在 ruby Range 对象中使用三点表示法时,我得到这个:
(0...5).each{|n| p n}
0
1
2
3
4
当我使用“最后”方法时,我得到:
(0...5).last
=> 5
我本来预计 4
这是一个错误吗?或者我对 Range 对象的概念有什么不明白的地方?
这是设计使然。Ruby 2.0 文档更具体:
请注意,没有参数
last
将返回定义范围结束的对象,即使exclude_end?
istrue
。(10..20).last #=> 20 (10...20).last #=> 20 (10..20).last(3) #=> [18, 19, 20] (10...20).last(3) #=> [17, 18, 19]
正如 Stefan 所回答的那样,您观察到的行为是预期的并记录在案。
如果您想获得将由范围枚举的最后一个元素而不必枚举整个范围,您可以使用Enumerable#reverse_each
irb> (0...5).reverse_each.first
=> 4