我无法理解部分为函数常量应用的函数的签名。例如,请考虑以下以相同方式工作的函数和方法定义:
2>&1
现在从上面的每个方法/函数中创建部分应用的函数。注意结果函数的签名:
def meth(x: Int): Unit = ()
val func = (x: Int) => ()
我不明白为什么val f = meth _ // Int => Unit
val g = func _ // () => Int => Unit
的签名包含func _
部分,这使得() =>
必须像g
而不是g()(1)
那样被调用。
答案 0 :(得分:2)
例如,考虑以下以相同方式工作的函数和方法定义:
Scala中的方法和功能不相同。他们实际上是非常不同的。方法不是一流的对象,而函数则是。也就是说,您永远不会拥有类型为方法类型的变量。
因此,让我们看一下没有下划线的类型。
val f = meth
val g = func
由于meth
是一种方法,因此将被称为 。因此,第一行将尝试在不带参数的情况下调用meth()
,这是一个错误。 func
是一个普通值,因此没有麻烦。我们将为func
命名为g
。
val f = meth _
val g = func _
为了允许我们将方法视为对象,Scala引入了_
语法。与方法一起使用时,它将方法转换为函数对象。因此meth _
是一种特殊的方法语法,它将其转换为函数。另一方面,func _
正在获取一个值(记住,函数是对象,就像字符串或其他任何东西一样)并将其提升为函数对象。做到这一点的“最简单”方法是添加一个空的参数列表,这正是Scala要做的。
tl; dr在名称后加上_
会将事物变成函数对象。如果事物是一种方法,则它不会应用。如果事物是一个值(包括但不限于一个函数),它将产生一个新的函数对象。