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
これは、「scream」メソッドを動的に定義するブロックで使用される変数が、「make_animal」メソッドの実行時ではなく「scream」メソッドの実行時にバインドされることを除いて、正常に機能するようです。
Animal::Human::NUM_LEGS # => 2 -- ok
Animal::Tiger::NUM_LEGS # => 4 -- ok
Animal::Human.scream # => "DERP!" -- ok
Animal::Tiger.scream # => "DERP!" -- fail!
Tigerが悲鳴を上げるように、上記のコードを変更するにはどうすればよい"ROAR!"
ですか?
[注]ここで説明するには複雑すぎる理由から、例では間抜けなOO構造を維持する必要があります。パラメータ化されたメソッド実装を使用して動的に定義されたクラスでクラスメソッドをプログラムで定義する方法を学ぶことにのみ興味があります。