Расширение классов в Ruby (def против class_eval) - PullRequest
1 голос
/ 11 марта 2012

Кажется, что class_eval (принимает строку, которая превращается в код), и объявление класса с новыми методами def - это по сути одно и то же.

Они действительно эквивалентны? Каковы плюсы и минусы каждого?

1 Ответ

1 голос
/ 11 марта 2012

Практически нет разницы между обычным определением метода и оценкой блока:

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

В любом случае, эти конструкции должны использоваться ихДля целей, если вы выполняете метапрограммирование, а затем используете оценку класса или экземпляра, если вы просто определяете метод, не будьте слишком умны в мелочах.

...