「値渡し」「参照渡し」とは
関数やメソッドにおける引数の渡し方の種類を表す用語のこと。
Rubyだけではなくどのプログラミング言語でも共通する。
値渡し
- 実引数の値をコピーして仮引数に渡す
- コピーを渡すので、実引数には影響なし
- Rubyは値渡し(他の言語も)
参照渡し
- 実引数の変数があるメモリ上の場所(メモリ番地)をコピーして仮引数に渡す
- 与えられたメモリ番地から実引数の値を辿って値を変更する
- 仮引数に変更を加えると実引数も変更される
参照の値渡し?
- 変数が参照(メモリ番地)を保持している場合、参照がコピーされる
- 「オブジェクトの参照(メモリ番地)」をコピーして実引数に渡すので、同じオブジェクトを共有しているということになる
- つまり、引数が指すオブジェクトを変更すると元の変数のオブジェクトも変更される
- あたかも「仮引数を変更したら実引数も変更された」ように見えるだけで、実際は値渡し
- 「変数を変更する」ことと「変数が指すオブジェクトを変更する」ことは別!
引用元
メモリ番地でイメージするととてもわかりやすかったです。
今日学んだことを可視化するためにとりあえず書いてみました。後程自分の中で噛み砕いてまとめます。