2008-10-14 54 views
155

$0是頂級Ruby程序的變量,但是當前方法是否有一個變量?獲取當前執行方法的名稱

+0

一個用途是檢查`super`是否可以在SimpleDelegator對象中調用:`def description; __getobj __。respond_to?(__ method__)?超級:'沒有描述';結束' – Kris 2013-09-26 13:57:39

回答

256

甚至比我的第一個答案你可以更好的使用__METHOD__:

class Foo 
    def test_method 
    __method__ 
    end 
end 

這將返回一個符號 - 例如,:test_method。要將方法名稱作爲字符串返回,請改爲調用__method__.to_s

注意:這需要Ruby 1.8.7。

+11

':'只是符號的象徵。 :) 只是`__method __。to_s`它將成爲方法的名稱,沒有別的 – Lambart 2013-09-25 23:39:55

19

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 
+4

這對我來說非常有用,可以找到*調用*的名稱(與當前的方法相反)。 – Lambart 2013-09-27 00:50:43

+0

`__callee__`不是這樣嗎? – 2015-05-22 16:32:48

+0

偉大的解決方案馬克 現在最好的解決方案。偉大的工作 – jonathanccalixto 2016-09-19 08:13:32

9

爲Ruby 1.9+我推薦使用__callee__

-2

我得到了同樣的問題,在視圖文件檢索方法名。我通過

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

的解決方案,如果你想獲得控制器的名稱,然後

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

取決於你真正想要的東西,你可以使用__method____callee__,它會返回當前執行方法的名稱一個符號。

關於紅寶石1.9,他們都表現相同(至於docs和我的測試)。

關於Ruby 2.1 & 2.2 __callee__行爲會有所不同,如果你調用方法定義的別名(見略有不同doc description

測試腳本:

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__ ret在方法被定義的點上甕名):

2.1.2 
{:call_orig=>{:callee=>:orig, :method=>:orig}, 
:call_alias=>{:callee=>:myalias, :method=>:orig}}