前回のエントリでは、メッセージ呼び出し時の引数について値渡しの確認をしました。今回は応答を見ます。メソッドの戻り値というやつです。前回と同様に2章で利用したリマインダーのdRubyサーバーを立ち上げておき、以下のスクリプトを実行してその中身を見ます。
require 'drb/drb'
r = DRbObject.new_with_uri('druby://hoge')
r.add('foo')
str = r[1]
このスクリプトのうち、前回は
r.add('foo')
を見ました。今回はその次のステップである
str = r[1]
を見ていくことにします。まず送信部分のTCPデータ部です。前回と同じように、色が変わっている部分がデータ部です。
見てわかるとおり、r[1]もメソッドです。([]というメソッドに、引数:1が渡される)ので、前回のadd('foo')の時と殆ど変わりはありません。解説は省略します。
次はサーバーから返されるデータ(クライアントが受信するデータ)のデータ部の内容を見ていきます。これも色が変わっている部分がデータ部です。
データ部は18バイトしかありません。短いですね。先頭から見ていきます。
00 00 00 03 04 08 54
これはboolのtrueを表します。リモートのメッセージパッシングが成功したらtrue。失敗したらfalseが入ってくるようです。
で、これに続くのが、
00 00 00 07 04 08 22 08 66 6f 6f
これは、'foo'という文字列のオブジェクトのマーシャルデータです。(66 6f 6fが'foo'です。)複製されたオブジェクトが渡されています。
なお、DRbMessageの以下のメソッドが、該当の処理を行なっている部分だと思います。
def send_reply(stream, succ, result) # :nodoc:
stream.write(dump(succ) + dump(result, !succ))
rescue
raise(DRbConnError, $!.message, $!.backtrace)
end
このことからdRubyのメソッドの戻り値の電文形式は以下の通りとわかりました。各々先頭に4バイトのサイズを示す固定長バイナリデータが付加される点は、送信時と同様です。
1. 成否のbool値
2. メソッドの戻り値のオブジェクト(複製)
この結果から、通常のdRubyのメッセージは、送受信共に確かに値渡しだということがわかりました。今回はここまでにします。次回は参照渡しをしてみます。

