2009-05-15 43 views

Trả lời

77

Sử dụng === điều hành (hoặc từ đồng nghĩa của nó include?)

if (1..10) === i 
+1

Có lợi ích tốt đẹp của cũng làm việc với 'phúc i' một cái gì đó khác hơn là một số (như 'nil') –

+3

Sẽ không giống như một giải pháp rất hiệu quả nếu phạm vi đã được đáng kể lớn. – rthbound

+4

Đối với người đọc trong tương lai, cách thay thế 'if i === (1..10)' sẽ không hoạt động – Anwar

34

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 
+5

Tôi nghĩ điều này đáng lẽ phải là câu trả lời được đánh dấu. – Geo

65

Như @Baldu nói, 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... 
+0

của tất cả các câu trả lời, điều này cũng có khả năng là hiệu suất cao nhất khi bạn có nhiều phạm vi. – xentek

0

Câu trả lời động hơn, c được xây dựng bằng 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 bằng nils để nắm bắt các điều kiện biên.

273
 
if i.between?(1, 10) 
    do thing 1 
elsif i.between?(11,20) 
    do thing 2 
... 
+3

Điều này cũng làm việc cho các đối tượng 'Date' và' DateTime' trong khi '===' thì không. – Aditya

+0

'i.between? (1..10)' sẽ không hoạt động (nếu nó là '..') Tôi cho rằng phải có lý do cho nó –

+0

** giữa? ** sẽ cần hai thông số nó sẽ không cho phép phạm vi. –

-2

Đối với Strings:

(["GRACE", "WEEKLY", "DAILY5"]).include?("GRACE") 

# => true

6

Bạn thường có thể có được hiệu suất tốt hơn rất nhiều với một cái gì đó như:

if i >= 21 
    # do thing 3 
elsif i >= 11 
    # do thing 2 
elsif i >= 1 
    # do thing 1 
3

Không phải là một câu trả lời trực tiếp đến câu hỏi, nhưng nếu bạn muốn đối diện với "bên trong":

(2..5).exclude?(7) 

đúng

2

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 chuẩn mực này trong Fast Ruby nhanh hơn include?

+0

Điều này thực sự nhanh hơn rất nhiều –

Các vấn đề liên quan