当前位置:  开发笔记 > 后端 > 正文

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

如何解决《获取当前正在执行的方法的名称》经验,为你挑选了4个好方法。

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



1> Mark A. Nico..:

甚至比我的第一个答案更好,你可以使用__method__:

class Foo
  def test_method
    __method__
  end
end

这会返回一个符号 - 例如,:test_method.要将方法名称作为字符串返回,请调用__method__.to_s.

注意:这需要Ruby 1.8.7.


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

2> Mark A. Nico..:

来自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


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

3> Kelvin..:

根据您的实际需要,您可以使用__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}}



4> l3x..:

对于Ruby 1.9+我建议使用 __callee__


@LeighMcCulloch实际上现在`__callee__`和`__method__`有不同的行为.见http://pastie.org/10380985(ruby 2.1.5)
`__callee__`在1.9之前表现不同,所以最好坚持使用`__method__`,因为它具有一致的行为.`__callee__`在1.9之后与`__method__`的行为相同.
推荐阅读
mobiledu2402852413
这个屌丝很懒,什么也没留下!
DevBox开发工具箱 | 专业的在线开发工具网站    京公网安备 11010802040832号  |  京ICP备19059560号-6
Copyright © 1998 - 2020 DevBox.CN. All Rights Reserved devBox.cn 开发工具箱 版权所有