Ruby 1.8是否相当于1.9的__callee__?

时间:2011-02-22 08:38:22

标签: ruby introspection

我需要在Ruby 1.8中获取词法封闭方法的名称; e.g。

def foo
  this_method = __callee__  # => 'foo'
end

上面的代码在Ruby 1.9中有效,但在1.8中失败,因为1.9中引入了__callee__。

有关在1.8中执行此操作的任何建议吗? 内核#caller 看起来很有前途,但似乎给了我调用堆栈,从方法的调用者开始,而不是方法本身。

我想我可以抛出一个异常,抓住它,并抓住异常#backtrace 数组中的第一个元素,但我的直觉告诉我这将是缓慢的。

2 个答案:

答案 0 :(得分:5)

在Ruby 1.8.7上有__method__,不确定1.8.6。

无论如何,您可以修补Kernel模块:

module Kernel
  # Defined in ruby 1.9
  unless defined?(__callee__)
    def __callee__
      caller[0] =~ /`([^']*)'/ and $1
    end
  end
end

答案 1 :(得分:2)

您是否检查过“backports”宝石是否有它?