Yanıtlar:
i. arasında mı? (1, 10) bir şey yap 1 elsif i. arasında? (11,20) bir şey yap 2 ...
i.between?(1..10)
işe yaramazsa (varsa ..
) bunun bir nedeni olmalı
3.between?(1, 3) => true
Kullanın ===
operatörü (veya eşanlamlı include?
)
if (1..10) === i
i
numaradan başka bir şey olmakla da çalışmanın iyi bir yararı var (örneğin nil
)
if i === (1..10)
işe yaramaz
(1..10000000000000000)
bir dizi değil. (1..10000000000000000) === 5000000000000000
sadece kaputun altında bir "arasında" testi yapıyor
@Baldu'nun dediği gibi, === operatörünü kullanın veya dahili olarak === kullanan case / kullanın:
case i
when 1..10
# do thing 1
when 11..20
# do thing 2
when 21..30
# do thing 3
etc...
hala aralık kullanmak istiyorsanız ...
def foo(x)
if (1..10).include?(x)
puts "1 to 10"
elsif (11..20).include?(x)
puts "11 to 20"
end
end
Genellikle aşağıdaki gibi bir şeyle çok daha iyi performans elde edebilirsiniz:
if i >= 21
# do thing 3
elsif i >= 11
# do thing 2
elsif i >= 1
# do thing 1
Kullanabilirsin
if (1..10).cover? i then thing_1
elsif (11..20).cover? i then thing_2
ve Fast Ruby'deki bu kritere göre daha hızlıinclude?
Soruya doğrudan bir cevap değil, ama "iç" in tam tersini istiyorsanız:
(2..5).exclude?(7)
doğru
exclude?
bir Rails eklentisi olduğunu unutmayın .
Ruby'de oluşturulabilecek daha dinamik bir cevap:
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
Yani, bu durumda, "aralıklar" sınır koşullarını yakalamak için gerçekten sadece nils ile çevrelenmiştir.
Dizeler için:
(["GRACE", "WEEKLY", "DAILY5"]).include?("GRACE")
# => True
Date
ve çalışmazkenDateTime
nesneler===
.