2012-02-16 10 views
6

me gustaría una explicación de la diferencia por ejemplo entre esta declaración:Declaración de constructor de clase ... ¿Dos formas de declarar lo mismo?

class Clazz(param1: String, param2: Integer) 

y éste:

class Clazz(param1: String)(param2: Integer) 

Cómo afecta la segunda declaración de la manera de crear instancias de los objetos o hay alguna razón más profunda No lo sé.

Una razón pensé que sería de longitud variable de múltiples parámetros, por ejemplo:

class Clazz(param1: String*)(param2: Integer*) 

Así que ¿hay otros?

Respuesta

11

# 1 Tipo de inferencia. Va de izquierda a derecha y se hace por lista de parámetros.

scala> class Foo[A](x: A, y: A => Unit) 
defined class Foo 

scala> new Foo(2, x => println(x)) 
<console>:24: error: missing parameter type 
       new Foo(2, x => println(x)) 
         ^

scala> class Foo[A](x: A)(y: A => Unit) 
defined class Foo 

scala> new Foo(2)(x => println(x)) 
res22: Foo[Int] = [email protected] 

# 2 lista de parámetros implícitos.

scala> class Foo[A](x: A)(implicit ord: scala.Ordering[A]) { 
    | def compare(y: A) = ord.compare(x, y) 
    | } 
defined class Foo 

scala> new Foo(3) 
res23: Foo[Int] = [email protected] 

scala> res23 compare 7 
res24: Int = -1 

scala> new Foo(new {}) 
<console>:24: error: No implicit Ordering defined for java.lang.Object. 
       new Foo(new {}) 
      ^
3

En la segunda versión que se está declarando un constructor principal de curry Clazz. Por lo que la diferencia entre las dos versiones es la misma que la diferencia entre "normal" y funciones de curry en Scala, es decir

def foo(param1: String, param2: Int) 

def foo(param1: String)(param2: Int) 

mayoría de las veces ambas declaraciones se pueden utilizar indistintamente, pero si usted necesita a menudo la función de curry entonces tiene más sentido declararlo en currículum. Nota También puede convertir una función normal o incluso constructor en una forma curry, por ejemplo, se podría transformar su constructor Clazz normales en forma de curry usando esto:

(new Clazz(_, _)).curried 

También necesita múltiples listas de parámetros si estás de paso implícito valor (como la palabra clave implícita se aplica a la lista de parámetros completa)

Cuestiones relacionadas