回答:
私の最初の答えよりも優れているのは、__ 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__
。これは、現在実行中のメソッドの名前をシンボルとして返します。
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}}
Ruby 1.9以降の場合は、 __callee__
__callee__
1.9より前のバージョンでは動作が異なるため、__method__
動作が一貫しているため、そのまま使用することをお勧めします。1.9以降__callee__
と同じように動作し__method__
ます。
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
妙な何かを見ませんか?
ビューファイルでメソッド名を取得するのと同じ問題が発生しました。私は解決策を得ました
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