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

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


转载于:https://www.cnblogs.com/bluejoe/p/5115865.html

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值