获取当前执行方法的名称


198

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


一种用途是super可以在SimpleDelegator对象中调用检查:def description; __getobj__.respond_to?(__method__) ? super : 'No description'; end
Kris

Answers:


334

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

class Foo
  def test_method
    __method__
  end
end

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

注意:这需要Ruby 1.8.7。


11
':'只是符号符号。:)只要做__method__.to_s,它将成为方法名称,别无其他
Lambart

如果我正在做耙子任务怎么办?
Imran Ahmad

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

5
这对我找到调用方法的名称(而不是当前方法)非常有帮助。
Lambart 2013年

__callee__这样做吗?
约书亚·品特

很好的解决方案Mark当前最好的解决方案。太好了
jonathanccalixto

18

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

10

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


3
__callee__在1.9之前的行为有所不同,因此最好坚持使用,__method__因为它具有一致的行为。__callee__行为与__method__1.9之后相同。
Leigh McCulloch 2014年

@LeighMcCulloch你能用一个例子(可能在一个新的答案中)解释区别吗?
西罗Santilli郝海东冠状病六四事件法轮功

@CiroSantilli六四事件法轮功纳米比亚威视def m1() puts("here is #{__method__} method. My caller is #{__callee__}.") end; def m2() puts("here is #{__method__} method. Let's call m1"); m1 end; m2你看不到什么奇怪的东西吗?
jgburet 2015年

4
现在实际上@LeighMcCulloch __callee____method__具有不同的行为。参见pastie.org/10380985(ruby 2.1.5)
goodniceweb

1
pastie.org关闭。永远还是现在?
Nakilon

-3

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

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

如果要获取控制器名称,则

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

4
我认为您误解了有关Rails控制器操作和http方法的问题...此答案可能应该删除。
Factor Mystic

从视图中获取当前正在执行的(控制器)方法的名称很有用。
avjaarsveld'7
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.