А вот еще одно решение:
class Foobar
# Non-test method definitions ...
%w(some_method some_method2).each do |mthd|
class_eval(<<-EOS, __FILE__, __LINE__ + 1)
def #{mthd}_test
#{mthd} / some_calculation
end
EOS
end
end
Таким образом, сами определения методов немного медленнее, но они работают намного быстрее, потому что они не вызывают никакого метода отражения, такого как send
, и там следы стека меньше.
Кстати, %w(foo bar)
означает слова и производит ['foo', 'bar']
.
<<-EOS
blah blah
blah blah
EOS
- это просто строка, которая состоит из нескольких строк (ЗДЕСЬ документ).
class_eval
оценивает строку как скрипт в контексте текущего класса (класс Foobar
). __FILE__
и __LINE__ + 1
влияют на путь к файлу и номер строки в трассировке стека.