14 Stimmen

Was ist der Grund für das `=>` in einem Selbsttyp?

Ein Selbsttyp sieht wie das folgende Beispiel aus:

trait A { self: String => }

Dies besagt, dass das Merkmal A (oder ein Subtyp davon) muss die Klasse String .

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

Aber was bedeutet die => Zustand für in einem Selbsttyp ? Was ist der Grund dafür?

11voto

0__ Punkte 65479

Reine Raterei... Sie brauchen ein bestimmtes Begrenzungszeichen für die Selbsttyp-Deklaration. Stellen Sie sich die => wurde einfach weggelassen. this: String wäre eine syntaktisch gültige Anweisung (obwohl die Typüberprüfung sich beschweren würde).

Welches sollte also das Begrenzungszeichen sein? Sie möchten keine verschachtelten Klammern wie trait A { self: String { ... }} . Welche nicht gepaarten Begrenzungszeichen gibt es also? => ist die einzige, die mir einfällt.

Wo ist => anderswo verwendet? Als Zucker für Funktionstypen ( A => B ) und für Funktionskörper ( i: Int => i + 1 ). Auch für Call-by-Name-Argumente und für die Fälle einer Musterübereinstimmung. Die letztgenannte Verwendung steht in gewisser Weise im Einklang mit dem Selbsttyp. Es ist wie eine Übereinstimmung mit this von einem bestimmten Typ zu sein, und dann den Körper in Abhängigkeit von dieser "Übereinstimmung" zu definieren. Ich weiß nicht, vielleicht ist das eine dumme Analogie.

10voto

Daniel C. Sobral Punkte 290004

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

En => ist das, was Scala mitteilt, dass es einen Selbst-Typ gibt. Andernfalls, self: Type sieht aus wie eine einfache Aussage, ein Ausdruck. Zum Beispiel:

class A
class B extends A {
  this: A
}

Das ist gültiger Scala-Code, und er hat keinen self-Typ.

0voto

Iulian Dragos Punkte 5652

this innerhalb des Körpers einer Klasse in den Geltungsbereich fällt, also in diesem Sinne ein Parameter ist (auch wenn wir das nie so sehen). Die Selbsttyp-Syntax macht ihn einfach explizit und erlaubt es, ihm einen anderen Namen (und Typ) zu geben. So wird der Pfeil zu einer sehr guten Wahl als Trennzeichen zwischen dem Binder und seinem Bereich.

CodeJaeger.com

CodeJaeger ist eine Gemeinschaft für Programmierer, die täglich Hilfe erhalten..
Wir haben viele Inhalte, und Sie können auch Ihre eigenen Fragen stellen oder die Fragen anderer Leute lösen.

Powered by:

X