偏应用函数.是一种表达式,你不需要提供函数需要的所有参数。代之以仅提供部分,或不提供所需参数 。
def sum(a:Int,b:Int,c:Int)=a+b+c val a=sum _ a(1,2,3)
scala编译器以偏应用表达式,sum _,实例化一个带三个缺失整数参数的函数值,并把这个新的函数值的索引赋给变量a.当把这个新函数值应用于三个参数之上时,它就回头调用sum,并传入这三个参数:1、2、3.
实际发生的事情是这样的:名为a的变量指向一个函数值对象。这个函数值是由scala编译器依照偏应用函数表达式sum _,自动产生的类的一个实例。编译器产生的类有一个apply方法带有三个参数.scala编译器把表达式a(1,2,3)翻译成对函数值的apply方法的调用。因此a(1,2,3)是 a.apply(1,2.3) 的短格式。
scala编译器根据表达式 sum _ 自动产生的类里的apply方法,简单地把这三个缺失的参数前转到sum,并返回计算结果。
这种一个下划线代表全部参数列表的表达式的另一个用途,就是把它当作转换函数(def)为函数值的方式。尽管不能把方法或嵌套函数通过赋值给变量,或当作参数传递给其他方法,但是如果你把方法或嵌套函数通过在名称后加一个下划线的方式包装在函数值中,就可以做到了。
下划线代表部分参数:
val b=sum(1,_:Int,3) b(2)
如果你正在写一个省略所有参数的偏应用程序表达式,如println _ 或 sum _,而且在代码的那个地方正需要一个函数,你可以去掉下划线从而表达得更简明。
val someNumbers=List(-11,-10,4,12,4) someNumbers.foreach(println _) //可以简写成 someNumbers.foreach(println)
注:上述东西是从scala向导摘录来的(感谢scala圈子里的大虾)。