2009-05-15 9 views

Odpowiedz

77

Użyj operatora === (lub jego synonim include?)

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

Posiada piękny korzyści współpracuje również z 'I' samopoczucia coś innego niż liczba (np. 'nil') –

+3

Nie wydaje się bardzo wydajnym rozwiązaniem, jeśli zasięg byłby znacznie duży. – rthbound

+4

Dla przyszłego czytnika alternatywny sposób 'if i === (1..10)' nie zadziała – Anwar

34

jeśli nadal chce korzystać z zakresów ...

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

Myślę, że powinna to być wyraźna odpowiedź. – Geo

65

Jak powiedział @Baldu, użyj operatora === lub przypadek użycia/kiedy używany wewnętrznie ===:

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

wszystkich odpowiedzi, jest to prawdopodobnie najbardziej wydajne, gdy masz wiele zakresów. – xentek

0

Bardziej dynamiczna odpowiedź, która c być zbudowany w 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 

Tak więc, w tym przypadku, „zakresy” są naprawdę ogrodzony Nils aby złapać warunki brzegowe.

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

Działa to również dla obiektów 'Date' i' DateTime', natomiast '===' nie. – Aditya

+0

'i.between? (1..10)' nie zadziała (jeśli jest to '..') Przypuszczam, że musi być z tego jakiś powód –

+0

** pomiędzy? ** wymagałoby dwóch parametrów, których by nie dopuścił zasięg. –

-2

ciągów:

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

# => true

6

Zazwyczaj można uzyskać o wiele lepszą wydajność z czymś takim:

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

Nie bezpośrednią odpowiedź na pytanie, ale jeśli chcesz przeciwieństwo "wewnątrz":

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

prawda

2

Można użyć
if (1..10).cover? i then thing_1 elsif (11..20).cover? i then thing_2

i według tego wzorca w Fast Ruby jest szybszy niż include?

+0

To jest o wiele szybsze –