2011年8月 4日

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

三嶋@長崎大と申します。

Module#const_missingを使った動的なクラス定義と,トップレベルでのinclude
について質問があります。なお,ruby-1.8.7-p352およびruby-1.9.2-p290で同様
な結果でした。

"dynamic.rb" として以下のスクリプトを準備します。

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

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

これに対し

require './dymamic'
include Foo
Bar::Hoge.test # => "Foo::Bar::Hoge.test"
Bar::Puyo.test # => "Foo::Bar::Puyo.test"

はうまく動くのですが,

require './dymamic'
include Foo::Bar
Hoge.test # => "Foo::Bar::Hoge.test"
Puyo.test # => uninitialized constant Puyo (NameError)

ではPuyo.testがエラーとなってしまいます。

後者でエラーを回避する方法はあるのでしょうか?(あるいは,おもいっきり勘
違いした質問になってましたらご容赦/ご指摘いただければ幸いです)

三嶋博之
--
長崎大学大学院医歯薬学総合研究科人類遺伝学
三嶋 博之


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




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