call by name 与 call by value的区别
两者的区别就是调用之前需不需要evaluation,前者不需要,后者需要。例如一个函数$f(x, y) = x$,我们分别调用$f(1+1, 2 )$,call by name 直接引用1+1,再计算出为2,而 call by value是先算出函数参数的值,再去调用$f(2, 2 )$,scala默认是call by value,但是可以在需要call by name 的参数加箭头如=>
。
scala里面定义变量def
和val
的区别即在此,前者是call by name,例如我们分别定义两个函数:
1 | def loop: Boolean = loop |
函数x可以被成功定义,而后者不行,因为在call by name 的参数evaluation的时候就进入死循环了。