Scala的解释器在解析函数参数(function arguments)时有两种方式:
- 传值调用(call-by-value):先计算参数表达式的值,再应用到函数内部;
- 传名调用(call-by-name):将未计算的参数表达式直接应用到函数内部
在进入函数内部前,传值调用方式就已经将参数表达式的值计算完毕,而传名调用是在函数内部进行参数表达式的值计算的。这就造成了一种现象,每次使用传名调用时,解释器都会计算一次表达式的值。
传名调用时, 接受表达式的形参定义一般是: block: =>Unit , 没有形参,返回类型Unit
demo:
def test(code: => Unit) {
println("start")
code
println("end")
}
def test1(code: () => Unit) {
println("start")
code()
println("end")
}
//开始测试
test {
println("when evaluated")
println("bb")
}
println(".................")
test1 {
println("bb")
() => println("when evaluated")
}
结果:
start when evaluated bb end ................. bb start when evaluated end