Вопрос:

Получить имя текущего исполняемого метода

ruby reflection metaprogramming

49107 просмотра

5 ответа

9323 Репутация автора

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

Автор: salt.racer Источник Размещён: 14.10.2008 12:14

Ответы (5)


20 плюса

31326 Репутация автора

С сайта 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
Автор: Mark A. Nicolosi Размещён: 14.10.2008 12:21

285 плюса

31326 Репутация автора

Решение

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

class Foo
  def test_method
    __method__
  end
end

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

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

Автор: Mark A. Nicolosi Размещён: 14.10.2008 12:24

10 плюса

17694 Репутация автора

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

Автор: l3x Размещён: 04.12.2013 02:46

-2 плюса

536 Репутация автора

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

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

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

params[:controller] # it will return you controller's name
Автор: Hetal Khunti Размещён: 12.11.2014 12:59

13 плюса

13452 Репутация автора

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

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

При рубине 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}}
Автор: Kelvin Размещён: 25.02.2016 06:05
Вопросы из категории :
32x32