Ruby class_eval метод - PullRequest
       1

Ruby class_eval метод

13 голосов
/ 11 января 2010

Я пытаюсь понять, как динамически создавать методы

class MyClass
  def initialize(dynamic_methods)
    @arr = Array.new(dynamic_methods)
    @arr.each { |m|
      self.class.class_eval do
        def m(*value) 
          puts value
        end
      end
    }
    end
end

tmp = MyClass.new ['method1', 'method2', 'method3']

К сожалению, это только создает метод m, но мне нужно создавать методы, основанные на значении m, идеи?

Ответы [ 2 ]

28 голосов
/ 11 января 2010

Есть два принятых способа:

  1. Использование define_method :

    @arr.each do |method|
      self.class.class_eval do
        define_method method do |*arguments|
          puts arguments
        end
      end
    end
    
  2. Используйте class_eval со строковым аргументом:

    @arr.each do |method|
      self.class.class_eval <<-EVAL
        def #{method}(*arguments)
          puts arguments
        end
      EVAL
    end
    

Первый параметр преобразует замыкание в метод, второй параметр оценивает строку (heredoc) и использует обычную привязку метода. Второй вариант имеет очень небольшое преимущество в производительности при вызове методов. Первый вариант (возможно) немного более читабелен.

4 голосов
/ 11 января 2010
define_method(m) do |*values|
  puts value
end
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...