私は、関連するクラスのクラス変数に保存する、整数パラメーターによって区別される一連の同様の Ruby クラスを生成できるシステムをセットアップしようとしています - C++ テンプレートに似ています。
ただし、テンプレート化されたクラスの新しいバージョンを参照 (したがって、作成) すると、以前のバージョンで保存されたパラメーターが上書きされます。その理由はわかりません。
これは最小限の例です
class Object
def self.const_missing(name)
if name =~ /^Templ(\d+)$/
return make_templ $1.to_i
else
raise NameError.new("uninitialised constant #{name}")
end
end
private
def make_templ(base)
# Make sure we don't define twice
if Object.const_defined? "Templ#{base}"
return Object.const_get "Templ#{base}"
else
# Define a stub class
Object.class_eval "class Templ#{base}; end"
# Open the class and define the actual things we need.
Object.const_get("Templ#{base}").class_exec(base) do |in_base|
@@base = in_base
def initialize
puts "Inited with base == #{@@base}"
end
end
Object.const_get("Templ#{base}")
end
end
end
irb(main):002:0> Templ1.new
Inited with base == 1
=> #<Templ1:0x26c11c8>
irb(main):003:0> Templ2.new
Inited with base == 2
=> #<Templ2:0x20a8370>
irb(main):004:0> Templ1.new
Inited with base == 2
=> #<Templ1:0x261d908>
私の Ruby (ruby 1.9.2p290 (2011-07-09) [i386-mingw32]) でバグを見つけたのでしょうか、それとも単純に何か間違ったコードを書いたのでしょうか?