Ruby class_eval方法

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

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的值创建方法,想法?

有两种可接受的方式:

  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)并使用常规方法绑定。 第二个选项在调用方法时具有非常小的性能优势。 第一种选择(可以说)更具可读性。

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