在查看ActiveSupport源代码时,我注意到有时eval
用于define_method
已足够的地方。
示例:ActiveSupport: Module.delegate
我认为define_method
更干净,更安全的做事方式。
eval
优于define_method
的好处是什么?
性能,内存使用情况,还有其他什么?
答案 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
比较。