¿Hay una manera elegante de comparar Option<Vec<u8>>
por igualdad con Option<&[u8]>
? (O equivalente con en Result
lugar de Option
).
8
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:
Patio de recreo
Aquí hay dos transformaciones clave:
La primera opción contiene el valor de propiedad, la segunda, una referencia. Entonces deberíamos ir de
Option<T>
(o&Option<T>
) aOption<&T>
, y esto se logra usando elas_ref
método deOption
.El primero
Option
ahora es válido&Vec<u8>
y lo vamos a comparar&[u8]
. Esto se maneja nuevamente por elas_ref
método, ahora definido en elAsRef<[u8]>
rasgo e implementado enVec
.fuente
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
yVec::as_slice
parece ser intercambiable aquí.