web-dev-qa-db-ja.com

現在実行中のメソッドの名前を取得します

$0は、最上位の変数Rubyプログラムですが、現在のメソッドには変数がありますか?

186
salt.racer

私の最初の答えよりもさらに良いのは、__ method__を使用できることです。

class Foo
  def test_method
    __method__
  end
end

これにより、シンボルが返されます。たとえば、:test_methodなどです。メソッド名を文字列として返すには、代わりに__method__.to_sを呼び出します。

注:これにはRuby 1.8.7。

307

から 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
23

実際に必要なものに応じて、__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}}
16
Kelvin

Ruby 1.9+の場合、__callee__

10
l3x