Wiem, że metoda klasy określa, jaka jest nazwa klasy obiektu, w jaki sposób mogę znać nazwę wywoływanej metody? Czy istnieje sposób, aby to wiedzieć?Czy istnieje sposób na poznanie metody wywoływania?
Odpowiedz
Examining the Ruby Call Stack akcje te informacje:
Czy kiedykolwiek chciałeś, aby spojrzeć na stosie wywołań bez podnoszenia wyjątek to zrobić?
caller.each {|c| puts c}
rozmówca jest kernal metoda, która pozwala to zrobić, więc rozmówca [0] pozwoli Ci poznać natychmiastowe rozmówcę funkcji.
szybkie siekać dostać tylko nazwa funkcji może być
caller[0][/`\S+/].chop[1..-1]
ta zwróci nazwę metody wywołującej jako ciąg znaków, które można następnie wykorzystać jednak chcesz
Ruby implementacja Kernel#caller
została wykonana z String
s dla wydajności i usuwania śmieci. Jeśli chcesz zrobić bardziej zaawansowaną analizę stosu wywołań, spojrzeć na tym blogu:
http://eigenclass.org/hiki/ruby+backtrace+data
Autor przechodzi dwóch różnych implementacjach lepszego połączenia obiektu stos wykresie, jeden realizowanego w czystym Ruby z (mało znana) metoda Kernel#set_trace_func
i inna, która działa jako rozszerzenie C do MRI.
Aplikacja produkcyjna nie powinna używać niczego innego niż implementacja Kernel#caller
dostarczana z Ruby. Jeśli korzystasz z rozszerzeń powyżej, prawdopodobnie skończysz na zabijaniu umiejętności zbierania śmieci Ruby i spowolnisz proces (szacuję) do kilku rzędów wielkości.
można napisać coś takiego:
module Kernel
private
def who_is_calling? # Or maybe def who_just_called?
caller[1] =~ /`([^']*)'/ and $1
end
end
A potem trzeba te małe testy:
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. W Matplotlib, istnieje sposób na poznanie listy dostępnych formatów wyjściowych
- 2. Właściwy sposób wywoływania metody JavaScript
- 3. sposób dynamicznego wywoływania metody z zachowaniem prywatności
- 4. W Groovy, czy istnieje sposób na poznanie nazwy zmiennej z zamknięciem?
- 5. W systemie Windows 7 git-bash, czy istnieje sposób na poznanie katalogu w bieżącej lokalizacji?
- 6. Groovy sposób dynamicznego wywoływania metody statycznej
- 7. Czy istnieje ogólny sposób synchronizowania metody asynchronicznej?
- 8. Sposób wywoływania metody autoscroll NSScrollView programowo
- 9. Czy wywołują destruktory podczas wywoływania metody exit()?
- 10. Czy istnieje taka metoda wywoływania "getBackgroundColor"?
- 11. Czy istnieje właściwy sposób na usunięcie httpwebrequest?
- 12. Metody wywoływania wywołań Java
- 13. Metody wywoływania z fragmentu
- 14. Czy istnieje sposób na wstrzymanie SKActions?
- 15. Czy istnieje sposób na pominięcie parametru?
- 16. Czy istnieje sposób na uniknięcie $ to-> wszędzie?
- 17. Czy istnieje sposób na przeciążenie + = w python?
- 18. Metody typu wywoływania w ramach metody instancji
- 19. Czy istnieje sposób sprawdzenia, ile parametrów jest wymaganych dla metody?
- 20. Czy istnieje czysty sposób rejestrowania wyniku metody w Groovy?
- 21. Czy istnieje skuteczniejszy sposób uzyskania metody z adnotacjami?
- 22. Czy istnieje sposób na złapanie próby uzyskania dostępu do nieistniejącej właściwości lub metody?
- 23. Czy istnieje sposób określenia ogólnej funkcji kosztu arbitralnej metody java?
- 24. Czy istnieje lepszy sposób zapisu metody "ciąg zawiera X"?
- 25. Najszybszym sposobem na poznanie Zend Framework?
- 26. Efektywny sposób wywoływania .Sum() na wielu właściwościach
- 27. Czy istnieje metoda wywoływania sygnatur metod w autouzupełnianiu programu Phpstorm?
- 28. Czy istnieje sposób wywołania metody, gdy ustawiona jest właściwość klasy?
- 29. Czy istnieje sposób dostępu do argumentów metody w Ruby?
- 30. Czy istnieje sposób, aby posłuchać innej metody klasy?
Nie dlatego, że nie jest to ważna kwestia i wszystko, ale o spojrzenie na wezwanie stos zwykle oznacza, że robisz coś źle. –