NeuroWhAI의 잡블로그

[Rust] ? 연산자 본문

개발 및 공부/언어

[Rust] ? 연산자

NeuroWhAI 2018. 6. 3. 12:23




Rust에는 Result라는 놈이 있는데 말 그대로 어떤 작업의 결과를 표현합니다.
성공했으면 Ok(결과 값), 실패했으면 Err(에러 값) 이렇게요.
때문에 Result에서 결과 값을 받아오려면 패턴 매칭을 사용하거나 unwrap 메소드를 써야하는데
이게 많아지면 보기가 안좋다고 합니다.
그래서 편의 문법으로 나온게 '?' 연산자입니다.

좀 다르겠지만 대충 아래와 같은 정의라고 보시면 됩니다.



Result x를 받아서 Ok라면 그 안의 결과 값을 취하지만
Err라면 그 안의 에러 값을 반환합니다.
단순히 return err;가 아닌 이유는 에러간의 변환에 관한 유연성 때문인데 아래에 설명이 있습니다.

공식 문서의 예제를 쬐끔 바꾼 코드입니다.



결과:
0.1
-2.3025850929940455
thread 'main' panicked at 'This is error from str', prog.rs:72
note: Run with `RUST_BACKTRACE=1` for a backtrace.

보시면 에러가 발생해서 panic을 일으켰는데 해당 부분을 보시면
question_op!(Err("This is error from str"));
요렇게 적어놨습니다.
일단 Err라서 return이 수행된건 위에서 설명했으니 넘어가고
주목해야 할 점은 현재 위치에 해당하는 함수의 반환 타입과 Err("This...")의 타입이 다르다는 겁니다.
그런데 어떻게 잘 변환이 되었습니다.
일단 문법적 설탕 요소를 제거하고 해당 부분을 보면



이렇게 되는데 결과적으론 From::from("This is err...") 이렇게 되겠고
더 나아가서는 MathError::from("This is err...")와 동일합니다.
MathError의 from은 위에서 아래 코드를 통해 정의하였었습니다.



덕분에 완전 다른 타입(&str <-> MathError)의 에러 정보가 개발자에게 보이지 않는 과정을 거쳐 자연스럽게 변환되었습니다.

요약하면 '?'는 Result에 대해 Ok(item)이면 item을 취하고
Err(err)라면 err를 적당히 변환하도록 시도한 뒤 반환시키는 매크로라고 볼 수 있습니다.




Comments