Scala 类构造函数声明。。。同一事物的两种声明方式?

Scala 类构造函数声明。。。同一事物的两种声明方式?,scala,parameters,constructor,Scala,Parameters,Constructor,我想解释一下本声明之间的差异: class Clazz(param1: String, param2: Integer) 还有这个: class Clazz(param1: String)(param2: Integer) 第二个声明是否只影响实例化对象的方式,或者是否有更深层次的原因我不知道 我考虑的一个原因是参数的多个可变长度,例如: class Clazz(param1: String*)(param2: Integer*) 还有其他的吗?#1类型推断。它从左到右,按照参数列表执行

我想解释一下本声明之间的差异:

class Clazz(param1: String, param2: Integer)
还有这个:

class Clazz(param1: String)(param2: Integer)
第二个声明是否只影响实例化对象的方式,或者是否有更深层次的原因我不知道

我考虑的一个原因是参数的多个可变长度,例如:

class Clazz(param1: String*)(param2: Integer*)
还有其他的吗?

#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] = Foo@4dc1e4
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] = Foo@965701

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 {})
              ^
scala>class Foo[A](x:A,y:A=>单位)
定义类Foo
scala>newfoo(2,x=>println(x))
:24:错误:缺少参数类型
新的Foo(2,x=>println(x))
^
scala>class-Foo[A](x:A)(y:A=>单位)
定义类Foo
scala>newfoo(2)(x=>println(x))
res22:Foo[Int]=Foo@4dc1e4
#2隐式参数列表

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] = Foo@4dc1e4
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] = Foo@965701

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 {})
              ^
scala>class-Foo[A](x:A)(隐式order:scala.Ordering[A]){
|定义比较(y:A)=命令比较(x,y)
| }
定义类Foo
scala>新Foo(3)
res23:Foo[Int]=Foo@965701
scala>res23比较7
res24:Int=-1
scala>newfoo(new{})
:24:错误:没有为java.lang.Object定义隐式排序。
新Foo(新{})
^

在第二个版本中,您为Clazz声明了一个当前的主构造函数。因此,这两个版本之间的差异与Scala中“普通”和curried函数之间的差异相同,即

def foo(param1: String, param2: Int)

def foo(param1: String)(param2: Int)
大多数情况下,这两种声明都可以互换使用,但如果您经常需要curry函数,那么以curry形式声明它就更有意义了。注意:您还可以将普通函数或构造函数转换为咖喱格式,例如,您可以使用以下命令将普通Clazz构造函数转换为咖喱格式:

(new Clazz(_, _)).curried
如果要传递隐式值,还需要多个参数列表(因为关键字implicit适用于完整的参数列表)