Ruby';最后一个';不提供最后一个值。为什么?

Ruby';最后一个';不提供最后一个值。为什么?,ruby,range,Ruby,Range,在ruby Range对象中使用三点符号时,我得到以下结果: (0...5).each{|n| p n} 0 1 2 3 4 当我使用“最后一个”方法时,我得到: (0...5).last => 5 我原以为会有4个 这是虫子吗?或者是关于范围对象的概念有什么我不理解的吗?这是设计的。Ruby 2.0文档包括: 请注意,如果没有参数,last将返回定义范围结束的对象,即使exclude\u end?为true (10..20).last #=> 20 (10...2

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

(0...5).each{|n| p n}
0
1
2
3
4
当我使用“最后一个”方法时,我得到:

(0...5).last
 => 5 
我原以为会有4个


这是虫子吗?或者是关于范围对象的概念有什么我不理解的吗?

这是设计的。Ruby 2.0文档包括:

请注意,如果没有参数,
last
将返回定义范围结束的对象,即使
exclude\u 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所回答的,您观察到的行为是预期的,并记录在案

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


这里是关于距离对象你不理解的:考虑范围<代码>数学::E…数学::π/代码>。最后一个
应该是什么?范围实际上只是一个开始,一个结束,无论结束是否被排除。整数范围可以枚举的事实是一个特殊特性。Range还有很多其他用途。Range有
end
方法,我按。但是我缺少了
开始
方法。
每个方法都反向。首先
会枚举整个范围,或者可能是
(0…5)。max
@Stefan你完全正确。我不知道我在想什么——Enumerable怎么可能对它所混入的类具有反向枚举的特殊知识。
(1…100000000)。每个类都反向。首先
将消耗大量内存,但
(1…100000000)。max.to\u I
不会。。。不要忘记使用
来定义i
,因为像
(4..3).max这样的范围将返回nil。
irb> (0...5).reverse_each.first
=> 4