如何找到范围的“有效”结束?

时间:2013-11-25 15:05:06

标签: ruby range

Ruby范围的.end是用于指定范围结束的数字,无论范围是否“不包括”结尾。我不明白这个设计决定的理由,但从来没有这么简单,我想知道确定范围的“有效结束”的最惯用机制是什么(即最大整数n,{{1我知道的唯一机制是range.include?(n),这看起来很笨拙。

1 个答案:

答案 0 :(得分:7)

使用Range#max方法:

r = 1...10
r.end
# => 10
r.max
# => 9
如果任何端点为max

Float将不适用于排他范围(有关详情,请参阅range.c中的range_max):

(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相同的值。它也是 O(1),如果范围成立begin > end,则返回nil对于非整数对象(StringDate,...)的异常范围,或者当传递一个块时,它会调用Enumerable#max,因此它必须遍历所有元素范围!