Ich weiß, die Klassenmethode sagt, was ist der Name der Klasse eines Objekts, wie kann ich den Namen der aufrufenden Methode wissen? Gibt es eine Möglichkeit das zu wissen?Gibt es eine Möglichkeit, die aufrufende Methode zu kennen?
Antwort
Examining the Ruby Call Stack teilt diese Informationen:
Haben Sie schon einmal bei den Call-Stack aussehen wollte es eine Ausnahme ohne Erhöhung zu tun?
caller.each {|c| puts c}
Anrufer ist ein Kernal-Methode, die Sie dies tun können, so Anrufer [0] werden Sie den unmittelbaren Aufrufer der Funktion wissen lassen.
ein schneller Hack nur der Name der Funktion erhalten kann
caller[0][/`\S+/].chop[1..-1]
sein, dies den Namen der anrufenden Methode als String zurück, die Sie dann aber wollen Sie
Ruby verwenden können Implementierung von Kernel#caller
wurde mit String
s für die Leistung und Speicherbereinigung Gründen getan. Wenn Sie anspruchsvollere Call-Stack-Analyse machen wollen, werfen Sie einen Blick auf dieser Blog-Post:
http://eigenclass.org/hiki/ruby+backtrace+data
Der Autor durch zwei verschiedene Implementierungen eines besseren Call-Stack Objektgraph, ein implementiert in reinem Rubin mit der geht (nicht weit verbreitet) Kernel#set_trace_func
Methode und eine andere, die als eine C-Erweiterung der MRI funktioniert.
Eine Produktionsanwendung sollte nichts anderes als die Implementierung Kernel#caller
verwenden, die mit Ruby geliefert wird. Wenn Sie die obigen Erweiterungen ausgiebig verwenden, werden Sie wahrscheinlich Rubys Fähigkeit verlieren, effektiv zu sammeln und Ihren Prozess (ich schätze es) um mehrere Größenordnungen zu verlangsamen.
Sie so etwas schreiben kann:
module Kernel
private
def who_is_calling? # Or maybe def who_just_called?
caller[1] =~ /`([^']*)'/ and $1
end
end
Und dann haben Sie diese kleinen Tests:
irb(main):056:0* def this_is_a_method
irb(main):057:1> puts "I, 'this_is_a_method', was called upon by: '#{who_is_calling?}'"
irb(main):058:1> end
=> nil
irb(main):059:0> def this_is_a_method_that_calls_another
irb(main):060:1> this_is_a_method
irb(main):061:1> end
=> nil
irb(main):062:0> this_is_a_method_that_calls_another
I, 'this_is_a_method', was called upon by: 'this_is_a_method_that_calls_another'
=> nil
irb(main):063:0> this_is_a_method
I, 'this_is_a_method', was called upon by: 'irb_binding'
=> nil
irb(main):064:0>
- 1. Gibt es eine Möglichkeit, die abgerufene URL zu kennen?
- 2. gibt es eine Möglichkeit, die Oracle-Datenbankinstanz Fehleranzahl zu kennen
- 3. Gibt es eine Möglichkeit, die aufrufende Klasse in Swift auf statische Funktionen zugreifen zu lassen?
- 4. Gibt es eine einfache Möglichkeit, den Typ einer Datei zu ermitteln, ohne die Dateierweiterung zu kennen?
- 5. Gibt es eine allgemeine Möglichkeit, eine asynchrone Methode zu synchronisieren?
- 6. Gibt es eine Möglichkeit, die Sprache standardmäßig nach Land in Locale zu kennen?
- 7. Gibt es eine Möglichkeit, die PID eines gestarteten Programms zu kennen?
- 8. Gibt es eine Möglichkeit, die URL des SVN-Servers zu kennen?
- 9. Gibt es eine Möglichkeit, eine Ausführungsberechtigung für aufrufende Anwendungen für eine C# -Bibliothek festzulegen?
- 10. Gibt es eine Möglichkeit, ein mehrdimensionales Array zu durchlaufen, ohne dessen Tiefe zu kennen?
- 11. Gibt es eine Möglichkeit, anonyme Methode von Methode zurückzugeben?
- 12. Gibt es eine Möglichkeit, PreparedStatement zu aktualisieren?
- 13. Gibt es eine Möglichkeit, die Vektordaten eines DisplayObject zu exportieren?
- 14. Gibt es eine Möglichkeit, eine Methode als Parameter an eine Methode zu übergeben?
- 15. Gibt es eine Möglichkeit, die Anforderung von RenderBody() zu umgehen?
- 16. Gibt es eine Möglichkeit, Konsolenprogramme über die Befehlszeile zu debuggen?
- 17. Gibt es eine Möglichkeit, django.db.connection.queries zu löschen?
- 18. Gibt es eine Möglichkeit, Fenstereigenschaften zu verbergen?
- 19. Gibt es eine Möglichkeit, onPanResponderMove zu verwalten?
- 20. Gibt es eine Möglichkeit, Formularantwort zu ignorieren?
- 21. Gibt es eine Möglichkeit, Ihren aktuellen Benutzernamen in MySQL zu kennen?
- 22. Gibt es eine Möglichkeit, Datenbanktransaktionen zu beschleunigen?
- 23. Gibt es eine Möglichkeit, Selektoren zu gruppieren?
- 24. Gibt es eine Möglichkeit, Kovarianz zu deklarieren?
- 25. Gibt es eine Möglichkeit, dies zu loopen?
- 26. Gibt es eine Möglichkeit, "träge" zu lesen?
- 27. Gibt es eine Möglichkeit, ConfigurationManager.AppSettings zu überschreiben?
- 28. Gibt es eine Möglichkeit, Webkonsolenfehler zu erkennen?
- 29. Gibt es eine Möglichkeit, Unterabfragen zu vermeiden?
- 30. Gibt es eine Möglichkeit, Creeps zu löschen?
Nicht, dass dies keine gültige Frage ist, und alles, aber auf den Ruf zu suchen, die Stack bedeutet normalerweise, dass Sie etwas falsch machen. –