[SCALA] - Dúvida Sintaxe

18 visualizações
Pular para a primeira mensagem não lida

Picanha

não lida,
22 de jun. de 2011, 10:23:5822/06/2011
para scala-br
Pessoal,

estou dando uma em uns exemplos do Lift in Action e to com uma dúvida
referente ao exemplo 9. Abaixo segue o trecho de código do Snippet:


1 def list = {
2 ".line" #> stock.is.map {
3 b =>
4 ".name" #> b.title &
5 ".line [id]" #> b.reference &
6 ".edit" #> ((ns: NodeSeq) => SHtml.a(() =>
7 SetHtml(editFormDiv, SHtml.ajaxForm(edit(b)(ns),
Hide(editFormDiv, 1 seconds))) &
8 Show(editFormDiv, 1 seconds), Text("Edit"))
9 )
10 }
11 }

1 def edit(b: Book) = {
2 "#book_name" #> SHtml.text(b.title, b.title = _) &
3 "type=submit" #> SHtml.ajaxSubmit("Update", () =>
SetHtml(b.reference, Text(b.title)))
4 }

Notem que na linha 07 tem uma chamada edit(b)(ns) passando NodeSeq
como se edit fosse uma Partial Function, só que edit não é. Qual regra
se enquadra essa chamada? O compilador deduz que a função chamada
possui um corpo que trata o NodeSeq????

Daniel Sobral

não lida,
22 de jun. de 2011, 11:35:2622/06/2011
para scal...@googlegroups.com
O método #> retorna um CssSel, que é uma função NodeSeq => NodeSeq
(trait CssSel extends (NodeSeq) => NodeSeq). Ou seja, edit(b) retorna
uma função NodeSeq => NodeSeq, a qual, então, recebe o parâmetro "ns".
Veja o exemplo 2.2 (seção 2.4) para uma introdução inicial, e a seção
6.1.2 para maiores detalhes (a listagem 6.4 contém uma definição quase
idêntica à de "edit").

A propósito, eu estava conversando com o Tim Perrett a respeito dessa
sua questão, e ele acha que o exemplo pode ser simplificado.

2011/6/22 Picanha <giulia...@gmail.com>:

--
Daniel C. Sobral

I travel to the future all the time.

Giuliano Costa

não lida,
22 de jun. de 2011, 12:55:3322/06/2011
para scal...@googlegroups.com
Pois é,

eu to começando agora a brincar com o Lift. Peguei esse exemplo do livro e estava perdido nesse pedaço. Com certeza esses trechos podem ser melhorados...

Pra mim que to vindo do java ainda é um pouco estranho essas sacadas da linguagem. Pelo que to vendo, tenho que comer muito feijão ainda...


Valeu pela resposta!

2011/6/22 Daniel Sobral <dcso...@gmail.com>



--
================================
Giuliano Costa

Picanha

não lida,
22 de jun. de 2011, 13:00:3622/06/2011
para scala-br
ops, já ia esquecendo...

E o trecho abaixo, o que está fazendo?

SHtml.text(b.title, b.title = _)

Pra que o "b.title = _" ?


Valeu!

On 22 jun, 13:55, Giuliano Costa <giulianoco...@gmail.com> wrote:
> Pois é,
>
> eu to começando agora a brincar com o Lift. Peguei esse exemplo do livro e
> estava perdido nesse pedaço. Com certeza esses trechos podem ser
> melhorados...
>
> Pra mim que to vindo do java ainda é um pouco estranho essas sacadas da
> linguagem. Pelo que to vendo, tenho que comer muito feijão ainda...
>
> Valeu pela resposta!
>
> 2011/6/22 Daniel Sobral <dcsob...@gmail.com>
>
>
>
>
>
>
>
>
>
> > O método #> retorna um CssSel, que é uma função NodeSeq => NodeSeq
> > (trait CssSel extends (NodeSeq) => NodeSeq). Ou seja, edit(b) retorna
> > uma função NodeSeq => NodeSeq, a qual, então, recebe o parâmetro "ns".
> > Veja o exemplo 2.2 (seção 2.4) para uma introdução inicial, e a seção
> > 6.1.2 para maiores detalhes (a listagem 6.4 contém uma definição quase
> > idêntica à de "edit").
>
> > A propósito, eu estava conversando com o Tim Perrett a respeito dessa
> > sua questão, e ele acha que o exemplo pode ser simplificado.
>
> > 2011/6/22 Picanha <giulianoco...@gmail.com>:

