So che il metodo di classe indica qual è il nome della classe di un oggetto, come potrei conoscere il nome del metodo di richiamo? C'è un modo per saperlo?C'è un modo per conoscere il metodo di richiamo?
risposta
Examining the Ruby Call Stack parti queste informazioni:
Avete mai desiderato di guardare lo stack di chiamate senza sollevare un'eccezione di farlo?
caller.each {|c| puts c}
chiamante è un metodo kernal che ti permette di fare questo, quindi chiamante [0] vi permetterà di conoscere il chiamante immediato della funzione.
un trucco veloce per ottenere solo il nome della funzione potrebbe essere
caller[0][/`\S+/].chop[1..-1]
Ciò restituirà il nome del metodo chiamante come una stringa, che è quindi possibile utilizzare come vuoi
Ruby l'implementazione di Kernel#caller
è stata eseguita con String
s per motivi di prestazioni e garbage collection. Se si vuole fare di più sofisticate analisi stack di chiamate, dare un'occhiata a questo post del blog:
http://eigenclass.org/hiki/ruby+backtrace+data
L'autore passa attraverso due diverse implementazioni di una migliore chiamata grafo stack di oggetto, quello implementato in puro rubino con la (non ampiamente conosciuto) il metodo Kernel#set_trace_func
e un altro che funziona come estensione C alla risonanza magnetica.
Un'applicazione di produzione non deve utilizzare altro che l'implementazione Kernel#caller
fornita con Ruby. Se utilizzi estensivamente le estensioni di cui sopra, probabilmente finirai per uccidere l'abilità di Ruby nel raccogliere i rifiuti in modo efficace e rallentare il tuo processo (stimare) fino a diversi ordini di grandezza.
È possibile scrivere qualcosa del genere:
module Kernel
private
def who_is_calling? # Or maybe def who_just_called?
caller[1] =~ /`([^']*)'/ and $1
end
end
E poi si deve questi piccoli test:
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>
Non che questa non è una domanda valida e tutti, ma dover guardare la chiamata
- 1. Metodo di richiamo di MethodInfo
- 2. Metodo di richiamo come chiusura
- 3. Richiamo astratto nel metodo reflection di java
- 4. Metodo di richiamo su tipo generico?
- 5. com.sun.jdi.InvocationException si è verificato il metodo di richiamo
- 6. Richiamo di un metodo statico mediante la riflessione
- 7. Metodo di richiamo con un parametro dell'array mediante la riflessione
- 8. Un modo per chiedere un metodo per il suo nome?
- 9. Meteor OAuth Eccezione durante il richiamo del metodo 'login'
- 10. C# 4.0 - Il richiamo di un metodo protetto su un oggetto dinamico chiama TryInvokeMember()?
- 11. IL Emetti per il richiamo di un'istanza delegata?
- 12. C'è un modo rapido per mostrare il codice di un metodo dichiarato nella Console Scala?
- 13. Un modo per richiamare un metodo privato?
- 14. Qual è un modo sicuro per conoscere il referente/referente in una richiesta HTTP?
- 15. C# Richiamo del metodo di overload con Ereditarietà
- 16. Metodo di classe per "conoscere" il nome della classe in Ruby?
- 17. C'è un modo per conoscere il tuo nome utente attuale in mysql?
- 18. C'è un modo per restituire il tipo Anonymous dal metodo?
- 19. Prevenire il richiamo del modello upvote per ogni commento
- 20. Richiamo del metodo di classe dinamica in Dart
- 21. Tre modi per conoscere l'esistenza di un attore akka
- 22. È sicuro chiamare il metodo ContinueWith su TaskCompletionSource.Task (che ha avuto il richiamo di .SetResult)?
- 23. Posso conoscere il nome della classe che chiama un metodo JNI C?
- 24. Richiamo JavaScript per nome funzione nell'attributo dati
- 25. C'è un modo in C# per sovrascrivere un metodo di classe con un metodo di estensione?
- 26. Qual è il modo migliore per chiamare correttamente un metodo DOPO il caricamento di un modulo?
- 27. Qual è il modo migliore per conoscere l'implementazione della VM oltre al codice di hacking?
- 28. verbose_name per il metodo di un modello
- 29. Utilizzare instanceof senza conoscere il tipo
- 30. In Matplotlib, esiste un modo per conoscere l'elenco del formato di output disponibile
lo stack di solito significa che stai facendo qualcosa di sbagliato. –