Câu trả lời:
Bạn chỉ cần chuyển đổi Option<Vec<u8>>sang Option<&[u8]>, sử dụng as_ref()và 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
}
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;)
&**x.
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
}
Có hai biến đổi chính ở đây:
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.
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.
first.map(Vec::as_slice) == secondkhông?
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_refvà Vec::as_slicedường như có thể hoán đổi cho nhau ở đây.