Ruby hat bereits mehrere built-in callbacks. Gibt es einen Rückruf für diesen Fall? Ein bisschen wie method_added, aber für Klassen (oder Konstanten) innerhalb eines Moduls anstelle von Instanzmethoden innerhalb einer Klasse.Rückruf für innerhalb eines Moduls definierte Klassen
Antwort
Soweit ich weiß, gibt es nichts genau wie das, was Sie beschreiben. Wie können Sie jedoch Ihre eigenen erstellen, mit Class::inherited
.
module MyModule
def self.class_added(klass)
# ... handle it
end
class ::Class
alias_method :old_inherited, :inherited
def inherited(subclass)
MyModule.class_added(subclass) if /^MyModule::\w+/.match subclass.name
old_inherited(subclass)
end
end
end
module MyModule
# now add classes
end
Sie könnten versuchen, diesen Ansatz, indem Sie Ihre eigene def_class
Methode definieren:
module M
def self.const_missing(name)
const_set(name, Class.new)
end
def self.def_class(klass, &block)
class_added(klass.name)
klass.class_eval(&block)
end
end
module M
def self.class_added(klass)
puts "new class added: #{klass}"
end
def_class Hello do
def hello
puts "hello!"
end
end
end
h = M::Hello.new.hello #=> "hello!"
Es ist ein guter Hack. Mit Parse Tree Hack ist es sogar möglich, dies zu tun, ohne dass die Benutzer ihre eigenen Module ändern müssen. Aber Parse Tree Hacks werden einen anderen Bereich einführen. Oder führen Sie eine andere benutzerdefinierte modulähnliche Methode ein. Nicht perfekt. Ich weiß, dass Matz nicht mehr Callbacks hinzufügen wollte, aber einige fehlen wirklich. –
- 1. Zend_Tool Schaffung eines Controllers innerhalb eines Moduls
- 2. Rückruf innerhalb eines Versprechens innerhalb einer Klasse?
- 3. eines Moduls Standort
- 4. Aufruf einer Methode innerhalb eines Moduls
- 5. Wie finden Sie rekursiv alle Module und Klassen innerhalb eines Moduls?
- 6. Erstellen eines einzelnen CommonJS-Moduls aus mehreren TypeScript-Klassen
- 7. Rückruf innerhalb einer Zeitschleife
- 8. Erstellen eines Moduls mit Klassen, die als direktes Kind des importierten Moduls zugänglich sind
- 9. Überschreiben von node.js querystring.escape innerhalb eines einzelnen Moduls
- 10. Verschleierung eines Moduls/einer Bibliothek
- 11. Aufruf einer Userspace-Funktion innerhalb eines Linux-Kernel-Moduls
- 12. Passing Variablen innerhalb eines Moduls mit hook_theme Zweig
- 13. Versuchen, jedes Submodul innerhalb eines Moduls in Python zu drucken
- 14. Yii- Wie urlManager Rules innerhalb eines Moduls hinzufügen?
- 15. Maximaler Aufrufstapel überschritten, wenn Klasse innerhalb eines Moduls instanziiert wird
- 16. Wie übersetze ich ein Modell innerhalb eines Moduls auf ActiveAdmin?
- 17. Ruby: Erneutes Öffnen einer Klasse innerhalb eines Moduls
- 18. Verweise auf ein bestimmtes Formularelement innerhalb eines Moduls
- 19. Einstellen der Prozessoraffinität innerhalb eines Linux-Kernel-Moduls
- 20. Wie lese/schreibe ich Dateien innerhalb eines Linux-Kernel-Moduls?
- 21. globale Variable von einer Funktion innerhalb eines Moduls aktualisieren
- 22. Aufrufen eines Moduls
- 23. Anpassen eines DNN-Moduls
- 24. Zugreifen auf einen eckigen Service innerhalb einer Funktion, innerhalb einer Klasse innerhalb eines Moduls
- 25. Ermitteln der Maven-Ausführungsphase innerhalb eines Plugins
- 26. Nicht definierte Variablen innerhalb eines Pakets während Build
- 27. Kreuz kompilieren eines Kernel-Moduls
- 28. Problem beim Erstellen eines Moduls?
- 29. Fehler eines Moduls CSS-Datei
- 30. Registrieren eines Jackson-Moduls für Spring Data REST
Ja, das Patchen Methoden der Klasse ihre eigenen Probleme haben. Insbesondere wird vererbt für keine Klasse aufgerufen, die einen eigenen Callback definiert und Super nicht aufruft. Die Alternative besteht darin, den Syntaxbaum mit Paraetre zu ändern (in letzter Zeit allerdings noch nicht 1.9). Aber es scheint, dass die Rückrufe fehlen. Ich habe gefragt, weil Gregors Beitrag ziemlich alt ist, und die Dokumente erwähnen solche Funktion nicht. –