當使用紅寶石Range對象三聯點符號,我得到這個:Ruby'Range.last'不提供最後一個值。爲什麼?
(0...5).each{|n| p n}
0
1
2
3
4
當我使用「最後」的方法獲得:
(0...5).last
=> 5
我本來期望4
這是一個錯誤?或者有什麼我不明白的關於Range對象的概念?
當使用紅寶石Range對象三聯點符號,我得到這個:Ruby'Range.last'不提供最後一個值。爲什麼?
(0...5).each{|n| p n}
0
1
2
3
4
當我使用「最後」的方法獲得:
(0...5).last
=> 5
我本來期望4
這是一個錯誤?或者有什麼我不明白的關於Range對象的概念?
這是設計。紅寶石2.0文檔是more specific:
注意,不帶參數
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
這裏就是你不理解有關Range對象:考慮範圍'Math :: E ... Math :: PI'。最後一個應該是什麼?範圍實際上只是一個開始,一個結束,以及是否排除了結尾。整數範圍可以枚舉的事實是一個特殊的功能。範圍有很多其他用途。 – Max 2012-07-13 23:03:27
範圍有'結束'方法,我推。我錯過了'start'方法。 – Rempargo 2012-07-23 12:51:45