我知道这个问题似乎有些异端。事实上,我非常欣赏C ++ 11中的lambdas,我很高兴能够学习一种语言,这种语言是从一开始就支持它们而不是作为一种人为的补充。
但是,我无法弄清楚如何处理Scala我可以用C ++ 11 lambdas做什么。
假设我想创建一个函数,该函数将作为参数传递的数字添加到变量a
中包含的某个值。在C ++中,我可以做到这两点
int a = 5;
auto lambdaVal = [ a](int par) { return par + a; };
auto lambdaRef = [&a](int par) { return par + a; };
现在,如果我更改a
,第二个版本将改变其行为;但第一个会继续添加5
。
在Scala中,如果我这样做
var a = 5
val lambdaOnly = (par:Int) => par + a
我基本上得到lambdaRef
模型:更改a
将立即更改函数的功能。
(这似乎有些似是而非,因为这次a
甚至没有在lambda的声明中提及,只是在它的代码中。但是让它成为)
我错过了获取lambdaVal
的方法吗?或者我是否必须先将a
复制到val
,然后才能自由修改它而没有副作用?
答案 0 :(得分:1)
函数定义中的a
引用变量a
。如果要在创建lambda时使用当前值a
,则必须复制值如下:
val lambdaConst = {
val aNow = a
(par:Int) => par + aNow
}