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?
@paradigmatic vale solo per le chiavi di una mappa. –
@mattb Il mio male. Rimuovo il mio commento – paradigmatic