$0
是顶级 Ruby 程序的变量,但当前方法是否存在变量?
salt.racer
问问题
70583 次
5 回答
369
甚至比我的第一个答案更好,您可以使用__method__:
class Foo
def test_method
__method__
end
end
这将返回一个符号 - 例如,:test_method
。要将方法名称作为字符串返回,请__method__.to_s
改为调用。
注意:这需要 Ruby 1.8.7。
于 2008-10-14T00:24:59.727 回答
32
根据您的实际需要,您可以使用__method__
或__callee__
,它将当前正在执行的方法的名称作为符号返回。
在 ruby 1.9 上,它们的行为相同(就文档和我的测试而言)。
__callee__
如果您调用已定义方法的别名,则在 ruby 2.1 和 2.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}}
于 2016-02-25T18:05:49.077 回答
25
来自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
于 2008-10-14T00:21:38.967 回答
11
对于 Ruby 1.9+,我建议使用__callee__
于 2013-12-04T02:46:56.000 回答
-2
我在视图文件中检索方法名称时遇到了同样的问题。我得到了解决方案
params[:action] # it will return method's name
如果你想得到控制器的名字然后
params[:controller] # it will return you controller's name
于 2014-11-12T12:59:11.883 回答