ruby 如何定义大于X的范围

8mmmxcuj  于 12个月前  发布在  Ruby
关注(0)|答案(2)|浏览(70)

恐怕我已经知道答案了,但是在Ruby 3.2中有没有一种方法可以定义一个大于1的范围?
以来

(..1.0).include?(1.0) => true
(...1.0).include?(1.0) => false

我希望(1.0...)能创建我需要的东西,但是,

(1.0..).include?(1.0) => true
(1.0...).include?(1.0) => true
uqzxnwby

uqzxnwby1#

你的答案是正确的,尽管有一些变通方法。来自www.example.com的文档https://docs.ruby-lang.org/en/3.2/Range.html#class-Range-label-Beginless+Ranges
一个无边界的范围有一个明确的结束值,但一个空的开始值。这样的范围包括直到端值的所有值。无限范围的文字可以用两个点或三个点来写。该范围具有相同的元素,无论哪种方式。但请注意,两者并不相等。
关键是只有结尾被记录为可以排除。
一种解决方法是

!(..1.0).include?(other_number)

!的意思是“不”,所以这里的意思是“不在负无穷大到1”。

!(..1.0).include?(1.01)
# => true
!(..1.0).include?(1.00)
# => false
!(..1.0).include?(0.99)
# => false

从技术上讲,这不是一个所有数字都大于1的范围,但它具有相同的效果。
你可以继承range来获得自定义行为。

class ExclusionaryRange < Range
  def include?(other)
    !(self.end..self.begin).include?(other)
  end
end

my_range = ExclusionaryRange.new(1.0, nil)
my_range.include?(1.0)
# => false
my_range.include?(1.1)
# => true
my_range.include?(0.9)
# => false
vybvopom

vybvopom2#

如果你使用浮点数,你可以利用浮点数数量有限的事实(Ruby内部使用64位二进制浮点数,也就是“double“)。你可以通过next_float得到浮点的后继:

1.0.next_float #=> 1.0000000000000002

为方便起见,1.0000000000000002的输出是四舍五入的表示。这个数字的精确值是1.00000000000002220446049250313080847263336181640625。没有其他的(64位二进制)浮点数比1.0更接近1.0。
如果你从这个浮点数开始你的范围,它将有效地跳过1.0

(1.0.next_float..).include?(1.0)    #=> false
(1.0.next_float..).include?(1.0001) #=> true

请注意,典型的浮点奇数仍然适用:

(0.3.next_float..).include?(0.3)       #=> false
(0.3.next_float..).include?(0.1 + 0.2) #=> true

相关问题