Respuestas:
Sólo se necesita para convertir Option<Vec<u8>>a Option<&[u8]>, el uso as_ref()y el Indexrasgo:
fn foo(a: Option<Vec<u8>>, b: Option<&[u8]>) -> bool {
a.as_ref().map(|x| &x[..]) == b
}
A partir de Rust 1.40, puede usar as_deref():
fn foo(a: Option<Vec<u8>>, b: Option<&[u8]>) -> bool {
a.as_deref() == b
}
Vec::as_refmía, comprobada nuevamente, no hay un solo estilo en Rust;)
&**x.
Tal vez sea subóptimo, pero este código parece compilar:
fn cmp(first: Option<Vec<u8>>, second: Option<&[u8]>) -> bool {
first.as_ref().map(Vec::as_ref) == second
}
Aquí hay dos transformaciones clave:
La primera opción contiene el valor de propiedad, la segunda, una referencia. Entonces deberíamos ir deOption<T> (o &Option<T>) a Option<&T>, y esto se logra usando el as_refmétodo de Option.
El primero Optionahora es válido &Vec<u8>y lo vamos a comparar &[u8]. Esto se maneja nuevamente por el as_refmétodo, ahora definido en el AsRef<[u8]>rasgo e implementado en Vec.
first.map(Vec::as_slice) == second?
as_ref()todos modos: acabo de comprobar que no se compilará de otra manera. Pero sí, Vec::as_refy Vec::as_sliceparece ser intercambiable aquí.