在Ruby中扩展类(def与class_eval)

时间:2012-03-10 22:00:59

标签: ruby metaprogramming class-eval

看起来像class_eval(将一个字符串变成代码)并用新的def方法声明该类基本上是一回事。

它们真的相同吗? 各自的优点和缺点是什么?

1 个答案:

答案 0 :(得分: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

无论如何,这些结构应该按照它们的用途使用,如果你进行元编程然后使用类或实例评估,如果你只是定义一个方法,那就不要太聪明了。