2016-10-26 16 views
5

Tôi có một vòng lặp while let mà đi qua một vòng lặp của Result và sử dụng kết hợp mẫu; nó đi qua iterator cho đến khi nó chạm hoặc một Err hay giá trị của Ok là một chuỗi rỗng:Có thể sử dụng tính năng bảo vệ mẫu phù hợp trong `while let` không?

while let Some(Ok(a)) = some_iterator.next() { 
    if a == "" { 
     break; 
    } 
    // ... 
} 

Mã này hoạt động tốt. Tuy nhiên, tôi nghĩ câu hỏi if trông xấu xí và có lẽ không phải là thành ngữ Rust. Trong match báo cáo, bảo vệ có thể được sử dụng trong mô hình kết hợp, như vậy:

match foo { 
    Some(Ok(a)) if a != "" => bar(a) 
    // ... 
} 

Đây sẽ là lý tưởng cho while let vòng lặp của tôi, mặc dù mô hình kết hợp làm việc ở đó dường như không hỗ trợ nó, gây ra một lỗi cú pháp:

while let Some(Ok(a)) = some_iterator.next() if a != "" { // <-- Syntax error 
    // ... 
} 

có cách nào sử dụng bảo vệ như thế này trong điều kiện của một while let? Nếu không, có cách nào tốt hơn để thoát ra khỏi vòng lặp nếu một chuỗi rỗng được tìm thấy?

+1

* và có lẽ không phải là thành ngữ Rust * - FWIW, tôi đã viết mã như thế; dường như không tệ với tôi. – Shepmaster

+0

Tôi khuyến khích người trả lời tập trung vào việc trả lời câu hỏi * chính * (bảo vệ trong 'while let'). OP [có lẽ nên hỏi một câu hỏi khác] (http://meta.stackexchange.com/q/39223/281829) cho khía cạnh "có cách nào tốt hơn" không. – Shepmaster

Trả lời

3

Không, while letif let mẫu không thể có bảo vệ. Đã có một số cuộc thảo luận về việc thay đổi điều đó (ví dụ: here), nhưng chưa có điều gì được quyết định.

Về các lựa chọn thay thế, tôi nghĩ phiên bản của bạn khá rõ ràng và tôi không thể nghĩ ra bất kỳ cách nào để thực sự cải thiện điều đó.

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