Визначення, чи є змінна в межах діапазону?


134

Мені потрібно написати цикл, який робить щось на кшталт:

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

Але поки що пішли неправильними шляхами з точки зору синтаксису.

Відповіді:


306
якщо i.між? (1, 10)
  робити річ 1 
elsif i.між ними? (11,20)
  робити щось 2 
...

3
Це також працює Dateі DateTimeоб'єкти , а ===не робить.
Адітя

i.between?(1..10)не буде працювати (якщо це так ..) Я вважаю, що для цього повинна бути причина
неополярність

між? знадобиться два параметри, що не дозволить діапазону.
Маніш Нагдевані

5
це включно чи ексклюзивно?
andrewcockerham

1
@andrewcockerham Inclusive. 3.between?(1, 3) => true
Тайлер Джеймс Янг

84

Використовуйте ===оператор (або його синонім include?)

if (1..10) === i

1
Приємна користь також і з тим, щоб iбути чимось іншим, ніж числом (як nil)
Крістофер Кланг

4
Не здавалося б дуже ефективним рішенням, якби діапазон був значно більшим.
rthbound

6
Для майбутнього читача альтернативний спосіб if i === (1..10)не буде працювати
Анвар

@rthbound, чому? (1..10000000000000000) це не масив. (1..10000000000000000) === 5000000000000000якраз робив тест "між" під кришкою
Джон Ла Руй

1
@Anwar ви могли б пояснити, чому це не працює інакше?
Говінд Рай

70

Як сказав @Baldu, використовуйте оператор === або використовуйте регістр /, коли внутрішньо використовується ===:

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

З усіх відповідей, це, ймовірно, є найбільш ефективним, коли у вас є кілька діапазонів.
xentek

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

Отже, у цьому випадку "хребти" дійсно просто обгороджуються нулями, щоб зловити граничні умови.


Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.