From: matz@... (Yukihiro Matsumoto) Date: 1997-12-18T14:35:55+09:00 Subject: [ruby-dev:1136] Re: Object#bind まつもと ゆきひろです In message "[ruby-dev:1134] Re: Object#bind" on 97/12/18, 石塚圭樹 writes: |けいじゅ@日本ラショナルソフトウェアです. | Object#bound_method(method_name) | |なんですね? すでにobject(のクラス)に登録してあるメソッドをobjectをレシー |バとしてbindしたメソッドなんですね. で, 実行したい時には, | | bound_method.call(arg,...) | |と... | |でも, これだとレシーバが固定になってしまいますね. そうです.レシーバに束縛されているんでBoundMethodなんですね. 石塚さんはモジュールに束縛されていると思ってたんですね. | Module#bodoud_method(method_name) | |って感じのBoundMethodもありますね. この場合はそのModuleに登録されたて |いるっていう意味で束縛されています. この場合は, そのModuleの子孫クラス |のインスタンスから呼びだし可能で, 次のように使えます. | | a_obj.send(bound_method, arg,...) | |後者の方が, 色々と応用例がありますね. これは私の話していたUnboundMethodに近いです.モジュールに束 縛されているということは上の例では a_obj は module に対して kind_of?が成立することを仮定しています? |# たしか, この話しの元になったのが |# |# (fset 'old-func (symbol-funcation 'method) |# (defun method ...) |# |# をrubyでも行ないたいって話しでしたので... とはいえ,もともとの前田さんのBoundMethodの実装が今私の話し ているようなBoundMethodでしたからねえ. | Module#bound(method_name, bound_method) | |これは, bound_methodの束縛しているクラスの子孫クラスにmethod_nameとし |て登録するメソッドです. そうすると, | | foo = Foo.bound_method(:foo) | Foo.remove_method(:foo) | Foo.bount_method(:foo_org, foo) | Foo.eval_module "def foo; ... foo_org ... ; end" | |なんてこともできるようになります. | |いかがでしょう? クラスツリーを越えられないのではaliasと変わらない気がします が…,どうなんでしょ? |うーん. 確かにsuperの問題は微妙ですね... 実際にメソッドが定義されてい |たクラスからたどっていけば良いような気もしますが, そうすれば良いとも限 |らないですからねえ... 問題なのはmix-inの関係でrubyは実装上は多重継承になっているの でsuperで呼ばれるメソッドが静的には決して決まらないことです. で,現在はレシーバのクラス階層から動的に探しているのですが, UnboundMethodによってメソッドが要求するクラス階層とレシーバ のクラス階層が異なると破綻しそうです.すくなくとも現在の実装 では対応できません. |先ほどのBoundMethodの後者の件でも, 子孫クラスでOKとしましたが, そのク |ラスに限るべきなんですかねえ... だから,それじゃ alias ですって. まつもと ゆきひろ /:|)