2009-05-15 3 views

ответ

77

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

if (1..10) === i 
+1

Имеет хорошую выгоду также работает с 'i' существа что-то другое, чем число (например, «nil») –

+3

Не было бы очень эффективным решением, если бы диапазон был значительно большой. – rthbound

+4

Для будущего читателя альтернативный способ 'if i === (1..10)' не будет работать – Anwar

34

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

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

Я думаю, что это должен был быть отмеченный ответ. – Geo

65

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

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

всех ответов, это также, вероятно, наиболее показательно, когда у вас есть несколько диапазонов. – xentek

0

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

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

273
 
if i.between?(1, 10) 
    do thing 1 
elsif i.between?(11,20) 
    do thing 2 
... 
+3

Это также работает для объектов 'Date' и' DateTime', а '===' - нет. – Aditya

+0

'i.between? (1..10)' не будет работать (если это '..') Я полагаю, что для этого должна быть причина –

+0

** между? ** потребуется два параметра, которые он не позволит ассортимент. –

-2

для струнных инструментов:

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

# => правда

6

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

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

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

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

правда

2

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

и в соответствии с этим эталоном в Fast Ruby быстрее, чем include?

+0

Это на самом деле намного быстрее –