私は質問が異端的だと思う。確かに、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
を取得する方法足りませんか?または、最初にa
をval
にコピーしてから、後で副作用なく自由に修正する必要がありますか?
まあ;:あなたは、ラムダが作成されたとき
a
の現在の値を使用したい場合は、このような値をコピーする必要が(par:Int)=> par + aNow} '...これはC++と同等以上の長さです! –一般的には、「var」を避けて、とにかく「val」を優先するのが好ましいです。 –
私はそれが私が逃していたものだと思う:)現時点で私の頭の中でほとんどの値は変更可能です、私はそれを変更する必要があります! –