2012-10-21 12 views
8

Oggi ho riscontrato alcuni problemi relativi all'assegnazione di un campo var in un'istanza della classe del caso memorizzata in una mappa. Ecco una semplice sessione nel repl che dimostra il problema:Non so dove il mio incarico sta andando

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)) 

Il primo tentativo di assegnazione non fa nulla. Tuttavia, la memorizzazione dell'istanza in una val e l'esecuzione dell'assegnazione funzionano, così come avviene chiamando direttamente il metodo di assegnazione per il campo.

Sto usando Scala 2.9.2.

Se questo comportamento è previsto, sarebbe bello se qualcuno potesse spiegarmelo perché non riesco a dare un senso a questo momento. Se questo è un bug, allora sarebbe bene saperlo.

In entrambi i casi, sarebbe anche interessante sapere dove sta andando il primo incarico m('x).x = 7. Presumo che qualcosa si stia mutando da qualche parte-Non ho proprio idea di cosa possa essere quel qualcosa.

Aggiornamento: Sembra che questo accada solo nel repl. Ho appena provato a compilare il codice e l'assegnazione avviene come previsto. Quindi, qual è il repl fare al mio incarico?

+0

@paradigmatic vale solo per le chiavi di una mappa. –

+0

@mattb Il mio male. Rimuovo il mio commento – paradigmatic

risposta

6

Questo sembra essere un bug. Se si esegue questo con un 2.10 di notte un messaggio di errore viene generato:

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

ho creato una ticket per questo.

+0

Dal tuo ticket sembra che stia effettivamente causando un errore in 2.9.2 repl, ma non viene visualizzato alcun errore. È giusto? – DaoWen

+1

@DaoDao: Sì, è corretto. – sschaef

+0

Grazie per l'informazione, e grazie per aver creato il biglietto! – DaoWen

Problemi correlati