Bye Bye Moore

PoCソルジャーな零細事業主が作業メモを残すブログ

Enumerable#any?は条件が一致するか判定する

単純に、何か入っているか確認する用途にも使えますし

(1..9).map.any?
#>> true

あるいは、ブロックを渡して条件が一致するメソッドがあるか調べることも可能。

(1..9).map.any?(&:odd?)
#>> true

これを応用したメソッドが、例のactive_supportに実装されたEnumrable#many?メソッドです。

  def many?
    cnt = 0
    if block_given?
      any? do |element|
        cnt += 1 if yield element
        cnt > 1
      end
    else
      any? { (cnt += 1) > 1 }
    end
  end

カウンタをもたせて、

  • ブロックなしなら、要素が2個以上あるか
  • ブロックありなら、ブロック中の条件が満たされる要素が2個以上あるか

という挙動を実現しています。