scala - 不确定我的任务去向

标签 scala

今天,我在对存储在 map 中的案例类实例中的 var 字段进行赋值时遇到了一些问题。这是 repl 中演示问题的一个简单 session :

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 对我的作业做了什么?

最佳答案

这似乎是一个错误。如果使用 2.10 nightly 执行此操作,则会抛出错误消息:

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

我创建了一个ticket为此。

关于scala - 不确定我的任务去向,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/12995322/

相关文章:

Scala HashMap 多个值

scala - 调用 toArray 时编译器错误

scala - 在 ScalaTest + Mockito 中使用 Slick 模拟数据库并测试更新

scala - 有什么方法可以使用凿子从 verilog 文本内容生成黑盒吗? (在scala中根据文本内容定义val)

scala - 在 Scala 编译错误中省略包名称

scala - 如何将源附加到 Scala IDE 中的 SBT 托管依赖项?

scala - Scala 中的类型推断和模式匹配

scala - 过滤 Scala 失败的任一列表

java - SBT 运行 scala 和 java 之间的差异?

java - 为使用存储的 actor 设置有界邮箱