Получить имя выполняемого в данный момент метода

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


person salt.racer    schedule 14.10.2008    source источник
comment
Одно из применений - проверка того, что super может быть вызван в объекте SimpleDelegator: def description; __getobj__.respond_to?(__method__) ? super : 'No description'; end   -  person Kris    schedule 26.09.2013


Ответы (5)


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

class Foo
  def test_method
    __method__
  end
end

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

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

person Mark A. Nicolosi    schedule 14.10.2008
comment
':' - это просто символ символа. :) просто введите __method__.to_s, и это будет имя метода, больше ничего - person Lambart; 26.09.2013
comment
Что делать, если я занимаюсь рейком? - person Imran Ahmad; 26.08.2017

В зависимости от того, что вы действительно хотите, вы можете использовать __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}}
person Kelvin    schedule 25.02.2016

Из 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
person Mark A. Nicolosi    schedule 14.10.2008
comment
Это очень помогло мне найти имя вызывающего (в отличие от текущего) метода. - person Lambart; 27.09.2013
comment
__callee__ этого не делает? - person Joshua Pinter; 22.05.2015
comment
Отличное решение Марк Лучшее решение на данный момент. Отличная работа - person jonathanccalixto; 19.09.2016

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

person l3x    schedule 04.12.2013
comment
__callee__ ведет себя иначе до 1.9, поэтому лучше придерживаться __method__, поскольку он ведет себя согласованно. __callee__ ведет себя так же, как __method__ после 1.9. - person Leigh McCulloch; 09.04.2014
comment
@LeighMcCulloch, можете ли вы объяснить разницу на примере (возможно, в новом ответе)? - person Ciro Santilli 新疆再教育营六四事件ۍ 11.09.2014
comment
@CiroSantilli 六四 事件 法轮功 纳米比亚 威 视 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
comment
@LeighMcCulloch на самом деле теперь __callee__ и __method__ ведут себя по-разному. См. pastie.org/10380985 (рубин 2.1.5) - person goodniceweb; 28.08.2015
comment
pastie.org не работает. Навсегда или только сейчас? - person Nakilon; 18.03.2018
comment
В Ruby 2.6 у меня есть метод с псевдонимом: __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
person Hetal Khunti    schedule 12.11.2014
comment
Я думаю, вы неправильно истолковали вопрос о действиях контроллера рельсов и методах http ... этот ответ, вероятно, следует удалить. - person Factor Mystic; 27.01.2016
comment
Полезно для получения имени выполняемого в данный момент метода (контроллера) из представления. - person avjaarsveld; 05.07.2016