Scala中的call-by-name与call-by-value
问题导读
1.在scala中函数的参数有哪两种定义方式?
2.打印过程中call-by-value时, block 只会被计算一次, 而call-by-name是如何计算的?
static/image/hrline/4.gif
在scala中函数的参数有两种定义方式分别叫做call-by-name和call-by-value, 例如下面的两个函数定义, 他们都接受一个函数block作为参数, 循环10次打印传入函数(block)的运行结果
def callByName(block: => T) = {
for( i<-0 until 10){
println(block)
}
}
def callByValue(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
{:soso_e115:}
页:
[1]