Wenn ich den folgenden Code ausführe,
%Vor%Ich bekomme:
%Vor% Wenn ich private[this]
durch private
ersetze, bekomme ich das erwartete Verhalten, d. h. die letzte Ausgabezeile wird a = 0
. Ich verwende IntelliJ 2016.1.2, Scala Plugin Version 3.0.6. Und Scala-SDK-2.11.8.
Ja, es ist ein Fehler ( SI-6165 , SI-6880 ).
Lasst uns weiter erkunden. Dies ist der dekompilierte Code für beide Fälle:
private[this]
:
Hier sehen Sie, dass var i
für das Objekt erstellt wurde und direkt im Code auf zugegriffen wird . Wir sehen, dass i
A.this.i
zugewiesen ist, was eine direkte Zuweisung an das Feld ist. Später wird der mutierte Wert i
zugewiesen, das Methodenargument, nicht A.this.i
, das Feld der Klasse A
. Der tatsächliche Wert i
wird beschattet.
Im Gegensatz dazu, wenn i
ist private
:
Hier sehen wir, dass i
eine Getter- und Setter-Methode hat, im Gegensatz zu private[this]
. Wir sehen auch, dass die Dekrementierung an A.this.i_
erfolgt, was der Setter für das Feldelement A.this.i
ist.
Es ist ein Fehler. Siehe SI-6880 .
private[this]
in einem Konstruktor var bewirkt, dass es sich fälschlicherweise selbst überschreibt und Sie den ursprünglichen Wert anstelle des gewünschten Accessors erhalten.
Tags und Links scala