From: Takeshi Horinouchi Date: 2003-08-11T14:46:00+09:00 Subject: [ruby-list:38073] module extendable? 堀之内と申します。 モジュールをネストして module_function を継承(のようなことを) することはできるでしょうか。具体的には、モジュールに入れたアルゴ リズム(メソッド群)を取り替えやすくするため、以下のようなことを したいのですが、うまくいきません。使用しているのは ruby 1.6.8 で す。同様のことをするのに別の方法があるよとか、1.6 ではだめだけど 1.8 ならできるといった情報でも結構です。(まだしばらく1.6は切り 捨てたくないので困りはしますが。。。) module Foo module_function def hi; "hi"; end def there; "there"; end end module Bar module_function extend Foo def hi; 'HI'; end end class Hoge @@algorithm = Foo def Hoge.set_algorithm(modul) @@algorithm = modul end def hi; p @@algorithm::hi + '!'; end def there; p @@algorithm::there + '!'; end end p Bar.private_instance_methods a = Hoge.new a.hi a.there Hoge.set_algorithm(Bar) a.hi a.there ちょっと長くなりましたが、要するにデフォルトのアルゴリズム集 (Foo)があって、必要に応じてその一部を再定義した別のアルゴリズム 集(Bar)に取り替えたいということです。実際には、module Bar に相当 するものは、あらかじめ選択肢を用意するだけでなく、ユーザー定義な ものがあることを想定しています。後から簡単に取り替えられるように したいので、モジュールをインクルードする形にはしてません。 上記のプログラムを実行すると以下のようなエラーがでます。 % ruby nested_modules2.rb ["hi"] "hi!" "there!" "HI!" /.../nested_modules2.rb:18:in `there': private method `there' called for Bar:Module (NameError) from /.../nested_modules2.rb:27 プライベートメソッドというわりには、Bar.private_instance_methods の結果に含まれない(上記の実行結果1行目)のが腑に落ちません。 なお、module Bar において extend でなく include にしてもだめです。 /.../nested_modules2.rb:18:in `there': undefined method `there' for Bar:Module (NameError) from /.../nested_modules2.rb:26 以上、よろしくお願い致します。