Olá:
Desculpem a minha demora mas só agora consegui experimentar a
sugestão. Renomeei os objects com a primeira letra maiúscula.
Entretanta afora o problema é outro. Segue-se o script:
case class ClasseA
case object Object1 extends ClasseA
case object Object2 extends ClasseA
case object Object3 extends ClasseA
val obj = Object2
obj match {
case Object1 => println("obj 1")
case Object2 => println("obj 2")
case Object3 => println("obj 3")
}
O retorno o shell foi o seguinte:
<console>:12: error: pattern type is incompatible with expected type;
found : object Object1
required: object Object2
case Object1 => println("obj 1")
^
<console>:14: error: pattern type is incompatible with expected type;
found : object Object3
required: object Object2
case Object3 => println("obj 3")
Achei estranho, pois o pattern matching não deveria "descobrir" a qual
classe obj pertenceria? Enquanto estava escrevendo esta mensagem tive
uma idéia e resolvi experimentar isto aqui:
case class ClasseA()
case object Object1 extends ClasseA
case object Object2 extends ClasseA
case object Object3 extends ClasseA
def funcao(obj: ClasseA) = obj match {
case Object1 => println("obj 1")
case Object2 => println("obj 2")
case Object3 => println("obj 3")
}
val obj = Object2
funcao(obj)
E finalmente obtive a resposta esperada.
Então resolvi refazer o primeiro exemplo mas desta vez explicitando a
classe de obj:
case class ClasseA()
case object Object1 extends ClasseA
case object Object2 extends ClasseA
case object Object3 extends ClasseA
val obj:ClasseA = Object2
obj match {
case Object1 => println("obj 1")
case Object2 => println("obj 2")
case Object3 => println("obj 3")
}
E agora sim deu certo.
On 21 out, 00:53, "Rafael de F. Ferreira" <
rafael...@gmail.com> wrote:
> Valeu, mas nem tanto, é que esse problema já me mordeu antes.
>
> --
> Rafael de F. Ferreira.
http://www.rafaelferreira.net/
>
> 2009/10/20 Alexei Barbosa de Aguiar <
ale...@verde.com.br>:
>
> > Estás sabendo um bocado, hein ? :-) Essa foi bem específica.
>
> > Rafael de F. Ferreira escreveu:
>
> > Em um pattern, scala considera tudo que começa com letra minúscula
> > como uma variável. Então o seu match é o mesmo que:
>
> > obj match {
> > case x => println("obj 1")
> > case y => println("obj 2")
> > case z => println("obj 3")
> > }
>
> > Como essas variáveis não especificam mais nenhuma restrição, o
> > primeiro case vai sempre ser selecionado e os outros ignorados. A
> > solução é usar a convenção de nomear seus tipos com a primeira letra
> > maiúscula:
>
> > case object Object1 extends ClasseA
>
> > IIRC, um workaround seria expressar o nome do tipo entre backticks:
> > obj match {
> > case `object1` => println("obj 1")
> > case `object2`=> ....
> > }
>
> > --
> > Rafael de F. Ferreira.
> >
http://www.rafaelferreira.net/
>
> > 2009/10/20 Rafael Afonso <
rafael.afo...@gmail.com>: