Risposte:
se i. tra? (1, 10) fai cosa 1 elsif i.b Between? (11,20) fai cosa 2 ...
i.between?(1..10)
non funzionerà (se lo è ..
) suppongo ci debba essere una ragione per questo
3.between?(1, 3) => true
Usa l' ===
operatore (o il suo sinonimo include?
)
if (1..10) === i
i
essere qualcos'altro che un numero (come nil
)
if i === (1..10)
non funzionerà
(1..10000000000000000)
non è un array. (1..10000000000000000) === 5000000000000000
sta solo facendo un test "tra" sotto il cofano
Come ha detto @Baldu, utilizzare l'operatore === o il caso d'uso / quando che utilizza internamente ===:
case i
when 1..10
# do thing 1
when 11..20
# do thing 2
when 21..30
# do thing 3
etc...
se volevi ancora usare gli intervalli ...
def foo(x)
if (1..10).include?(x)
puts "1 to 10"
elsif (11..20).include?(x)
puts "11 to 20"
end
end
Di solito puoi ottenere prestazioni molto migliori con qualcosa del tipo:
if i >= 21
# do thing 3
elsif i >= 11
# do thing 2
elsif i >= 1
# do thing 1
Puoi usare
if (1..10).cover? i then thing_1
elsif (11..20).cover? i then thing_2
e secondo questo benchmark in Fast Ruby è più veloce diinclude?
Non una risposta diretta alla domanda, ma se vuoi il contrario di "entro":
(2..5).exclude?(7)
vero
exclude?
è un'aggiunta di Rails .
Una risposta più dinamica, che può essere costruita 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à recintati con zero per catturare le condizioni al contorno.
Per archi:
(["GRACE", "WEEKLY", "DAILY5"]).include?("GRACE")
# => True
Date
eDateTime
oggetti mentre===
non lo fa.