$0
- это переменная для программы Ruby верхнего уровня, но есть ли для текущего метода?
Получить имя текущего исполняемого метода
Ответ 1
Даже лучше, чем мой первый ответ, вы можете использовать __method __:
class Foo
def test_method
__method__
end
end
Возвращает символ - например, :test_method
. Чтобы вернуть имя метода в виде строки, вызовите __method__.to_s
.
Примечание: Для этого требуется Ruby 1.8.7.
Ответ 2
Из 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
Ответ 3
Для Ruby 1.9+ я бы рекомендовал использовать __callee__
Ответ 4
В зависимости от того, что вы действительно хотите, вы можете использовать либо __method__
, либо __callee__
, которые возвращают имя исполняемого метода в настоящее время как символ.
В ruby 1.9 оба они ведут себя одинаково (в отношении docs и моего тестирования).
В рубине 2.1 и 2.2 __callee__
ведет себя по-другому, если вы вызываете псевдоним определенного метода (см. несколько другое описание doc)
Тест script:
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}}
Ответ 5
У меня возникла такая же проблема, чтобы получить имя метода в файле вида. Я получил решение
params[:action] # it will return method name
если вы хотите получить имя контроллера, затем
params[:controller] # it will return you controller name