Saya perlu menulis loop yang melakukan sesuatu seperti:
if i (1..10)
do thing 1
elsif i (11..20)
do thing 2
elsif i (21..30)
do thing 3
etc...
Namun sejauh ini telah menempuh jalan yang salah dalam hal sintaksis.
Jawaban:
jika i.between? (1, 10) lakukan hal 1 elsif i.between? (11,20) lakukan hal 2 ...
i.between?(1..10)
tidak akan berfungsi (jika ya ..
) Saya kira pasti ada alasan untuk itu
3.between?(1, 3) => true
Gunakan ===
operator (atau sinonimnya include?
)
if (1..10) === i
i
menjadi sesuatu yang lain selain angka (seperti nil
)
if i === (1..10)
tidak akan berhasil
(1..10000000000000000)
bukanlah sebuah array. (1..10000000000000000) === 5000000000000000
hanya melakukan tes "antara" di bawah tenda
Seperti yang dikatakan @Baldu, gunakan operator === atau use case / saat yang secara internal menggunakan ===:
case i
when 1..10
# do thing 1
when 11..20
# do thing 2
when 21..30
# do thing 3
etc...
jika Anda masih ingin menggunakan rentang ...
def foo(x)
if (1..10).include?(x)
puts "1 to 10"
elsif (11..20).include?(x)
puts "11 to 20"
end
end
Anda biasanya bisa mendapatkan kinerja yang jauh lebih baik dengan sesuatu seperti:
if i >= 21
# do thing 3
elsif i >= 11
# do thing 2
elsif i >= 1
# do thing 1
Anda bisa menggunakan
if (1..10).cover? i then thing_1
elsif (11..20).cover? i then thing_2
dan menurut benchmark ini di Fast Ruby lebih cepat dariinclude?
Bukan jawaban langsung untuk pertanyaan tersebut, tetapi jika Anda ingin kebalikan dari "dalam":
(2..5).exclude?(7)
benar
exclude?
adalah tambahan Rails .
Jawaban yang lebih dinamis, yang dapat dibangun di 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
Jadi, dalam kasus ini, "range" sebenarnya hanya dipagari dengan nil untuk menangkap kondisi batas.
Untuk String:
(["GRACE", "WEEKLY", "DAILY5"]).include?("GRACE")
# => benar
Date
danDateTime
sementara===
tidak.