1

似乎 class_eval (将字符串转换为代码)和用新的 def 方法声明类本质上是一回事。

它们真的是等价的吗?各自的优缺点是什么?

4

1 回答 1

1

通常的方法定义和块评估之间几乎没有区别:

bench(1000000) do
  class A; def test; end end
end
=> 2.5 sec

class B; end
bench(1000000) do
  B.class_eval{ def test; end }
end
=> 2.75 sec

但这里与字符串评估有很大不同:

bench(1000000) do
  B.class_eval("def test1; end")
end
=> 24.02 sec

无论如何,这些结构应该按其用途使用,如果您进行元编程然后使用类或实例评估,如果您只是定义一个方法,请不要太聪明。

于 2012-03-10T22:22:15.847 回答