【问题标题】: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 更干净、更安全的做事方式。
eval 比 define_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。
【解决方案3】:
我不知道在那种特殊情况下的原因是什么,但是define_method 需要一个块,它是一个闭包(携带它定义位置的局部变量),这可能会导致相当高的内存消耗比较到普通的eval。