$0
是顶级Ruby程序的变量,但当前方法有一个吗?
答案 0 :(得分:301)
甚至比我的第一个答案还要好,你可以使用__method __:
class Foo
def test_method
__method__
end
end
这会返回一个符号 - 例如:test_method
。要将方法名称作为字符串返回,请改为调用__method__.to_s
。
注意:这需要Ruby 1.8.7。
答案 1 :(得分:22)
来自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
答案 2 :(得分:14)
根据您的实际需要,您可以使用__method__
或__callee__
,将当前正在执行的方法的名称作为符号返回。
在ruby 1.9上,它们的行为完全一致(就docs而言,我的测试也是如此)。
关于ruby 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}}
答案 3 :(得分:10)
对于Ruby 1.9+,我建议使用__callee__
答案 4 :(得分:-2)
我在视图文件中检索方法名称时遇到了同样的问题。
我得到了解决方案params[:action] # it will return method's name
如果你想得到控制器的名字,那么
params[:controller] # it will return you controller's name