下列:
val add = (a: Int, b: Int) => a + b
转换为:
object add extends Function2[Int, Int, Int] {
def apply(a: Int, b: Int) = a + b
}
而
val a1 = add(_: Int, 3)
转换为:
object a1 extends Function1[Int, Int] {
def apply(x: Int): Int = {
add(x, 3)
}
}
但是当我这样做时:
scala> val a2 = add _
a2: () => (Int, Int) => Int = <function0>
然后调用a2
,它将引发错误:
scala> a2(1, 2)
<console>:11: error: too many arguments for method apply: ()(Int, Int) => Int in trait Function0
a2(1, 2)
^
为什么是这样?为什么下面的工作?
a2()(1, 2)
add
已经是Function2[Int, Int, Int]
。如果要a2
具有相同的类型,则只需进行简单的分配即可。
scala> val a2 = add
a2: (Int, Int) => Int = <function2>
scala> a2(1, 2)
res3: Int = 3
您正在考虑的是将方法扩展为函数的方法。如果我们有:
def add(a: Int, b: Int): Int = a + b
然后,我们将使用add _
eta展开来分配一个值。
scala> def a2 = add _
a2: (Int, Int) => Int
scala> a2(1, 2)
res4: Int = 3
不过add
是已经一个功能,所以下划线具有不同的含义。add
现在是一个值,而不是一个方法。既然add
是一个值,它就像返回一个的无参数方法一样Function2[Int, Int, Int]
。而且,如果我们尝试得到eta的展开式,我们会得到() => Function2[Int, Int, Int]
。
考虑一个简单的示例,其中有一个简单的val a = 1
。a
本质上与返回1
(def a = 1
)的无参数方法相同。如果我尝试获得eta扩展,我将得到() => Int
。
scala> val a = 1
a: Int = 1
scala> val a2 = a _
a2: () => Int = <function0>
本文收集自互联网,转载请注明来源。
如有侵权,请联系 [email protected] 删除。
我来说两句