このように、プログラム的にクラスを定義したいという状況があります。私がここで継承しているサードパーティのクラスは、そのクラスが匿名で定義されているという事実を好まないという事実を除いて、私が使用しているメソッドはうまくいきます(基本的に、必要な情報を持っていません。匿名クラスを定数に設定する前に、 '継承された'フック内のクラス名)。ブロックを使った動的クラス定義
['one', 'two', 'three'].each do |model|
cls = Class.new(ThirdPartyClass) do
define_method :model do
model
end
end
ThirdPartyClass.const_set(model.capitalize, cls)
end
私は単純にevalを使用するなど、クラスの何かを定義することができます。
['one', 'two', 'three'].each do |model|
eval "class ThirdPartyClass::#{model.capitalize} < ThirdPartyClass; ...; end"
end
をしかし、それは厄介な文字列補間だので、私はそれを好きではありません。ブロックベースの方法は、美的に言えば「より良い」と思われます。
ブロックベースの構文を使用して、そのクラスを非匿名で(つまり、最初から名前を付けて)定義できる方法はありますか、またはevalの乱雑な文字列入力の土地にとどまるのですか?
クラスが同じクラスの名前空間内にあり、同じクラスのサブクラスになることは奇妙です。 – sawa
Trueですが、名前空間の問題はこの特定の問題に直面しています(少なくとも私はそう考えています)。好奇心が強いなら、私はclassy_enum宝石を使用しています。その宝石の慣例により、enum値はメインenumクラスの名前空間内になければなりません。それは、他の言語のそれと幾分類似した列挙構文を生成する。 – elsurudo