Ruby 3.2中如何定义大于1的范围?
在Ruby 3.2中定义严格大于1.0的范围
Ruby的Range语法里,(1.0..)和(1.0...)都是包含1.0的无限范围——因为...在这里只作用于上限(但上限是无穷,这个标记没有实际意义),下限始终是包含的。而你需要的是严格大于1.0的范围,默认Range做不到,可通过以下几种方法实现:
方法1:用Lambda直接做判断
如果只是需要检查数值是否符合条件,没必要硬用Range,直接写判断逻辑更简单:
greater_than_one = ->(num) { num > 1.0 } greater_than_one.call(1.0) # => false greater_than_one.call(1.1) # => true
方法2:自定义Range子类重写include?
如果一定要用Range对象,可以创建子类覆盖include?方法,让它检查数值严格大于下限:
class ExclusiveLowerRange < Range def include?(value) value > self.begin end end # 创建范围:从1.0到无穷,且严格大于1.0 range = ExclusiveLowerRange.new(1.0, Float::INFINITY) range.include?(1.0) # => false range.include?(1.5) # => true range.include?(100.0)# => true
方法3:给单个Range对象添加单例方法
如果只需要临时修改某个Range的行为,不用子类化,直接给对象加单例方法:
range = (1.0..) def range.include?(value) value > self.begin end range.include?(1.0) # => false range.include?(2.0) # => true
注意:Ruby原生Range的exclude_end参数只控制是否排除上限,对下限没有影响,所以没法通过原生语法直接创建下限排除的无限范围,必须自定义判断逻辑。
内容的提问来源于stack exchange,提问作者Sig
相关产品推荐
相关产品推荐

