2011年2月 1日

[ruby-list:47817] 参照渡しの実現方法は?

 吉泉といいます。
 ルビマをいつも興味深く読ませていただいています。感謝。

 32号で、「値渡しと参照渡しの違いを理解する」がありました。
 rubyも基本的には値渡しだと思いますが、参照渡しを実現する方法ってある
んでしょうか。
 記事中にあった例でいうと

−−−−−−−−
def foo(a, b)
a += 1
b += 2
end
x = 10
y = 20
foo(x, y)
p x # => 10 ほんとは 11 になって欲しい
p y # => 20 ほんとは 22 になって欲しい
−−−−−−−−

 時々「参照渡しができれば便利」と思うことがあります。C言語で &x でア
ドレスを取り出し、*a でポインタとして受け取るみたいなイメージです。安
易に使うと後でデバッグに苦しむことはありますが。
 メソッドfooの引数が文字列なら

−−−−−−−−
def foo(a, b)
a.gsub!(/^/, "!")
b.gsub!(/^/, "#")
end
x = "abc"
y = "xyz"
foo(x, y)
p x # => "!abc"
p y # => "#xyz"
−−−−−−−−

 こんな感じで、メソッド内での処理結果を呼び出し元に反映させることがで
きますが、数値の場合にどうしたら実現できるのか……
 というか、引数のデータ型が何であっても、呼び出し元に処理結果を反映さ
せて返したい、というのが希望です。
 一つの素直な方法としては、メソッド foo の最後に「return a, b」を置い
て、呼び出す時は
x, y = foo(x, y)
とするのが一番無難なのかもしれません。
 また、引数を配列(Array)にセットして渡すというのも一つの方法だとは思
います。
 でも、もっと単純に参照渡しができないものかと、
 何か方法があったらアドバイスをお願いします。

投稿者 xml-rpc : 2011年2月 1日 23:27
役に立ちました?:
過去のフィードバック 平均:(0) 総合:(0) 投票回数:(0)
本記事へのTrackback: http://hoop.euqset.org/blog/mt-tb2006.cgi/101724
トラックバック
コメント
コメントする




画像の中に見える文字を入力してください。