Rust의 물음표 `?` 연산자
8656 단어 tutorialprogrammingbeginnersrust
?
연산자는 ?
값과 호환되는 반환 유형이 있는 함수를 일찍 종료하는 데 사용됩니다. Err(e)
와 같은 것이지만 None
에서도 사용할 수 있다는 것을 아는 사람은 많지 않습니다.?
연산자는 일반적으로 Result<T, E>
와 함께 사용되어 호출 체인 위로 오류를 전파합니다. 모든 오류를 호스트하기 위해 통합된 오류 열거형을 정의할 수 있습니다. Rust의 변환 방법From<T>
을 활용하여 외부 오류를 통합 오류 열거형으로 변환하는 것을 잊지 마십시오. 그렇게 하면 ?
연산자를 활용하여 백그라운드에서 변환을 수행합니다.// Unified `Error` enum
#[derive(Debug)]
enum Error {
ParseIntError(std::num::ParseIntError),
ParseFloatError(std::num::ParseFloatError),
}
impl std::fmt::Display for Error {
fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result {
match self {
Self::ParseIntError(e) => write!(f, "ParseIntError: {}", e.to_string()),
Self::ParseFloatError(e) => write!(f, "ParseFloatError: {}", e.to_string()),
}
}
}
impl std::error::Error for Error {}
// Convert `std::num::ParseIntError` to `Error`
impl From<std::num::ParseIntError> for Error {
fn from(err: std::num::ParseIntError) -> Self {
Self::ParseIntError(err)
}
}
// Convert `std::num::ParseFloatError` to `Error`
impl From<std::num::ParseFloatError> for Error {
fn from(err: std::num::ParseFloatError) -> Self {
Self::ParseFloatError(err)
}
}
fn main() -> Result<(), Error> {
// Parse an integer and unwrap it, or throw `Error::ParseIntError`
let _: i32 = "123".parse()?;
let _: i32 = "not_an_integer".parse()?;
// Parse a float and unwrap it, or throw `Error::ParseFloatError`
let _: f64 = "not_a_number".parse()?;
Ok(())
}
?
연산자는 Option<T>
반환 유형에 대해 조기 반환을 수행할 수도 있습니다.fn get_first_char_of_second_word(phrase: &str) -> Option<char> {
// Return `None` if the phrase consist of a single word
phrase.split(" ").skip(1).next()?.chars().next()
}
fn main() {
assert_eq!(get_first_char_of_second_word("Hello World"), Some('W'));
assert_eq!(get_first_char_of_second_word("Hello?"), None);
}
Reference
이 문제에 관하여(Rust의 물음표 `?` 연산자), 우리는 이곳에서 더 많은 자료를 발견하고 링크를 클릭하여 보았다 https://dev.to/billy1624/the-question-mark-operator-in-rust-25n1텍스트를 자유롭게 공유하거나 복사할 수 있습니다.하지만 이 문서의 URL은 참조 URL로 남겨 두십시오.
우수한 개발자 콘텐츠 발견에 전념 (Collection and Share based on the CC Protocol.)