Ruby’Range.last’没有给出最后一个值。 为什么?

在ruby Range对象中使用三点符号时,我得到:

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

当我使用’last’方法时,我得到:

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

我原以为4

这是一个错误吗? 或者是否有一些我不了解Range对象的概念?

这是设计的。 Ruby 2.0文档更具体 :

请注意,如果没有参数,则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] 

正如Stefan所回答的那样,您的观察到的行为是可以预期的

如果要获取范围枚举的最后一个元素而不必枚举整个范围,可以使用Enumerable#reverse_each

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