名词释义:
call by name : 不对表达式求值,直接替换
参数格式 :b: =>Int
call by value : 先计算表达式的值,再进行替换
参数格式:a:Int
call by name 示例:
object Test {
def main(args: Array[String]): Unit = {
println(getOne(100,loop()))
}
// 死循环
def loop():Int = {
loop()
}
// 第一个参数 a 要是一个value ,第二个参数 b 可以是一个表达式
def getOne(a:Int,b: =>Int):Int={
1
}
}
结果:
1
分析:
将100 传给了 getOne的第一个参数,将死循环传给了 getOne的第二个参数,由于 b: =>Int (call by name)只是进行替换,不会对loop()求出值,所以 getOne 成功返回了 1 。
call by value 示例:
object Test {
def main(args: Array[String]): Unit = {
println(getOne(loop(),100))
}
def loop():Int = {
loop()
}
def getOne(a:Int,b: =>Int):Int={
1
}
}
结果:
无限等待
分析:
程序尝试求出loop()的值,然后赋给a, 这当然会无限等下去的。