Ruby_Array_13

この記事は、以下のドキュメントを改変(自分なりに整理)して利用しています。

class Array (Ruby 3.0.0 リファレンスマニュアル)

インスタンスメソッド

combination(n) {|c| block } -> Array
combination(n) -> Enumerator
  • サイズnの組み合わせをすべて生成し、それを引数としてブロックを実行する
    • 組み合わせの順序は保証されない
  • ブロックなしで呼び出されると、組み合わせを生成するEnumeratorオブジェクトを返す
  • nに整数以外のオブジェクトを指定した場合、to_intメソッドによる暗黙の型変換を試みる
irb(main):001:0> arr = [1, 2, 3, 1]
=> [1, 2, 3, 1]

irb(main):002:0> arr.combination(1)
=> #<Enumerator: [1, 2, 3, 1]:combination(1)>

irb(main):003:0> arr.combination(1).to_a
=> [[1], [2], [3], [1]]

irb(main):004:0> arr.combination(2).to_a
=> [[1, 2], [1, 3], [1, 1], [2, 3], [2, 1], [3, 1]]

irb(main):005:0> arr.combination(3).to_a
=> [[1, 2, 3], [1, 2, 1], [1, 3, 1], [2, 3, 1]]

irb(main):006:0> arr.combination(4).to_a
=> [[1, 2, 3, 1]]

irb(main):007:0> arr.combination(5).to_a
=> []

irb(main):008:0> arr.combination(0).to_a
=> [[]]

# memo
# nに0を指定した場合、配列のサイズより大きい値を指定した場合の挙動を覚えておきたい
irb(main):001:0> arr = [1, 2, 3]
=> [1, 2, 3]

irb(main):002:0> arr.combination(2) {|v| pp v }
[1, 2]
[1, 3]
[2, 3]
=> [1, 2, 3]
irb(main):001:0> arr = [1, 2, 3]
=> [1, 2, 3]

irb(main):002:0> arr.combination(1)
=> #<Enumerator: [1, 2, 3]:combination(1)>

irb(main):003:0> arr << 4
=> [1, 2, 3, 4]

irb(main):004:0> arr.combination(1)
=> #<Enumerator: [1, 2, 3, 4]:combination(1)>

irb(main):005:0> arr.combination(1).to_a
=> [[1], [2], [3], [4]]
compact -> Array
compact! -> self | nil
  • compactは自身からnilを取り除いた配列を生成して返す
  • compact!は自身から破壊的にnilを取り除き、変更が行われた場合はselfを、そうでなければnilを返す
irb(main):001:0> arr = [1, nil, 3, nil]
=> [1, nil, 3, nil]

irb(main):002:0> v = arr.compact
=> [1, 3]

irb(main):003:0> arr
=> [1, nil, 3, nil]

irb(main):004:0> v
=> [1, 3]

irb(main):005:0> arr[0] = 'a'
=> "a"

irb(main):006:0> arr
=> ["a", nil, 3, nil]

irb(main):007:0> v
=> [1, 3]
irb(main):001:0> arr = [1, 2, 3]
=> [1, 2, 3]

irb(main):002:0> v = arr.compact
=> [1, 2, 3]

irb(main):003:0> arr
=> [1, 2, 3]

irb(main):004:0> v
=> [1, 2, 3]
irb(main):001:0> arr = [1, nil, 3, nil]
=> [1, nil, 3, nil]

irb(main):002:0> v = arr.compact!
=> [1, 3]

irb(main):003:0> arr
=> [1, 3]

irb(main):004:0> v
=> [1, 3]
irb(main):001:0> arr = [1, 2, 3]
=> [1, 2, 3]

irb(main):002:0> v = arr.compact!
=> nil

irb(main):003:0> arr
=> [1, 2, 3]

irb(main):004:0> v
=> nil

メモ

  • combinationの引数nに0や配列のサイズより大きい値を指定した場合の挙動は覚えておきたい
  • compactとcompact!は返り値の挙動が変わるので気をつけたい