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.
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.
jika i.between? (1, 10) lakukan hal 1 elsif i.between? (11,20) lakukan hal 2 ...
Date
danDateTime
sementara===
tidak.i.between?(1..10)
tidak akan berfungsi (jika ya..
) Saya kira pasti ada alasan untuk itu3.between?(1, 3) => true
Gunakan
===
operator (atau sinonimnyainclude?
)if (1..10) === i
sumber
i
menjadi sesuatu yang lain selain angka (sepertinil
)if i === (1..10)
tidak akan berhasil(1..10000000000000000)
bukanlah sebuah array.(1..10000000000000000) === 5000000000000000
hanya melakukan tes "antara" di bawah tendaSeperti 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...
sumber
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
sumber
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
sumber
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 dari
include?
sumber
Bukan jawaban langsung untuk pertanyaan tersebut, tetapi jika Anda ingin kebalikan dari "dalam":
(2..5).exclude?(7)
sumber
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.
sumber
Untuk String:
(["GRACE", "WEEKLY", "DAILY5"]).include?("GRACE")
# => benar
sumber