[Rust] ? μ—°μ‚°μž (question mark operator)

? μ—°μ‚°μžλŠ” Rust 였λ₯˜ 처리 μ‹œμŠ€ν…œμ˜ 핡심을 μ΄λ£¨λŠ” syntax sugar 쀑 ν•˜λ‚˜λ‹€.
였λ₯˜μ˜ μ „νŒŒ(propagation)λ₯Ό μš©μ΄ν•˜κ²Œ ν•˜λŠ” μˆ˜λ‹¨μ΄λΌκ³  ν•  수 μžˆλ‹€.



문제

μ•Œλ‹€μ‹œν”Ό, RustλŠ” 전톡적인 try-catch 였λ₯˜μ²˜λ¦¬ ꡬ쑰λ₯Ό κ±°λΆ€ν•˜κ³ , ν•¨μˆ˜ν˜•μ—μ„œ 주둜 μ‚¬μš©ν•˜λŠ” monad 기반의 였λ₯˜μ²˜λ¦¬λ₯Ό 기본으둜 μ‚¬μš©ν•œλ‹€. Result와 Option 말이닀.

κ·Έλž˜μ„œ λ§Œμ•½ μ΄λ ‡κ²Œ κ°œλ³„ ν•¨μˆ˜μ—μ„œ 였λ₯˜λ₯Ό λ°˜ν™˜ν•  수 μžˆλŠ” 상황이라면


호좜자 ν•¨μˆ˜λ„ κ·Έ 였λ₯˜λ₯Ό 적절히 λ°›μ•„μ„œ 처리λ₯Ό ν•΄μ€˜μ•Ό ν•œλ‹€.

근데 이게, κ·Έλƒ₯ μ—¬κΈ°μ„œ 처리λ₯Ό ν•˜κ³  끝내면 μ’‹κ² μ§€λ§Œ, 또 였λ₯˜λ₯Ό κ·Έ μƒμœ„λ‘œ μ „νŒŒν•˜λŠ”κ²Œ 효율적인 경우일 λ•Œκ°€ λ§Žλ‹€.
try-catch μ‹œμŠ€ν…œμ—μ„œλŠ” 이게 쉽닀. κ·Έλƒ₯ catchλ₯Ό ν•˜μ§€ μ•ŠμœΌλ©΄ μ˜ˆμ™Έκ°€ 호좜자둜 λ– λ„˜κ²¨μ§€κΈ° λ•Œλ¬Έμ΄λ‹€.

ν•˜μ§€λ§Œ Rust 처럼 였λ₯˜λ₯Ό λͺ…λ°±ν•œ κ°’μ˜ μΌμ’…μœΌλ‘œ λ‹€λ£° κ²½μš°μ—λŠ”, μœ„μ˜ μ½”λ“œμ²˜λŸΌ 였λ₯˜μ— λŒ€ν•΄μ„œ 맀번 번거둭게 λΆ„κΈ°λ₯Ό μ³μ€˜μ•Ό ν•œλ‹€.




? μ—°μ‚°μž

? μ—°μ‚°μžλŠ” 이런 λΆˆν•„μš”ν•œ λ³΄μΌλŸ¬ν”Œλ ˆμ΄νŠΈλ₯Ό μ΅œμ†Œν™”ν•˜κΈ° μœ„ν•œ 보쑰 문법이라고 보면 λœλ‹€.
μœ„μ˜ λ²ˆμž‘ν•œ μ½”λ“œμ— ? μ—°μ‚°μžλ₯Ό μ μš©ν•˜λ©΄, λ†€λΌμšΈ μ •λ„λ‘œ μ½”λ“œλ₯Ό κ°„κ²°ν•˜κ²Œ λ§Œλ“€ 수 μžˆλ‹€.

λ™μž‘μ€ 방금 μ½”λ“œμ™€ λ™μΌν•˜λ‹€.
Resultκ°€ 였λ₯˜ μƒνƒœλΌλ©΄ λ°”λ‘œ 였λ₯˜λ₯Ό λ°˜ν™˜ν•˜κ³ , 였λ₯˜κ°€ μ•„λ‹ˆλΌλ©΄ unwrap을 ν•΄μ„œ κ·Έ 값을 κ·ΈλŒ€λ‘œ λ°˜ν™˜ν•΄μ£ΌλŠ” 것이닀. κ·Έκ±Έ μ € μ—°μ‚°μž ν•˜λ‚˜λ‘œ μΆ•μ•½ν•œ 것이닀.

그리고 μœ μ˜λ―Έν•œ 값이 λ°˜ν™˜κ°’μœΌλ‘œ μ‘΄μž¬ν•˜λ”λΌλ„, κ·Έλƒ₯ λ°›μ•„μ„œ μ“°λ©΄ λœλ‹€.

μ΄λ ‡κ²Œ 말이닀.

그리고 μ΅œμƒμœ„ λ ˆμ΄μ–΄-main ν•¨μˆ˜μ—μ„œλ„ μ‚¬μš© κ°€λŠ₯ν•˜λ‹€.

μ—¬κΈ°μ„œ 였λ₯˜κ°€ λ°œμƒν•˜λ©΄ λ‹Ήμ—°νžˆ ν”„λ‘œκ·Έλž¨μ΄ λ»—λŠ”λ‹€. ꢌμž₯λ˜λŠ” μ‚¬μš© 방식은 μ•„λ‹ˆλ‹€.




? μ—°μ‚°μžμ˜ 적용 λŒ€μƒ

