読者です 読者をやめる 読者になる 読者になる

Bye Bye Moore

猫マンション建築の野望を胸に零細事業主として資本主義の荒波に漕ぎ出したアラサー男の技術メモ

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個以上あるか

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