Fragezeichen-Operator in Rust

Nilesh Katuwal 21 Juni 2023
  1. der Fragezeichen-Operator (?) in Rust
  2. Fehlerfortpflanzung in Rust
  3. Wann und wo wird der Fragezeichen-Operator (?) in Rust verwendet?
Fragezeichen-Operator in Rust

In diesem Tutorial geht es um den Fragezeichenoperator (?) von Rust.

der Fragezeichen-Operator (?) in Rust

Der Fragezeichenoperator (?) entpackt faire Werte und gibt fehlerhafte Werte an die aufrufende Funktion zurück, die dann an den Aufrufer weitergegeben werden. Ein unärer Postfix-Operator kann nur auf die Typen Result<T, E> und Option<T> angewendet werden und auf keine anderen Typen.

Die Dinge können unübersichtlich werden, wenn Sie den Match-Operator verwenden, um Ergebnisse miteinander zu verketten; glücklicherweise ist das ? Bediener kann die Dinge ein wenig geordneter machen. ? wird am Ende eines Ausdrucks verwendet, der ein Ergebnis zurückgibt.

Es entspricht einem Übereinstimmungsausdruck, bei dem der Zweig Err(err) zu einem frühen return Err(From::from(err)) und der Ok(ok)-Zweig zu einem ok erweitert wird. Ausdruck, und der Err(err)-Zweig erweitert sich zu einem frühen return Err(From::from(err))-Zweig.

? kann nicht überladen werden.

Wie Sie vielleicht gesehen haben, ist Rust eine regelbefolgende Sprache. Obwohl es Paniken enthält, wird daher von ihrer Verwendung zur Fehlerbehandlung abgeraten, da sie für nicht behebbare Fehler gedacht sind.

Außerdem müssen wir die Fehlerfortpflanzung studieren, um zu verstehen, wie man das ? verwendet. direkt markieren.

Fehlerfortpflanzung in Rust

Die Fehlerweitergabe ist der Prozess der Weitergabe oder Verbreitung oder Rückgabe von Fehlerinformationen, die in Code gefunden werden, der häufig von einer aufrufenden Funktion aufgerufen wird, damit die aufrufende Funktion das Problem effektiv behandeln kann.

Beispiel:

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)
}

Ausgang:

The value is 5

Beachten Sie die einfache Hilfsfunktion char_in_second_word, die den Index des Zeichens zurückgibt, das im ersten Wort gefunden wurde, das in einer Literalzeichenfolge erkannt wurde.

Wenn das String-Literal jedoch Learning ist und das gesuchte Zeichen I ist, lautet der zurückgegebene Indexwert Some(5), da das erste Wort des String-Literals Learning ist, das den Buchstaben enthält I an Position 5 der Zeichenkette.

Aber mit einem Fragezeichen können die Codes einfacher und einfacher gemacht werden.

In Rust wird Ergebnis zur Fehlerbehandlung verwendet. Der ? Der Operator kann nur in einer Funktion verwendet werden, die Ergebnis oder Option zurückgibt.

Beispiel:

use std::num::ParseIntError;

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

Ausgang:

7

Der ? Der Operator könnte auf einen Typ Ergebnis angewendet werden, wenn die enthaltene Funktion auch ein Ergebnis zurückgibt.

Jedes Mal, wenn Sie ein ? sehen, weist dies auf die Möglichkeit einer vorzeitigen Rückkehr von der Funktion hin, in der das ? verwendet wird.

Wann und wo wird der Fragezeichen-Operator (?) in Rust verwendet?

Es gibt Situationen, in denen das Fragezeichen ? Operator kann nicht gemacht werden. In der Beschreibung heißt es beispielsweise, dass das ? Operator wird nur in Funktionen verwendet, die die Typen Ergebnis oder Option zurückgeben.

Dies schließt das Arbeiten mit den Typen Ergebnis und Option innerhalb einer Funktion nicht aus. Der ? Der Operator hingegen sollte ausschließlich mit Typen verwendet werden, die denselben Typ in einer Funktion zurückgeben.

Mit anderen Worten, wenn die Funktion einen Typ namens Ergebnis zurückgibt, verwenden Sie das ? Operator in einem Typ namens Ergebnis. Wenn die Funktion eine Option zurückgibt, wird das ? Operator sollte in einem Option-Typ verwendet werden.

Der Versuch, das ? zu verwenden -Operator für die Typen Ergebnis und Option in einer Funktion, die nur einen der beiden Typen zurückgibt, führt zu einem Fehler. Betrachten Sie zur Veranschaulichung den folgenden Code.

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

    Ok(x)
}

Das Ausführen des obigen Quellcodes verursacht den unten angegebenen Fehler.

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

Wir sollten uns daran erinnern, dass bei der Fehlerfortpflanzung das ? wird als Abkürzung verwendet.

Wenn das ? Zeichen in einem anderen Typ als dem von einer Funktion zurückgegebenen verwendet wird, besteht die Möglichkeit, dass Fehler weitergegeben werden, die nichts mit dem Typ zu tun haben, der in der zurückzugebenden Funktion definiert ist.

Glücklicherweise ist Rust intelligent genug, um diese Probleme während des Kompilierungsprozesses abzufangen. Infolgedessen würden solche Fehler während der Codeausführung nicht auftreten.