¿Hay una manera elegante de comparar Option<Vec<u8>>por igualdad con Option<&[u8]>? (O equivalente con en Resultlugar de Option).
8
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:
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_refmétodo deOption.El primero
Optionahora es válido&Vec<u8>y lo vamos a comparar&[u8]. Esto se maneja nuevamente por elas_refmé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_refyVec::as_sliceparece ser intercambiable aquí.