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

时间:2008-10-14 00:14:07

标签: ruby reflection metaprogramming

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

5 个答案:

答案 0 :(得分:301)

甚至比我的第一个答案还要好,你可以使用__method __:

class Foo
  def test_method
    __method__
  end
end

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

注意:这需要Ruby 1.8.7。

答案 1 :(得分:22)

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

答案 2 :(得分:14)

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

在ruby 1.9上,它们的行为完全一致(就docs而言,我的测试也是如此)。

关于ruby 2.1& 2.2 __callee__如果调用已定义方法的别名,则行为会有所不同。这两者的docs是不同的:

  • __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}}

答案 3 :(得分:10)

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

答案 4 :(得分:-2)

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

我得到了解决方案
params[:action] # it will return method's name

如果你想得到控制器的名字,那么

params[:controller] # it will return you controller's name