当使用红宝石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