🐥

[Bug #21124] #Enumerable#find にブロック引数を渡さなかったときの #size の話

2025/02/23に公開

[Bug #21124] Enumerable#find called without a block returns Enumerator without size

  • ブロック引数がない #find#size が意図しない値を返すというバグ報告
    • 以下の例だと nil が返ってくる
p [1, 2, 3].find.size
# => nil
  • 他のメソッドだと元の要素数がそのまま返ってきます
p [1, 2, 3].map.size    # => 3
p [1, 2, 3].select.size # => 3
  • また #to_a を呼ぶと元の要素を返します
p [1, 2, 3].find.to_a
# => [1, 2, 3]
  • これなんですが『呼び出し回数はブロックの戻り値によって変わるので size が不明 = nil を返す』とコメントされていますね
  • #find にブロックを渡さなかった場合にどういう挙動になるのかと思ったら #each でチェーンして true を返したらその要素が返ってくるみたいですね
p [3, 5, 2].find.each { _1.even? }  # => 2
p [6, 2, 5].find.each { _1.odd? }   # => 5
  • と、いうことでこのチケットは閉じられています
  • #sizenil を返すケースなんてあったんですねー
GitHubで編集を提案

Discussion