concatメソッド
concatは配列を自身の末尾に破壊的に連結するメソッドです。
concat
を利用した配列の結合は以下の通りです。
> array1 = ['a', 'b']
> array2 = ['c', 'd']
> array3 = ['e', 'f']
> [].concat(array1, array2, array3)
=> ["a", "b", "c", "d", "e", "f"]
concat
はレシーバに対して破壊的な変更を加えます。ですので、以下のようにすると連結元の配列が変更される(今回の例でいうとarray1)ので注意してください。
> array1 = ['a', 'b']
> array2 = ['c', 'd']
> array3 = ['e', 'f']
> array1.concat(array2, array3)
=> ["a", "b", "c", "d", "e", "f"]
### array1の内容が変わってしまう
> array1
=> ["a", "b", "c", "d", "e", "f"]
append(push)メソッド
appendは配列の末尾に要素を追加するメソッドです。push
はappend
と等価なメソッドです。
append
を利用した配列の結合結果は多次元配列になります。ですので、1次元配列で結果を取得する場合はflatten
を利用するか、引数の配列にアスタリスク(*
)を付け足します。
append
を利用した配列の結合は以下の通りです。
> array1 = ['a', 'b']
> array2 = ['c', 'd']
> array3 = ['e', 'f']
### 多次元配列を1次元配列にする
> [].append(array1, array2, array3).flatten
=> ["a", "b", "c", "d", "e", "f"]
### 配列の要素を展開する
> [].append(*array1, *array2, *array3)
=> ["a", "b", "c", "d", "e", "f"]
### 参考: 配列をそのまま引数にすると多次元配列になる
> [].append(array1, array2, array3)
=> [["a", "b"], ["c", "d"], ["e", "f"]]
append
メソッドはレシーバに対して破壊的な変更を加えます。ですので、以下のようにすると連結元の配列が変更される(今回の例でいうとarray1)ので注意してください。
> array1 = ['a', 'b']
> array2 = ['c', 'd']
> array3 = ['e', 'f']
> array1.append(*array2, *array3)
=> ["a", "b", "c", "d", "e", "f"]
### array1の内容が変わってしまう
> array1
=> ["a", "b", "c", "d", "e", "f"]
+メソッド
+は配列を連結するメソッドです。
+
を利用した配列の結合は以下の通りです。
> array1 = ['a', 'b']
> array2 = ['c', 'd']
> array3 = ['e', 'f']
> array1 + array2 + array3
=> ["a", "b", "c", "d", "e", "f"]
<<メソッド
<<は列の末尾に要素を追加するメソッドです。
<<
を利用した配列の結合結果は多次元配列になるため、1次元配列で結果を取得する場合はflatten
を利用します。また、<<
の引数は1つしか指定できないため引数が複数になる場合は<<
を連結させます。
<<
を利用した配列の結合は以下の通りです。
> array1 = ['a', 'b']
> array2 = ['c', 'd']
> array3 = ['e', 'f']
### 多次元配列を1次元配列にする
> ([] << array1 << array2 << array3).flatten
=> ["a", "b", "c", "d", "e", "f"]
### 参考: 配列をそのまま引数にすると多次元配列になる
> [] << array1 << array2 << array3
=> [["a", "b"], ["c", "d"], ["e", "f"]]
<<
メソッドはレシーバに対して破壊的な変更を加えます。ですので、以下のようにすると連結元の配列が変更される(今回の例でいうとarray1)ので注意してください。
> array1 = ['a', 'b']
> array2 = ['c', 'd']
> array3 = ['e', 'f']
> array1 << array2 << array3
=> ["a", "b", ["c", "d"], ["e", "f"]]
### array1の内容が変わってしまう
> array1
=> ["a", "b", ["c", "d"], ["e", "f"]]
参考: inject(reduce)メソッド
配列の結合はたたみこみ演算をするinjectメソッドでも表現できます。reduce
はinject
と等価なメソッドです。
inject
を利用して配列にconcat
を実施する例は以下の通りです。
> array1 = ['a', 'b']
> array2 = ['c', 'd']
> array3 = ['e', 'f']
> [array1, array2, array3].inject([], :concat)
=> ["a", "b", "c", "d", "e", "f"]
inject
を利用して配列に+
を実施する例は以下の通りです。
> array1 = ['a', 'b']
> array2 = ['c', 'd']
> array3 = ['e', 'f']
> [array1, array2, array3].inject(:+)
=> ["a", "b", "c", "d", "e", "f"]
まとめ
メソッド | レシーバに破壊的変更を加えない | 配列の結合結果が1次元 | 引数の複数指定 |
---|---|---|---|
concat | x | ○ | ○ |
append(push) | x | x | ○ |
+ | ○ | ○ | x |
<< | x | x | x |
さいごに
Twitter(@nishina555)やってます。フォローしてもらえるとうれしいです!