2011年8月 4日

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

前者の方は、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 <missy@xxxxx>:

> 三嶋@長崎大と申します。
>
> 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

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




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