doctree icon indicating copy to clipboard operation
doctree copied to clipboard

ArithmeticSequence#end は最終項ではない

Open scivola opened this issue 4 years ago • 2 comments

https://docs.ruby-lang.org/ja/2.7.0/method/Enumerator=3a=3aArithmeticSequence/i/end.html

私が「Enumerator::ArithmeticSequence#end は有限数列としての最後の項の値を返す」と思い込み,プルリクエスト #2156 を作成して取り込んでいただいたのですが,@mrkn さんの ご指摘 どおり,最終項(=末項)ではありませんでした。 (最終項と一致する場合もあります)

用語を修正するとともに,

  • (1..5).step
  • (1...5).step
  • (1..).step

のような場合を挙げるなどして,end の返り値の意味を分かりやすくしたいと思います。

begin のほうは果たして「初項」と言いうるかというと,

(3..1).step.begin # => 3

において数列としては項が無くても 3 を返したりして微妙な気がしますが,こちらは素朴に「初項」のままでもいいのかもしれません。

scivola avatar Mar 11 '20 03:03 scivola

Enumerator::ArithmeticSequenceRange オブジェクトが表す範囲に含まれる等差数列」っていう説明が良いかもしれません。この数列は、begin を初項、step を公差とする等差数列で、end を超えない値のみを含みます。そのように説明すると、begin を初項としても矛盾は生じないと思います。

以下のように、exclude_end?false の場合であっても end が含まれない数列を作ることができます。

>> (1..10).step(4).end
=> 10
>> (1..10).step(4).to_a
=> [1, 5, 9]

mrkn avatar Mar 11 '20 06:03 mrkn

本件,(私が混入させた〔重大な〕誤りの始末なのに)長らく放置してすみません。

ArithmeticSequence#end の説明は実装を知らないと書けないと思い,手が着けられませんでした。

  • Range#step で生成した場合は元になった Range オブジェクトの end
  • Numeric#step で生成した場合は limit なり to なりの値

という理解でいいんでしょうか?

また,前者の場合,ArithmeticSequence#exclude_end? は元になった Range オブジェクトの exclude_end? なんでしょうか?

後者の場合はどうなるんでしょうか?

scivola avatar Jan 04 '23 11:01 scivola