Enumerator::Product と Enumerator.product を追加 (Ruby 3.2)#3312
Enumerator::Product と Enumerator.product を追加 (Ruby 3.2)#3312Watson1978 wants to merge 2 commits into
Conversation
Enumerator を継承する公開クラスで、Enumerator.product から作られる。 実機で確認し、独立ファイルとして収録した。since は front matter で 3.2 とした。 each / inspect / rewind / size と Enumerator::Product.new を記載した。 各オブジェクトには each ではなく each_entry が呼ばれ N 要素の配列になること、 引数なしのときは空の引数リストでブロックを1回呼ぶこと、size は積・不明なら nil・ 無限を含むなら Float::INFINITY を返すことを実機で確認した。 対になる Enumerator::Producer は enumerator.c で /* :nodoc: Producer */ と 指定された内部実装クラスで、ri にもドキュメントが無いため収録しない (トラッカーで非対応とする)。 bitclust のデータベース生成を 3.1 / 3.2 / 3.3 / 4.0 で実行し、3.1 では未登録、 3.2 以降でクラスと 5 項目が登録されることを確認済み。例は 3.2 / 3.3 / 3.4 / 4.0 で 実行して出力を確認した。 Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
|
レビューありがとうございます。実機(all-ruby, Ruby 3.0.7〜4.0.6)で確認しました。クラスのドキュメントの内容はとても正確で、記載の例はすべて実機の出力と一致しました。
1 点だけ、リンク切れになる箇所があります。
|
Enumerator::Product から参照している [m:Enumerator.product] が未定義で リンク切れになる指摘への対応。Ruby 3.2 で追加されたメソッドなので #@SInCE 3.2 で囲む。 ブロックを渡した場合の返り値は、rdoc の call-seq が `Enumerator.product(*enums) { |elts| ... } -> enumerator` としているが、 enumerator.c の実装は nil を返しており(rdoc 本文も returns nil)、 実機の確認結果に合わせて -> nil とした。 Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
|
確認ありがとうございます。ご指摘のとおり
1 点、rdoc とあえて変えたところがあります。ブロックを渡した場合の返り値です。
if (!NIL_P(block)) {
enum_product_run(obj, block);
return Qnil;
}で $ ruby -e 'p(Enumerator.product(1..2, ["a", "b"]) { })'
nilそのため、るりまは実機に合わせて 検証:
PR のタイトルと本文も、 🤖 Generated with Claude Code |
|
対応ありがとうございます。ca60fe554 で
🤖 Generated with Claude Code |
概要
Ruby 4.0 に存在するのにリファレンスに項目が無かった [c:Enumerator::Product] と
[m:Enumerator.product] を追加しました。どちらも Ruby 3.2 で追加された公開 API です。
Enumerator::Product(新規ファイル) —newとeach/inspect/rewind/sizeEnumerator.product(Enumerator.mdに追加) —Enumerator::Product.newと同じものEnumerator.product も同じ PR で追加しました (レビュー対応)
当初は
Enumerator::Productだけを追加していましたが、クラスの説明とnewの- **SEE**から参照している[m:Enumerator.product]が doctree に未定義でリンク切れになるとのご指摘をいただき、この PR で
Enumerator.mdにも追加しました。Ruby 3.2 で追加されたメソッドなので
#@since 3.2で囲んでいます。説明は
[m:Enumerator::Product.new] と同じですとして、参照先の内容を複製しない形にしました。
ブロックを渡した場合の返り値を rdoc と変えています
enumerator.cの call-seq は次のようになっています。しかし実装はブロックがあるとき
nilを返します。rdoc の本文も「ブロックを渡した場合は nil を返す」と説明しており、実機でも
nilが返ります。call-seq 側の誤りと考えられるため、るりまは実機に合わせて
-> nilとしました。Enumerator::Producer は非対応にしました
対になる
Enumerator::Producerも未収録でしたが、Ruby 本体のenumerator.cでと
:nodoc:指定された内部実装クラスで、ri にもドキュメントがありません(
Enumerator.produceが返すのは通常の [c:Enumerator] で、Producer は表に出ません)。:nodoc: のものは収録しない方針に従い、こちらは収録せずトラッカーで非対応としました。
登場バージョン
3.1.6 では
Enumerator.productはNoMethodError(Did you mean? produce) になります。記述の根拠(実機で確認)
eachではなくeach_entryが呼ばれ、N 個のオブジェクトの直積は各繰り返しでちょうど N 要素の配列になります。
sizeは各オブジェクトのサイズの積を返し、無限を含む場合は [m:Float::INFINITY]、分からない場合は nil を返します。
Enumerator.productの返り値はEnumerator::Productです。検証
rake check_format/check_blank_lines/check_indent_in_samplecode/check_single_space_indentbitclust update --markdowntree=manual/apiを 3.1 / 3.2 / 3.3 / 4.0 で実行し、エラーが出ないこと、3.1 では未登録・3.2 以降でクラスと 5 項目が登録されることを
確認しました。
Enumerator.productも同様に、4.0 の DB ではbitclust lookup --method='Enumerator.product'で引けること、3.1 の DB では
no such methodになることを確認しました。🤖 Generated with Claude Code