Respostas:
Você só precisa converter Option<Vec<u8>>para Option<&[u8]>, usando as_ref()e Indexcaracterí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_refmeu 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_refmétodo de Option.
O primeiro Optionagora é válido &Vec<u8>e vamos compará-lo &[u8]. Isso é tratado novamente pelo as_refmé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_refe Vec::as_sliceparece ser intercambiável aqui.