Wie benutze ich ein Scala-Merkmal mit "self" -Referenz?
Sah ich einige code schreiben, die Eigenschaft, wie folgend:
trait SelfAware { self: Self =>
....
}
class Self
val s = new Self with SelfAware //this is ok
println(s.self) //error happened
class X
new X with SelfAware //error happened here
Ich würde gerne wissen, warum der Fehler passiert ist und wie Sie Merkmal in dieser Art und Weise?
Kommentar zu dem Problem
Was genau Fragen Sie?
Ich würde gerne wissen, warum der Fehler passiert ist und wie Sie Merkmal in dieser Art und Weise?
Ich bin froh, dass Sie lief in diesen Fehler, ich lernte ein bisschen mehr über Merkmale, weil es. 🙂 Besonders interessant ist es, dass Sie angeben können Einschränkungen in dieser Weise über das, was Arten von Dingen, die die Eigenschaft angewendet werden kann.
Da dies das erste mal, dass ich auf diesen Typ von syntax Frage ich mich, was ist der Unterschied zwischen
- trait-SomeTrait {: SomeType => .... }
und Eigenschaft SomeTrait erstreckt SomeType { ... }
? InformationsquelleAutor der Frage Evans Y. | 2012-04-24
Du musst angemeldet sein, um einen Kommentar abzugeben.
Der Fehler Auftritt, da haben Sie eingeschränkt, die Art der
this
Referenz (die Sie benannt habenself
) TypSelf
. Wenn Sie sagennew Self with SelfAware
, das ist OK, denn ein Objekt vom TypSelf
wie Sie fragte. Aber wenn Sie sagennew X with SelfAware
, es gibt keine Beweise dafür, dassX
ist in keiner Weise ein Untertyp vonSelf
.In Ihr neues Objekt vom Typ
X with SelfAware
, was wäre die Art Ihrerself
Mitglied? Gut, es wäre nicht sein TypSelf
, aber der TypX
. Aber Sie haben die EigenschaftSelfAware
so dassself
muss vom TypSelf
, so erhalten Sie eine Art Fehler.InformationsquelleAutor der Antwort Apocalisp
Fand ich auch die Antwort hier: http://markthomas.info/blog/?p=92
Selbst Arten
Bestellt gemischt werden kann, in jeder Klasse; Sie hängt nicht von einzelnen Methoden oder Felder der Klasse, es ist gemischt. Manchmal ist es sinnvoll für ein Merkmal zu können, verwenden Sie die Felder oder Methoden einer Klasse ist es gemischt, kann dies durch Angabe eines " self-Typ für die Eigenschaft. Ein selbst geben kann angegeben werden, für eine Klasse oder eine Eigenschaft, wie folgt:
selbst im Kontext dieser trait bezieht sich auf diese. Aliasing-dies ist nützlich für die geschachtelte Klassen oder traits, wo es sonst schwierig sein, den Zugriff auf ein bestimmtes dieses. Die syntax erweitert werden kann, um anzugeben, eine untere-Schranken auf diese, wenn dies die Eigenschaft oder Klasse kann die Funktionen, die von dieser unteren Klasse gebunden, so kann es erweitern oder ändern Ihr Verhalten.
Kann der compiler überprüfen, dass jede Klasse in einer Hierarchie mit Rechtschreibprüfung oder erweitert RandomAccessSeq[char], so dass die Rechtschreibprüfung kann nun die Verwendung der Felder oder Methoden von RandomAccessSeq[char]
InformationsquelleAutor der Antwort Evans Y.
Antwort auf die andere Hälfte der Frage (warum
println(s.self)
produzieren ein Fehler?), das ist, weilself
ist nicht ein Feld vonSelfAware
. Es kann verwendet werden, um zu definieren, wie Felder, jedoch:InformationsquelleAutor der Antwort Dan Burton