変数が範囲内にあるかどうかを判断しますか?


134

次のようなループを作成する必要があります。

if i (1..10)
  do thing 1
elsif i (11..20)
  do thing 2
elsif i (21..30)
  do thing 3
etc...

しかし、これまでのところ、構文に関しては間違った道を進んでいます。

回答:


306
間にある場合(1、10)
  こと1 
elsif i.between?(11,20)
  事2 
...

3
これはDateDateTimeオブジェクトに対しても機能しますが、===機能しません。
Aditya

i.between?(1..10)動作しません(動作する場合..)理由はあると思います
非極性

の間に?範囲を許可しない2つのパラメーターが必要になります。
Manish Nagdewani

5
それは包括的ですか、それとも排他的ですか?
andrewcockerham 2017

1
@andrewcockerhamインクルーシブ。3.between?(1, 3) => true
タイラージェームスヤング

84

===演算子(またはその同義語include?)を使用する

if (1..10) === i

1
i数字以外の何か(のようなnil)でも作業できるという素晴らしい利点があります
Christoffer Klang 2012

4
範囲が非常に大きい場合は、非常に効率的なソリューションのようには見えません。
rthbound 2013年

6
将来の読者のために、別の方法if i === (1..10)は機能しません
アンワル、

@rthbound、なぜですか?(1..10000000000000000) 配列ではありません。(1..10000000000000000) === 5000000000000000はボンネットの下で「間」テストを行っているだけです
John La Rooy

1
@Anwarは、それが他の方法で機能しない理由を説明できますか?
Govind Rai

70

@Balduが言ったように、===演算子を使用するか、内部で===を使用するユースケース/場合:

case i
when 1..10
  # do thing 1
when 11..20
  # do thing 2
when 21..30
  # do thing 3
etc...

すべての回答の中で、これは複数の範囲がある場合にも最もパフォーマンスが高い可能性があります。
xentek 2013年

40

それでも範囲を使用したい場合...

def foo(x)
 if (1..10).include?(x)
   puts "1 to 10"
 elsif (11..20).include?(x)
   puts "11 to 20"
 end
end

8

通常、次のような方法でパフォーマンスを大幅に向上させることができます。

if i >= 21
  # do thing 3
elsif i >= 11
  # do thing 2
elsif i >= 1
  # do thing 1



1

Rubyで構築できるより動的な答え:

def select_f_from(collection, point) 
  collection.each do |cutoff, f|
    if point <= cutoff
      return f
    end
  end
  return nil
end

def foo(x)
  collection = [ [ 0, nil ],
                 [ 10, lambda { puts "doing thing 1"} ],
                 [ 20, lambda { puts "doing thing 2"} ],
                 [ 30, lambda { puts "doing thing 3"} ],
                 [ 40, nil ] ]

  f = select_f_from(collection, x)
  f.call if f
end

したがって、この場合、「範囲」は、境界条件をキャッチするために、実際にはnilで囲われています。


-2

文字列の場合:

(["GRACE", "WEEKLY", "DAILY5"]).include?("GRACE")

#=> true

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.