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