Ruby_Array_28
この記事は、以下のドキュメントを改変(自分なりに整理)して利用しています。
class Array (Ruby 3.0.0 リファレンスマニュアル)
インスタンスメソッド
flatten(lv = nil) -> Array
flatten!(lv = nil) -> self | nil
- flattenは自身を再帰的に平坦化した配列を生成して返す
- flatten!は自身を再帰的かつ破壊的に平坦化し、平坦化が行われた場合はselfを、そうでない場合はnilを返す
- nilを返す挙動は覚えておきたい。uniq!等と同じ挙動。
- lvが指定され場合、lvの深さまで再帰的に平坦化する
- 引数に整数以外の(暗黙の型変換が行えない)オブジェクトを指定した場合にTypeError、配列要素が自身を含むような無限にネストした配列に対して flatten を呼んだ場合にArgumentErrorが発生する
irb(main):001:0> arr = [1, [2, 3]] => [1, [2, 3]] irb(main):002:0> arr.flatten => [1, 2, 3] irb(main):003:0> arr => [1, [2, 3]]
irb(main):001:0> arr = [1, [2, 3], [4, [5, 6]]] => [1, [2, 3], [4, [5, 6]]] irb(main):002:0> arr.flatten => [1, 2, 3, 4, 5, 6]
irb(main):001:0> arr = [1, [2, 3]] => [1, [2, 3]] irb(main):002:0> arr.flatten! => [1, 2, 3] irb(main):003:0> arr => [1, 2, 3]
irb(main):001:0> arr = [1, 2, 3] => [1, 2, 3] irb(main):002:0> arr.flatten! => nil irb(main):003:0> arr => [1, 2, 3]
irb(main):001:0> arr = [1, [2, 3]] => [1, [2, 3]] irb(main):002:0> arr.flatten('1') Traceback (most recent call last): 5: from /Users/mfham/.rbenv/versions/3.0.0/bin/irb:23:in `<main>' 4: from /Users/mfham/.rbenv/versions/3.0.0/bin/irb:23:in `load' 3: from /Users/mfham/.rbenv/versions/3.0.0/lib/ruby/gems/3.0.0/gems/irb-1.3.0/exe/irb:11:in `<top (required)>' 2: from (irb):2:in `<main>' 1: from (irb):2:in `flatten' TypeError (no implicit conversion of String into Integer)
irb(main):001:0> arr = [1, 2, 3] => [1, 2, 3] irb(main):002:0> arr.push(arr) => [1, 2, 3, [...]] irb(main):003:0> arr => [1, 2, 3, [...]] irb(main):004:0> arr.flatten Traceback (most recent call last): 5: from /Users/mfham/.rbenv/versions/3.0.0/bin/irb:23:in `<main>' 4: from /Users/mfham/.rbenv/versions/3.0.0/bin/irb:23:in `load' 3: from /Users/mfham/.rbenv/versions/3.0.0/lib/ruby/gems/3.0.0/gems/irb-1.3.0/exe/irb:11:in `<top (required)>' 2: from (irb):4:in `<main>' 1: from (irb):4:in `flatten' ArgumentError (tried to flatten recursive array)
メモ
- flatten!のnilを返す挙動は覚えておきたい
- lvを指定することができるのを今知った
- 無限配列の存在も今知った