216

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

4

5 に答える 5

369

__method__ を使用できる私の最初の回答よりもさらに優れています。

class Foo
  def test_method
    __method__
  end
end

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

注:これには Ruby 1.8.7 が必要です。

于 2008-10-14T00:24:59.727 に答える
32

実際に必要なものに応じて、現在実行中のメソッドの名前をシンボルとして返す__method__またはを使用できます。__callee__

Ruby 1.9 では、どちらも同じように動作します (ドキュメントと私のテストに関する限り)。

Ruby 2.1 と 2.2__callee__では、定義されたメソッドのエイリアスを呼び出すと動作が異なります。2 つのドキュメントは異なります。

  • __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}}
于 2016-02-25T18:05:49.077 に答える
25

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
于 2008-10-14T00:21:38.967 に答える
11

Ruby 1.9+の場合、使用をお勧めします__callee__

于 2013-12-04T02:46:56.000 に答える