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


198

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


1つの用途は、チェックしてsuperSimpleDelegatorオブジェクト内で呼び出すことができますdef description; __getobj__.respond_to?(__method__) ? super : 'No description'; end
クリス

回答:


334

私の最初の答えよりも優れているのは、__ method__を使用できることです。

class Foo
  def test_method
    __method__
  end
end

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

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


11
「:」は単なる記号です。:)ただやれば__method__.to_s、それはメソッド名になり、それ以外は何もない
Lambart

レーキタスクの場合はどうなりますか?
Imran Ahmad

24

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

5
これは、呼び出しメソッド(現在のメソッドではなく)の名前を見つけるのにとても役立ちました。
ランバート2013

これをし__callee__ませんか?
Joshua Pinter

優れたソリューションマーク現時点で最高のソリューション。素晴らしい仕事
jonathanccalixto

18

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

10

Ruby 1.9以降の場合は、 __callee__


3
__callee__1.9より前のバージョンでは動作が異なるため、__method__動作が一貫しているため、そのまま使用することをお勧めします。1.9以降__callee__と同じように動作し__method__ます。
Leigh McCulloch

@LeighMcCullochは、違いを例(おそらく新しい答えで)で説明できますか?
Ciro Santilli郝海东冠状病六四事件法轮功

@CiroSantilli六四事件法轮功纳米比亚威视奇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妙な何かを見ませんか?
jgburet

4
@LeighMcCullochは実際には現在__callee____method__動作が異なります。pastie.org/10380985(ルビー2.1.5)を参照してください
goodniceweb

1
pastie.orgがダウンしています。永遠に、または今ちょうど?
Nakilon、

-3

ビューファイルでメソッド名を取得するのと同じ問題が発生しました。私は解決策を得ました

params[:action] # it will return method's name

コントローラの名前を取得したい場合

params[:controller] # it will return you controller's name

4
質問は、railsコントローラのアクションとhttpメソッドに関するものであると誤って解釈したと思います...この答えはおそらく削除する必要があります。
Factor Mystic、2016年

ビューから現在実行中の(コントローラー)メソッドの名前を取得するのに役立ちます。
avjaarsveld 2016
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.