From: ttate@... Date: 1998-09-01T18:08:32+09:00 Subject: [ruby-list:9391] Re: Delegator 立石です。 From: matz@netlab.co.jp (Yukihiro Matsumoto) Subject: [ruby-list:9381] Re: Delegator matz> 1. 私のところではSEGVせずに matz> matz> /tmp/test.rb:13:in `say': super: no superclass method `say' (NameError) matz> from /tmp/test.rb:16 matz> matz> となります.SEGVするのはバグだと思うのですが….環境とバー matz> ジョンを教えて下さい.うちはlinuxで1.1c2,1.1c3,1.1d0で発 matz> 生しませんでした. すみません。こちらはどうやらおそらく自作モジュール のバグのようです。自宅に帰って再現させてみると上記 と同じようなエラーとなってしまいました。 拡張モジュールの方はいろいろと変更してしまったあと なので今となってはどういう状況だったのか分かりません。 お騒がせしてしまいました。m(_ _)m matz> 2. SimpleDelegatorは転送先オブジェクトの持っているメソッドを matz> 特異メソッドとして定義します.ので,特異メソッドfoo.sayを matz> 定義するとSimpleDelegatorによる定義を上書きしてしまいます. matz> ですから,superで呼べないでエラーになったのだと思います. matz> matz> foo = DelegateClass(Foo).new matz> def foo.say matz> ... matz> super matz> end matz> matz> とかなら動作するような気がするんですが. こちらは、DelegateClass(Foo)によって生成させた クラスにinitializeを再定義する必要があるため DelegateClass(Foo).new という書き方はできない ようです。aliasを使ってごまかすよりもこちらの方法で なんとか initialize 再定義の手間を省けないか考えた のですが次のような感じの修正はいかがでしょう? *** delegate.rb.old Tue Sep 1 17:55:38 1998 --- delegate.rb Tue Sep 1 18:02:03 1998 *************** *** 69,81 **** # def DelegateClass(superclass) klass = Class.new methods = superclass.instance_methods methods -= ::Kernel.instance_methods methods |= ["to_s","to_a","inspect","hash","eql?","==","=~","==="] klass.module_eval <