2017-03-01 37 views
1

我知道这个问题似乎有点异端。事实上,我非常喜欢C++ 11中的lambda表达式,所以我非常激动地学习一种从一开始就支持它们的语言,而不是一个人为的添加。Scala是否像C++ lambda一样灵活?

但是,我无法弄清楚如何用Scala处理C++ 11 lambda表达式。

假设我想创建一个函数,该函数将作为参数传入的数字加上变量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

函数定义中的a指的是变量a。如果你想使用的a当前值的拉姆达被创建的时候,你必须复制这样的值:

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

好吧,如果我能在一行写'{VAL aNow =一个; (par:Int)=> par + aNow}'......它不比C++等效的时间长! –

+1

一般来说,无论如何避免使用'var's并优先选择'val'是最好的选择。 –

+0

我想这就是我所缺少的:)在我眼前的大多数值都是可变的,我必须改变它! –

相关问题