Отримайте назву методу, який виконується в даний час


198

$0 є змінною для програми Ruby верхнього рівня, але чи є вона для поточного методу?


Одне використання - перевірка superможе бути викликана в об’єкті SimpleDelegator:def description; __getobj__.respond_to?(__method__) ? super : 'No description'; end
Kris,

Відповіді:


334

Навіть краще, ніж моя перша відповідь, ви можете використовувати __method__:

class Foo
  def test_method
    __method__
  end
end

Це повертає символ - наприклад, :test_method. Щоб повернути ім'я методу як рядок, зателефонуйте __method__.to_sнатомість.

Примітка. Для цього потрібно Ruby 1.8.7.


11
':' - це просто символ символу. :) просто зробіть, __method__.to_sі це буде назва методу, нічого іншого
Lambart

Що робити, якщо я перебуваю у виконанні граблів?
Імран Ахмад

24

З 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

5
Це було дуже корисно мені для пошуку імені виклику (на відміну від поточного) методу.
Ламбарт

Це __callee__не робить?
Джошуа Пінтер

Відмінне рішення Марк Найкраще рішення на даний момент. Чудова робота
Jonathanccalixto

18

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

На рубіні 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}}

10

Для Ruby 1.9+ я рекомендую використовувати __callee__


3
__callee__поводиться по-різному до 1.9, тому краще дотримуватися, __method__оскільки він має послідовну поведінку. __callee__поводиться так само, як __method__після 1.9.
Лі МакКаллох

@LeighMcCulloch Ви можете пояснити різницю прикладом (можливо, у новій відповіді)?
Ciro Santilli 郝海东 冠状 病 六四 事件 法轮功

@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Ви не бачите нічого дивного?
jgburet

4
@LeighMcCulloch насправді зараз __callee__і __method__відрізняється поведінкою. Дивіться pastie.org/10380985 (ruby 2.1.5)
goodniceweb

1
pastie.org не працює. Назавжди чи просто зараз?
Накілон

-3

У мене виникла та сама проблема, щоб отримати ім'я методу у файлі перегляду. Я отримав рішення від

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

якщо ви хочете отримати ім'я контролера

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

4
Думаю, ви неправильно трактували питання щодо дій контролера рейлів та методів http ... цю відповідь, ймовірно, слід видалити.
Фактор Містик

Корисно для отримання імені поточного методу виконання (контролера) з виду.
avjaarsveld
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.