scala中的call-by-name和call-by-value
2015-02-27 13:16
363 查看
http://www.jianshu.com/p/93eefcb61d4f
def则会做call-by-name操作。
例如:
[1] https://class.coursera.org/progfun-003/lecture/5
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
相关文章推荐
- scala def/val/lazy val区别以及call-by-name和call-by-value
- scala中call-by-name和call-by-value
- Scala从零开始:函数参数的传名调用(call-by-name)和传值调用(call-by-value)
- scala函数的call-by-name和call-by-value 区别
- Scala中的call-by-name与call-by-value
- scala中的call-by-name和call-by-value
- scala:函数参数的传名调用(call-by-name)和传值调用(call-by-value)
- scala 中的def/val/lazy val/的区别,call-by-value/call-by-name
- call by name 与 call by value in scala
- scala中的call-by-name和call-by-value
- scala 传名调用call-by-name
- A simple Scala call-by-name example
- Scala 函数传名调用(call-by-name)
- Scala 学习笔记(一)------函数传名调用(call-by-name)
- CallByValue和CallByName区别
- Call by Name, Call by Value
- call by value ;call by address/reference ;call by name;call by pointer
- 回归基础系列-call by value / call by reference区别与实例
- Is Python call-by-value or call-by-reference?
- 回归基础系列-call by value / call by reference区别与实例