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 回答