Ruby class_eval方法

时间:2010-01-10 23:03:07

标签: ruby

我正在试图弄清楚如何动态创建方法

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 个答案:

答案 0 :(得分:28)

有两种可接受的方式:

  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
    
  3. 第一个选项将闭包转换为方法,第二个选项计算字符串(heredoc)并使用常规方法绑定。第二个选项在调用方法时具有非常轻微的性能优势。第一种选择(可以说)更具可读性。

答案 1 :(得分:4)

define_method(m) do |*values|
  puts value
end