2008-10-14 9 views
155

$0 - это переменная для программы Ruby верхнего уровня, но есть ли она для текущего метода?Получить имя текущего исполняемого метода

+0

Одно использование проверки `super` может быть вызвано в объекте SimpleDelegator:` def description; __getobj __. reply_to? (__ method__)? super: «Без описания»; end` – Kris 2013-09-26 13:57:39

ответ

256

Даже лучше, чем мой первый ответ вы можете использовать __METHOD__:

class Foo 
    def test_method 
    __method__ 
    end 
end 

Это возвращает символ - например, :test_method. Чтобы вернуть имя метода в виде строки, вместо этого вызовите __method__.to_s.

Примечание: Для этого требуется Ruby 1.8.7.

+11

':' является символом символа. :) просто сделайте `__method __. To_s`, и это будет имя метода, ничего больше – Lambart 2013-09-25 23:39:55

19

От 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 
+4

Это очень помогло мне найти имя * call * (в отличие от текущего) метода. – Lambart 2013-09-27 00:50:43

+0

Не делает ли это `__callee__`? – 2015-05-22 16:32:48

+0

Отличное решение Mark Лучшее решение сейчас. Отличная работа – jonathanccalixto 2016-09-19 08:13:32

9

Для Руби 1.9+ я бы рекомендовал использовать __callee__

-2

я получил тот же вопрос, чтобы восстановить имя метода в файл представления. Я получил решение по

params[:action] # it will return method's name 

, если вы хотите, чтобы получить имя контроллера затем

params[:controller] # it will return you controller's name 
4

В зависимости от того, что вы на самом деле хотите, вы можете использовать либо __method__ или __callee__, которые возвращают имя исполняемого в данный момент метода как символ.

На рубине 1.9 оба они ведут себя одинаково (насколько это касается docs и моих испытаний).

На рубин 2,1 & 2,2 __callee__ ведет себя по-другому, если вы звоните псевдоним определенного метода (см немного другой doc description)

тестовый скрипт:

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__ ret urns имя в точке, где был определен метод):

2.1.2 
{:call_orig=>{:callee=>:orig, :method=>:orig}, 
:call_alias=>{:callee=>:myalias, :method=>:orig}} 
Смежные вопросы