Antworten:
wenn zwischen? (1, 10) mach was 1 sonst zwischen? (11,20) mach was 2 ...
i.between?(1..10)
wird nicht funktionieren (wenn es so ist ..
) Ich nehme an, es muss einen Grund dafür geben
3.between?(1, 3) => true
Verwenden Sie den ===
Operator (oder sein Synonym include?
)
if (1..10) === i
i
, etwas anderes als eine Zahl (wie nil
) zu sein
if i === (1..10)
nicht funktionieren
(1..10000000000000000)
ist kein Array. (1..10000000000000000) === 5000000000000000
macht gerade einen "Zwischen" -Test unter der Haube
Verwenden Sie, wie @Baldu sagte, den Operator === oder den Anwendungsfall / when, der intern === verwendet:
case i
when 1..10
# do thing 1
when 11..20
# do thing 2
when 21..30
# do thing 3
etc...
wenn Sie noch Bereiche verwenden wollten ...
def foo(x)
if (1..10).include?(x)
puts "1 to 10"
elsif (11..20).include?(x)
puts "11 to 20"
end
end
Normalerweise erzielen Sie eine viel bessere Leistung mit:
if i >= 21
# do thing 3
elsif i >= 11
# do thing 2
elsif i >= 1
# do thing 1
Du könntest benutzen
if (1..10).cover? i then thing_1
elsif (11..20).cover? i then thing_2
und nach diesem Benchmark in Fast Ruby ist schneller alsinclude?
Keine direkte Antwort auf die Frage, aber wenn Sie das Gegenteil von "innerhalb" wollen:
(2..5).exclude?(7)
wahr
exclude?
ein Rails-Zusatz ist .
Eine dynamischere Antwort, die in Ruby erstellt werden kann:
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
In diesem Fall sind die "Bereiche" also wirklich nur mit Nullen eingezäunt, um die Randbedingungen zu erfassen.
Für Streicher:
(["GRACE", "WEEKLY", "DAILY5"]).include?("GRACE")
# => wahr
Date
undDateTime
Objekte, während===
dies nicht der Fall ist.