μœ„μ—μ„œλŠ” Result만 μ˜ˆμ‹œλ‘œ λ“€μ—ˆμ§€λ§Œ, Option νƒ€μž…μ— λŒ€ν•΄μ„œλ„ 적용이 κ°€λŠ₯ν•˜λ‹€.

? μ—°μ‚°μžλŠ” λ‹Ήμ—°νžˆ 아무 νƒ€μž…μ—λ‚˜ μ μš©λ˜λŠ” 것은 μ•„λ‹ˆκ³ , Try νŠΈλ ˆμž‡μ„ κ΅¬ν˜„ν•˜λŠ” νƒ€μž…μ— λŒ€ν•΄μ„œλ§Œ λ™μž‘ν•œλ‹€.
ν˜„μž¬λ‘œμ„œλŠ” Result, Option νƒ€μž…μ— λŒ€ν•΄μ„œλ§Œ 지원이 λœλ‹€.

λ‹€λ§Œ ν˜„μž¬ μ‹œμ μ—μ„œ Try νŠΈλ ˆμž‡μ˜ 직접 κ΅¬ν˜„μ€ nightly이기 λ•Œλ¬Έμ—, 직접 κ΅¬ν˜„ν•œ 래퍼 νƒ€μž…μ— λŒ€ν•΄μ„œλŠ” ? μ—°μ‚°μžλ₯Ό μ‚¬μš©ν•  수 μ—†λ‹€.




문제: Option<>Result κ°„ νƒ€μž… 뢈일치

? μ—°μ‚°μžμ˜ λΆˆνŽΈν•œ λΆ€λΆ„ 쀑 ν•˜λ‚˜λŠ”, ? μ‚¬μš©λŒ€μƒ ν•¨μˆ˜μ˜ λ°˜ν™˜ νƒ€μž…κ³Ό ν˜„μž¬ ν•¨μˆ˜μ˜ λ°˜ν™˜νƒ€μž…μ΄ μΌμΉ˜ν•˜κ±°λ‚˜, λ³€ν™˜ κ°€λŠ₯ν•΄μ•Ό ν•œλ‹€λŠ” 것이닀.

이게 무슨 말이냐?

이런 μ‹μœΌλ‘œ Result와 Option을 λ¬΄μž‘μ • μ„žμ–΄μ“Έ 수 μ—†λ‹€λŠ” 것이닀. 사싀 λ‹Ήμ—°ν•˜λ‹€.

λ‹¨μˆœ Option<-Result κ°„ λ³€ν™˜μ΄λΌλ©΄ κ°„λ‹¨ν•œ 꼼수둜 μ²˜λ¦¬ν•  수 있긴 ν•˜λ‹€.
Result::ok ν•¨μˆ˜λŠ” 값을 Option ν˜•νƒœλ‘œ λ³€ν™˜ν•œλ‹€.

이러면 Result의 였λ₯˜ 정보가 μœ μ‹€λ˜κΈ΄ ν•˜μ§€λ§Œ, λ„˜μ–΄κ°€κΈ΄ ν•œλ‹€.


λ°˜λŒ€λ‘œ Option->Result둜 λ„˜κΈΈ κ²½μš°μ—λŠ” ok_or둜 였λ₯˜ νƒ€μž…μ„ λ§€ν•‘ν•΄μ£Όλ©΄ λœλ‹€.




문제: Result의 였λ₯˜ κ°„ νƒ€μž… 뢈일치

또 ν”νžˆ 맞λ‹₯λœ¨λ¦¬λŠ” 문제 쀑 ν•˜λ‚˜κ°€, 같은 Result νƒ€μž…μ΄λ”λΌλ„ Error νƒ€μž…μ΄ ν˜Έν™˜λ˜μ§€ μ•ŠμœΌλ©΄ ? μ—°μ‚°μžκ°€ λ™μž‘ν•˜μ§€ μ•ŠλŠ”λ‹€λŠ” 것이닀.

μ™ΈλΆ€ 라이브러리λ₯Ό μ‚¬μš©ν•˜λ‹€λ³΄λ©΄, 이런 μ‹μœΌλ‘œ 원본 였λ₯˜ νƒ€μž…λ“€μ΄ 혼재될 κ²½μš°κ°€ μž¦λ‹€.


그럼 λ‹Ήμ—°νžˆ μ—λŸ¬κ°€ λ‚œλ‹€.
κ²°κ΅­ μ§€κΈˆ ν•¨μˆ˜μ—μ„œλŠ” 였λ₯˜κ°€ λ°œμƒν•˜λ©΄ Error νƒ€μž…μœΌλ‘œ λ°˜ν™˜μ„ ν•΄μ•Όν•˜λŠ”λ°, μ΄μƒν•œ 였λ₯˜ νƒ€μž…μ΄ κ»΄μžˆμœΌλ‹ˆ νƒ€μž…μ΄ λ»‘λ‚˜λŠ” 것이닀.

이 λ¬Έμ œλŠ” κ½€ κ°„λ‹¨ν•˜κ²Œ ν•΄κ²°ν•  수 μžˆλ‹€.

κ·Έλƒ₯ From trait κ΅¬ν˜„μ„ 톡해 였λ₯˜ κ°„ νƒ€μž…λ³€ν™˜μ„ μ œκ³΅ν•΄μ£Όλ©΄ λœλ‹€.
그럼 이 μ •λ„λŠ” μ•Œμ•„μ„œ κ°μ§€ν•΄μ„œ λ³€ν™˜μ²˜λ¦¬ν•΄μ€€λ‹€.