Array#+とArray#concatの違い

Array#+では、新しいArrayオブジェクトが作られる。Array#concatではselfに足し込まれる。
以下のプログラムでは、新しいオブジェクトが作られたかどうかをobject_idメソッドで調べています。また、+を行う前に変数cに代入しておいた配列にはbが足し込まれないことを確認しています。

a = [ 'Alice', 'Bobby', 'Chris' ]
b = [ 'David', 'Elvis' ]

p a.object_id   #=> 23058920

c = a
a += b

p c             #=> ["Alice", "Bobby", "Chris"]
p a             #=> ["Alice", "Bobby", "Chris", "David", "Elvis"]

p a.object_id   #=> 23058770
p c.object_id   #=> 23058920

以下のプログラムはconcatを使っています。object_idの結果は変わらず、新しいオブジェクトは作られていないのがわかります。またconcatするまえに変数cに代入をしていますが、そちらのオブジェクトにも(というか同じオブジェクトなので)bが足し込まれていることがわかります。

a = [ 'Alice', 'Bobby', 'Chris' ]
b = [ 'David', 'Elvis' ]

p a.object_id   #=> 23058920

c = a
a.concat(b)

p c             #=> ["Alice", "Bobby", "Chris", "David", "Elvis"]
p a             #=> ["Alice", "Bobby", "Chris", "David", "Elvis"]

p a.object_id   #=> 23058920
p c.object_id   #=> 23058920

以上、Array#+とArray#concatの違いでした。