2009-05-15 4 views

risposta

77

Utilizzare l'=== operatore (o il suo sinonimo include?)

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

ha la simpatica vantaggio di lavorare anche con 'essere I' Qualcosa di diverso da un numero (come 'nil') –

+3

Non sembrerebbe una soluzione molto efficiente se la gamma fosse stata significativamente grande. – rthbound

+4

Per il futuro lettore, il modo alternativo 'if i === (1..10)' non funzionerà – Anwar

34

se ancora voleva utilizzare gamme ...

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

Penso che questa dovrebbe essere la risposta contrassegnata. – Geo

65

Come detto @Baldu, utilizzare l'operatore === o use case/when which internally uses ===:

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

di tutte le risposte, anche questo è probabilmente il più performante quando si dispone di più intervalli. – xentek

0

Una risposta più dinamica, che c un essere costruito in 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 

Quindi, in questo caso, gli "intervalli" sono in realtà solo recintato con Nils al fine di catturare le condizioni al contorno.

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

Funziona anche per gli oggetti 'Date' e' DateTime' mentre '===' no. – Aditya

+0

'i.between? (1..10)' non funzionerà (se è '..') Suppongo che ci debba essere un motivo per questo –

+0

** tra? ** avrebbero bisogno di due parametri che non permetterebbero gamma. –

-2

For Strings:

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

# => true

6

Di solito è possibile ottenere molto meglio delle prestazioni con qualcosa di simile:

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

Non è una risposta diretta alla domanda, ma se si desidera l'opposto a "dentro":

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

vero

2

Si potrebbe utilizzare
if (1..10).cover? i then thing_1 elsif (11..20).cover? i then thing_2

e secondo questo punto di riferimento nel Fast Ruby è più veloce di include?

+0

Questo è in realtà molto più veloce –