首页 > 其他 > 详细

Scala“call by name“和 “call by value” 比较

时间:2015-11-17 02:03:50      阅读:291      评论:0      收藏:0      [点我收藏+]
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

(0)
(0)
   
举报
评论 一句话评论(0
关于我们 - 联系我们 - 留言反馈 - 联系我们:wmxa8@hotmail.com
© 2014 bubuko.com 版权所有
打开技术之扣,分享程序人生!