« 4章.参照渡しと値渡し (その2) | メイン | 4章.参照渡しと値渡し (その4) »

4章.参照渡しと値渡し (その3)

前回のエントリでは、メッセージ呼び出し時の引数について値渡しの確認をしました。今回は応答を見ます。メソッドの戻り値というやつです。前回と同様に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のメッセージは、送受信共に確かに値渡しだということがわかりました。今回はここまでにします。次回は参照渡しをしてみます。

トラックバック

このエントリーのトラックバックURL:
http://www.grandnature.net/bin/mt-tb.cgi/64

コメントを投稿

About

2007年10月04日 09:50に投稿されたエントリーのページです。

ひとつ前の投稿は「4章.参照渡しと値渡し (その2)」です。

次の投稿は「4章.参照渡しと値渡し (その4)」です。

他にも多くのエントリーがあります。メインページアーカイブページも見てください。