在模块方法中访问调用范围

时间:2016-10-06 21:44:40

标签: ruby scope reference

我正在制作一个小调试工具,以便将参数传递给方法,如下所示:

Class bar
  def foo(a,b,c)
    Debug.get_arguments()
    ### do stuff
  end
end

module Debug
  def get_arguments
    method(__method__).parameters.map { |arg| [arg[1],eval(arg[1].to_s)] }.to_h
  end
end

目前,它返回并清空哈希' {}'虽然我希望它返回{a:x,b:y,c:z}(foo的参数和值)。

是否有类似__calling_method__或__parent_method__的内容?否则,我必须将调试代码放在每个方法中。

1 个答案:

答案 0 :(得分:0)

您可以使用eval来评估当前范围内的代码字符串。

请注意,我修复的代码存在一些错误:

  • Class bar中,大写错误
  • 您正在调用Debug.get_arguments,因此get_arguments应该是一种类方法

请注意,我只是为了更清楚地显示输出而加载awesome_print;代码不依赖于它。

脚本(test.rb):

require 'awesome_print'

class Bar
  def foo(a,b,c)
    eval Debug.get_arguments
  end
end

module Debug
  def self.get_arguments
    "method(__method__).parameters.map { |arg| [arg[1],eval(arg[1].to_s)] }.to_h"
  end
end

ap Bar.new.foo 1,2,3

调用脚本:

$ ruby test.rb

打印:

{
    :a => 1,
    :b => 2,
    :c => 3
}

这表明eval即使在嵌套时也能正常工作,这很酷。