2012-06-30 4 views
12

Selbst Typ sieht aus wie das folgende Beispiel:Was ist der Grund hinter dem `=>` in einem Selbst-Typ?

trait A { self: String => } 

Dieses sagt, dass Merkmal A (oder ein Subtyp davon) muss die Klasse String erben.

Das Schlüsselwort self wird gefolgt von : analog zu einer Variablen in var s: String, wo der Typ nach : kommt.

Aber was ist der => Zustand für in einem Selbst-Typ? Was ist der Grund dafür?

+1

Es ist ein merkwürdiges bisschen Syntax ich denke, da es wie ein Pfeil scheint, der auf etwas zeigen würde ... – david

+0

Ja, zu Beginn des Lernens Scala, dachte ich immer, dass der Pfeil auf den Rest des Körpers zeigt , sah aus wie eine Funktion und verwirrte mich sehr. –

Antwort

11

Nur raten Arbeit ... Sie benötigen ein bestimmtes Trennzeichen der Selbstdeklaration. Stellen Sie sich vor, die => wurde einfach weggelassen. this: String wäre eine syntaktisch gültige Anweisung (obwohl der Typchecker sich beschweren wird).

Also was sollte das Trennzeichen sein? Sie möchten keine verschachtelten Klammern wie trait A { self: String { ... }}. Welche nicht gepaarten existierenden Begrenzer existieren also? => ist die einzige, die ich mir vorstellen kann.

Wo wird => woanders verwendet? Als Zucker für Funktionstypen (A => B) und für Funktionskörper (i: Int => i + 1). Auch für Argumente mit Name und für die Fälle einer Musterübereinstimmung. Diese letzte Verwendung ist etwas kohärent mit dem Selbst-Typ. Es ist so, als würde man this einem bestimmten Typ zuordnen und dann den Körper entsprechend dieser "Übereinstimmung" definieren. Ich weiß nicht, vielleicht ist das eine alberne Analogie.

+0

Vielen Dank für Ihre Gedanken zu diesem Thema. Klingt gut für mich. Ich habe in eine ähnliche Richtung gelernt. –

9

Beachten Sie, dass self kein Schlüsselwort ist, sondern ein normaler Bezeichner. Sie können wirklich jeden anderen gültigen Bezeichner anstelle von self schreiben. Und : nach einem Ausdruck ist ein Typ Zuschreibung, etwas völlig gültig überall, wo ein Ausdruck gültig ist.

Die => ist, was Scala sagt, dass es einen Selbst-Typ gibt. Ansonsten sieht self: Type wie eine einfache Aussage aus, ein Ausdruck. Zum Beispiel:

Das ist gültig Scala-Code, und es hat keinen Selbsttyp.

+0

Guter Punkt, danke. Gibt es einen konkreten Grund, das '=>' als Symbol für einen Selbst-Typ zu verwenden oder wird es einfach aufgenommen, weil es gut zum Rest der Scalas-Syntax passt? –

+0

@JohnThreepwood Odersky ist den reservierten Symbolen und Schlüsselwörtern abgeneigt, also versucht er die wiederzuverwenden, die er hat. Ich denke, dass er damit zu weit gegangen ist, wenn es um Unterstreichungen geht, aber so ist es. –

0

this ist im Bereich innerhalb des Körpers einer Klasse, so in diesem Sinne ist es ein Parameter (obwohl wir es nie so denken). Die Syntax des Selbst-Typs macht es einfach explizit und erlaubt es einem anderen Namen (und Typ) zu geben. So wird der Pfeil zu einer sehr guten Wahl als Trennzeichen zwischen dem Ordner und seinem Umfang.