1. 函数和方法
在Scala中函数是一等公民,你可以像操作数字一样将函数赋值给一个变量。使用val语句可以定义函数,def语句定义方法:
class Test{
def m(x: Int) = x + 3
val f = (x: Int) => x + 3
}
在Scala中无法直接操作方法,如果要操作方法,必须先将其转换成函数。有两种方法可以将方法转换成函数:
val f1 = m _
在方法名称m后面紧跟一个空格和下划线告诉编译器将方法m转换成函数,而不是要调用这个方法。 也可以显示地告诉编译器需要将方法转换成函数:
val f1: (Int) => Int = m
通常情况下编译器会自动将方法转换成函数,例如在一个应该传入函数参数的地方传入了一个方法,编译器会自动将传入的方法转换成函数。
2. 两者的区别
可以直接调用函数上的方法,而方法却不行,例如:
f.toString //编译通过
m.toString //编译失败
3. Currying函数和Currying方法
Currying函数可以只传入部分参数返回一个偏函数(partially applied function, 也叫部分应用函数),而Currying方法在转换成偏函数时需要加上显式说明,让编译器完成转换:
object TestCurrying {
def invoke(f: Int => Int => Int): Int = {
f(1)(2)
}
def multiply(x: Int)(y: Int): Int = x * y
def main(args: Array[String]) {
invoke(multiply)//编译器会自动将multiply方法转换成函数
val partial1 = multiply(1) //尝试将Currying方法转换成偏函数导致编译失败
val partial2 = multiply(1): (Int => Int) //编译通过
val f = multiply _ //将multiply方法转换成函数f
val partial3 = f(1) //只应用第1个参数返回偏函数,编译通过
}
}
4. 参考文档:
- Scala Functions vs Methods
- Why does it compile successfully while pass only one parameter to currying function?
来源:oschina
链接:https://my.oschina.net/u/659771/blog/652310