Respostas:
se i.entre? (1, 10) fazer coisa 1 (11,20) faça a coisa 2 ...
i.between?(1..10)
não vai funcionar (se for ..
) Suponho que deve haver uma razão para isso
3.between?(1, 3) => true
Use o ===
operador (ou seu sinônimo include?
)
if (1..10) === i
i
sendo algo mais do que um número (como nil
)
if i === (1..10)
não funcionará
(1..10000000000000000)
não é uma matriz. (1..10000000000000000) === 5000000000000000
está apenas fazendo um "entre" teste sob o capô
Como o @Baldu disse, use o operador === ou caso de uso / quando o qual usar internamente ===:
case i
when 1..10
# do thing 1
when 11..20
# do thing 2
when 21..30
# do thing 3
etc...
se você ainda queria usar intervalos ...
def foo(x)
if (1..10).include?(x)
puts "1 to 10"
elsif (11..20).include?(x)
puts "11 to 20"
end
end
Geralmente, você pode obter um desempenho muito melhor com algo como:
if i >= 21
# do thing 3
elsif i >= 11
# do thing 2
elsif i >= 1
# do thing 1
Você poderia usar
if (1..10).cover? i then thing_1
elsif (11..20).cover? i then thing_2
e de acordo com essa referência no Fast Ruby é mais rápido queinclude?
Não é uma resposta direta à pergunta, mas se você quiser o contrário de "dentro":
(2..5).exclude?(7)
verdade
exclude?
é uma adição ao Rails .
Uma resposta mais dinâmica, que pode ser construída em 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
Portanto, neste caso, os "intervalos" são realmente limitados a zero para capturar as condições de contorno.
Para cordas:
(["GRACE", "WEEKLY", "DAILY5"]).include?("GRACE")
# => true
Date
eDateTime
objetos, enquanto===
não funciona.