Rubyでの参照渡し

Rubyで参照渡しを使うにはどうするのかというのが気になり、色々と調べてみました。

結論として、参照渡しを使うケースは主にひとつ以上の値をメソッドから取り出したいケースで、Rubyの場合は配列で戻り値を返そうよっということみたいです。

引用元:
http://blade.nagaokaut.ac.jp/cgi-bin/vframe.rb/ruby/ruby-list/613?593-819

rubyには変数の参照というものがないので,そういうことはできま
せん.変数の参照渡しがしたい時というのは大体において以下のよ
うな場合です.

  * オブジェクトのサイズが大きいとコピーのコストが大きい

    rubyのオブジェクトは全部参照ですからオブジェクトサイズに
    かかわらず引数渡しのコストは同じです.

  * ひとつ以上の値をメソッドから取り出したい

    rubyは配列を返すことで見掛け上複数の戻り値を返すことがで
    きます.

       a, b = foo(arg)

ただ、Rubyには変数の参照がないと書かれているのには?がともります。
例えば、

def test(hash_in)
	hash_in["c"] = 3
end

hash_out = {"a" => 1, "b" => 2}
test(hash_out)
p hash_out # 出力→{"a"=>1, "b"=>2, "c"=>3}

とすれば、関数内で格納した値が関数外でも格納されているので、これって参照渡しだよねって思うのです。

ただし、

def test(hash_in)
	hash_in = {"c" => 10, "d"=>11}
end

hash_out = {"a" => 1, "b" => 2}
test(hash_out)
p hash_out # 出力 → {"a"=>1, "b"=>2}

とすると、あれっやっぱり参照じゃないのかなっと訳がわからなくなるのです。

そこで、もう少し調べてみたところ、以下の記事を見つけました。

引用元:
http://blade.nagaokaut.ac.jp/cgi-bin/scat.rb/ruby/ruby-list/1534

rubyには値渡ししかなく引き数として与えられた変
数の値を変えても元の式の値は変わりません.ただし,オブジェク
トの参照が渡るので値に対して破壊的な操作は可能です.

ということで、Rubyでは引数は値渡ししかない。
ただし、値渡しでありながらもオブジェクトが渡っているので、そのオブジェクトに対する操作であれば関数外のオブジェクトに対しても影響を与えることができるということですね。サンプルプログラムの結果とも一致します。
ん?最後にまとめたつもりが、上の文書の繰り返しになってしまいました。。。