2008-10-14 67 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}}