rsl...@gmail.com

não lida,
22 de jun. de 2011, 13:28:5222/06/2011
para scal...@googlegroups.com
São duas funções. Uma para preencher o valor do campo (b.title) e outra para atualizar o que for necessário depois que o form for submetido (b.title = _)

2011/6/22 Picanha <giulia...@gmail.com>



--
Ricardo da Silva Lima
rsl...@gmail.com

rsl...@gmail.com

não lida,
22 de jun. de 2011, 13:32:3622/06/2011
para scal...@googlegroups.com
Correção. O primeiro parâmetro é uma String (o valor que vai para o campo value do input). O segundo é uma função (String) => Any que será executada quando o form for submetido com o valor do input como parâmetro. Resumindo, o getter e o setter. :P

Daniel Sobral

não lida,
22 de jun. de 2011, 13:47:3422/06/2011
para scal...@googlegroups.com
2011/6/22 Picanha <giulia...@gmail.com>:

> ops, já ia esquecendo...
>
> E o trecho abaixo, o que está fazendo?
>
> SHtml.text(b.title, b.title = _)
>
> Pra que o "b.title = _" ?

Isso é explicado em detalhe na seção 6.1.2. Se você olhar o objeto
SHtml no Scaladoc do Lift
(http://scala-tools.org/mvnsites/liftweb-2.3/ para versão 2.3), o
método text tem a seguinte assinatura:

def text (value: String, func: (String) => Any, attrs: ElemAttr*) : Elem

Ou seja, o primeiro parâmetro deve ser uma String, e o segundo uma
função que recebe String e faz alguma coisa com ela. No Lift in
Action, ele descreve o primeiro parâmetro como "Getter" e o segundo
como "Setter", e é exatamente isso que acontece. Esse campo texto vai
ser preenchido com o conteúdo de b.title (getter), e quando o usuário
digitar alguma coisa, b.title vai ser setado para este valor (setter).

Em detalhes, "_" tem muitos significados em Scala. Neste caso em
particular, ele é um _parâmetro anônimo_, fazendo da expressão
"b.title = _" uma função. Em particular, se eu tenho a expressão "_ +
_ + _", isso é equivalente a escrever "(x, y, z) => x + y + z". No
exemplo original, portanto, teria sido equivalente escrever o
seguinte:

SHtml.text(b.title, (value) => b.title = value)

Giuliano Costa

não lida,
23 de jun. de 2011, 14:06:3423/06/2011
para scal...@googlegroups.com
Pois é Daniel. Eu não possuo o livro. Estou tentando aprender apenas pelos exemplos.

Já me elucidou! Valeu!



2011/6/22 Daniel Sobral <dcso...@gmail.com>



--
================================
Giuliano Costa

Saulo Venâncio

não lida,
24 de jun. de 2011, 18:05:4124/06/2011
para scal...@googlegroups.com
Pessoal, 
Duvida de amador em scala, ouvi mais falar que produzi código.

Tem como eu reproduzir todo o comportamento do um servidor full-stack em Java com Scala?
Com transações, messages, ejbs, etc.
Desculpe a ignorancia mas ainda sou realmente "ignorante" em scala, queria saber se posso pensar em migrar projetos pessoal mais avançados pra scala antes de aprender a linguagem.

Obrigado.

-----------------------
Saulo B. M. Venâncio

Control and Automation Eng. Student
Associate in Business Management

T +55 48 84121486
E saulo.v...@gmail.com




2011/6/23 Giuliano Costa <giulia...@gmail.com>

Giuliano Costa

não lida,
24 de jun. de 2011, 18:31:2424/06/2011
para scal...@googlegroups.com
Cara,

Você pode usar qualquer classe Java dentro do seu projeto scala. Scala vira bytecode quando compilado. Se você fizer um projeto em cima do lift, verificará que ele não passa de uma webapp feita em java.

Não tenho experiência em nenhuma migração de projeto para scala. É lógico que não será tão "lisa" a migração, mas certamente da.


Att,
Giuliano Costa

2011/6/24 Saulo Venâncio <saulo.v...@gmail.com>



--
================================
Giuliano Costa

Thomas Sant'ana

não lida,
24 de jun. de 2011, 19:07:3524/06/2011
para scal...@googlegroups.com
Acho que converter da um certo trabalho. Já peguei pequenos exemplo em java e converti. É um pouco doloros (tem algumas diferenças de formato). O Intellij ajuda a fazer o cut and paste (mas não faz 100%).

Agora o que talvez seja mais interessante é fazer um código misto. Se você tem um monte de coisa em Java, deixa em java e coloca algumas coisas em Scala.

Chamar Java de Scala é bem fácil. Existem algumas pontos para observar.Chamar Scala de Java requer mais planejamento no Scala.

Como exemplo no meu projeto, eu uso Jetty, Log4J, Swing (scala e não scala), e já testei Neo4J, H2, XStream entre outras coisas. Agora eu não uso ORM e outros mapeamentos que necessitam pesadamente de reflection.

Acho que o pior mesmo é voltar para o Java depois de muito tempo em Scala.... (ai esses ponto e virgulas).

Thomas

2011/6/24 Giuliano Costa <giulia...@gmail.com>

Paulo "JCranky" Siqueira

não lida,
25 de jun. de 2011, 18:28:3425/06/2011
para scal...@googlegroups.com
+1 na idéia de misturar Java e Scala. É assim que eu trabalho boa parte do tempo. Tenho alguns serviços REST com jax-rs, em um projeto tenho resources em Java, em outro em Scala. Cada caso é um caso.

Um exemplo é quando você quer começar a usar Scala, mas ainda não sabe fazer alguma coisa específica, como persistência, em Scala. Para ganhar tempo, pode ser muito mais interessante fazer a persistência com JPA em Java, e os controllers em Scala. O limite é a imaginação, e esse é um dos pontos fortes de Scala: a integraçção com Java é ridiculamente fácil =)

