2011-02-01 38 views
7

tôi không thể khá tìm ra những gì tôi đang làm sai ở đây ..Làm thế nào để trả lại một giá trị boolean từ một regex

if @calc.docket_num =~ /DC-000044-10/ || @calc.docket_num =~ /DC-67-09/ 
    @calc.lda = true 
else 
    @calc.lda = false 
end 

Nhưng dường như @calc.docket_num thể được bất kỳ chuỗi nào và nó luôn luôn trả về như true.

Tôi không làm điều này đúng không?

+0

Khi kiểm tra mã của bạn, nó thực sự trả về "nil" (tương đương với "false" vì lợi ích của câu lệnh if/else) cho bất kỳ giá trị nào ngoài "DC-000044-10" hoặc "DC-67-09" ... –

Trả lời

32

Đây là một lớp lót:

@calc.lda = !!(@calc.docket_num =~ /DC-000044-10|DC-67-09/) 

Các !! buộc để đáp ứng đúng/sai, sau đó bạn có thể gán biến boolean của bạn trực tiếp.

+2

+1 để sử dụng '!!'. Các regex có thể là một chút chặt chẽ hơn mặc dù: '/ DC - (?: 000044-10 | 67-09) /' –

+4

Awesome. Không bao giờ biết về '!!'. – CambridgeMike

+1

Tôi chỉ googled cùng một câu hỏi và tìm thấy câu hỏi của riêng tôi từ một năm trước đây và tìm thấy câu trả lời của bạn mà là hella tuyệt vời. Cảm ơn nhiều. – Trip

2

Tôi nghĩ vấn đề ở đâu đó trong quá trình triển khai của bạn. Sử dụng mã này để kiểm tra xem nó:

 
k = 'random information' 

if k =~ /DC-000044-10/ || k =~ /DC-67-09/ 
    puts 'success' 
else 
    puts 'failure' 
end 

=> failure 
+2

Điều này có thể được rút ngắn bằng cách sử dụng toán tử bậc ba: 'puts (k = ~/DC - (? 000044-10 | 67-09) /)? 'success': 'failure'' –

4

Hoặc bạn có thể sử dụng toán tử ba bằng (===) cho lớp Regexp được sử dụng để xác định sự bình đẳng khi sử dụng cú pháp case.

@calc.lda = /DC-000044-10|DC-67-09/ === @calc.docket_num 
@calc.lda 
=> true 

BEWARE

/Regexp/ === String là hoàn toàn khác so với String === /Regexp/ !!!! Phương thức này không giao hoán. Mỗi lớp thực hiện === khác nhau. Đối với câu hỏi trên, cụm từ thông dụng phải ở bên trái của ===.

Để thực hiện Regexp, bạn có thể xem thêm tài liệu về điều này (như của Ruby 2.2.1) here.

+0

Ah ý tưởng tuyệt vời !! – Trip

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