216

$0是顶级 Ruby 程序的变量,但当前方法是否存在变量?

4

5 回答 5

369

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

class Foo
  def test_method
    __method__
  end
end

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

注意:这需要 Ruby 1.8.7。

于 2008-10-14T00:24:59.727 回答
32

根据您的实际需要,您可以使用__method____callee__,它将当前正在执行的方法的名称作为符号返回。

在 ruby​​ 1.9 上,它们的行为相同(就文档和我的测试而言)。

__callee__如果您调用已定义方法的别名,则在 ruby​​ 2.1 和 2.2 上的行为会有所不同。两者的文档不同:

  • __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}}
于 2016-02-25T18:05:49.077 回答
25

来自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
于 2008-10-14T00:21:38.967 回答
11

对于 Ruby 1.9+,我建议使用__callee__

于 2013-12-04T02:46:56.000 回答
-2

我在视图文件中检索方法名称时遇到了同样的问题。我得到了解决方案

params[:action] # it will return method's name

如果你想得到控制器的名字然后

params[:controller] # it will return you controller's name
于 2014-11-12T12:59:11.883 回答