Answers:
比我的第一个答案更好的是,您可以使用__method__:
class Foo
def test_method
__method__
end
end
这将返回一个符号-例如,:test_method
。要以字符串形式返回方法名称,请调用__method__.to_s
。
注意:这需要Ruby 1.8.7。
__method__.to_s
,它将成为方法名称,别无其他
从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__
这样做吗?
根据实际需要,可以使用__method__
或__callee__
,这将返回当前正在执行的方法的名称作为符号。
在ruby 1.9上,它们的行为相同(就文档和我的测试而言)。
在ruby 2.1和2.2上,__callee__
如果调用已定义方法的别名,则行为会有所不同。两者的文档不同:
__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}}
对于Ruby 1.9+,我建议使用 __callee__
__callee__
在1.9之前的行为有所不同,因此最好坚持使用,__method__
因为它具有一致的行为。__callee__
行为与__method__
1.9之后相同。
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
super
可以在SimpleDelegator对象中调用检查:def description; __getobj__.respond_to?(__method__) ? super : 'No description'; end