【问题标题】:Ruby performance: define method with define_method or evalRuby 性能:使用 define_method 或 eval 定义方法
【发布时间】:2011-09-27 23:14:07
【问题描述】:

在查看 ActiveSupport 源代码时,我注意到有时eval 用于define_method 足够的地方。

示例:ActiveSupport: Module.delegate

我认为define_method 更干净、更安全的做事方式。 evaldefine_method 有什么好处? 性能、内存使用量,还是其他?

【问题讨论】:

    标签: ruby methods metaprogramming eval


    【解决方案1】:

    当您使用define_method 时,您定义的方法can't accept a block

    众所周知,因为 块论点的缺陷 Ruby 1.8 类#define_method 不能 定义采用块的方法。

    def x *args, █ end  # => works!
    define_method(:x) {|*args,&block| } # => SyntaxError: compile error
    

    被定义的方法需要一个块:

    "def #{prefix}#{method}(*args, &block)" # def customer_name(*args, &block)
    

    所以无法使用define_method。

    【讨论】:

    • 这在 Ruby 1.9 中不是问题
    【解决方案2】:

    我发现这是一篇关于这个主题的非常好的文章:http://blog.grayproductions.net/articles/eval_isnt_quite_pure_evil

    【讨论】:

      【解决方案3】:

      我不知道在那种特殊情况下的原因是什么,但是define_method 需要一个块,它是一个闭包(携带它定义位置的局部变量),这可能会导致相当高的内存消耗比较到普通的eval

      【讨论】:

      • 我认为eval 往往是最慢的方法。
      • 根据@emboss提供的链接,也许它毕竟不慢。
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2011-01-30
      • 2011-03-11
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2011-09-22
      相关资源
      最近更新 更多