Tùy chọn so sánh Rust <Vec <u8 >> với Tùy chọn <& [u8]>


8

Có một cách thanh lịch để so sánh Option<Vec<u8>>cho bình đẳng với Option<&[u8]>? (Hoặc tương đương với Resultthay vì Option.)

Câu trả lời:


10

Bạn chỉ cần chuyển đổi Option<Vec<u8>>sang Option<&[u8]>, sử dụng as_ref()Indexđặc điểm:

fn foo(a: Option<Vec<u8>>, b: Option<&[u8]>) -> bool {
    a.as_ref().map(|x| &x[..]) == b
}

Kể từ Rust 1.40, bạn có thể sử dụng as_deref():

fn foo(a: Option<Vec<u8>>, b: Option<&[u8]>) -> bool {
    a.as_deref() == b
}

Bạn đã nhanh hơn một chút, ok :)
Cerberus

@Cerberus Tôi không quan tâm, sử dụng câu trả lời của bạn Vec::as_reftôi không, chứng minh một lần nữa không có một và chỉ một phong cách trong Rust;)
Stargateur

Yeat một lựa chọn khác sẽ được &**x.
Sven Marnach

11

Có thể nó không tối ưu, nhưng mã này dường như biên dịch:

fn cmp(first: Option<Vec<u8>>, second: Option<&[u8]>) -> bool {
    first.as_ref().map(Vec::as_ref) == second
}

Sân chơi

Có hai biến đổi chính ở đây:

  1. Tùy chọn đầu tiên giữ giá trị sở hữu, thứ hai - một tham chiếu. Vì vậy, chúng ta nên đi từ Option<T>(hoặc &Option<T>) đến Option<&T>, và điều này đạt được bằng cách sử dụng as_refphương pháp Option.

  2. Cái đầu tiên Optionbây giờ được giữ &Vec<u8>, và chúng ta sẽ so sánh nó với &[u8]. Điều này được xử lý lại bằng as_refphương thức, bây giờ được xác định trên AsRef<[u8]>đặc điểm và được thực hiện trên Vec.


1
Ah vậy tôi có thể làm như vậy first.map(Vec::as_slice) == secondkhông?
Timmmm

Dù sao bạn cũng sẽ cần cái đầu tiên as_ref()- tôi vừa kiểm tra, nó sẽ không biên dịch theo cách khác. Nhưng có, Vec::as_refVec::as_slicedường như có thể hoán đổi cho nhau ở đây.
Cerberus

Ngôn ngữ này là gì? Gắn thẻ nó.
alexherm

Tôi không hiểu, có chuyện gì vậy? Câu hỏi được gắn thẻ (và nếu không, bạn sẽ hỏi người hỏi chứ không phải tôi).
Cerberus
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.