获取当前正在执行的方法的名称

sal*_*cer 190 ruby reflection metaprogramming

$0 是顶级Ruby程序的变量,但当前方法有一个吗?

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.

  • ':'只是符号符号.:)只做`__method __.to_s`,它将是方法名称,没有别的 (11认同)

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)

  • 这对我来说非常有帮助,因为我找到了*调用*(而不是当前)方法的名称. (5认同)

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__

  • @LeighMcCulloch实际上现在`__callee__`和`__method__`有不同的行为.见http://pastie.org/10380985(ruby 2.1.5) (4认同)
  • `__callee__`在1.9之前表现不同,所以最好坚持使用`__method__`,因为它具有一致的行为.`__callee__`在1.9之后与`__method__`的行为相同. (3认同)