2016-10-23 4 views
1

ich ein Merkmal schreibe die eine Funktion enthält:Zugriff auf eine Scala Trait-Methode in einem anderen Verfahren

trait MyTrait[X,Y] { 
    def f(x : X) : Y 
} 

Ich versuche, eine Map-Funktion hinzuzufügen:

trait MyTrait[X,Y] { 
    def f(x : X) : Y // the outer f 

    def map[Z](g : Y => Z) : MyTrait[X,Y] = MyTrait[X,Z] { 
    //namespace conflict : I need to access the outer f within this f 
    override def f(x : X) : Z = outerF andThen g 
    } 
} 

Meine Frage ist: wie referenziere ich die äußere f? Ich habe super.f und this.f vergeblich versucht. Ich bin mir sicher, dass dies eine grundlegende Frage ist, die zuvor gestellt wurde, aber es ist nicht sehr "google-fähig", z.B. einfach zu suchen.

Vielen Dank im Voraus für Ihre Überlegung und Antwort.

Antwort

2

können Sie self Typ verwenden

trait MyTrait[X,Y] { 
    self => 
    def f(x : X) : Y // the outer f 

    def map[Z](g : Y => Z) : MyTrait[X,Y] = MyTrait[X,Z] { 
    override def f(x : X) : Z = self.f andThen g 
    } 
} 
+0

Vielen Dank. Ich musste eine kleine Änderung vornehmen, um dein Beispiel zu kompilieren. –

+0

@RamonJRomeroyVigil cool .. danke :) – pamu

1

Sie auch override def f(x : X) : Z = MyTrait.this.f andThen g verwenden können.

Verwandte Themen