$0
最上位のRubyプログラムの変数ですが、現在のメソッドの変数はありますか?
70583 次
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 に答える