doctree
doctree copied to clipboard
ArithmeticSequence#end は最終項ではない
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 を返したりして微妙な気がしますが,こちらは素朴に「初項」のままでもいいのかもしれません。
「Enumerator::ArithmeticSequence
は Range
オブジェクトが表す範囲に含まれる等差数列」っていう説明が良いかもしれません。この数列は、begin
を初項、step
を公差とする等差数列で、end
を超えない値のみを含みます。そのように説明すると、begin
を初項としても矛盾は生じないと思います。
以下のように、exclude_end?
が false
の場合であっても end
が含まれない数列を作ることができます。
>> (1..10).step(4).end
=> 10
>> (1..10).step(4).to_a
=> [1, 5, 9]
本件,(私が混入させた〔重大な〕誤りの始末なのに)長らく放置してすみません。
ArithmeticSequence#end
の説明は実装を知らないと書けないと思い,手が着けられませんでした。
-
Range#step
で生成した場合は元になった Range オブジェクトのend
-
Numeric#step
で生成した場合はlimit
なりto
なりの値
という理解でいいんでしょうか?
また,前者の場合,ArithmeticSequence#exclude_end?
は元になった Range オブジェクトの exclude_end?
なんでしょうか?
後者の場合はどうなるんでしょうか?