Wenn ich eine Methode zu einer Klasse in Scala hinzufügen will, muß ich, wie etwas tun:warum „pimp my Bibliothek“ Verstehen in Scala auf diese Weise definiert wurde
class RichFoo(f: Foo) {
def newMethod = f.bar()
}
object RichFoo {
implicit def foo2Rich(f: Foo) = new RichFoo(f)
}
Dann in der Schöpfung f.newMethod
resultieren aus RichFoo
Instanz und rufen Sie die Methode auf.
Ich versuche zu verstehen, warum es nicht ähnlich Ruby definiert wurde:
override class Foo {
def newMethod = bar
}
Der Compiler an dieser Definition aussehen kann, und eine FooOverride Klasse mit statischer Methode newMethod erstellen, die einen Parameter vom Typ Foo bekommt und ruft seine Balkenmethode auf. So implementiert Scala Eigenschaften. Ich muss immer noch das Paket mit der Foo-Überschreibung importieren, um es zu verwenden.
Es scheint weniger Tippen zu erfordern, erfordert nicht, dass ich Namen erfinde, und hat eine bessere Leistung (keine Methode aufrufen und ein Objekt erstellen). Alles, was die implizite Konvertierungsmethode tut, kann innerhalb der zusätzlichen Methode erfolgen.
Ich bin mir sicher, ich habe etwas verpasst und möchte einen Einblick in was bekommen.
Does Rubin wirklich heraus ausführen Scala in diesem Fall oder spekulieren Sie, dass eine offene Implementierungsklasse Kann so schnell wie ein geschlossen gemacht werden? –
Ich schlage eine Fassade vor, die so aussieht, als würde man eine Klasse wieder öffnen, ruft aber tatsächlich nur statische Methoden auf. Der scala-Compiler macht solche Dinge ständig (Eigenschaften werden mit statischen Methoden zu einer Schnittstelle und einer Klasse kompiliert). Ich spekuliere, dass es weniger codiert und schneller ist als die aktuelle implizite Methode – IttayD