Techioz Blog

X より大きい範囲を定義する方法

概要

申し訳ありませんが、答えはすでにわかっていますが、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

解決策

あなたの答えは正しいですが、回避策はあります。 https://docs.ruby-lang.org/en/3.2/Range.html#class-Range-label-Beginless+Ranges のドキュメントより

重要な点は、最後だけが除外可能であると文書化されているということです。

1 つの回避策は、

!(..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 より大きい範囲ではありませんが、同じ効果があります。

範囲をサブクラス化してカスタム動作を取得できます。

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