分享

Scala中的call-by-name与call-by-value

desehawk 发表于 2015-3-13 01:09:17 [显示全部楼层] 回帖奖励 阅读模式 关闭右栏 1 9953

问题导读

1.在scala中函数的参数有哪两种定义方式?
2.打印过程中call-by-value时, block 只会被计算一次, 而call-by-name是如何计算的?






在scala中函数的参数有两种定义方式分别叫做call-by-name和call-by-value, 例如下面的两个函数定义, 他们都接受一个函数block作为参数, 循环10次打印传入函数(block)的运行结果

def callByName[T](block: => T) = {
    for( i<-0 until 10){
        println(block)
    }
}
def callByValue[T](block: T) = {
    for( i<-0 until 10){
        println(block)
    }
}
 表面上两者的区别在于一个=> , 实际运行时的区别是什么呢? 其实正如其名,call-by-value时, block 只会被计算一次, 而call-by-name则每次都要计算一次, 当然还有一个定语, "在该函数(这里指callByValue和callByName)内部". 所以callByValue中虽然循环调用了println(block)10次, 但实际上block只执行了一次. 后面就一直用第一次计算出来的值了. 例如下面的代码

var a = 1;
def sum = {
    a = a + 1
    a
}
callByName(sum)
callByValue(sum);
callByValue(sum);


产生的输出是

2
3
4
5
6
7
8
9
10
11
12
12
12
12
12
12
12
12
12
12
13
13
13
13
13
13
13
13
13
13

已有(1)人评论

跳转到指定楼层
feng01301218 发表于 2015-3-14 16:08:43
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

关闭

推荐上一条 /2 下一条