2009-12-07 13 views
6

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?

+4

Nie dlatego, że nie jest to ważna kwestia i wszystko, ale o spojrzenie na wezwanie stos zwykle oznacza, że ​​robisz coś źle. –

Odpowiedz

10

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} 
3

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

1

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.

0

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> 
Powiązane problemy