Ruby での参照渡しについて
Ruby
Published: 2019-05-10

やったこと

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"

参考

class Object (Ruby 2.6.0)