ruby 获取当前执行方法的名称

58wvjzkj  于 2023-04-11  发布在  Ruby
关注(0)|答案(5)|浏览(128)

$0是顶层Ruby程序的变量,但是否有一个变量用于当前方法?

kokeuurv

kokeuurv1#

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

class Foo
  def test_method
    __method__
  end
end

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

**注意:**需要Ruby 1.8.7。

new9mtju

new9mtju2#

根据实际需要,可以使用__method____callee__,它们以符号的形式返回当前正在执行的方法的名称。
在ruby1.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}}
xggvc2p6

xggvc2p63#

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
gmol1639

gmol16394#

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

5jdjgkvh

5jdjgkvh5#

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

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

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

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

相关问题