2016-07-20 10 views
1

Ich war auf Best Practices für die Implementierung von Slick lesen, und wurde this example untersucht. Darin gibt es dieses Konstrukt:dies: SomeObject => Objekt Konstrukt

trait BankRepository extends BankTable { this: DBComponent => 
    ... //A bunch of code 
} 

Ich verstehe nicht, den this: DBComponent => Teil. In diesem Fall ist DBComponent ein einfaches Merkmal, das an anderer Stelle definiert wurde (Sie finden es im obigen Link). Was ich nicht verstehe, ist:

  • Was bedeutet die this: DBComponent => tun konstruieren. Meine IDE beschwert sich nicht, aber sie verbindet sich auch nicht mit der Funktion, die von => ausgeführt wird. Meine Intuition ist, dass es sagt, der Rest des Codes ist ein Wert, der zurückgegeben wird, aber ich bin nicht klar darüber, was es aufruft, oder was der Wert genau zurückgegeben hat.
  • Was nenne ich dieses Konstrukt? Wie bei vielen symbolträchtigen Konstrukten ist es schwer, nach Dokumenten zu suchen/zu suchen, da diese eindeutig vom Kontext abhängig sind. Aber sogar den Kontext zu beschreiben ist schwierig. Wie heißt dieses Konstrukt?

Antwort

4

Es heißt Selbsttyp. Es ist im Grunde ein Vertrag, der besagt, dass jede Klasse, die dieses Merkmal erweitert (eingemischt) muss enthalten. Und als solcher sollte der Compiler annehmen, dass DBCompenent Elemente für den folgenden Code im Umfang sind.

Hier ist eine link auf eine Beschreibung davon aus Programmierung in Scala, Odersky et al, 1. Auflage (etwas veraltet, aber immer noch genau auf den meisten Themen).

+0

Interessant! Haben Sie einen Link zur Dokumentation? Sollte dies auch als ein Einzeiler betrachtet werden, der magisch auf die Typbeschreibung gehoben wird, oder wirkt sich das Folgende auf den Typ aus? Könnte ich es zum Beispiel in die Mitte des Merkmals setzen? –

+0

Ich habe es nur an der Spitze des Trait/Class-Code gesehen. Einige schnelle Experimente mit der IntelliJ-IDE zeigen an, dass der Compiler sie ablehnt, wenn sie nicht an der Spitze steht. – jwvh

+0

Meine Experimente ergaben das gleiche Ergebnis, aber ich war mir nicht sicher, wie genau der Compiler bei den Typinformationen innerhalb der Klammern kam. (Weit über mein Verständnis von Compilern.) Danke für die Hilfe! –

Verwandte Themen