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

在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

  

posted on 2012-05-31 10:49  nixil  阅读(1445)  评论(0编辑  收藏  举报