ルビーレンジオブジェクトでトリプルドット表記を使用すると、次のようになります。
(0...5).each{|n| p n}
0
1
2
3
4
'last'メソッドを使用すると、次のようになります。
(0...5).last
=> 5
私は4を期待していたでしょう
これはバグですか?または、Rangeオブジェクトの概念について理解できないことがありますか?
これは仕様によるものです。Ruby 2.0のドキュメントはより具体的です:
引数がないと、がであっても範囲の終わりを定義するオブジェクトが返されることに注意して
last
ください。exclude_end?
true
(10..20).last #=> 20 (10...20).last #=> 20 (10..20).last(3) #=> [18, 19, 20] (10...20).last(3) #=> [17, 18, 19]
ステファンが答えたように、あなたの観察された行動は予想され、文書化されています。
範囲全体を列挙せずに範囲によって列挙される最後の要素を取得する場合は、次を使用できます。Enumerable#reverse_each
irb> (0...5).reverse_each.first
=> 4