📘

[Feature #21701] Enumerator.produce で size を設定できるようにする提案

に公開

[Feature #21701] Enumerator.produce accepts an optional size keyword argument

  • Enumerator.producesize を設定できるようにする提案
  • Enumerator#size は現状だと常に Float::INFINITY を返すようになっている
enum = Enumerator.produce(1000, &:succ)
p enum.size  # => Float::INFINITY
enum = Enumerator.produce(1000, size: 3, &:succ)
p enum.size  # => 3
  • またこれは size:proc を渡して制御できる
enum = Enumerator.produce(1000, size: -> { 5 }, &:succ)
p enum.size  # => 5
  • 更に size: キーワード非キスがない場合は nil を返すようになる
enum = Enumerator.produce(1000,  &:succ)
p enum.size  # => 5

  • 個人的には Enumerator.produce で有限よりも無限を設定するほうが多いのであんまり size: を設定するモチベーションはないんですよねえ
    • なので意図的に size を使用したいケースも思いつかない
  • これを提案するモチベーションとしては #to_set が無限の enumerator に対してエラーになるようになったのでそれに対応したい、という点みたい
  • また、あと大きな変更として『 #size の戻り値が Float::INFINITY から nil になる』という非互換な変更のデメリットが圧倒的に大きい印象がある
    • 単純に #sizenil を返すことを許容してコードは書きたくない…
  • size: を指定できるようにすること自体はまあユースケースがあるならいいんですが nil を返すのはやめてほしいですねえ……
GitHubで編集を提案

Discussion