$0
は、最上位の変数Rubyプログラムですが、現在のメソッドには変数がありますか?
私の最初の答えよりもさらに良いのは、__ method__を使用できることです。
class Foo
def test_method
__method__
end
end
これにより、シンボルが返されます。たとえば、:test_method
などです。メソッド名を文字列として返すには、代わりに__method__.to_s
を呼び出します。
注:これにはRuby 1.8.7。
から 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
実際に必要なものに応じて、__method__
または __callee__
。現在実行中のメソッドの名前をシンボルとして返します。
Ruby 1.9、両方とも同じように動作します( docs と私のテストに関する限り)。
オンRuby 2.1&2.2 __callee__
定義されたメソッドのエイリアスを呼び出すと、動作が異なります。 2つの場合の 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}}
Ruby 1.9+の場合、__callee__