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の深さまで再帰的に平坦化する
    • nilを指定した場合、再帰の深さの制限なしに平坦化する
  • 引数に整数以外の(暗黙の型変換が行えない)オブジェクトを指定した場合に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を指定することができるのを今知った
  • 無限配列の存在も今知った