Câu trả lời:
nếu tôi ở giữa? (1, 10) làm điều 1 elsif i.b between? (11,20) làm điều 2 ...
i.between?(1..10)
sẽ không hoạt động (nếu có ..
) Tôi cho rằng phải có một lý do cho nó
3.between?(1, 3) => true
Sử dụng ===
toán tử (hoặc từ đồng nghĩa của nó include?
)
if (1..10) === i
i
một cái gì đó khác hơn là một số (như nil
)
if i === (1..10)
sẽ không hiệu quả
(1..10000000000000000)
không phải là một mảng. (1..10000000000000000) === 5000000000000000
chỉ đang thực hiện bài kiểm tra "giữa" dưới mui xe
Như @Baldu đã nói, hãy sử dụng toán tử === hoặc trường hợp sử dụng / khi sử dụng nội bộ ===:
case i
when 1..10
# do thing 1
when 11..20
# do thing 2
when 21..30
# do thing 3
etc...
nếu bạn vẫn muốn sử dụng phạm vi ...
def foo(x)
if (1..10).include?(x)
puts "1 to 10"
elsif (11..20).include?(x)
puts "11 to 20"
end
end
Bạn thường có thể có được hiệu suất tốt hơn rất nhiều với những thứ như:
if i >= 21
# do thing 3
elsif i >= 11
# do thing 2
elsif i >= 1
# do thing 1
Bạn đã có thể sử dụng
if (1..10).cover? i then thing_1
elsif (11..20).cover? i then thing_2
và theo tiêu chuẩn này trong Fast Ruby nhanh hơninclude?
Không phải là một câu trả lời trực tiếp cho câu hỏi, nhưng nếu bạn muốn ngược lại "bên trong":
(2..5).exclude?(7)
thật
exclude?
là một bổ sung Rails .
Một câu trả lời năng động hơn, có thể được xây dựng trong 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
Vì vậy, trong trường hợp này, "phạm vi" thực sự chỉ được rào lại bằng nils để bắt các điều kiện biên.
Đối với Chuỗi:
(["GRACE", "WEEKLY", "DAILY5"]).include?("GRACE")
# => đúng
Date
vàDateTime
các đối tượng trong khi===
không.