() => Unit
---> 是一个函数;=> Unit
--> 是一个执行结果为Unit的表达式
code: => Unit
是 by name
传递参数。参数是一个返回值为Unit
的代码块。在传递的时候,参数没有被调用。比如:
def test(code : => Unit){
println("start")
code // 这行才会调用传入的代码块,写成code()亦可
println("end")
}
test{// 此处的代码块不会马上被调用
println("when evaluated")
println("bb")
}
结果
start
when evaluated
bb
end
注意:when evaluated
被打印在了start
和end
中间。
而code: ()=>Unit
参数的类型,是一个没有参数而且返回值为Unit的函数类型。
def test1(code: ()=>Unit){
println("start")
code() // 要想调用传入的代码块,必须写成code(),否则不会调用。
println("end")
}
test1 {//此代码块,传入后立即执行。
println("when evaluated")
()=>{println("bb")}
}
结果:
when evaluated
start
bb
end
注意:when evaluated
被打印在了start
之前。
实际上,在第二例当中,test1
的参数是一个表达式。在Scala中,如果将要传入的参数正好是一个,则可以用花括号。这时候test1
的参数列表是一个表达式,而这个表达式的结果是最后一行的返回,也就是一个函数() => { println("bb") }
,它被传给了test1
的唯一参数。然后test1
方法体执行。至于为什么when evaluated
在另外三行之前,是因为它是在传参的时候,求表达式值的副产物。
其实code :=> Unit
就是code : () => Unit
,只是第一种是按名
传参,用花括号
可以把花括号内的所有东西作为一个函数传给code
;第二种就是普通传参
,但是它刚好只有一个参数
。这时候用了花括号
,就是花括号内表达式的值传进去了。
最后,提供对等用例
object FunctionTest2 {
def main(args: Array[String]) {
def test(code: => Unit) {
println("start")
code
println("end")
}
test {
println("when evaluated")
println("bb")
}
def test1(code: () => Unit) {
println("start")
code()
println("end")
}
test1 {
() =>
println("when evaluated")
println("bb")
}
}
}