您的位置:首页 > 产品设计 > UI/UE

scala中的call-by-name和call-by-value

2015-02-27 13:16 363 查看
http://www.jianshu.com/p/93eefcb61d4f

val和def的区别

在scala中,可以用val和def前缀来定义变量,例如:
val  x = 1
def  y = “foo”
这两者的区别在于:val定义值时,会做call-by-value操作,
def则会做call-by-name操作。
例如:
// 这是一个死循环
def loop: Boolean = loop

// 用val定义时会做call-by-value,以下语句会block住
val x = loop

// 用def定义时,是做的call-by-name。故以下语句暂时不会执行,在用到y的时候才做evaluation
def y = loop
陷到loop里时,用ctrl+c发中断信号终止。

函数定义中的call-by-name和call-by-value

首先思考一个问题,如何在不使用”||”和“&&”的情况下,实现如下两个函数and和or:
and(x, y) == x && y
or(x, y) == x || y
对于and,可以用如下方式定义:
def and(x: Boolean, y: Boolean) =
if (x) y else false

// 测试
and(true, true)      // => true
and(false, true)     // => false
但是,这种定义在遇上循环的时候会有问题,例如
and(false, loop)
上述语句会陷入循环,因为在我们的定义中,对于x和y参数的引用都是call-by-value的。要指定参数为call-by-name,只需要把函数定义改为如下形式即可:
def and(x: Boolean, y: => Boolean) =
if (x) y else false

// 测试
and(false, loop)     // => false
注意我们在定义参数y的时候,使用的
=>
符号。参考:
[1] https://class.coursera.org/progfun-003/lecture/5
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: