1

私は変更可能なマップで出現を数えてきました:

var bar = collection.mutable.Map[Int, Int]().withDefaultValue(0)

キーが既に存在するbar(a) += bかどうかに関係なく、問題なく動作するようになりました (存在する場合は追加されます)。abar

可変マップの可変マップで同じことを試しました:

var foo = collection.mutable.Map[Int, collection.mutable.Map[Int, Int]]().
          withDefaultValue(collection.mutable.Map().withDefaultValue(0))

foo(a)(b) += xシンタックス シュガーなしではどのように見えますか?

Scalaのシンタックス シュガーのすべてのインスタンスは何ですか? 私はそれが次のように展開すると仮定します:

foo.apply(a).put(b, foo.apply(a).apply(b) + x)

しかし、なぜこれはfoo導入例のようにそれ自体を更新しないのでしょうか (つまり、キーが以前に存在しなかった場合foo、専用の値がありません)。a

編集:Perseidsが指摘したように、foo(a)(b) += x変更可能なデフォルト値が変更されます。これは望ましい機能ですか?DaoWengetOrElseUpdateの提案どおりに使用することが、両方の問題を克服するための最良の方法のようです。しかし、これは type の関数ではうまく機能しますが、 type の関数では非常に扱いにくくなります。だから私はまだどんな提案でもうれしいです!Int => Int => IntInt => Int => Int => Int => Int

4

2 に答える 2

1

foo(a)(b) += xシンタックス シュガーなしではどのように見えますか?

foo(a)(b)によって返されるオブジェクトに名前付きのメソッドがあるかどうかによって異なります+=。もしそうなら、それは以下と同等です:

foo.apply(a).apply(b).+=(x)

そうでない場合は、次と同等です。

foo.apply(a).update(b, foo.apply(a).apply(b).+(x))

の重複評価がないことを除いてfoo.apply(a)(私は思う。)

于 2013-10-09T10:21:05.567 に答える