Call?by?name :传给函数/方法M的参数是另外一个参数函数,该参数函数在函数体内调用时执行
call?by?value : 传给函数的参数是个值,如果是个表达式或者是另外一个参数函数,则要先计算出表达式的值或者是要先得到参数函数执行后的返回值
?
《Programming?in?Scala,?2nd?Edition》在?9.5?By-name?parameters 一节出给出一个例子解释
?
代码如下:
?
?
object?bynameparameters?extends?App?{
var?assertionsEnabled?=?false
//Call?by?name
def?byNameAssert(predicate:?=>?Boolean)?=
if?(assertionsEnabled?&&?!predicate)
throw?new?AssertionError
?
//call?by?value?
def?boolAssert(predicate:?Boolean)?=
if?(assertionsEnabled?&&?!predicate)
throw?new?AssertionError
//boolAssert(3?/0?==?0)?//?java.lang.ArithmeticException:?/?by?zero
?byNameAssert(3?/?0?==?0)?//will?not?yield?an?exception:
}
?
?
当执行boolAssert(3?/0?==?0) 时,会先算3?/0?==?0表达式,于是抛出异常
?
但是执行byNameAssert(3?/?0?==?0),3?/?0?==?0,会隐式转换成一个函数predicate给byNameAssert,因为assertionsEnabled?=?false,所以在if语句判断中永远不会执行predicate方法,所以不会产生异常
?
?
另外在stackoverflowe 上有篇关于“call?by?name“和?“call?by?value”的解释不错,可以参考
Scala“call by name“和 “call by value” 比较
原文:http://zhouchaofei2010.iteye.com/blog/2257201