やったこと
Ruby での参照渡しについて、調べてみます。
確認環境
$ ruby --version
ruby 2.6.3p62 (2019-04-16 revision 67580) [x86_64-darwin17]
調査
関数に渡す引数の変数について、object_id を調べてみます。 また変数の代入もしてみます。
test.rb
def test(a, b)
p "a: #{a.object_id} in test"
p "b: #{b.object_id} in test"
end
a = 1
b = 2
c = b
p "a: #{a.object_id}"
p "b: #{b.object_id}"
p "c: #{c.object_id}"
test(a, b)
出力結果
$ ruby test.rb
"a: 3"
"b: 5"
"c: 5"
"a: 3 in test"
"b: 5 in test"
どうやら、引数として渡す前、渡した後のオブジェクトは同じもののようです。
つまり、引数に対して関数内で引数のオブジェクトに直接変更を加えると 関数を抜けた後も影響を受けます。
test.rb
def test2(a, b)
a.upcase!
end
a = 'abc'
b = 'jkl'
test2(a, b)
p a
p b
出力結果
"ABC"
"jkl"