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_ref
tô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_ref
phương pháp Option
.
Cái đầu tiên Option
bâ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_ref
phươ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) == second
khô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_ref
và Vec::as_slice
dường như có thể hoán đổi cho nhau ở đây.