$0
是顶级 Ruby 程序的变量,但当前方法是否存在变量?
super
:def description; __getobj__.respond_to?(__method__) ? super : 'No description'; end
甚至比我的第一个答案更好,您可以使用__method__:
class Foo
def test_method
__method__
end
end
这将返回一个符号 – 例如,:test_method
。要将方法名称作为字符串返回,请改为调用 __method__.to_s
。
注意:这需要 Ruby 1.8.7。
根据您的实际需要,您可以使用 __method__
或 __callee__
,它们将当前正在执行的方法的名称作为符号返回。
在 ruby 1.9 上,它们的行为相同(就 docs 和我的测试而言)。
在红宝石 2.1 和2.2 如果您调用已定义方法的别名,__callee__
的行为会有所不同。两者的 docs 不同:
__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}}
从 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__
不这样做吗?
对于 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
__method__.to_s
,它将是方法名称,仅此而已