3

我正在使用一个在类上动态定义一些方法的 gem,类似于:

class << self
  some_strings.each do |string|
    eval <<-RUBY
      def #{string}
      ....
      end
    RUBY
  end
end

在那些动态定义的方法中引发的任何异常都有无用的回溯;它们导致类似于(eval):2而不是实际的行号。

我想按照以下方式修改此代码:

eval <<-RUBY, nil, __FILE__, __LINE__ + 1

...为了获得更好的回溯。

但是,与class_evaland不同instance_eval,plain oldeval有一个可选binding参数,我不确定传递nil给它是否是个好主意,如上所示。

它似乎确实有效,并且eval 的文档说绑定是可选的:

If binding is given, which must be a Binding object, the evaluation is 
performed in its context.

尽管如此,我还是喜欢一些有用的解释,因为我还没有很好地掌握绑定和动态评估。

动态评估class << self块内代码并确保有用的回溯的正确方法是什么?

4

1 回答 1

1

绑定并不是您正在寻找的解决方案,因为所有这些所做的只是更改的上下文,eval并且它已经在您想要的上下文中。

更好的做法是尽可能避免使用eval字符串。Ruby 有大量的元编程辅助方法,可以让您在除极少数情况外的所有情况下避免字符串评估。

在您的具体示例中,它看起来Module#define_methodObject#define_singleton_method可能有用。

于 2012-08-21T04:30:35.223 回答