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の違いでした。