$0
jest zmienną dla programu Ruby najwyższego poziomu, ale czy jest taka dla bieżącej metody?
$0
jest zmienną dla programu Ruby najwyższego poziomu, ale czy jest taka dla bieżącej metody?
Odpowiedzi:
Nawet lepiej niż moja pierwsza odpowiedź możesz użyć __method__:
class Foo
def test_method
__method__
end
end
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.
__method__.to_s
a będzie to nazwa metody, nic więcej
Od http://snippets.dzone.com/posts/show/2785 :
module Kernel
private
def this_method_name
caller[0] =~ /`([^']*)'/ and $1
end
end
class Foo
def test_method
this_method_name
end
end
puts Foo.new.test_method # => test_method
__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:
require 'pp'
puts RUBY_VERSION
class Foo
def orig
{callee: __callee__, method: __method__}
end
alias_method :myalias, :orig
end
pp( {call_orig: Foo.new.orig, call_alias: Foo.new.myalias} )
1.9.3 Wyjście:
1.9.3
{:call_orig=>{:callee=>:orig, :method=>:orig},
:call_alias=>{:callee=>:orig, :method=>:orig}}
2.1.2 Dane wyjściowe ( __callee__
zwraca nazwę aliasu, ale __method__
zwraca nazwę w punkcie, w którym metoda została zdefiniowana):
2.1.2
{:call_orig=>{:callee=>:orig, :method=>:orig},
:call_alias=>{:callee=>:myalias, :method=>:orig}}
Dla Ruby 1.9+ polecam używać __callee__
__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
params[:action] # it will return method's name
jeśli chcesz uzyskać nazwę kontrolera, to
params[:controller] # it will return you controller's name
super
można wywołać w obiekcie SimpleDelegator:def description; __getobj__.respond_to?(__method__) ? super : 'No description'; end