Respuestas:
Sólo se necesita para convertir Option<Vec<u8>>
a Option<&[u8]>
, el uso as_ref()
y el Index
rasgo:
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_ref
mí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_ref
método de Option
.
El primero Option
ahora es válido &Vec<u8>
y lo vamos a comparar &[u8]
. Esto se maneja nuevamente por el as_ref
mé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_ref
y Vec::as_slice
parece ser intercambiable aquí.