2012-03-10 15 views
1

class_eval(文字列をコードに変換する)のように見えて、新しいdefメソッドでクラスを宣言するのは本質的に同じことです。Rubyでのクラスの拡張(def対class_eval)

本当に同じですか? それぞれの長所と短所は何ですか?

答えて

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 

をとにかくが、これらの構造は、その目的で使用されなければならない、もしあなたはメタプログラミングを行い、クラスやインスタンスを評価することをお勧めします。メソッドを定義するだけの場合は、あまりにも些細なことで賢明にならないでください。