8

var今日、マップに格納されているケース クラス インスタンスのフィールドに割り当てを行っているときに、いくつかの問題に遭遇しました。問題を示す repl の簡単なセッションを次に示します。

scala> case class X(var x: Int)
defined class X

scala> val m = Map('x -> X(1))
m: scala.collection.immutable.Map[Symbol,X] = Map('x -> X(1))

scala> m
res0: scala.collection.immutable.Map[Symbol,X] = Map('x -> X(1))

scala> m('x).x = 7

scala> m
res1: scala.collection.immutable.Map[Symbol,X] = Map('x -> X(1))

scala> val x = m('x)
x: X = X(1)

scala> x.x = 7
x.x: Int = 7

scala> x
res2: X = X(7)

scala> m
res3: scala.collection.immutable.Map[Symbol,X] = Map('x -> X(7))

scala> m('x).x_=(8)

scala> m
res5: scala.collection.immutable.Map[Symbol,X] = Map('x -> X(8))

割り当ての最初の試みは何もしません。ただし、インスタンスを val に格納してから割り当てを行うと、フィールドの割り当てメソッドを直接呼び出すのと同様に機能します。

Scala 2.9.2 を使用しています。

これが予期された動作である場合、誰かが私にそれを説明できればいいと思います. これがバグである場合は、それも知っておくとよいでしょう。

m('x).x = 7いずれにせよ、その最初の割り当てがどこに向かうのかを知ることも興味深いでしょう. どこかで何かが変異していると思いますが、それが何であるかはわかりません。

更新:これは repl でのみ発生するようです。コードをコンパイルしようとしたところ、割り当てが期待どおりに行われました。それで、replは私の課題に何をしていますか?

4

1 に答える 1

6

これはバグのようです。これを 2.10 nightly で実行すると、エラー メッセージがスローされます。

scala> m('x).x = 7
<console>:10: error: ')' expected but string literal found.
 + "m(scala.Symbol("x")).x: Int = " + `$ires0` + "\n" 
                    ^

このためのチケットを作成しました。

于 2012-10-21T08:19:14.607 に答える