Mar*_*osi 316
甚至比我的第一个答案更好,你可以使用__method__:
class Foo
def test_method
__method__
end
end
Run Code Online (Sandbox Code Playgroud)
这会返回一个符号 - 例如,:test_method.要将方法名称作为字符串返回,请调用__method__.to_s.
注意:这需要Ruby 1.8.7.
Mar*_*osi 24
来自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
Run Code Online (Sandbox Code Playgroud)
Kel*_*vin 16
根据您的实际需要,您可以使用__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} )
Run Code Online (Sandbox Code Playgroud)
1.9.3输出:
1.9.3
{:call_orig=>{:callee=>:orig, :method=>:orig},
:call_alias=>{:callee=>:orig, :method=>:orig}}
Run Code Online (Sandbox Code Playgroud)
2.1.2输出(__callee__返回别名,但__method__在定义方法时返回名称):
2.1.2
{:call_orig=>{:callee=>:orig, :method=>:orig},
:call_alias=>{:callee=>:myalias, :method=>:orig}}
Run Code Online (Sandbox Code Playgroud)
l3x*_*l3x 10
对于Ruby 1.9+我建议使用 __callee__