Óxido compare la Opción <Vec <u8>> con la Opción <& [u8]>


8

¿Hay una manera elegante de comparar Option<Vec<u8>>por igualdad con Option<&[u8]>? (O equivalente con en Resultlugar de Option).

Respuestas:


10

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
}

Fuiste un poco más rápido, ok :)
Cerberus

@Cerberus No me importa, tu respuesta no usa la Vec::as_refmía, comprobada nuevamente, no hay un solo estilo en Rust;)
Stargateur

Yeat sería otra opción &**x.
Sven Marnach

11

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
}

Patio de recreo

Aquí hay dos transformaciones clave:

  1. 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.

  2. 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.


1
Ah, entonces ¿podría hacer lo mismo first.map(Vec::as_slice) == second?
Timmmm

Necesitará el primero de 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í.
Cerberus

¿Qué lenguaje es este? Etiquetarlo
alexherm

No entiendo, ¿qué pasa? La pregunta está etiquetada (y si no fuera así, le preguntarías al autor de la pregunta, no a mí).
Cerberus
Al usar nuestro sitio, usted reconoce que ha leído y comprende nuestra Política de Cookies y Política de Privacidad.
Licensed under cc by-sa 3.0 with attribution required.