Réponses:
si i.entre? (1, 10) faire la chose 1 elsif i.entre? (11,20) faire la chose 2 ...
i.between?(1..10)
ne fonctionnera pas (si c'est le cas ..
) Je suppose qu'il doit y avoir une raison à cela
3.between?(1, 3) => true
Utilisez l' ===
opérateur (ou son synonyme include?
)
if (1..10) === i
i
autre chose qu'un nombre (comme nil
)
if i === (1..10)
ne fonctionnera pas
(1..10000000000000000)
n'est pas un tableau. (1..10000000000000000) === 5000000000000000
fait juste un test "entre" sous le capot
Comme @Baldu l'a dit, utilisez l'opérateur === ou utilisez le cas / quand qui utilise en interne ===:
case i
when 1..10
# do thing 1
when 11..20
# do thing 2
when 21..30
# do thing 3
etc...
si vous vouliez toujours utiliser des plages ...
def foo(x)
if (1..10).include?(x)
puts "1 to 10"
elsif (11..20).include?(x)
puts "11 to 20"
end
end
Vous pouvez généralement obtenir de bien meilleures performances avec quelque chose comme:
if i >= 21
# do thing 3
elsif i >= 11
# do thing 2
elsif i >= 1
# do thing 1
Vous pourriez utiliser
if (1..10).cover? i then thing_1
elsif (11..20).cover? i then thing_2
et selon cette référence dans Fast Ruby est plus rapide queinclude?
Pas une réponse directe à la question, mais si vous voulez le contraire de "dedans":
(2..5).exclude?(7)
vrai
exclude?
s'agit d'un ajout de Rails .
Une réponse plus dynamique, qui peut être intégrée dans 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
Donc, dans ce cas, les «plages» sont en réalité simplement délimitées par des nils afin de capturer les conditions aux limites.
Pour les cordes:
(["GRACE", "WEEKLY", "DAILY5"]).include?("GRACE")
# => vrai
Date
et lesDateTime
objets, mais===
pas.