TL;DR

  • Ruby のメソッドの引数は、参照渡しではなく参照の値渡しである。
  • 引数で受け取った配列の要素を書き換えると呼び出し元の配列も変わるが、引数に別の配列を代入しても呼び出し元の配列は変わらない。

環境

  • Ruby 3.2.2

検証

配列を引数に渡して、実際の挙動を確かめる。

配列の要素を変更する

a = [1, 2, 3]
 
def change_element(arr)
  arr[0] = 100000
end
 
change_element(a)
a # [100000, 2, 3]: 変更される

引数の変数に別の配列を代入する

def change_var(arr)
  arr = [3, 2, 1]
end
 
change_var(a)
 
a # [1, 2, 3]: 変更されない

結果

要素を変更したときは、呼び出し元の a も [100000, 2, 3] に変わった。引数の変数に別の配列を代入したときは、呼び出し元の a は変わらなかった。

考察

要素の変更は、引数が指している配列そのものを書き換えるので、同じ配列を指している呼び出し元にも変更が及ぶ。一方、引数への代入は、引数の変数が指す先を別の配列に変えるだけなので、呼び出し元の変数には影響しない。

キーワード

  • Ruby
  • 参照の値渡し

参考