W Rubim 1.9.3 muszę utworzyć kilka instancji klasy, z których każda ma podobne metody klasy i instancji, ale które różnią się tylko o kilka stałych parametrów. Rozróżnienie ich typu klasy jest również ważne, więc nie mogę po prostu użyć oddzielnych instancji tej samej klasy.Zdefiniowanie metod klas Dynamicznie w Rubim
Uproszczony przykład wygląda następująco.
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
ten wydaje się działać dobrze z tym, że zmienne stosowane w bloku, który dynamicznie wyznacza „Scream” metoda jest związana w czasie działania „Scream” zamiast wykonywania sposobu z „make_animal” metodą.
Animal::Human::NUM_LEGS # => 2 -- ok
Animal::Tiger::NUM_LEGS # => 4 -- ok
Animal::Human.scream # => "DERP!" -- ok
Animal::Tiger.scream # => "DERP!" -- fail!
Jak mogę zmodyfikować powyższy kod tak, że Tiger krzyczy "ROAR!"
?
[Uwaga] I naprawdę trzeba zachować strukturę głupkowaty OO na przykład z powodów, które są zbyt zaangażowani tu opisać. Interesuje mnie tylko nauka programowania programowo metod klas na dynamicznie definiowanych klasach z sparametryzowanymi implementacjami metod.
Ach, 'define_singleton_method'.Zapomniałem o tym :) –
Tak, "define_singleton_method" wydaje się być tym, czego mi brakowało. – maerics