Respostas:
Você só precisa converter Option<Vec<u8>>
para Option<&[u8]>
, usando as_ref()
e Index
característica:
fn foo(a: Option<Vec<u8>>, b: Option<&[u8]>) -> bool {
a.as_ref().map(|x| &x[..]) == b
}
A partir do Rust 1.40, você pode usar as_deref()
:
fn foo(a: Option<Vec<u8>>, b: Option<&[u8]>) -> bool {
a.as_deref() == b
}
Vec::as_ref
meu não, provou novamente que não há um e somente um estilo em Rust;)
&**x
.
Talvez seja abaixo do ideal, mas esse código parece compilar:
fn cmp(first: Option<Vec<u8>>, second: Option<&[u8]>) -> bool {
first.as_ref().map(Vec::as_ref) == second
}
Existem duas transformações principais aqui:
A primeira opção contém o valor de propriedade, a segunda - uma referência. Portanto, devemos ir de Option<T>
(ou &Option<T>
) para Option<&T>
e isso é alcançado usando o as_ref
método de Option
.
O primeiro Option
agora é válido &Vec<u8>
e vamos compará-lo &[u8]
. Isso é tratado novamente pelo as_ref
método, agora definido na AsRef<[u8]>
característica e implementado em Vec
.
first.map(Vec::as_slice) == second
?
as_ref()
qualquer maneira - acabei de verificar, caso contrário não será compilado. Mas sim, Vec::as_ref
e Vec::as_slice
parece ser intercambiável aqui.