Desempaquetar opciones con ?

Puedes desempaquetar Options usando declaraciones match, pero a menudo es más fácil usar el operador ?. Si x es una Option, entonces la evaluación de x? devolverá el valor subyacente si x es Some; de lo contrario, terminará cualquier función que se esté ejecutando y devolverá None.

fn proximo_cumpleagnos(edad_actual: Option<u8>) -> Option<String> {
	// Si `edad_actual` es `None`, esto devuele `None`.
	// Si `edad_actual` es `Some`, el `u8` interior se asigna a `proxima_edad`
    let proxima_edad: u8 = edad_actual?;
    Some(format!("El año que viene seré {}", proxima_edad))
}

Puedes encadenar muchos ?s juntos para hacer tu código mucho más legible.

struct Persona {
    empleo: Option<Empleo>,
}

#[derive(Clone, Copy)]
struct Empleo {
    numero_de_telefono: Option<NumeroDeTelefono>,
}

#[derive(Clone, Copy)]
struct NumeroDeTelefono {
    codigo_de_area: Option<u8>,
    numero: u32,
}

impl Persona {
    // Obtiene el código de área del número de teléfono del empleo de la persona, si
    // existe.
    fn codigo_de_area_telefono_de_empleo(&self) -> Option<u8> {
        // Esto necesitaría muchas declaraciones `match` anidadas sin el operador `?`.
        // Se necesitaría mucho más código; intenta escribirlo tú mismo y ve cuál es más
        // fácil.
        self.empleo?.numero_de_telefono?.codigo_de_area
    }
}

fn main() {
    let p = Persona {
        empleo: Some(Empleo {
            numero_de_telefono: Some(NumeroDeTelefono {
                codigo_de_area: Some(61),
                numero: 439222222,
            }),
        }),
    };

    assert_eq!(p.codigo_de_area_telefono_de_empleo(), Some(61));
}