在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結構,這是因爲這裏涉及太多的原因。我只感興趣的是學習如何用參數化方法實現以編程方式定義動態定義的類上的類方法。
啊,是的,'define_singleton_method'。忘了它:) –
是的,「define_singleton_method」似乎是我失蹤。 – maerics