2012-10-21 81 views
8

我今天遇到了一些问题,在存储在地图中的案例类实例中分配var字段。以下是展示问题的简单会话:不知道我的任务去哪里

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。我只是试着编译代码,分配按预期发生。那么,我的工作是什么?

+0

@paradigmatic这只对地图的键是正确的。 –

+0

@mattb我的不好。我删除了我的评论。 – paradigmatic

回答

6

这似乎是一个错误。如果一个执行这个带有2.10每晚的错误信息被抛出:

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

我创建了这个ticket

+0

从票证看来,它实际上在2.9.2 repl中也会导致错误,但不会显示错误。是对的吗? – DaoWen

+1

@DaoWen:是的,这是正确的。 – sschaef

+0

感谢您的信息,并感谢您创建票! – DaoWen