From: Masatoshi SEKI Date: 2001-02-01T23:40:55+09:00 Subject: [ruby-list:27448] observer と dRuby 咳といいます。 Rubyに同梱されるobserver.rbをdRubyで使おうとしています。 一つ問題があって | module Observable | def add_observer(observer) | @observer_peers = [] unless defined? @observer_peers | unless defined? observer.update | raise NameError, "observer needs to respond to `update'" defined? で update メソッドの有無を検査しています。 dRubyではローカルにあるのは参照オブジェクト(DRbObject)なので リモートがupdateを持っていてもdefined?が偽となり例外となって しまいます。 | unless defined? observer.update ここが | unless observer.respond_to? 'update' 上のようになってくれるとdRubyで (DRbObjectで) 反応するチャンスが あるので解決できそうなのですが、respond_to? にしていただけないで しょうか ? んで次はdRubyで反応する話です。 DRbObjectはmethod_missingを捕えてリモートのメソッドを呼びますが、 respond_to?メソッドを持っているのでこのままではリモートに確認に いけません。そこで次のように respond_to? をundefすることにより リモートに確認しにいけるようになります。 class DRbObject undef :respond_to? end この方式ではDRbObjectが生成されるごとにメソッドの有無を検査する のではなく、アプリがrespond_to?するときだけ検査します。ですから 従来のアプリは従来と同じ通信回数で済みます。プロトコルも変わりま せん。 ところで、respond_to? って undef しても別段問題ないのかな。 respond_to? をあてにしてるビルトインとかある ??