In Ruby 1.9.3 muss ich einige Klasseninstanzen anlegen, die jeweils ähnliche Instanz- und Klassenmethoden haben, aber nur um einige feste Parameter variieren. Die Unterscheidung ihrer Klassenart ist ebenfalls wichtig, daher kann ich nicht einfach einzelne Instanzen derselben Klasse verwenden.Dynamische Klassenmethoden in Ruby definieren
Ein vereinfachtes Beispiel sieht so aus.
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
Dies scheint gut zu funktionieren, außer, dass die Variablen in dem Block verwendet, die die „Schrei“ Methode dynamisch definiert werden zur Laufzeit der „Schrei“ Methode anstelle der Laufzeit des „make_animal“ Verfahrens gebunden.
Animal::Human::NUM_LEGS # => 2 -- ok
Animal::Tiger::NUM_LEGS # => 4 -- ok
Animal::Human.scream # => "DERP!" -- ok
Animal::Tiger.scream # => "DERP!" -- fail!
Wie kann ich den obigen Code ändern, so dass der Tiger "ROAR!"
schreit?
[Hinweis] Ich muss wirklich die doof OO-Struktur in dem Beispiel aus Gründen, die zu beschreibend sind hier zu halten. Ich bin nur daran interessiert zu lernen, wie man Klassenmethoden dynamisch mit parametrisierten Methodenimplementierungen definiert.
Ach ja, 'define_singleton_method'.Habe es vergessen :) –
Ja, "define_singleton_method" scheint das zu sein, was mir gefehlt hat. – maerics