ruby- 动态定义模块

ruby- define modules dynamically

下面是我在项目中使用的示例模块(n 个编号),方法名称相同但 return 值不同(模块名称前缀)。

module Example1
 def self.ex_method
   'example1_with_'
 end
end


module Example2
 def self.ex_method
   'example2_with_'
 end
end

我尝试使用像#define_method 这样的元编程方式来完成这个。但是,它对我不起作用。有什么办法吗?

array.each do |name|
  Object.class_eval <<TES
    module #{name}
      def self.ex_method
        "#{name.downcase}_with_"
      end
    end
  TES
end

Error snap: 你可以在最后一行看到它没有完成。

注意:我会使用 Cary 提供的解决方案,因为它更地道。

现在让我们回答OP中的问题。

问题出在heredoc

Object.class_eval <<TES

将以TES 在第一个位置结束。要像您一样关闭,请使用:

#                   ⇓ HERE
Object.class_eval <<-TES
m = Object.const_set("Example1", Module.new)
  #=> Example1 
m.define_singleton_method("ex_method") { 'example1_with' }
  #=> :ex_method  

让我们看看:

Example1.is_a? Module
  #=> true
Example1.methods.include?(:ex_method)
  #=> true
Example1.ex_method
  #=> "example1_with"