$0
jest zmienną dla programu Ruby najwyższego poziomu, ale czy jest taka dla bieżącej metody?
ruby
reflection
metaprogramming
salt.racer
źródło
źródło
super
można wywołać w obiekcie SimpleDelegator:def description; __getobj__.respond_to?(__method__) ? super : 'No description'; end
Odpowiedzi:
Nawet lepiej niż moja pierwsza odpowiedź możesz użyć __method__:
Zwraca symbol - na przykład
:test_method
. Aby zwrócić nazwę metody jako ciąg, wywołaj__method__.to_s
zamiast niej.Uwaga: Wymaga to Ruby 1.8.7.
źródło
__method__.to_s
a będzie to nazwa metody, nic więcejOd http://snippets.dzone.com/posts/show/2785 :
źródło
__callee__
robi tego?W zależności od tego, czego naprawdę chcesz, możesz użyć albo,
__method__
albo__callee__
, który zwraca nazwę aktualnie wykonywanej metody jako symbol.Na Ruby 1.9 oba zachowują się identycznie (w odniesieniu do dokumentacji i moich testów).
W Ruby 2.1 i 2.2
__callee__
zachowuje się inaczej, jeśli wywołasz alias zdefiniowanej metody. W docs dla obu są różne:__method__
: „nazwa w definicji bieżącej metody” (tj. nazwa w takiej postaci, w jakiej została zdefiniowana)__callee__
: „nazwa wywoływana bieżącej metody” (tj. nazwa, w jakiej została wywołana (wywołana))Skrypt testowy:
1.9.3 Wyjście:
2.1.2 Dane wyjściowe (
__callee__
zwraca nazwę aliasu, ale__method__
zwraca nazwę w punkcie, w którym metoda została zdefiniowana):źródło
Dla Ruby 1.9+ polecam używać
__callee__
źródło
__callee__
zachowuje się inaczej przed wersją 1.9, więc najlepiej trzymać się tego,__method__
ponieważ ma spójne zachowanie.__callee__
zachowuje się tak samo jak__method__
po wersji 1.9.def m1() puts("here is #{__method__} method. My caller is #{__callee__}.") end; def m2() puts("here is #{__method__} method. Let's call m1"); m1 end; m2
Nie widzisz nic dziwnego?__callee__
i__method__
ma inne zachowanie. Zobacz pastie.org/10380985 (ruby 2.1.5)Mam ten sam problem z pobraniem nazwy metody w pliku widoku. Mam rozwiązanie przez
jeśli chcesz uzyskać nazwę kontrolera, to
źródło