[Rust] Result와 Option 타입에 대해서

https://doc.rust-lang.org/std/result/enum.Result.html

거두절미하고 Rust의 Result와 Option는 모나드를 구현한 열거 타입이다. 이 둘의 객체에는 결과값이 들어있을 수도, 없을 수도 있다.
만약 결과값이 정상적으로 들어있다면 잘 작동한거고, 아니라면 예외가 발생한 것이다.

이 둘은 거의 비슷한 구조와 사용법을 가지는데, 다른 점은 오류 정보를 가지냐, 마냐의 차이밖에 없다.
Result는 아래와 같이 에러 정보를 명시적으로 가진다.
enumResult<T, E> { Ok(T), Err(E), } 하지만 Option은 더 단순하다. 이건 그냥 있냐 없냐만 따진다. None은 여타 언어에서의 Null&Nil과 동일시해도 된다.
pub enum Option { None, Some(T), } rust는 기존의 try-catch 방식을 사용하지 않고 이것들을 통해서 예외를 처리한다.
다른 게 아니라 이 방식이 성능상으로 더 빠르기 때문이다.


떠들기만 하는 것보다 예시를 보는 것이 이해가 빠를 것이다.
아래에서는 문자열에서 특정 내용을 찾아서 인덱스를 반환하는 find 메서드를 사용했다. 이 메서드는 결과를 Option으로 반환한다.

잘 돌아가는데


unwrap을 했는데 만약 값이 안 들어있으면 panic을 내면서 프로그램을 강제로 종료시킨다.
때문에 unwrap은 테스트용이나 성공을 확신할 수 있을 때만 사용해야 한다.

제대로 예외처리를 하려면 이런 식으로 짠다.



expect 같은 경우엔 값이 없을 경우 파라미터로 넘긴 텍스트로 패닉을 걸어버린다.
이것도 강제로 종료시키는거라 테스트용에 적합하다.



unwrap_or은 값이 있으면 그냥 벗겨서 넣지만, 없으면 인자로 넘겨준걸 그대로 넣는다.

다른 것도 많은데, 대충 이만하면 됐고, 이제 result를 봐보자.


unwrap, unwrap_or, expect 등은 option과 완전히 같다.


그런데 result는 option과는 다르게 에러값도 벗겨낼 수가 있다.



정석적으로 예외처리를 구성하려면 이렇게 하면 된다. option과 별 차이 없다.


이게 다다.