在 Ruby 1.9.3 中,我需要创建一些类实例,每个实例具有相似的实例方法和类方法,但它们仅因几个固定参数而异。它们的类类型的区别也很重要,所以我不能简单地使用同一类的不同实例。
一个简化的示例如下所示。
module Animal
private
def self.make_animal(name, legs, noise)
klass = Class.new
klass.const_set(:NUM_LEGS, legs)
klass.class.send(:define_method, :scream) { noise.upcase + '!' }
Animal.const_set(name, klass)
end
make_animal :Tiger, 4, 'roar'
make_animal :Human, 2, 'derp'
end
除了动态定义“尖叫”方法的块中使用的变量在“尖叫”方法的运行时而不是“make_animal”方法的运行时绑定之外,这似乎工作正常。
Animal::Human::NUM_LEGS # => 2 -- ok
Animal::Tiger::NUM_LEGS # => 4 -- ok
Animal::Human.scream # => "DERP!" -- ok
Animal::Tiger.scream # => "DERP!" -- fail!
我怎样才能修改上面的代码,让老虎尖叫"ROAR!"
?
[注意]我确实需要维护示例中愚蠢的 OO 结构,原因太复杂,无法在此描述。我只对学习如何使用参数化方法实现以编程方式在动态定义的类上定义类方法感兴趣。