web-dev-qa-db-ja.com

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

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

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

しかし、これまでのところ、構文の観点から間違った道を進んでいます。

130
btw
 if i.between?(1、10)
事1を行う
 elsif i.between?(11,20)
事2を行う
 ... 
298
rogerdpack

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

if (1..10) === i
81
Baldu

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

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

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

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

通常、次のようなものを使用すると、パフォーマンスが大幅に向上します。

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

使用できます
if (1..10).cover? i then thing_1 elsif (11..20).cover? i then thing_2

Fast Ruby のこのベンチマークによれば、include?

質問に対する直接的な答えではありませんが、「内」の反対を望む場合:

(2..5).exclude?(7)

本当

5
Fellow Stranger

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

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

1
m104