Ответ 1
Существует два способа:
-
Используйте define_method:
@arr.each do |method| self.class.class_eval do define_method method do |*arguments| puts arguments end end end
-
Используйте class_eval со строковым аргументом:
@arr.each do |method| self.class.class_eval <<-EVAL def #{method}(*arguments) puts arguments end EVAL end
Первый вариант преобразует замыкание в метод, второй параметр оценивает строку (heredoc) и использует регулярную привязку метода. Второй вариант имеет очень небольшое преимущество при использовании методов. Первый вариант (возможно) немного читабельнее.