そのため、プログラムで一連のクラスを定義したいという状況があります。以下で使用しているメソッドは正常に動作しますが、ここから継承しているサードパーティ クラスは、クラスが匿名で定義されているという事実を好まない (基本的に、必要な情報がない、つまり. 匿名クラスを定数に設定する機会を得る前に、「継承された」フック内のクラス名)。
['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 の乱雑な文字列入力の世界にとどまる運命にあるのでしょうか?