2017-03-01 2 views
1

私は質問が異端的だと思う。確かに、C++ 11でラムダを高く評価していたので、私は人工的なものとしてではなく、最初からそれらをサポートするために作られた言語を学ぶことにとても興奮していました。ScalaクロージャはC++ラムダほど柔軟性がありますか?

しかし、私はC++ 11ラムダでできることすべてをScalaで行う方法を理解できません。

変数として渡された数値に変数aが含まれている値を加算する関数を作成したいとします。 C++では、私はaを変更した場合、第二のバージョンは、その動作を変更します、今すぐ両方

int a = 5; 
auto lambdaVal = [ a](int par) { return par + a; }; 
auto lambdaRef = [&a](int par) { return par + a; }; 

を行うことができます。最初は5を追加し続けます。 Scalaで

、私はこの

var a = 5 
val lambdaOnly = (par:Int) => par + a 

をすれば、私は基本的にlambdaRefモデルを取得:aを変更すると、すぐに機能が何をするのか変更されます。 (この時aはだけでもそのコードでは、ラムダの宣言で言及されていないことを考えると、私にはややもっともらしいと思われる。しかし、それは聞かせて)

私はlambdaValを取得する方法足りませんか?または、最初にavalにコピーしてから、後で副作用なく自由に修正する必要がありますか?

答えて

1

関数定義内のaは、変数aを参照します。 {valをaNowは= `私は1行で書くことができれば、

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

まあ;:あなたは、ラムダが作成されたときaの現在の値を使用したい場合は、このような値をコピーする必要が(par:Int)=> par + aNow} '...これはC++と同等以上の長さです! –

+1

一般的には、「var」を避けて、とにかく「val」を優先するのが好ましいです。 –

+0

私はそれが私が逃していたものだと思う:)現時点で私の頭の中でほとんどの値は変更可能です、私はそれを変更する必要があります! –

関連する問題