今天我遇到了一些问题,分配给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))
Run Code Online (Sandbox Code Playgroud)
第一次分配尝试什么也没做.但是,将实例存储在val中然后执行赋值工作,就像直接调用字段的赋值方法一样.
我正在使用Scala 2.9.2.
如果这是预期的行为,如果有人可以向我解释它会很好,因为我现在似乎无法理解它.如果这是一个错误,那么也应该知道.
无论哪种方式,知道第一次m('x).x = 7任务的去向也很有趣.我假设某些事情在某个地方发生了变异- 我只是不知道那是什么东西.
更新:看起来这只发生在repl中.我只是尝试编译代码,并按预期进行分配.那么,repl对我的任务做了什么?
这似乎是一个错误.如果每晚使用2.10执行此操作,则会抛出错误消息:
scala> m('x).x = 7
<console>:10: error: ')' expected but string literal found.
+ "m(scala.Symbol("x")).x: Int = " + `$ires0` + "\n"
^
Run Code Online (Sandbox Code Playgroud)
我为此创建了一张票.
| 归档时间: |
|
| 查看次数: |
167 次 |
| 最近记录: |