2010-07-28 22 views
10

¿Qué hace este código? ¿Por qué hay dos conjuntos de parámetros de constructor?Dos conjuntos de parámetros de constructor en una clase scala

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

puedo inicializar un objeto y utilizar los dos campos:

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

Si hago una clase caso, puedo coincidir sólo por el primer conjunto de parámetros.

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

No es posible crear 3 conjuntos de parámetros. No compila Entonces, ¿cuál es el significado de los dos conjuntos de parámetros de constructor?

+1

No es algo que inventé. Encontré esta construcción en la biblioteca de scala swing: https://lampsvn.epfl.ch/trac/scala/browser/scala/trunk/src/swing/scala/swing/event/MouseEvent.scala – PeWu

Respuesta

7

De acuerdo con scala specification (ver sección 5.3), el segundo conjunto de parámetros está dedicado a los parámetros implícitos. Dividir los parámetros en dos conjuntos le permite definir solo el panametra no implícito y dejar que el otro se defina contextualmente.

Es realmente extraño que el compilador adopte parámetros no implícitos en el segundo conjunto.

+2

Gracias. Si agrego la palabra clave _implicit_ en el segundo conjunto, comienza a ser implícita, pero no está implícitamente implícita sin la palabra clave _implicit_. De todos modos, la especificación scala no permite parámetros no implícitos en el segundo conjunto. – PeWu

+0

Bueno ... esta sección de la especificación parece muy extraña: el ejemplo dado justo debajo de la gramática no parece corresponder al gramar. Y "class test (a: Int) (b: Int) (c: Int)" es una definición de clase válida. – Nicolas

+1

@PeWu +1 por tener la frase "no está implícitamente implícito sin la palabra clave implícita" :) – I82Much

Cuestiones relacionadas