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适用于完整的参数列表)