Ruby范围的.end
是用于指定范围结束的数字,无论范围是否“不包括”结尾。我不明白这个设计决定的理由,但从来没有这么简单,我想知道确定范围的“有效结束”的最惯用机制是什么(即最大整数n
,{{1我知道的唯一机制是range.include?(n)
,这看起来很笨拙。
答案 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
适用于任何包含范围和独占整数范围的常数时间,它分别返回与end
和end-1
相同的值。它也是 O(1),如果范围成立begin > end
,则返回nil
。 对于非整数对象(String
,Date
,...)的异常范围,或者当传递一个块时,它会调用Enumerable#max
,因此它必须遍历所有元素范围!