9

在 ruby​​ Range 对象中使用三点表示法时,我得到这个:

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

当我使用“最后”方法时,我得到:

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

我本来预计 4

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

4

2 回答 2

14

这是设计使然。Ruby 2.0 文档更具体

请注意,没有参数last将返回定义范围结束的对象,即使exclude_end?is true

(10..20).last      #=> 20
(10...20).last     #=> 20
(10..20).last(3)   #=> [18, 19, 20]
(10...20).last(3)  #=> [17, 18, 19]
于 2012-07-13T09:51:56.900 回答
1

正如 Stefan 所回答的那样,您观察到的行为是预期的并记录在案。

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

irb> (0...5).reverse_each.first
=> 4
于 2012-07-13T19:05:51.007 回答