Sì, it's a bug (SI-6165, SI-6880).
Esploriamo ulteriormente. Questo è il codice decompiled per entrambi i casi:
private[this]
:
class A extends Object {
<paramaccessor> private[this] var i: Int = _;
override def toString(): String = scala.Int.box(A.this.i).toString();
def <init>(i: Int): com.yuval.A = {
A.this.i = i;
A.super.<init>();
scala.this.Predef.println("i = ".+(scala.Int.box(i)));
i = i.-(1);
scala.this.Predef.println("After decrement, i = ".+(scala.Int.box(i)));
()
}
};
Qui, vediamo che var i
viene creato per l'oggetto e si accede direttamente nel codice. Vediamo che i
è assegnato a A.this.i
, che è un'assegnazione diretta al campo. Successivamente, il valore mutato viene assegnato a i
, l'argomento metodo, non a A.this.i
, il campo della classe A
. Il valore attuale i
viene ombreggiato.
Al contrario, quando è i
private
:
class A extends Object {
<paramaccessor> private[this] var i: Int = _;
<accessor> <paramaccessor> private def i(): Int = A.this.i;
<accessor> <paramaccessor> private def i_=(x$1: Int): Unit = A.this.i = x$1;
override def toString(): String = scala.Int.box(A.this.i()).toString();
def <init>(i: Int): com.yuval.A = {
A.this.i = i;
A.super.<init>();
scala.this.Predef.println("i = ".+(scala.Int.box(A.this.i())));
A.this.i_=(A.this.i().-(1));
scala.this.Predef.println("After decrement, i = ".+(scala.Int.box(A.this.i())));
()
}
};
Qui, si vede che ha un i
metodi getter e setter, a differenza private[this]
. Vediamo anche che il decremento viene eseguito su A.this.i_
, che è il setter per il membro del campo A.this.i
.
fonte
2016-05-16 14:37:48
Sì, ho lo stesso comportamento. E no, non posso spiegarlo :( – Dima
Ho appena provato questo ed è un risultato ancora più strano: http://pastebin.com/fKCjnWVZ – Martijn
@Martijn hai avuto il comportamento opposto, fondamentalmente. Probabilmente è a causa dello stesso bug, la cui essenza sembra essere che il codice compilato ha anche un i locale la cui esistenza non è trasparente (vedi le risposte). Nel tuo codice, stai cambiando this.i, che non influenza l'i locale del codice compilato. –