Получить имя исполняемого в данный момент метода - PullRequest
184 голосов
/ 14 октября 2008

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

Ответы [ 5 ]

301 голосов
/ 14 октября 2008

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

class Foo
  def test_method
    __method__
  end
end

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

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

22 голосов
/ 14 октября 2008

С 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
14 голосов
/ 25 февраля 2016

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

На ruby ​​1.9 они оба ведут себя одинаково (что касается документов и моего тестирования).

На ruby ​​2.1 и 2.2 __callee__ ведет себя по-разному, если вы вызываете псевдоним определенного метода. Документы для двух разных:

  • __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}}
10 голосов
/ 04 декабря 2013

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

0 голосов
/ 12 ноября 2014

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

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

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

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