2012-07-13 66 views
7

当使用红宝石Range对象三联点符号,我得到这个:Ruby'Range.last'不提供最后一个值。为什么?

(0...5).each{|n| p n} 
0 
1 
2 
3 
4 

当我使用“最后”的方法获得:

(0...5).last 
=> 5 

我本来期望4

这是一个错误?或者有什么我不明白的关于Range对象的概念?

+1

这里就是你不理解有关Range对象:考虑范围'Math :: E ... Math :: PI'。最后一个应该是什么?范围实际上只是一个开始,一个结束,以及是否排除了结尾。整数范围可以枚举的事实是一个特殊的功能。范围有很多其他用途。 – Max 2012-07-13 23:03:27

+0

范围有'结束'方法,我推。我错过了'start'方法。 – Rempargo 2012-07-23 12:51:45

回答

11

这是设计。红宝石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] 
1

正如斯特凡已经回答了你的观察到的行为预期和记录。

如果你想获得这将由范围枚举,而无需枚举的整个范围的最后一个元素,你可以使用Enumerable#reverse_each

irb> (0...5).reverse_each.first 
=> 4 
+0

'reverse_each.first' *确实*枚举整个范围 – Stefan 2014-05-09 13:46:41

+1

或者也许'(0 ... 5).max' – 2014-05-09 15:03:31

+0

@Stefan你是完全正确的。不知道我在想什么 - Enumerable怎么可能对它混入的类的反向枚举有特殊的了解。 – dbenhur 2014-05-21 00:09:20

相关问题