2011年8月 4日

[ruby-list:48257] Re: 動的なクラス定義とトップレベルでのinclude

畠山です。

結論からいいますと、二番目のエラーが出たのはPuyoがFoo::Barの定数としてではなくトップレベルの定数だと認識されたためだと思います。
トップレベルの未定義定数の場合はObject.const_missingが呼ばれますので次のように定義すると両方とも実行されます。(実用的には二度同じ定義をするのはあまりよろしくないのでもう少し賢い方法はどなたかの回答を期待します...)


module Foo
module Bar

class Hoge
def self.test
"Foo::Bar::Hoge.test"
end
end

def self.const_missing(sym)
p self
module_eval %!
class #{sym}
def self.test
"Foo::Bar::#{sym}.test"
end
end
!
const_get(sym)
end

def Object.const_missing(sym)
p self
module_eval %!
class #{sym}
def self.test
"Foo::Bar::#{sym}.test"
end
end
!
const_get(sym)
end

end
end

ちなみに

require 'dynamic'
include Foo::Bar
p Puyo.test # => "Foo::Bar::Puyo.test"
p Foo::Bar::Puyo.test # "Foo::Bar::Puyo.test"

とすると一つめと二つ目でselfの値が違っているのが分かります。

参考までに。

畠山


投稿者 xml-rpc : 2011年8月 4日 16:07
役に立ちました?:
過去のフィードバック 平均:(0) 総合:(0) 投票回数:(0)
本記事へのTrackback: http://hoop.euqset.org/blog/mt-tb2006.cgi/105526
トラックバック
コメント
コメントする




画像の中に見える文字を入力してください。