2012-02-16 15 views
6

Chciałbym wyjaśnienie różnicy na przykład między tą deklaracją:Deklaracja konstruktora klasy ... Dwa sposoby deklarowania tego samego?

class Clazz(param1: String, param2: Integer) 

i to jedno:

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

Czy druga deklaracja wpływa tylko na sposób tworzenia instancji obiektów czy jest jakiś głębszy powód Nie wiem.

Jednym z powodów myślałem o byłby wielokrotnością zmiennej długości parametrów dla przykładu:

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

Więc czy są jakieś inne?

Odpowiedz

11

# 1 Typ wnioskowania. Przechodzi od lewej do prawej i odbywa się według listy parametrów.

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 niejawny lista parametrów.

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

W drugiej wersji jesteś deklarowania curry podstawowy konstruktor Clazz. Więc różnica między tymi dwoma wersjami jest taka sama jak różnica między „normalną” i funkcji curry w Scala, tj

def foo(param1: String, param2: Int) 

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

Większość czasu obie deklaracje mogą być używane zamiennie, ale jeśli często trzeba funkcję curry następnie go bardziej sensowne jest zadeklarowanie go w formie curry. Uwaga Można również przekonwertować normalne funkcjonowanie, a nawet konstruktora w curry postaci, np można przekształcić normalny konstruktor Clazz w formie curry pomocą tego:

(new Clazz(_, _)).curried 

Należy również wiele list parametrów, jeśli przechodzą niejawna wartość (ponieważ słowo kluczowe implicit dotyczy całego wykazu parametrów)

Powiązane problemy