Ich habe diese Frage von this discussion. Ein Methodenaufruf wie object.m
bedeutet nicht immer, dass die Klasse "Objekt" eine "m" -Methode hat, genauso wie die Methode find für ein Array-Objekt nicht direkt vom Array-Objekt stammt, sondern vom eingemischten Enumerable-Modul. Meine Frage ist, wie können wir anhand einer Methode die Klasse bestimmen, aus der die Methode stammt?Wie kann die Klasse bestimmt werden, aus der eine bestimmte Methode stammt?
Antwort
Jede Klassen-/Objektmethode ist ein Objekt in Ruby und besitzt einige eigene Methoden.
So können Sie dies tun:
[].method(:count).inspect
=> "#<Method: Array#count>"
[].method(:detect).inspect
=> "#<Method: Array(Enumerable)#detect>"
Schnell bisschen RegEx und du bist fertig.
vielleicht benutzen Sie Anrufer() Sie den Backtrace siehe geben:
Ich denke, so etwas wie dies funktionieren könnte
def print_ancestor_definitions(cl,method)
ancestors = cl.ancestors
p ancestors.join(' < ') #Print heirarchy
p "Searching..."
ancestors.each do |c|
if c.instance_methods.include? method
p "#{c} defines #{method} as an instance method!"
elsif c.singleton_methods.include? method
p "#{c} defines #{method} as a singleton method"
else
p "#{c} doesn't define #{method}"
end
end
end
print_ancestor_definitions(Array,'find')
# >> "Array < Enumerable < Object < Kernel"
# >> "Searching..."
# >> "Array defines find as an instance method!"
# >> "Enumerable defines find as an instance method!"
# >> "Object doesn't define find"
# >> "Kernel doesn't define find"
ich das letzte nehme an, die haben Methode ist derjenige, der es definiert?
Ich bin mir nicht sicher, ob wir genau herausfinden können, woher eine Methode kommt. Wenn Sie ein Mixin hinzufügen, werden alle Methoden Teil Ihrer Klasse, als ob Sie sie dort abgelegt hätten. Siehe Antwort von dylanfm für ca.
method.inspect wird sagen Sie, wenn eine Methode an einen Mixin –
tobyhede's Antwort ist genial, aber ich habe gerade ein bisschen graben in irb
und es gibt keine Notwendigkeit, die Ausgabe von #inspect
zu zerstückeln. Die Method
Klasse
>> Object.new.method(:inspect)
=> #<Method: Object(Kernel)#inspect>
hat einige nützliche Methoden für sich:
>> Object.new.method(:inspect).methods - Object.methods
=> ["owner", "call", "to_proc", "unbind", "arity", "receiver", "[]"]
Insbesondere die #owner
Methode, die den Eigentümer als eine richtige Objekt zurückgibt:
>> [].method(:count).owner
=> Array
>> [].method(:detect).owner
=> Enumerable
genial finden, wird dies definitiv nützlich sein. –
natürlich! Das ist sehr cool. –
- 1. Java: Wie kann der Zugriff einer Methode auf eine bestimmte Klasse eingeschränkt werden?
- 2. Wie kann eine Klasse aus Spring in applicationContext ausgeschlossen werden?
- 3. Ruby win32ole - wie man den OLE-Klassentyp bestimmt, ob die OLE-Klasse eine Methode unterstützt
- 4. Die Popover-Pfeilrichtung kann nicht bestimmt werden
- 5. Methode in Klasse kann nicht auf bestimmte Typen angewendet werden
- 6. Umwandlung in eine Klasse, die zur Laufzeit bestimmt wird
- 7. Wie kann der Datentyp einer JSON-Eigenschaft bestimmt werden?
- 8. Kann eine statische Methode in der abgeleiteten Klasse überschrieben werden?
- 9. Kann die Größe der herunterzuladenden Datei bestimmt werden?
- 10. Wie bestimmt MSTest die Reihenfolge, in der Testmethoden ausgeführt werden?
- 11. Wie eine übergeordnete Klasse Methode aus einer geschachtelten Klasse zuzugreifen?
- 12. Wie kann der Speicherort einer Anwendung bestimmt werden?
- 13. Wie kann die Klasse, die als Parameter in einer Methode verwendet werden kann, dynamisch definiert werden?
- 14. Aufruf Methode aus der Klasse "x", eine Zeichenfolge gegeben, die gleich "x"?
- 15. Kann eine Methode der DAO-Klasse nicht aufrufen - nicht statische Methode einfügen kann nicht aus einem statischen Kontext verwiesen werden
- 16. Wie eine Methode aus der Klasse ist Classloader mit
- 17. Wie schreibe ich HashCode-Methode für eine bestimmte Klasse?
- 18. Umwandlung in eine Klasse, die zur Laufzeit bestimmt wird
- 19. Bestimmt, ob die Klasse benutzerdefiniert ist __init__
- 20. Wie kann die Verzögerung berechnet werden, um eine bestimmte Geschwindigkeit über eine bestimmte Distanz zu erreichen?
- 21. Wie kann die Auswahl eines Textbereiches in Safari aus JavaScript bestimmt/manipuliert werden?
- 22. Wie kann man eine Methode aus ihrer Klasse (und in eine neue oder bestehende Klasse) ziehen?
- 23. Gmock kann nicht eine Methode vortäuschen, die eine andere Methode in der gleichen Klasse anrief
- 24. Ajax Call-Methode aus der Klasse PHP
- 25. Anruf Python-Methode aus der Klasse innerhalb der Klasse definiert
- 26. So ermitteln Sie, ob eine Shellskriptdatei aus der Bash stammt
- 27. Wie kann ich eine bestimmte Klasse aus den Listen der Klassen auswählen, die durch die ID des Elements erhalten wurden?
- 28. Kann überprüft werden, ob eine IP-Adresse aus einem bestimmten Land stammt, ohne GeoIP zu verwenden?
- 29. Kann eine anonyme Klasse die abstrakte Methode der abstrakten Klasse implementieren?
- 30. Wie lade ich die Proxy-Klasse aus der Proxy-Klasse?
Sweet angehängt ist, das ist großartig – dylanfm