Scala闭包是否像C ++ lambdas一样灵活?

时间:2017-03-01 08:57:19

标签: scala c++11 lambda

我知道这个问题似乎有些异端。事实上,我非常欣赏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,然后才能自由修改它而没有副作用?

1 个答案:

答案 0 :(得分:1)

函数定义中的a引用变量a。如果要在创建lambda时使用当前值a,则必须复制值如下:

val lambdaConst = {
  val aNow = a
  (par:Int) => par + aNow
}