In Ruby verstehe ich die Grundidee von extend
. Was passiert jedoch in diesem Codesegment? Was macht konkret extend
? Ist es nur eine bequeme Möglichkeit, die Instanzmethoden in Klassenmethoden umzuwandeln? Warum sollten Sie dies so tun, anstatt von Anfang an Klassenmethoden anzugeben?
module Rake
include Test::Unit::Assertions
def run_tests # etc.
end
# what does the next line do?
extend self
end
extend self
damit zu tun hat.In einem Modul ist self die Modulklasse selbst. So zum Beispiel
wird Rake so zurückgeben,
Grundsätzlich stehen ihm die in Rake definierten Instanzmethoden zur Verfügung, damit Sie dies tun können
quelle
Für mich ist es immer hilft , zu denken ,
extend
wieinclude
innerhalb der Singleton-Klasse (auch als Meta oder Eigenklasse bekannt) zu betrachten.Sie wissen wahrscheinlich, dass in der Singleton-Klasse definierte Methoden im Grunde Klassenmethoden sind:
Jetzt, da wir das wissen,
extend
werdeninclude
die Methoden im Modul innerhalb der Singleton-Klasse und damit als Klassenmethoden verfügbar gemacht:quelle
Um Link Rot zu vermeiden, wird der von user83510 verlinkte Blog-Beitrag von Chris Wanstrath unten (mit seiner Erlaubnis) erneut veröffentlicht. Trotzdem ist nichts besser als ein Original. Verwenden Sie seinen Link, solange er funktioniert.
→ Singletons singen 18. November 2008 Es gibt Dinge, die ich einfach nicht verstehe. David Bowie zum Beispiel. Oder die südliche Hemisphäre. Aber nichts verwirrt mich so sehr wie Rubys Singleton. Weil es wirklich völlig unnötig ist.
Folgendes sollen Sie mit Ihrem Code tun:
Aber das ist verrückt. Kämpfe gegen die Macht.
Warum nicht? Die API ist prägnanter, der Code ist einfacher zu testen, zu verspotten und zu stubben, und es ist immer noch kinderleicht, ihn bei Bedarf in eine richtige Klasse zu konvertieren.
((Copyright sollte zehn Chris Wanstrath)
quelle
extend self
Enthält alle vorhandenen Instanzmethoden als Modulmethoden. Dies ist gleichbedeutend mit sagenextend Rake
. Ist auchRake
ein Objekt der KlasseModule
.Ein anderer Weg, um ein gleichwertiges Verhalten zu erreichen, ist:
Dies kann verwendet werden, um eigenständige Module mit privaten Methoden zu definieren.
quelle