Rust의 물음표 연산자

Nilesh Katuwal 2023년6월21일
  1. Rust의 물음표 연산자(?)
  2. Rust에서 오류 전파
  3. Rust에서 물음표(?) 연산자를 사용하는 시기와 장소
Rust의 물음표 연산자

이 튜토리얼은 Rust의 물음표 연산자(?)에 관한 것입니다.

Rust의 물음표 연산자(?)

물음표 연산자(?)는 공정한 값을 풀고 잘못된 값을 호출 함수에 반환한 다음 호출자에게 전달합니다. 단항 후위 연산자는 Result<T, E>Option<T> 유형에만 적용할 수 있으며 다른 유형에는 사용할 수 없습니다.

일치 연산자를 사용하여 결과를 함께 연결하면 상황이 복잡해질 수 있습니다. 다행히 ? 운영자는 일을 좀 더 질서 정연하게 만들 수 있습니다. ? 결과를 반환하는 식의 끝에 사용됩니다.

이는 Err(err) 분기가 초기 return Err(From::from(err))으로 확장되고 Ok(ok) 분기가 ok로 확장되는 일치 표현식과 동일합니다. 표현식, Err(err) 분기는 초기 return Err(From::from(err)) 분기로 확장됩니다.

?는 오버로드할 수 없습니다.

보시다시피 Rust는 규칙을 따르는 언어입니다. 따라서 패닉이 포함되어 있지만 복구할 수 없는 오류를 의미하므로 오류 처리에 사용하지 않는 것이 좋습니다.

또한 ?를 사용하는 방법을 이해하려면 오류 전파를 연구해야 합니다. 직접 표시하십시오.

Rust에서 오류 전파

오류 전파는 호출자 함수가 문제를 효과적으로 처리할 수 있도록 호출자 함수가 자주 호출하는 코드에서 발견된 오류 정보를 전파 또는 확산하거나 반환하는 프로세스입니다.

예:

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

출력:

The value is 5

리터럴 문자열에서 감지된 첫 번째 단어에서 발견된 문자의 인덱스를 반환하는 간단한 유틸리티 함수 char_in_second_word에 주목하십시오.

그러나 문자열 리터럴이 Learning이고 찾고 있는 문자가 I인 경우 문자열 리터럴의 첫 번째 단어가 문자를 포함하는 Learning이기 때문에 반환된 인덱스 값은 Some(5)입니다. I는 문자 배열의 5 위치에 있습니다.

그러나 물음표를 사용하면 코드를 더 쉽고 간단하게 만들 수 있습니다.

Rust에서는 Result가 오류 처리에 사용됩니다. ? 연산자는 Result 또는 Option을 반환하는 함수에서만 사용할 수 있습니다.

예:

use std::num::ParseIntError;

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

출력:

7

? 포함된 함수가 결과도 반환하는 경우 결과 유형에서 연산자를 사용할 수 있습니다.

?가 표시될 때마다 ?가 있는 함수에서 조기 반환 가능성을 나타냅니다. 활용됩니다.

Rust에서 물음표(?) 연산자를 사용하는 시기와 장소

물음표 ?를 사용하는 경우가 있습니다. 연산자를 만들 수 없습니다. 예를 들어 설명에 ? 연산자는 Result 또는 Option 유형을 반환하는 함수에서만 사용됩니다.

이는 함수 내에서 ResultOption 유형 작업을 제외하지 않습니다. ? 반면 연산자는 함수에서 동일한 유형을 반환하는 유형에만 엄격하게 사용해야 합니다.

즉, 함수가 Result라는 유형을 반환하는 경우 ? Result라는 유형의 연산자. 함수가 Option을 반환하면 ? 연산자는 Option 유형에서 사용해야 합니다.

? 사용 시도 두 종류 중 하나만 반환하는 함수에서 ResultOption 유형 모두에 대한 연산자는 오류를 발생시킵니다. 설명을 위해 다음 코드를 고려하십시오.

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

    Ok(x)
}

위의 소스 코드를 실행하면 아래와 같은 오류가 발생합니다.

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

오류 전파에서 ? 바로 가기로 사용됩니다.

? 문자가 함수에 의해 반환된 유형이 아닌 다른 유형에 사용되면 반환할 함수에 정의된 유형과 관련 없는 실수를 전파할 가능성이 있습니다.

다행스럽게도 Rust는 컴파일 과정에서 이러한 문제를 포착할 만큼 지능적입니다. 결과적으로 코드 실행 중에 이러한 실수가 발생하지 않습니다.