ruby范围的.end是用于指定范围结束的数字,无论范围是否“排除”结束。我不理解这个设计决策的基本原理,但我一直在想,最惯用的机制是什么来确定范围的“有效结束”(即最大整数n,这样range.include?(n)就是true)。我所知道的唯一机制是last(1)[0],这看起来很模糊。

最佳答案

使用Range#max方法:

r = 1...10
r.end
# => 10
r.max
# => 9

max对于独占范围不起作用,如果任何端点是Float(有关详细信息,请参见range_max中的range.c):
(1.0...10.0).max
# TypeError: cannot exclude non Integer end value

(1.0..10.0).max
# => 10.0

作为例外,如果begin > end,则不会引发错误并返回nil
(2.0...1.0).max
# => nil

更新:max在计算时间内对任何整数的包含范围和排除范围起作用,它分别返回与endend-1相同的值。如果范围保持begin > end,则返回0(1)。对于非整数对象的exlusive范围(nilString,…)或当传递块时,它调用Date,因此它必须遍历该范围内的所有元素!

10-02 00:51
查看更多