From: Aiga Matsuo Date: 2011-08-04T16:09:00+09:00 Subject: [ruby-list:48258] Re: 動的なクラス定義とトップレベルでのinclude --90e6ba6e8d06f32e1404a9a890b9 Content-Type: text/plain; charset=ISO-2022-JP Content-Transfer-Encoding: 7bit 前者の方は、Foo::Barのスコープでmethod_missingが呼ばれますが、 後者は、Objectのスコープでmethod_missingが呼ばれることになります。 トップレベルのconst_missingを再定義するなら、 class Object def self.const_missing(sym) puts "constant: #{sym}" end end p Hoge # => "constant: Hoge" こんな感じになっちゃいます。 2011年8月4日14:54 MISHIMA, Hiroyuki : > 三嶋@長崎大と申します。 > > 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がエラーとなってしまいます。 > > 後者でエラーを回避する方法はあるのでしょうか?(あるいは,おもいっきり勘 > 違いした質問になってましたらご容赦/ご指摘いただければ幸いです) > > 三嶋博之 > -- > 長崎大学大学院医歯薬学総合研究科人類遺伝学 > 三嶋 博之 > > -- Aiga Matsuo --90e6ba6e8d06f32e1404a9a890b9--