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"
下面是我在项目中使用的示例模块(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"