[]s,

2011/6/24 Thomas Sant'ana <mail...@gmail.com>



--
Paulo "JCranky" Siqueira
Visit my blog: http://www.jcranky.com/

Saulo Venâncio

não lida,
30 de jun. de 2011, 13:53:5030/06/2011
para scal...@googlegroups.com
Então o ideal, pelo que entendi, pra conhecer melhor a linguagem, em projetos pequenos trabalhar as duas ling juntas. E especialmente trabalhar os controllers no scala, e devagar ir migrando. certo?
E thomas, sobre as APIs que vc falou, vc usa elas no scala? as invocacoes sao igual, instanciametno de obj, o obj criado por ling java dentro do scala pode usar recursos  só do escala (ex. instancio Pessoa de forma java, depois coloco no setter de qq coisa um integer do scala)
????
Obrigado galera, muito show todos vcs.

-----------------------
Saulo B. M. Venâncio

Control and Automation Eng. Student
Associate in Business Management

T +55 48 84121486
E saulo.v...@gmail.com




2011/6/25 Paulo "JCranky" Siqueira <paulo.s...@gmail.com>

Paulo "JCranky" Siqueira

não lida,
30 de jun. de 2011, 16:56:2030/06/2011
para scal...@googlegroups.com
Abaixo:

Então o ideal, pelo que entendi, pra conhecer melhor a linguagem, em projetos pequenos trabalhar as duas ling juntas. E especialmente trabalhar os controllers no scala, e devagar ir migrando. certo?

Se você já sabe bem como fazer a persistência em Java, pode ser uma boa. É claro que, se for um projeto começando do zero, e ele for MUITO simples, talvez fazer tudo em scala não seja tão ruim.

Se você está começando agora, uma coisa que pode pegar um pouco, se tentar usar JPA ou algum framework de injeção de dependências, é o uso de anotações. Mas depois que acostuma, fica fácil.
 
E thomas, sobre as APIs que vc falou, vc usa elas no scala? as invocacoes sao igual, instanciametno de obj, o obj criado por ling java dentro do scala pode usar recursos  só do escala (ex. instancio Pessoa de forma java, depois coloco no setter de qq coisa um integer do scala)
????

Não sou o Thomas mas já que "estou aqui"... hehehe

Basicamente, cada caso é um caso. Acho que fica mais fácil você abrir emails novos para cada dúvida, mas um exemplo:

