$0 - это переменная для Ruby-программы верхнего уровня, но есть ли она для текущего метода?
Получить имя выполняемого в данный момент метода
Ответы (5)
Даже лучше, чем мой первый ответ, вы можете использовать __method__:
class Foo
def test_method
__method__
end
end
Это возвращает символ - например, :test_method. Чтобы вернуть имя метода в виде строки, вызовите вместо этого __method__.to_s.
Примечание. Для этого требуется Ruby 1.8.7.
__method__.to_s, и это будет имя метода, больше ничего
- person Lambart; 26.09.2013
В зависимости от того, что вы действительно хотите, вы можете использовать __method__ или __callee__, которые возвращают имя выполняемого в данный момент метода в виде символа.
В Ruby 1.9 они оба ведут себя одинаково (что касается документы и мое тестирование).
В Ruby 2.1 и 2.2 __callee__ ведет себя иначе, если вы вызываете псевдоним определенного метода. docs для них разные:
__method__: "имя в определении текущего метода" (т.е. имя, как оно было определено)__callee__: "вызываемое имя текущего метода" (т.е. имя, как оно было вызвано (вызвано))
Тестовый сценарий:
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 Выход:
1.9.3
{:call_orig=>{:callee=>:orig, :method=>:orig},
:call_alias=>{:callee=>:orig, :method=>:orig}}
2.1.2 Вывод (__callee__ возвращает имя с псевдонимом, но __method__ возвращает имя в точке, где был определен метод):
2.1.2
{:call_orig=>{:callee=>:orig, :method=>:orig},
:call_alias=>{:callee=>:myalias, :method=>:orig}}
Из 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__ этого не делает?
- person Joshua Pinter; 22.05.2015
Для Ruby 1.9+ я бы рекомендовал использовать __callee__
__callee__ ведет себя иначе до 1.9, поэтому лучше придерживаться __method__, поскольку он ведет себя согласованно. __callee__ ведет себя так же, как __method__ после 1.9.
- person Leigh McCulloch; 09.04.2014
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 Вы не видите ничего странного?
- person jgburet; 08.07.2015
__callee__ и __method__ ведут себя по-разному. См. pastie.org/10380985 (рубин 2.1.5)
- person goodniceweb; 28.08.2015
__method__ вернул мне имя реального метода (тот, который был заполнен кодом), __callee__ вернул используемый псевдоним.
- person Rael Gugelmin Cunha; 28.05.2021
У меня такая же проблема с получением имени метода в файле представления. Я получил решение
params[:action] # it will return method's name
если вы хотите получить имя контроллера, тогда
params[:controller] # it will return you controller's name
superможет быть вызван в объекте SimpleDelegator:def description; __getobj__.respond_to?(__method__) ? super : 'No description'; end- person Kris   schedule 26.09.2013