Ruby性能:使用define_method或eval定义方法

时间:2011-07-04 07:59:05

标签: ruby methods metaprogramming eval

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

示例:ActiveSupport: Module.delegate

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

3 个答案:

答案 0 :(得分:3)

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

  

众所周知,因为   中国的块参数不足   Ruby 1.8 Class#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。

答案 1 :(得分:3)

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

答案 2 :(得分:1)

我不知道在那种特殊情况下是什么原因,但define_method采用了一个块,这是一个闭包(带有它定义的地方的局部变量),并且可以导致相当高的内存消费与普通eval比较。