语法:
Expr ::= (Bindings | Id | "_‟) "=>‟ Expr
ResultExpr ::= (Bindings | (Id | "_‟) ":‟ CompoundType) "=>‟ Block
Bindings ::= "(‟ Binding {",‟ Binding} ")‟
Binding ::= (id | "_‟) [":‟ Type]
匿名函数(x1: T1,...,xn: Tn) => e 将类型为Ti的参数xi映射为由表达式e给出的结果。每个正式参数xi的作用域是e。正式参数必须具有两两不同的名称。
如果匿名函数的期望类型具有scala.Functionn[S1,...,Sn, R]的形式,则e的期望类型是R,每个参数xi的类型Ti可忽略,可假定Ti = Si。如果匿名函数的期望类型是某些其他类型,则所有正式参数的类型都必须显式的给出,且e的期望类型是未定义的。匿名函数的类型是scala.Functionn[S1,...,Sn, T],这里T是e的打包类型(§6.1)。T必须等价于一个不引用任何正式参数xi的类型。
匿名函数求值方式为实例创建表达式
new scala.Functionn[T1,...,Tn, T] {
def apply(x1: T1,...,xn: Tn): T = e
}
在具有单个未类型化的正式参数时,(x) => e可缩写为 x => e。如果匿名函数 (x: T) => e有单个类型化的参数作为一个代码块的结果表达式出现,则可缩写为x: T => e。
一个正式参数也可以是由一个下划线 _ 表示的通配符。在此情况下可以随意选择该参数的一个新名称。
示例6.23.1 匿名函数的例子
x => x //恒等函数
f => g => x => f(g(x)) //柯里化的函数组合
(x: Int, y: Int) => x + y //求和函数
() => { count +=1; count } //该函数参数列表为空
//将一个非本地变量‟count‟加1
//并返回新的值
语句
68
_ => 5 //该函数忽略其所有参数并总是返回5
匿名函数的占位符语法
语法:
SimpleExpr1 ::= "_‟
一个表达式(语法上归类为Expr)可以在合法的标识符处包含内嵌的下划线记号 _。这样一个表达式表示一个下划线后的位置的连续的参数的匿名函数。
定义下划线段具有形式为_:T的表达式,T是一个类型,或者形式为_,下划线并不是类型归属_:T的表达式部分。
具有Expr句法归类的表达式e绑定到下划线段u的两个条件是:(1) e合理包含u,且(2)没有其他的具有Expr句法归类的表达式合理包含于e且其自身合理包含u。
如果表达式e按照既定顺序绑定到下划线段u1,...,un,则等价于匿名函数(u‟1,...,u‟n)=> e‟,每个u‟i是将ui中下划线替换为新的标识符的结果,e‟则是将e中每个下划线段ui替换为u‟i的结果。
示例6.23.2 左侧的匿名函数使用了占位符语法。每个都等价于其右侧的匿名函数
_ + 1 x => x + 1
_ * _ (x1, x2) => x1 * x2
(_: Int) *2 (x: Int) => (x: Int) * 2
if (_) x else y z => if (z) x else y
_.map(f) x => x.map(f)
_.map(_ + 1) x => x.map(y => y + 1)