2010-07-28 6 views
10

Que fait ce code? Pourquoi existe-t-il deux ensembles de paramètres de constructeur?Deux ensembles de paramètres constructeurs dans une classe scala

class A(val x: Int)(val y: Int) 

Je peux initialiser un objet et utiliser les deux champs:

val a = new A(5)(7) 
println(a.x + ", " + a.y) 

Si je fais une classe de cas, je ne peux correspondre que par le premier ensemble de paramètres.

case class A(x: Int)(y: Int) 
val a = A(5)(7) 
a match { 
    A(x) => println(x) 
} 

Il n'est pas possible de créer 3 ensembles de paramètres. Il ne compile pas. Alors, quelle est la signification des deux ensembles de paramètres du constructeur?

+1

Ce n'est pas quelque chose que j'ai inventé. J'ai trouvé cette construction dans la librairie scala swing: https://lampsvn.epfl.ch/trac/scala/browser/scala/trunk/src/swing/scala/swing/event/MouseEvent.scala – PeWu

Répondre

7

Selon le scala specification (voir section 5.3), le second ensemble de paramètres est dédié aux paramètres implicites. En divisant les paramètres en deux ensembles, vous pouvez définir uniquement un paamètre non implicite et laisser l'autre être défini contextuellement.

Il est assez étrange que le compilateur accepte les paramètres non-implicites dans le second ensemble.

+2

Merci. Si j'ajoute le mot-clé _implicit_ dans le second ensemble, il commence à être implicite, mais il n'est pas implicitement implicite sans le mot-clé _implicit_. Quoi qu'il en soit, la spécification scala n'autorise pas les paramètres non implicites dans le second ensemble. – PeWu

+0

Eh bien ... cette section de la spécification semble très étrange: l'exemple donné juste en dessous de la grammaire ne semble pas correspondre à la gramar. Et "class Test (a: Int) (b: Int) (c: Int)" est une définition de classe valide. – Nicolas

+1

@PeWu +1 pour avoir la phrase "ce n'est pas implicitement implicite sans le mot-clé implicite" :) – I82Much

Questions connexes