Operador de signo de interrogación en Rust

Nilesh Katuwal 21 junio 2023
  1. el operador de signo de interrogación (?) en Rust
  2. Propagación de errores en Rust
  3. Cuándo y dónde usar el operador de signo de interrogación (?) en Rust
Operador de signo de interrogación en Rust

Este tutorial trata sobre el operador de signo de interrogación de Rust (?).

el operador de signo de interrogación (?) en Rust

El operador de signo de interrogación (?) desenvuelve los valores justos y devuelve valores erróneos a la función que llama, que luego se pasa a la persona que llama. Un operador de sufijo unario solo se puede aplicar a los tipos Resultado<T, E> y Opción<T> y no se puede usar a ningún otro tipo.

Las cosas pueden desordenarse cuando se usa el operador de coincidencia para encadenar resultados; afortunadamente, el ? operador puede hacer las cosas un poco más ordenadas. ? se utiliza al final de una expresión que devuelve un Resultado.

Es equivalente a una expresión de coincidencia en la que la rama Err(err) se expande a un principio return Err(From::from(err)), y la rama Ok(ok) se expande a un ok y la rama Err(err) se expande a una rama anterior return Err(From::from(err)).

? no se puede sobrecargar.

Como habrás visto, Rust es un lenguaje que sigue reglas. Por lo tanto, aunque contiene pánicos, se desaconseja su uso para el manejo de errores, ya que están destinados a errores irrecuperables.

Además, debemos estudiar la propagación de errores para entender cómo usar el ? marcar directamente.

Propagación de errores en Rust

La propagación de errores es el proceso de propagar o extender, o devolver información de error que se encuentra en el código que a menudo es invocado por una función de llamada para permitir que la función de llamada maneje el problema de manera efectiva.

Ejemplo:

fn main() {
    let result = char_in_second_word(&"Learning when question mark used", &'i');

    println!("The value is {}", result.unwrap_or(1))
}


fn char_in_second_word(sentence: &str, char: &char) -> Option<usize> {
    let second_word =  match sentence.split(" ").next().is_some() == true {
        true => sentence.split(" ").next().unwrap(),
        false => return None
    };

    second_word.find(|x| &x == char)
}

Producción :

The value is 5

Tome nota de la función de utilidad simple char_in_second_word, que devuelve el índice del carácter descubierto en la primera palabra detectada en una cadena literal.

Sin embargo, si el literal de cadena es Learning y el carácter que estamos buscando es I, el valor de índice devuelto será “Algunos (5)” porque la primera palabra del literal de cadena es Learning, que contiene la letra I en la posición 5 de la matriz de caracteres.

Pero usando un signo de interrogación, los códigos pueden hacerse más fáciles y simples.

En Rust, Resultado se usa para el manejo de errores. El ? El operador solo se puede utilizar en una función que devuelve Resultado u Opción.

Ejemplo:

use std::num::ParseIntError;

fn main() -> Result<(), ParseIntError>
{
    let num = "7".parse::<i32>()?;
    println!("{:?}", num);
    Ok(())
}

Producción :

7

El ? El operador podría usarse en un tipo Resultado si la función contenida también devuelve un Resultado.

Cada vez que vea un ?, indica la posibilidad de un regreso anticipado de la función en la que el ? se utiliza

Cuándo y dónde usar el operador de signo de interrogación (?) en Rust

Hay algunas circunstancias en las que la utilización del signo de interrogación ? El operador no se puede hacer. Por ejemplo, la descripción establece que el ? El operador solo se usa en funciones que devuelven los tipos Resultado u Opción.

Esto no excluye trabajar con los tipos Resultado y Opción dentro de una función. El ? El operador, por otro lado, debe usarse estrictamente con tipos que devuelven el mismo tipo en una función.

En otras palabras, si la función devuelve un tipo llamado Resultado, utilice el ? operador en un tipo llamado Resultado. Si la función devuelve una Opción, el ? El operador debe usarse en un tipo Opción.

Intentar usar el ? El operador en los tipos Resultado y Opción en una función que devuelve solo uno de los dos tipos dará como resultado un error. A modo de ilustración, considere el siguiente código.

fn err_fxn() -> Result<i32, String> {
    let x = Ok("The go!")?;
    let y = Some(1)?;

    Ok(x)
}

Ejecutar el código fuente anterior provocará el error como se indica a continuación.

the `?` operator can only be used on `Result`s, not `Option`s, in a function that returns `Result`

Recordemos que, en la propagación de errores, el ? se utiliza como un atajo.

Si el ? carácter se utiliza en un tipo diferente al devuelto por una función, existe la posibilidad de propagar errores no relacionados con el tipo definido en la función a devolver.

Afortunadamente, Rust es lo suficientemente inteligente como para detectar estos problemas durante el proceso de compilación. Como resultado, tales errores no surgirían durante la ejecución del código.