desehawk 发表于 2015-3-13 01:09:17

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

feng01301218 发表于 2015-3-14 16:08:43

{:soso_e115:}
页: [1]
查看完整版本: Scala中的call-by-name与call-by-value