$0
є змінною для програми Ruby верхнього рівня, але чи є вона для поточного методу?
$0
є змінною для програми Ruby верхнього рівня, але чи є вона для поточного методу?
Відповіді:
Навіть краще, ніж моя перша відповідь, ви можете використовувати __method__:
class Foo
def test_method
__method__
end
end
Це повертає символ - наприклад, :test_method
. Щоб повернути ім'я методу як рядок, зателефонуйте __method__.to_s
натомість.
Примітка. Для цього потрібно Ruby 1.8.7.
__method__.to_s
і це буде назва методу, нічого іншого
З 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
__callee__
не робить?
В залежності від того, що ви на справді хочете, ви можете використовувати або __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}}
Для Ruby 1.9+ я рекомендую використовувати __callee__
__callee__
поводиться по-різному до 1.9, тому краще дотримуватися, __method__
оскільки він має послідовну поведінку. __callee__
поводиться так само, як __method__
після 1.9.
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
Ви не бачите нічого дивного?
__callee__
і __method__
відрізняється поведінкою. Дивіться pastie.org/10380985 (ruby 2.1.5)
У мене виникла та сама проблема, щоб отримати ім'я методу у файлі перегляду. Я отримав рішення від
params[:action] # it will return method's name
якщо ви хочете отримати ім'я контролера
params[:controller] # it will return you controller's name
super
може бути викликана в об’єкті SimpleDelegator:def description; __getobj__.respond_to?(__method__) ? super : 'No description'; end