我正在试图弄清楚如何动态创建方法
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的值创建方法吗?
答案 0 :(得分:28)
有两种可接受的方式:
@arr.each do |method|
self.class.class_eval do
define_method method do |*arguments|
puts arguments
end
end
end
将class_eval与字符串参数一起使用:
@arr.each do |method|
self.class.class_eval <<-EVAL
def #{method}(*arguments)
puts arguments
end
EVAL
end
第一个选项将闭包转换为方法,第二个选项计算字符串(heredoc)并使用常规方法绑定。第二个选项在调用方法时具有非常轻微的性能优势。第一种选择(可以说)更具可读性。
答案 1 :(得分:4)
define_method(m) do |*values|
puts value
end