2012-10-21 143 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