2012-02-16 11 views
6

私はこの宣言の間に例えば違いの説明をしたいと思います:クラスコンストラクタの宣言...同じことを宣言する2つの方法はありますか?

class Clazz(param1: String, param2: Integer) 

と、この1:

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

2番目の宣言は、オブジェクトをインスタンス化するかのだけの方法に影響を与えるかは、任意のより深い理由があります私は知らない。私は、例えば約パラメータの複数の可変長だろうと思った

一つの理由:

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

ので、他のものがありますか?

答えて

11

#1タイプ推論。それは左から右に進み、パラメータリストごとに行われます。

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暗黙のパラメータリスト。

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

2番目のバージョンでは、Clazz用のカリー化された1次コンストラクタを宣言しています。だから、2つのバージョン間の違いは、すなわち

def foo(param1: String, param2: Int) 

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

、Scalaでは「ノーマル」とカリー化関数の違いと同じであり、両方の宣言は互換的に使用することができる時間のほとんどが、あなたは、多くの場合、機能をカレーする必要がある場合は、それそれをカレーの形で宣言するのがより理にかなっています。あなたはまた、例えばのためにこれを使用したカレーのフォームにあなたの通常のClazzコンストラクタを変換することができ、カリー化形式に正常な機能、さらには、コンストラクタを変換することができます注意:

(new Clazz(_, _)).curried 

あなたが暗黙的に渡している場合は、複数のパラメータリストを必要とします値(キーワードが暗黙的に完全なパラメータリストに適用されるため)

関連する問題