Digamos que você tem uma classe Java que expõe uma coleção (também java). Se você quiser usar as facilidades das coleções Scala, vai precisar de um pequeno "cheat code": import scala.collection.JavaConversions._ - com isso, suas coleções java vão ser transformadas em coleções Scala "por baixo dos panos", e você vai poder usar foreach, map, filter etc.

Agora, não entendi o que você quis dizer com o exemplo de Pessoa aí em cima...

[]s,

Thomas Sant'ana

não lida,
30 de jun. de 2011, 18:46:5630/06/2011
para scal...@googlegroups.com


2011/6/30 Paulo "JCranky" Siqueira <paulo.s...@gmail.com>

Abaixo:

Então o ideal, pelo que entendi, pra conhecer melhor a linguagem, em projetos pequenos trabalhar as duas ling juntas. E especialmente trabalhar os controllers no scala, e devagar ir migrando. certo?

Se você já sabe bem como fazer a persistência em Java, pode ser uma boa. É claro que, se for um projeto começando do zero, e ele for MUITO simples, talvez fazer tudo em scala não seja tão ruim.

Se você está começando agora, uma coisa que pode pegar um pouco, se tentar usar JPA ou algum framework de injeção de dependências, é o uso de anotações. Mas depois que acostuma, fica fácil.

Eu concordo. Se você quer aprender scala e tem um projeto pequeno eu usaria scala de cabo a rabo. Uma vez que você pega o jeito do scala fica melhor você ter tudo em scala.

Por exemplo, usar estruturas imutáveis em Scala é muito mais fácil do que em Java. Embora Effective Java recomende usar imutabilidade em Java também.  No começo eu tive um pouco de dificuldade com a imutabilidade. Hoje me arrependo de não ter investido mais tempo para entender como linguagens funcionais resolvem problema, porque estou refatorando grandes partes do meu código para usar estrutura imutáveis.

Agora se você um projeto grande que já esta funcionado em Java, ai pode ser interessante injetar Scala aqui e ali.

O que eu acho legal do Scala é que se voce escrever do jeito java vai funcionar, se esquever do jeito Haskell também. Mas se for tudos em scala, ir saindo do java para o funcional fica mais fácil.
 
 
E thomas, sobre as APIs que vc falou, vc usa elas no scala? as invocacoes sao igual, instanciametno de obj, o obj criado por ling java dentro do scala pode usar recursos  só do escala (ex. instancio Pessoa de forma java, depois coloco no setter de qq coisa um integer do scala)
????

Não sou o Thomas mas já que "estou aqui"... hehehe

Basicamente, cada caso é um caso. Acho que fica mais fácil você abrir emails novos para cada dúvida, mas um exemplo:

Digamos que você tem uma classe Java que expõe uma coleção (também java). Se você quiser usar as facilidades das coleções Scala, vai precisar de um pequeno "cheat code": import scala.collection.JavaConversions._ - com isso, suas coleções java vão ser transformadas em coleções Scala "por baixo dos panos", e você vai poder usar foreach, map, filter etc.

Agora, não entendi o que você quis dizer com o exemplo de Pessoa aí em cima...


Acho que eles está se referindo a ORM para gravar dados.  Eu não uso ORM. Acho que tem que testar caso a caso e ver como funciona. Mas você pode pegar qualquer objeto do java e manipular no scala. Disse o Paulo as vezes os collections do java requerem uma massagem :)

Para ser bem honesto eu acho a implementação de collections do Java muito fraca. As coisa sempre ficam estranhas (no olhar de Scala.

List[Integer] lista = busca()
for(Integer i : lista ) {
     println(i)
}

é feio comparado com:

busca.foreach(println)

Thomas

Saulo Venâncio

não lida,
1 de jul. de 2011, 06:27:1101/07/2011
para scal...@googlegroups.com
Valeu galera, vou começar a implementar scala em projetos menores e sentir a diferença.
abracos :)

-----------------------
Saulo B. M. Venâncio

Control and Automation Eng. Student
Associate in Business Management

T +55 48 84121486
E saulo.v...@gmail.com




2011/6/30 Thomas Sant'ana <mail...@gmail.com>
Responder a todos
Responder ao autor
Encaminhar
0 nova mensagem