02 Jun '12, 8am

わかりやすい Rubyist Magazine - 値渡しと参照渡しの違いを理解する

わかりやすい Rubyist Magazine - 値渡しと参照渡しの違いを理解する

参照渡し (call by reference) とは、変数のメモリ番地を渡す渡し方です。これにより、あたかも変数が共有されたような状態になります。 リスト 4 をご覧ください。これは list3 と同じコードですが、もし Ruby が参照渡しだったとしたら、最後の行の出力結果が list3 とは異なるはずです。 list4. もし Ruby が参照渡しだったとした場合 def foo(a, b) # a, b を「仮引数」という a += 1 b += 2 # a と b を変更する end x = 10 y = 20 foo(x, y) # x, y を「実引数」という puts x #=> 11 # 変更されている! puts y #=> 22 # 変更されている! この仕組みを説明します。「add(x, y)」のように関数が呼ばれると、参照渡しでは fig5. のように変数 x と y のメモリ番地が引数 a と b に渡されます。 fig5. x と y のメモリ番地が a と b に渡される 参照渡しでは変数の値は渡されないので、メモリ番地をたどって値を取得します。この場合なら変数 a に格納されたメモリ番地 0x8840 をたどって、10 という値を取り出します。また引数 a や b に別の値を代入すると、メモリ番地をたどって、変数 x や y の値が変更されます (fig6)。このとき、a や b に格納されたメモリ番地の値は変わりません。 fig6. a や b を操作すると、x と y の値が変わる このような仕組みのため、参照渡しでは次のような性質があります。 引数 a や b を使って、変数 x や y の値を変更できる (a や b を変更すると、x や y も変更される)。 このおかげで、あたかも x と a が、また y と b が、同じ変数を共有しているように見えます。 ところで前のセクションで、a や b は「仮引数」、x や y は「実引数」と呼ぶと説明しました。これらの用語を使うと、上の文章は次のように...

Full article: http://jp.rubyist.net/magazine/?0032-CallByValueAndCallBy...

Tweets