Определение, находится ли переменная в пределах диапазона? - PullRequest
129 голосов
/ 15 мая 2009

Мне нужно написать цикл, который делает что-то вроде:

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

Но до сих пор шли неправильные пути с точки зрения синтаксиса.

Ответы [ 9 ]

297 голосов
/ 17 августа 2010
if i.between?(1, 10)
  do thing 1 
elsif i.between?(11,20)
  do thing 2 
...
80 голосов
/ 15 мая 2009

Используйте оператор === (или его синоним include?)

if (1..10) === i
69 голосов
/ 15 мая 2009

Как сказал @Baldu, используйте оператор === или прецедент /, когда внутренне используется ===:

case i
when 1..10
  # do thing 1
when 11..20
  # do thing 2
when 21..30
  # do thing 3
etc...
39 голосов
/ 15 мая 2009

, если вы все еще хотите использовать диапазоны ...

def foo(x)
 if (1..10).include?(x)
   puts "1 to 10"
 elsif (11..20).include?(x)
   puts "11 to 20"
 end
end
7 голосов
/ 28 августа 2017

Вы можете использовать
if (1..10).cover? i then thing_1 elsif (11..20).cover? i then thing_2

и в соответствии с этим тестом в Fast Ruby быстрее include?

7 голосов
/ 29 мая 2014

Обычно вы можете получить намного лучшую производительность с чем-то вроде:

if i >= 21
  # do thing 3
elsif i >= 11
  # do thing 2
elsif i >= 1
  # do thing 1
5 голосов
/ 09 ноября 2016

Не прямой ответ на вопрос, но если вы хотите противоположность «внутри»:

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

правда

1 голос
/ 16 мая 2009

Более динамичный ответ, который можно встроить в 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

Таким образом, в этом случае «диапазоны» действительно просто ограничены нулями, чтобы поймать граничные условия.

0 голосов
/ 14 декабря 2012

Для строк:

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

# => правда

...