Rust: `?`์—ฐ์‚ฐ์ž ๋ฐ`try` ๋ธ”๋ก์— ๋Œ€ํ•œ ์ถ”์  ๋ฌธ์ œ (RFC 243,`question_mark` ๋ฐ`try_blocks` ๊ธฐ๋Šฅ)

์— ๋งŒ๋“  2016๋…„ 02์›” 05์ผ  ยท  340์ฝ”๋ฉ˜ํŠธ  ยท  ์ถœ์ฒ˜: rust-lang/rust

rust-lang / rfcs # 243 ๋ฐ rust-lang / rfcs # 1859์— ๋Œ€ํ•œ ์ถ”์  ๋ฌธ์ œ์ž…๋‹ˆ๋‹ค.

๊ตฌํ˜„ ๋ฌธ์ œ :

  • [x] ? try! -# 31954์™€ ๊ฑฐ์˜ ๋™์ผํ•œ ? ์—ฐ์‚ฐ์ž
  • [x] try { ... } ํ‘œํ˜„์‹-https: //github.com/rust-lang/rust/issues/39849

    • [x] do catch { ... } ๊ตฌ๋ฌธ ์งˆ๋ฌธ ํ•ด๊ฒฐ


    • [x] catch ๋ธ”๋ก์ด ๊ฒฐ๊ณผ ๊ฐ’์„ "๋ž˜ํ•‘"ํ•ด์•ผํ•˜๋Š”์ง€ ์—ฌ๋ถ€๋ฅผ ํ™•์ธํ•ฉ๋‹ˆ๋‹ค (์ฒ˜์Œ https://github.com/rust-lang/rust/issues/41414์—์„œ ํ•ด๊ฒฐ๋จ, ์ด์ œ https://github.com/rust-์—์„œ ์ƒˆ๋กœ ํ•ด๊ฒฐ๋จ). lang / rust / issues / 70941)

    • [] ์œ ํ˜• ์œ ์ถ” ๊ด€๋ จ ๋ฌธ์ œ๋ฅผ ํ•ด๊ฒฐํ•ฉ๋‹ˆ๋‹ค ( try { expr? }? ํ˜„์žฌ ์–ด๋”˜๊ฐ€์— ๋ช…์‹œ์ ์ธ ์œ ํ˜• ์ฃผ์„์ด ํ•„์š”ํ•จ).

  • [x] Try ํŠน์„ฑ์˜ ์„ค๊ณ„ ์ •์ฐฉ (https://github.com/rust-lang/rfcs/pull/1859)

    • [x] ์ƒˆ๋กœ์šด Try ํŠธ๋ ˆ์ด ํŠธ ( Carrier )๋ฅผ ๊ตฌํ˜„ํ•˜๊ณ  ? ๋ฅผ ๋ณ€ํ™˜ํ•˜์—ฌ ์‚ฌ์šฉํ•ฉ๋‹ˆ๋‹ค (https://github.com/rust-lang/rust/pull / 42275)

    • [x] Option ๋“ฑ์— ๋Œ€ํ•œ impls ๋ฐ ์ ์ ˆํ•œ ํ…Œ์ŠคํŠธ ์ œํ’ˆ๊ตฐ ์ถ”๊ฐ€ (https://github.com/rust-lang/rust/pull/42526)

    • [x] RFC (https://github.com/rust-lang/rust/issues/35946)์— ์„ค๋ช… ๋œ๋Œ€๋กœ ์˜ค๋ฅ˜ ๋ฉ”์‹œ์ง€ ๊ฐœ์„ 

  • [x] ์ƒˆ ๋ฒ„์ „์—์„œ try ์˜ˆ์•ฝ
  • [x] try{}catch (๋˜๋Š” ๊ธฐํƒ€ ํ›„์† ID)๋ฅผ ์ฐจ๋‹จํ•˜์—ฌ ๋ฏธ๋ž˜๋ฅผ ์œ„ํ•ด ๋””์ž์ธ ๊ณต๊ฐ„์„ ์—ด์–ด๋‘๊ณ  ๋Œ€์‹  match ์›ํ•˜๋Š” ์ž‘์—…์„ ์ˆ˜ํ–‰ํ•˜๋Š” ๋ฐฉ๋ฒ•์„ ์•Œ๋ ค์ค๋‹ˆ๋‹ค.
A-error-handling B-RFC-approved B-RFC-implemented B-unstable C-tracking-issue F-try_blocks Libs-Tracked T-lang T-libs

๊ฐ€์žฅ ์œ ์šฉํ•œ ๋Œ“๊ธ€

@ mark-im ์•ˆ์ •ํ™” ํ›„ ํ•ฉ๋ฆฌ์ ์œผ๋กœ ์ด๋™ํ•  ์ˆ˜ ์žˆ๋‹ค๊ณ  ์ƒ๊ฐํ•˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค. ๋‚ด๊ฐ€ Ok-wrapping์ด๋ผ๊ณ  ์ƒ๊ฐํ•˜๋Š” ๊ฒƒ๋งŒ ํผ ๋‚˜์˜์ง€๋งŒ, ๋‹น์‹ ์ด ๊ทธ๊ฒƒ์„ ์›ํ•˜๋Š”์ง€ ์•„๋‹Œ์ง€ ์ถ”์ธกํ•˜๋ ค๊ณ  ์‹œ๋„ํ•˜๋Š” ์ผ๊ด€์„ฑ์—†๋Š” Ok-wrapping์€ ๋” ๋‚˜์  ๊ฒƒ์ž…๋‹ˆ๋‹ค.

๋ชจ๋“  340 ๋Œ“๊ธ€

ํ•จ๊ป˜ ์ œ๊ณต๋˜๋Š” RFC๋Š” ๋ ˆ์ด๋ธ”์ด ์ง€์ •๋œ ๋ฐ˜ํ™˜ / ์ค‘๋‹จ์„ ๊ธฐ๋ฐ˜์œผ๋กœ desugaring์— ๋Œ€ํ•ด ์„ค๋ช…ํ•ฉ๋‹ˆ๋‹ค. ์šฐ๋ฆฌ๋„ ๊ทธ๋ ‡๊ฒŒ๋ฉ๋‹ˆ๊นŒ ์•„๋‹ˆ๋ฉด ์ปดํŒŒ์ผ๋Ÿฌ์—์„œ ? ๋ฐ catch ์— ๋Œ€ํ•œ ํŠน์ˆ˜ ์ฒ˜๋ฆฌ๊ฐ€ ์žˆ์„๊นŒ์š”?

ํŽธ์ง‘ : ๋ ˆ์ด๋ธ” ๋ฐ˜ํ™˜ / ํœด์‹์€ ? ๋ฐ catch ๊ณผ๋Š” ๋ณ„๊ฐœ์˜ ํ›Œ๋ฅญํ•œ ์•„์ด๋””์–ด๋ผ๊ณ  ์ƒ๊ฐํ•˜๋ฏ€๋กœ ๋Œ€๋‹ต์ด '์•„๋‹ˆ์š”'์ด๋ฉด ๋ณ„๋„์˜ RFC๋ฅผ ์—ด ๊ฒƒ์ž…๋‹ˆ๋‹ค.

๋ ˆ์ด๋ธ”์ด์žˆ๋Š” ๋ฐ˜ํ’ˆ / ํœด์‹์€ ์ˆœ์ „ํžˆ ์„ค๋ช…์„์œ„ํ•œ ๊ฒƒ์ž…๋‹ˆ๋‹ค.

2016 ๋…„ 2 ์›” 5 ์ผ ๊ธˆ์š”์ผ ์˜คํ›„ 3:56, Jonathan Reem [email protected]
์ผ๋‹ค :

์ฒจ๋ถ€ ๋œ RFC๋Š” ๋ ˆ์ด๋ธ”์ด์žˆ๋Š” ๋ฐ˜ํ’ˆ / ํœด์‹์„ ๊ธฐ๋ฐ˜์œผ๋กœ ์„คํƒ• ์ œ๊ฑฐ์— ๋Œ€ํ•ด ์„ค๋ช…ํ•ฉ๋‹ˆ๋‹ค.
์šฐ๋ฆฌ๋„ ๊ทธ๊ฒƒ์„ ๋ฐ›๊ณ  ์žˆ์Šต๋‹ˆ๊นŒ ์•„๋‹ˆ๋ฉด ํŠน๋ณ„ํ•œ ๋Œ€์šฐ๊ฐ€ ์žˆ์Šต๋‹ˆ๊นŒ? ๊ณผ
์ปดํŒŒ์ผ๋Ÿฌ์—์„œ ์žก์•„?

โ€”
์ด ์ด๋ฉ”์ผ์— ์ง์ ‘ ๋‹ต์žฅํ•˜๊ฑฐ๋‚˜ GitHub์—์„œ ํ™•์ธํ•˜์„ธ์š”.
https://github.com/rust-lang/rust/issues/31436#issuecomment -180551605.

์šฐ๋ฆฌ๊ฐ€ ์•ˆ์ •ํ™”๋˜๊ธฐ ์ „์— ํ•ด๊ฒฐํ•˜๋Š” ๋ฐ ๋˜ ๋‹ค๋ฅธ ํ•ด๊ฒฐ๋˜์ง€ ์•Š์€ ๋ฌธ์ œ๋Š” ๊ณ„์•ฝ ๊ฒƒ์ž…๋‹ˆ๋‹ค impl s์˜ Into ์—ฌ๋ถ€ - ์ˆœ์ข…์ด ์žˆ์–ด์•ผ ํ•  ํ•„์š”๊ฐ€ Into ์‚ฌ์šฉ์œผ๋กœ๋„ ์˜ฌ๋ฐ”๋ฅธ ํŠน์„ฑ์ž…๋‹ˆ๋‹ค ์—ฌ๊ธฐ์—์„œ ์˜ค๋ฅ˜ ์—… ์บ์ŠคํŒ…์„ ์œ„ํ•ด. (์•„๋งˆ ์ด๊ฒƒ์€ ๋‹ค๋ฅธ ์ฒดํฌ๋ฆฌ์ŠคํŠธ ํ•ญ๋ชฉ์ด์–ด์•ผํ•ฉ๋‹ˆ๊นŒ?)

๋ฆผ

๋ ˆ์ด๋ธ” ๋ฐ˜ํ™˜ / ํœด์‹์€ ํ›Œ๋ฅญํ•œ ์•„์ด๋””์–ด๋ผ๊ณ  ์ƒ๊ฐํ•ฉ๋‹ˆ๋‹ค. ์•„๋งˆ๋„ ๋ณ„๋„์˜ RFC๋ฅผ ์—ด ๊ฒƒ์ž…๋‹ˆ๋‹ค.

์ œ๋ฐœ!

Carrier ํŠน์„ฑ์˜ ์ฃผ์ œ์— ๋Œ€ํ•ด RFC ํ”„๋กœ์„ธ์Šค ์ดˆ๊ธฐ์— ์ž‘์„ฑํ•œ ํŠน์„ฑ์˜ ์š”์  ์˜ˆ๊ฐ€ ์žˆ์Šต๋‹ˆ๋‹ค.
https://gist.github.com/thepowersgang/f0de63db1746114266d3

๊ตฌ๋ฌธ ๋ถ„์„ ์ค‘์— ์–ด๋–ป๊ฒŒ ์ฒ˜๋ฆฌ๋ฉ๋‹ˆ๊นŒ?

struct catch {
    a: u8
}

fn main() {

    let b = 10;
    catch { a: b } // struct literal or catch expression with type ascription inside?

}

@petrochenkov ์Œ, ์ •์˜๋Š” ๊ตฌ๋ฌธ ๋ถ„์„์— ์˜ํ–ฅ์„ ์ค„ ์ˆ˜ ์—†์ง€๋งŒ { , : ์ดํ›„์˜ ๋‘ ๋ฒˆ์งธ ํ† ํฐ์„ ๊ธฐ๋ฐ˜์œผ๋กœํ•˜๋Š” ์˜ˆ๊ฒฌ ๊ทœ์น™์ด ์—ฌ์ „ํžˆ ์žˆ๋‹ค๊ณ  ์ƒ๊ฐํ•ฉ๋‹ˆ๋‹ค. ๊ตฌ์กฐ์ฒด ๋ฆฌํ„ฐ๋Ÿด๋กœ ๊ตฌ๋ฌธ ๋ถ„์„๋ฉ๋‹ˆ๋‹ค.

๋˜ํ•œ

let c1 = catch { a: 10 };
let c2 = catch { ..c1 }; // <--

struct catch {}
let c3 = catch {}; // <--

+ https://github.com/rust-lang/rfcs/issues/306 (์–ธ์ œ!) ๊ตฌํ˜„ ๋œ ๊ฒฝ์šฐ.
๊ตฌ์กฐ์ฒด ๋ฆฌํ„ฐ๋Ÿด ์™ธ์— ์ถฉ๋Œ์ด์—†๋Š” ๊ฒƒ ๊ฐ™์Šต๋‹ˆ๋‹ค.

์œ„์˜ ์˜ˆ๊ฐ€ ์ฃผ์–ด์ง€๋ฉด ๊ฐ€์žฅ ๊ฐ„๋‹จํ•œ ์†”๋ฃจ์…˜ (ํ‰์†Œ์ฒ˜๋Ÿผ)์ž…๋‹ˆ๋‹ค. ํ•ญ์ƒ ํ‘œํ˜„์‹ ์œ„์น˜์—์„œ catch { ๋ฅผ catch ๋ธ”๋ก์˜ ์‹œ์ž‘์œผ๋กœ ์ทจ๊ธ‰ํ•ฉ๋‹ˆ๋‹ค. ์–ด์จŒ๋“  ๊ตฌ์กฐ๋ฅผ catch ๋ผ๊ณ  ๋ถ€๋ฅด๋Š” ์‚ฌ๋žŒ์€ ์—†์Šต๋‹ˆ๋‹ค.

catch ๋Œ€์‹  ํ‚ค์›Œ๋“œ๋ฅผ ์‚ฌ์šฉํ•˜๋ฉด ๋” ์‰ฌ์šธ ๊ฒƒ์ž…๋‹ˆ๋‹ค.

๋‹ค์Œ์€ ํ‚ค์›Œ๋“œ ๋ชฉ๋ก์ž…๋‹ˆ๋‹ค. http://doc.rust-lang.org/nightly/grammar.html#keywords

@bluss ๊ทธ๋ž˜, ๋‚˜๋Š” ๊ทธ๋“ค ์ค‘ ๋ˆ„๊ตฌ๋„ ํ›Œ๋ฅญํ•˜์ง€ override ๋Š” ๊ฐ€๊นŒ์šด ์œ ์ผํ•œ ์‚ฌ๋žŒ์ธ ๊ฒƒ ๊ฐ™๋‹ค. ๋˜๋Š” do ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ๋˜๋Š” ์กฐํ•ฉ, ๋น„๋ก ๋‚ด๊ฐ€ ์ฆ‰์‹œ ์ข‹์€ ๊ฒƒ์„ ๋ณด์ง€ ๋ชปํ•˜๋”๋ผ๋„. do catch ?

do ์€ IMO์— ๊ฐ€๊นŒ์šด ๊ฒƒ์ฒ˜๋Ÿผ ๋ณด์ด๋Š” ์œ ์ผํ•œ ๊ฒƒ์ž…๋‹ˆ๋‹ค. do ์ ‘๋‘์‚ฌ๊ฐ€์žˆ๋Š” ํ‚ค์›Œ๋“œ ์ˆ˜ํ”„๋Š” ์–ธ์–ด์˜ ๋‹ค๋ฅธ ๋ถ€๋ถ„๊ณผ ๋น„์Šทํ•˜์ง€ ์•Š์€ ์•ฝ๊ฐ„ ๋ถˆ๊ทœ์น™ํ•œ๊ฐ€์š”? while let ๋„ ํ‚ค์›Œ๋“œ ์ˆ˜ํ”„์ž…๋‹ˆ๊นŒ? ์ต์ˆ™ํ•ด์ง€๋ฉด ์ด์ œ ๊ดœ์ฐฎ๋‹ค๊ณ  ๋Š๊ปด์ง‘๋‹ˆ๋‹ค.

? ์‚ฌ์šฉ์„์œ„ํ•œ ํฌํŠธ try! ?

? try! ๋Œ€์‹  Result ๋ฐ˜ํ™˜ ๊ฒฝ๋กœ๋ฅผ ์–ป์œผ๋ ค๋Š” ์‚ฌ์šฉ ์‚ฌ๋ก€๋ฅผ ํ—ˆ์šฉํ•ฉ๋‹ˆ๋‹ค. try! ํ•˜๋ฉด ๋งค์šฐ ๊ฐ„๋‹จํ•ฉ๋‹ˆ๋‹ค. ํŒŒ์ผ ์‹œ์ž‘ ๋ถ€๋ถ„ (๋˜๋Š” lib / main.rs)์—์„œ ๋งคํฌ๋กœ๋ฅผ ์žฌ์ •์˜ํ•˜๊ธฐ ๋งŒํ•˜๋ฉด๋ฉ๋‹ˆ๋‹ค.

macro_rules! try {
    ($expr:expr) => (match $expr {
        Result::Ok(val) => val,
        Result::Err(err) => {
            panic!("Error occured: {:?}", err)
        }
    })
}

Result ๋ฐ˜ํ™˜ ๊ฒฝ๋กœ์—์„œ try! ์˜ ์ฒซ ๋ฒˆ์งธ ๋ฐœ์ƒ๋ถ€ํ„ฐ ํŒจ๋‹‰ ์Šคํƒ ์ถ”์ ์ด ๋ฐœ์ƒํ•ฉ๋‹ˆ๋‹ค. ๋‹น์‹ ์ด ํ•  ๊ฒฝ์šฐ ์‚ฌ์‹ค, try!(Err(sth)) ๋Œ€์‹ ์˜ ์˜ค๋ฅ˜ ๋ฐœ๊ฒฌํ•˜๋Š” ๊ฒฝ์šฐ return Err(sth) , ๋‹น์‹ ๋„ ์ „์ฒด ์Šคํƒ ์ถ”์ ์„ ์–ป์„.

๊ทธ๋Ÿฌ๋‚˜ ๊ทธ ํŠธ๋ฆญ์„ ๊ตฌํ˜„ํ•˜์ง€ ์•Š์€ ์‚ฌ๋žŒ๋“ค์ด ์ž‘์„ฑํ•œ ์™ธ๋ถ€ ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ๋ฅผ ๋””๋ฒ„๊น… ํ•  ๋•Œ๋Š” ์ฒด์ธ์˜ ์–ด๋”˜๊ฐ€์—์„œ try! ์‚ฌ์šฉ์— ์˜์กดํ•ฉ๋‹ˆ๋‹ค. ์ด์ œ ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ๊ฐ€ ํ•˜๋“œ ์ฝ”๋”ฉ ๋œ ๋™์ž‘์œผ๋กœ ? ์—ฐ์‚ฐ์ž๋ฅผ ์‚ฌ์šฉํ•˜๋ฉด ์Šคํƒ ์ถ”์ ์„ ์–ป๋Š” ๊ฒƒ์ด ๊ฑฐ์˜ ๋ถˆ๊ฐ€๋Šฅํ•ฉ๋‹ˆ๋‹ค.

try! ์žฌ์ •์˜๊ฐ€ ? ์—ฐ์‚ฐ์ž์—๋„ ์˜ํ–ฅ์„ ๋ฏธ์น˜๋ฉด ๋ฉ‹์งˆ ๊ฒƒ์ž…๋‹ˆ๋‹ค.

๋‚˜์ค‘์— ๋งคํฌ๋กœ ์‹œ์Šคํ…œ์— ๋” ๋งŽ์€ ๊ธฐ๋Šฅ์ด ์ถ”๊ฐ€๋˜๋ฉด ๋‹นํ™ฉ ํ•  ์ˆ˜๋„ ์žˆ์Šต๋‹ˆ๋‹ค! ํŠน์ • ์œ ํ˜•์—๋งŒ ํ•ด๋‹น๋ฉ๋‹ˆ๋‹ค.

์ด ์ œ์•ˆ์— RFC๊ฐ€ ํ•„์š”ํ•œ ๊ฒฝ์šฐ ์•Œ๋ ค ์ฃผ์‹œ๊ธฐ ๋ฐ”๋ž๋‹ˆ๋‹ค.

์ด์ƒ์ ์œผ๋กœ ? ๋งŒ์ด ์•„๋‹ˆ๋ผ ๋Œ€์ฒด ํ•  ์ˆ˜์žˆ๋Š” ๋Šฅ๋ ฅ์— ์˜์กดํ•˜์ง€ ์•Š๊ณ , ์ง์ ‘ ์Šคํƒ ์ถ”์  ์ง€์›์„ ์ œ๊ณตํ•˜๋„๋ก ํ™•์žฅ ํ•  ์ˆ˜ try! . ๊ทธ๋Ÿฌ๋ฉด ๋ชจ๋“  ๊ณณ์—์„œ ์ž‘๋™ํ•ฉ๋‹ˆ๋‹ค.

์Šคํƒ ์ถ”์ ์€ ํ•˜๋‚˜์˜ ์˜ˆ์ผ๋ฟ์ž…๋‹ˆ๋‹ค (๋งค์šฐ ์œ ์šฉํ•œ ๊ฒƒ์œผ๋กœ ๋ณด์ด์ง€๋งŒ).
Carrier ํŠน์„ฑ์ด ์ž‘๋™ํ•˜๋„๋ก ๋งŒ๋“ค์–ด์ง€๋ฉด ๊ทธ๋Ÿฌํ•œ ํ™•์žฅ์„ ํฌํ•จ ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๊นŒ?

2016 ๋…„ 2 ์›” 7 ์ผ ์ผ์š”์ผ ์˜คํ›„ 4:14, Russell Johnston [email protected]
์ผ๋‹ค :

์ด์ƒ์ ์œผ๋กœ? ์Šคํƒ ์ถ”์  ์ง€์›์„ ์ง์ ‘ ์ œ๊ณตํ•˜๋„๋ก ํ™•์žฅ ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.
try!๋ฅผ ์žฌ์ •์˜ํ•˜๋Š” ๊ธฐ๋Šฅ์— ์˜์กดํ•˜์ง€ ์•Š๊ณ  ๊ทธ๋Ÿฐ ๋‹ค์Œ ์ž‘๋™ํ•ฉ๋‹ˆ๋‹ค
์–ด๋””์—๋‚˜.

โ€”
์ด ์ด๋ฉ”์ผ์— ์ง์ ‘ ๋‹ต์žฅํ•˜๊ฑฐ๋‚˜ GitHub์—์„œ ํ™•์ธํ•˜์„ธ์š”.
https://github.com/rust-lang/rust/issues/31436#issuecomment -181118499.

์ถ”์ธกํ•˜๊ณ  ์‹ถ์ง€๋Š” ์•Š์ง€๋งŒ ๋ช‡ ๊ฐ€์ง€ ๋ฌธ์ œ๊ฐ€ ์žˆ์ง€๋งŒ ์ž‘๋™ ํ•  ์ˆ˜ ์žˆ๋‹ค๊ณ  ์ƒ๊ฐํ•ฉ๋‹ˆ๋‹ค.

Result<V,E> ๊ฐ’์„ ๋ฐ˜ํ™˜ํ•˜๋Š” ์ฝ”๋“œ๊ฐ€์žˆ๋Š” ์ผ๋ฐ˜์ ์ธ ๊ฒฝ์šฐ๋ฅผ ๊ณ ๋ คํ•˜์‹ญ์‹œ์˜ค. ์ด์ œ Carrier ํŠน์„ฑ์˜ ์—ฌ๋Ÿฌ ๊ตฌํ˜„์ด ๊ณต์กด ํ•  ์ˆ˜ ์žˆ๋„๋กํ•ด์•ผํ•ฉ๋‹ˆ๋‹ค. E0119 ๋กœ ์‹คํ–‰๋˜์ง€ ์•Š์œผ๋ ค๋ฉด ๋ชจ๋“  ๊ตฌํ˜„์„ ๋ฒ”์œ„๋ฅผ ? ์—ฐ์‚ฐ์ž๋ฅผ ์‚ฌ์šฉํ•  ๋•Œ ์‚ฌ์šฉ์ž๋Š” ์›ํ•˜๋Š” ํ•ญ๋ชฉ์„ ๊ฐ€์ ธ์™€์•ผํ•ฉ๋‹ˆ๋‹ค. ์ดํ–‰.

์ด๋ฅผ ์œ„ํ•ด์„œ๋Š” ๋””๋ฒ„๊ทธ๋ฅผ ์›ํ•˜์ง€ ์•Š๋Š” ์‚ฌ๋žŒ์ด๋ผ๋„ ? ์‚ฌ์šฉํ•  ๋•Œ ์›ํ•˜๋Š” ํŠน์„ฑ ๊ตฌํ˜„์„ ๊ฐ€์ ธ์™€์•ผํ•˜๋ฉฐ ๋ฏธ๋ฆฌ ์ •์˜ ๋œ ๊ธฐ๋ณธ๊ฐ’์— ๋Œ€ํ•œ ์˜ต์…˜์ด ์—†์Šต๋‹ˆ๋‹ค.

๋ชจ๋“  ์œ ํ˜•์ด ๊ฒฝ๊ณ„๋ฅผ ๋ฒ—์–ด๋‚œ Result<V,E> ๋Œ€ํ•ด ์‚ฌ์šฉ์ž ์ •์˜ Carrier ๊ตฌํ˜„์„ ์ˆ˜ํ–‰ํ•˜๋ ค๋Š” ๊ฒฝ์šฐ E0117 ๋„ ๋ฌธ์ œ๊ฐ€ ๋  ์ˆ˜ ์žˆ์œผ๋ฏ€๋กœ libstd๋Š” ์ด๋ฏธ Carrier ์˜ ๊ตฌํ˜„ ์„ธํŠธ๋ฅผ ์ œ๊ณตํ•ด์•ผํ•ฉ๋‹ˆ๋‹ค. ๊ฐ€์žฅ ๋งŽ์ด ์‚ฌ์šฉ๋˜๋Š” ์‚ฌ์šฉ ์‚ฌ๋ก€์˜ panic! ๊ตฌํ˜„ ๋“ฑ).

๋งคํฌ๋กœ๋ฅผ ํ†ตํ•ด ์žฌ์ •์˜ ํ•  ์ˆ˜์žˆ๋Š” ๊ฐ€๋Šฅ์„ฑ์€ ์›๋ž˜ ๊ตฌํ˜„ ์ž์— ๋Œ€ํ•œ ์ถ”๊ฐ€ ๋ถ€๋‹ด์—†์ด ๋” ํฐ ์œ ์—ฐ์„ฑ์„ ์ œ๊ณตํ•ฉ๋‹ˆ๋‹ค (์›ํ•˜๋Š” ๊ตฌํ˜„์„ ๊ฐ€์ ธ์˜ฌ ํ•„์š”๊ฐ€ ์—†์Œ). ํ•˜์ง€๋งŒ Rust์—๋Š” ์ด์ „์— ๋งคํฌ๋กœ ๊ธฐ๋ฐ˜ ์—ฐ์‚ฐ์ž๊ฐ€ ์—†์—ˆ์œผ๋ฉฐ, catch { ... } ๊ฐ€ ์ž‘๋™ํ•ด์•ผํ•˜๋Š” ๊ฒฝ์šฐ ๋งคํฌ๋กœ๋ฅผ ํ†ตํ•ด ? ๋ฅผ ๊ตฌํ˜„ํ•˜๋Š” ๊ฒƒ์ด ๋ถˆ๊ฐ€๋Šฅํ•˜๋‹ค๋Š” ๊ฒƒ์„ ์•Œ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. return_to_catch , throw , RFC 243์—์„œ ์‚ฌ์šฉ๋˜๋Š”๋Œ€๋กœ ๋งค๊ฐœ ๋ณ€์ˆ˜๋กœ break ๋ ˆ์ด๋ธ”์ด ์ง€์ •๋จ).

Err ๋ฐ˜ํ™˜ ๊ฒฝ๋กœ๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ Result ์Šคํƒ ํŠธ๋ ˆ์ด์Šค๋ฅผ ์–ป์„ ์ˆ˜์žˆ๋Š” ์„ค์ •์€ ๊ดœ์ฐฎ์Šต๋‹ˆ๋‹ค. ํŒŒ์ผ ์ƒ๋‹จ์—์„œ ๋งค์šฐ ์ ์€ ์–‘์˜ ์ฝ”๋“œ ๋งŒ ์ˆ˜์ •ํ•˜๋ฉด๋ฉ๋‹ˆ๋‹ค. ๋˜ํ•œ์ด ์†”๋ฃจ์…˜์€ Err ์œ ํ˜•์ด ๊ตฌํ˜„๋˜๋Š” ๋ฐฉ๋ฒ• ๋ฐ ์œ„์น˜์™€ ๋ฌด๊ด€ํ•˜๊ฒŒ ์ž‘๋™ํ•ด์•ผํ•ฉ๋‹ˆ๋‹ค.

์ž์ „๊ฑฐ ํ˜๋ฆฌ๊ธฐ์— ์ฐจ์ž„ : catch in { ... } ์€ ๊ฝค ๋ฉ‹์ง€๊ฒŒ ํ๋ฆ…๋‹ˆ๋‹ค.

catch! { ... } ์€ ๋˜ ๋‹ค๋ฅธ backcompat ์„ ํƒ์ž…๋‹ˆ๋‹ค.

๋˜ํ•œ ์ด๊ฒƒ์ด ๋ณ€๊ฒฝ ๋  ๊ฒƒ์œผ๋กœ ๊ธฐ๋Œ€ํ•˜์ง€๋Š” ์•Š์ง€๋งŒ, ์œ ํ˜• ์ง€์ •์ด $i:ident : $t:ty ๊นจ๋Š” ๊ฒƒ๊ณผ ๊ฐ™์€ ๋ฐฉ์‹์œผ๋กœ $i:ident ? ๋ฐ›์•„๋“ค์ด๋Š” ๋‹ค์ค‘ ์•” ๋งคํฌ๋กœ๋ฅผ ๊นจ๋œจ๋ฆด ๊ฒƒ์ด๋ผ๋Š” ์ ์— ์œ ์˜ํ•˜์„ธ์š”.

์ด์ „ ๋ฒ„์ „๊ณผ์˜ ํ˜ธํ™˜์„ฑ์„ ๊ณผ๋„ํ•˜๊ฒŒ ์‚ฌ์šฉํ•˜์ง€ ๋ง๊ณ  { ๋‹ค์Œ์— catch ๋ฅผ ์ฒ˜๋ฆฌํ•˜์‹ญ์‹œ์˜ค (์•„๋งˆ๋„ ํ‘œํ˜„์‹ ์œ„์น˜์—์„œ๋งŒ ๊ฐ€๋Šฅํ•˜์ง€๋งŒ ํ˜ธํ™˜์„ฑ ์ธก๋ฉด์—์„œ ๋งŽ์ด ๋ณ€๊ฒฝ๋˜๋Š”์ง€ ํ™•์‹คํ•˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค).

๋˜ํ•œ ๊ตฌ์กฐ์ฒด ๋ฆฌํ„ฐ๋Ÿด์„ ํฌํ•จํ•˜์ง€ ์•Š๋Š” ๋ช‡ ๊ฐ€์ง€ ๊ฐ€๋Šฅํ•œ ๋ฌธ์ œ๋ฅผ ์ƒ์ƒํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค (์˜ˆ : let catch = true; if catch {} ); ๊ทธ๋Ÿฌ๋‚˜ ๋‚˜๋Š” ์ถ”์•…ํ•œ ๊ตฌ๋ฌธ๋ณด๋‹ค ์‚ฌ์†Œํ•œ ๋ณ€๊ฒฝ์„ ์„ ํ˜ธํ•ฉ๋‹ˆ๋‹ค.

์–ด์จŒ๋“  ์ƒˆ ํ‚ค์›Œ๋“œ๋ฅผ ์ถ”๊ฐ€ํ•˜๋Š” ๋ฐ ํ•„์š”ํ•œ ๊ฒƒ์ด ์—†์Šต๋‹ˆ๊นŒ? ์ƒˆ๋กœ์šด ๊ตฌ๋ฌธ์— ๋Œ€ํ•ด ์ผ์ข…์˜ from __future__ ์˜ตํŠธ ์ธ์„ ์ œ๊ณต ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ๋˜๋Š” ๋ช…๋ น ์ค„ / Cargo.toml์—์„œ rust ์–ธ์–ด ๋ฒ„์ „ ๋ฒˆํ˜ธ๋ฅผ ์ง€์ •ํ•˜์‹ญ์‹œ์˜ค.
์žฅ๊ธฐ์ ์œผ๋กœ๋Š” ์ด๋ฏธ ์˜ˆ์•ฝ ๋œ ํ‚ค์›Œ๋“œ๋กœ๋งŒ ์ž‘์—… ํ•  ์ˆ˜ ์žˆ์„์ง€ ์˜์‹ฌ ์Šค๋Ÿฝ์Šต๋‹ˆ๋‹ค. ๋ฌธ๋งฅ์— ๋”ฐ๋ผ ํ‚ค์›Œ๋“œ๊ฐ€ ๊ฐ๊ฐ ์„ธ ๊ฐ€์ง€ ๋‹ค๋ฅธ ์˜๋ฏธ๋ฅผ ๊ฐ–๊ธฐ๋ฅผ ์›ํ•˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค.

๋‚˜๋Š” ๋™์˜ํ•œ๋‹ค. ์ด๊ฒƒ์€ ์ด๊ฒƒ์ด ๋‚˜์˜จ ์ฒซ ๋ฒˆ์งธ RFC๋„ ์•„๋‹™๋‹ˆ๋‹ค (https://github.com/rust-lang/rfcs/pull/1444๊ฐ€ ๋˜ ๋‹ค๋ฅธ ์˜ˆ์ž…๋‹ˆ๋‹ค). ๋‚˜๋Š” ๊ทธ๊ฒƒ์ด ๋งˆ์ง€๋ง‰์ด ์•„๋‹ ๊ฒƒ์œผ๋กœ ์˜ˆ์ƒํ•ฉ๋‹ˆ๋‹ค. (๋˜ํ•œ https://github.com/rust-lang/rfcs/pull/1210์˜ default , ์ œ๊ฐ€ โ€‹โ€‹์„ ํ˜ธํ•˜๋Š” RFC๋Š” ์•„๋‹ˆ์ง€๋งŒ) ์ถ”๊ฐ€ ํ•  ๋ฐฉ๋ฒ•์„ ์ฐพ์•„์•ผํ•œ๋‹ค๊ณ  ์ƒ๊ฐํ•ฉ๋‹ˆ๋‹ค. ์ƒˆ๋กœ์šด ๊ฒฝ์šฐ๋งˆ๋‹ค ๋ฌธ๋ฒ•์„ ์ž„์‹œ๋กœ ํ•ดํ‚นํ•˜๋Š” ๋ฐฉ๋ฒ•์„ ์•Œ์•„๋‚ด๋Š” ๋Œ€์‹  ์ •์งํ•œ ํ‚ค์›Œ๋“œ๋ฅผ ์‚ฌ์šฉํ•ฉ๋‹ˆ๋‹ค.

1.0 ์ด์ „์— ์—ฌ๋Ÿฌ ํ‚ค์›Œ๋“œ๋ฅผ ์˜ˆ์•ฝํ•˜์ง€ ์•Š์•˜๋‹ค๋Š” ์ „์ฒด ์ฃผ์žฅ์ด ์–ธ์–ด์— ์ƒˆ ํ‚ค์›Œ๋“œ๋ฅผ ์—ญ ํ˜ธํ™˜ ์ ์œผ๋กœ (์•„๋งˆ๋„ ๋ช…์‹œ ์ ์œผ๋กœ ์˜ตํŠธ ์ธํ•˜์—ฌ) ์ถ”๊ฐ€ํ•˜๋Š” ๋ฐฉ๋ฒ•์„ ํ™•์‹คํžˆ ๋„์ž… ํ•  ๊ฒƒ์ด๋ผ๋Š” ๊ฒƒ์ด ์•„๋‹ˆ ์—ˆ์Šต๋‹ˆ๊นŒ? ์ง€๊ธˆ์ด ์ข‹์€ ์‹œ๊ฐ„์ด ๋  ๊ฒƒ ๊ฐ™์Šต๋‹ˆ๋‹ค.

@japaric ์˜ˆ์ „์˜ PR์„ ๋˜ ์‚ด๋ฆฌ๊ณ  ์ด๊ฒƒ์„ ๋ฐ›์•„๋“ค์ด๋Š” ๋ฐ ๊ด€์‹ฌ์ด ์žˆ์Šต๋‹ˆ๊นŒ?

@aturon ๋‚ด ๊ตฌํ˜„์€ try!(foo) ๊ณผ ๊ฐ™์€ ๋ฐฉ์‹์œผ๋กœ foo? ๋ฅผ ๊ฐ„๋‹จํžˆ desugaredํ–ˆ์Šต๋‹ˆ๋‹ค . ๋˜ํ•œ ๋ฉ”์„œ๋“œ ๋ฐ ํ•จ์ˆ˜ ํ˜ธ์ถœ์—์„œ๋งŒ ์ž‘๋™ํ–ˆ์Šต๋‹ˆ๋‹ค. ์ฆ‰ foo.bar()? ๋ฐ baz()? ์ž‘๋™ํ•˜์ง€๋งŒ quux? ๋ฐ (quux)? ์ž‘๋™ํ•˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค. ์ดˆ๊ธฐ ๊ตฌํ˜„์—์„œ ๊ดœ์ฐฎ์„๊นŒ์š”?

@japaric ๋ฉ”์†Œ๋“œ์™€ ํ•จ์ˆ˜ ํ˜ธ์ถœ๋กœ ์ œํ•œ ํ•œ ์ด์œ ๋Š” ๋ฌด์—‡์ž…๋‹ˆ๊นŒ? ์ผ๋ฐ˜์ ์ธ ์ ‘๋ฏธ์‚ฌ ์—ฐ์‚ฐ์ž๋กœ ํŒŒ์‹ฑํ•˜๋Š” ๊ฒƒ์ด ๋” ์‰ฌ์šธ๊นŒ์š”?

๋ฉ”์„œ๋“œ์™€ ํ•จ์ˆ˜ ํ˜ธ์ถœ๋กœ ์ œํ•œ ํ•œ ์ด์œ ๋Š” ๋ฌด์—‡์ž…๋‹ˆ๊นŒ?

? ํ™•์žฅ์„ ํ…Œ์ŠคํŠธํ•˜๋Š” ๊ฐ€์žฅ ์‰ฌ์šด ๋ฐฉ๋ฒ•

์ผ๋ฐ˜์ ์ธ ์ ‘๋ฏธ์‚ฌ ์—ฐ์‚ฐ์ž๋กœ ํŒŒ์‹ฑํ•˜๋Š” ๊ฒƒ์ด ๋” ์‰ฌ์šธ๊นŒ์š”?

์•„๋งˆ

@japaric ์•„๋งˆ ์ „์ฒด ์ ‘๋ฏธ์‚ฌ ์—ฐ์‚ฐ์ž๋กœ ์ผ๋ฐ˜ํ™”ํ•˜๋Š” ๊ฒƒ์ด ์ข‹์ง€๋งŒ ( @eddyb ์ด ์ œ์•ˆํ•œ๋Œ€๋กœ) ๊ฐ„๋‹จํ•œ ํƒˆ๋‹น์œผ๋กœ ? ๋ฅผ ์„ค์ • ํ•œ ๋‹ค์Œ ๋‚˜์ค‘์— catch ๋ฅผ ์ถ”๊ฐ€ํ•˜๋Š” ๊ฒƒ์ด ์ข‹์Šต๋‹ˆ๋‹ค.

@aturon ์ข‹์•„, ์•„๋ฌด๋„ ๋‚˜๋ฅผ ์ด๊ธธ ์ˆ˜ ์—†๋‹ค๋ฉด ๋‹ค์Œ ์ฃผ๊นŒ์ง€ postfix ๋ฒ„์ „์„ ์‚ดํŽด๋ณผ ๊ฒƒ์ž…๋‹ˆ๋‹ค :-).

# 31954์—์„œ ๋‚ด PR์„ ์—…๋ฐ์ดํŠธ / ์—…๋ฐ์ดํŠธํ–ˆ์Šต๋‹ˆ๋‹ค. :-)

์Šคํƒ ์ถ”์  ์ œ๊ณต์— ๋Œ€ํ•œ ์ง€์›์€ ์–ด๋–ป์Šต๋‹ˆ๊นŒ? ๊ณ„ํš๋œ ๊ฑด๊ฐ€์š”?

๋‚˜๋Š” +1 ๋‚จ์ž๊ฐ€๋˜๋Š” ๊ฒƒ์ด ์‹ซ์ง€๋งŒ, ์Šคํƒ ํŠธ๋ ˆ์ด์Šค๋Š” ๊ณผ๊ฑฐ์— ๋‚ด ์‹œ๊ฐ„์˜ ์ข‹์€ ๋ฉ์–ด๋ฆฌ๋ฅผ ์ ˆ์•ฝํ–ˆ๋‹ค. ๋””๋ฒ„๊ทธ ๋นŒ๋“œ์—์„œ, ์˜ค๋ฅ˜ ๊ฒฝ๋กœ์— ๋„๋‹ฌํ•˜๋ฉด? ์—ฐ์‚ฐ์ž๋Š” ๊ฒฐ๊ณผ์—์„œ Vec์— ํŒŒ์ผ / ์ค„์„ ์ถ”๊ฐ€ ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๊นŒ? Vec๋„ ๋””๋ฒ„๊ทธ ์ „์šฉ ์ผ ์ˆ˜ ์žˆ์Šต๋‹ˆ๊นŒ?

๊ทธ๋ฆฌ๊ณ  ๊ทธ๊ฒƒ์€ ๋…ธ์ถœ๋˜๊ฑฐ๋‚˜ ์˜ค๋ฅ˜ ์„ค๋ช…์˜ ์ผ๋ถ€๋กœ ๋ฐ”๋€” ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

Option<Result<T, E>> ๋ฐ˜ํ™˜ํ•˜๋Š” ๋ฐ˜๋ณต๊ธฐ ๋‚ด๋ถ€์—์„œ try! / ? ์„ (๋ฅผ) ์‚ฌ์šฉํ•˜๋ ค๋Š” ์ƒํ™ฉ์ด ๊ณ„์† ๋ฐœ์ƒํ•ฉ๋‹ˆ๋‹ค. ๋ถˆํ–‰ํžˆ๋„ ํ˜„์žฌ๋Š” ์‹ค์ œ๋กœ ์ž‘๋™ํ•˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค. ์บ๋ฆฌ์–ด ํŠน์„ฑ์ด์ด๋ฅผ ์ง€์›ํ•˜๊ธฐ ์œ„ํ•ด ์˜ค๋ฒ„๋กœ๋“œ ๋  ์ˆ˜ ์žˆ๋Š”์ง€ ์•„๋‹ˆ๋ฉด๋ณด๋‹ค ์ผ๋ฐ˜์ ์ธ From ๋กœ ๋“ค์–ด๊ฐˆ ์ˆ˜ ์žˆ๋Š”์ง€ ๊ถ๊ธˆํ•ฉ๋‹ˆ๋‹ค.

@hexsel ๋‚˜๋Š” ์ •๋ง๋กœ Result<> ์œ ํ˜•์ด ๋””๋ฒ„๊ทธ์—์„œ ๋ช…๋ น์–ด ํฌ์ธํ„ฐ์˜ vec๋ฅผ ์ „๋‹ฌํ•˜๊ธฐ๋ฅผ ๋ฐ”๋ž๋‹ˆ๋‹ค. ์ถ”๊ฐ€ ํ•  ๊ฒƒ์ž…๋‹ˆ๋‹ค. ๊ทธ๋Ÿฐ ์‹์œผ๋กœ DWARF ์ •๋ณด๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ ์ฝ์„ ์ˆ˜์žˆ๋Š” ์Šคํƒ ์ถ”์ ์„ ๊ตฌ์ถ• ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

@mitsuhiko ํ•˜์ง€๋งŒ ์–ด๋–ป๊ฒŒ Result ๋ฅผ ๋งŒ๋“ค๊ณ  ํŒจํ„ด ๋งค์นญ ํ•  ์ˆ˜ ์žˆ์„๊นŒ์š”? enum atm์ž…๋‹ˆ๋‹ค.

์— ๋Œ€ํ•ด์„œ๋Š” Option ํฌ์žฅ, ๋‚˜๋Š” ๋‹น์‹ ์ด ์›ํ•˜๋Š” ์ƒ๊ฐ Some(catch {...}) .

ํ˜„์žฌ, ๋‚ด ์Šต๊ด€์ด ์ง€๊ธˆํ•˜๋Š” ๊ฒƒ์ž…๋‹ˆ๋‹ค try!(Err(bla)) ๋Œ€์‹  return Err() ๋‚ด๊ฐ€ ํ•˜๋‚˜์— ๋‚˜์ค‘์— ์‹œ๋„ ๋งคํฌ๋กœ๋ฅผ ์žฌ์ •์˜ ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค ๊ทธ๋ž˜์„œ, ๊ทธ ํŒจ๋‹‰, ๋ฐฑ ํŠธ๋ ˆ์ด์Šค๋ฅผ ์–ป๊ธฐ ์œ„ํ•ด์„œ์ด๋‹ค. ๊ทธ๊ฒƒ์€ ๋‚˜์—๊ฒŒ ์ž˜ ์ž‘๋™ํ•˜์ง€๋งŒ ๋‚ด๊ฐ€ ๋‹ค๋ฃจ๋Š” ์ฝ”๋“œ๋Š” ๋งค์šฐ ๋‚ฎ์€ ์ˆ˜์ค€์ด๋ฉฐ ๋Œ€๋ถ€๋ถ„ ์˜ค๋ฅ˜๊ฐ€ ๋ฐœ์ƒํ•ฉ๋‹ˆ๋‹ค. Result ๋ฅผ ๋ฐ˜ํ™˜ํ•˜๋Š” ์™ธ๋ถ€ ์ฝ”๋“œ๋ฅผ ์‚ฌ์šฉํ•˜๋Š” ๊ฒฝ์šฐ ์—ฌ์ „ํžˆ ? ๋ฅผ ํ”ผํ•ด์•ผํ•ฉ๋‹ˆ๋‹ค.

@eddyb ๋‹ค๋ฅธ ๋ฐฉ๋ฒ•์œผ๋กœ ์กฐ์ž‘ํ•ด์•ผํ•˜๋Š” ๊ฒƒ ์™ธ์—๋„ ์ˆจ๊ฒจ์ง„ ๊ฐ’์„ ์ „๋‹ฌํ•˜๋ ค๋ฉด ์–ธ์–ด ์ง€์›์ด ํ•„์š”ํ•ฉ๋‹ˆ๋‹ค. ๋‹ค๋ฅธ ๋ฐฉ๋ฒ•์œผ๋กœ ํ•  ์ˆ˜ ์žˆ์„์ง€ ๊ถ๊ธˆํ–ˆ๋Š”๋ฐ ์–ด๋–ป๊ฒŒ๋˜๋Š”์ง€ ๋ชจ๋ฅด๊ฒ ์–ด์š”. ์œ ์ผํ•œ ๋‹ค๋ฅธ ๋ฐฉ๋ฒ•์€ ์ถ”๊ฐ€ ๋ฐ์ดํ„ฐ๋ฅผ ํฌํ•จ ํ•  ์ˆ˜์žˆ๋Š” ํ‘œ์ค€ํ™” ๋œ ์˜ค๋ฅ˜ ์ƒ์ž ์˜€์„ ๊ฒƒ์ž…๋‹ˆ๋‹ค. ๊ทธ๋Ÿฌ๋‚˜ ์ƒ์ž ์˜ค๋ฅ˜๊ฐ€์žˆ์„ ํ•„์š”๊ฐ€ ์—†์œผ๋ฉฐ ๋Œ€๋ถ€๋ถ„์˜ ์‚ฌ๋žŒ๋“ค์ด์ด๋ฅผ ์ˆ˜ํ–‰ํ•˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค.

@mitsuhiko Error ํŠธ๋ ˆ์ด ํŠธ์™€ TLS์— ๋Œ€ํ•œ ์ƒˆ๋กœ์šด (๊ธฐ๋ณธ) ๋ฉ”์„œ๋“œ๋ฅผ ์ƒ๊ฐํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.
ํ›„์ž๋Š” ๋•Œ๋•Œ๋กœ ์‚ด๊ท ์ œ์— ์˜ํ•ด ์‚ฌ์šฉ๋ฉ๋‹ˆ๋‹ค.

@eddyb ๋Š” ๊ฒฐ๊ณผ๋ฅผ ์‹๋ณ„ ํ•  ์ˆ˜ ์žˆ๊ณ  ์ƒ์ž์—

@mitsuhiko TLS? ์‹ค์ œ๋กœ๋Š” ๊ฐ’๋ณ„๋กœ ์˜ค๋ฅ˜๋ฅผ ๋น„๊ตํ•  ์ˆ˜ ์žˆ์–ด์•ผํ•ฉ๋‹ˆ๋‹ค.

๋˜๋Š” ์œ ํ˜•๋ณ„๋กœ ( From ์ž…๋ ฅ ๋ฐ ์ถœ๋ ฅ ์—ฐ๊ฒฐ ํฌํ•จ) ์Šคํƒ ์ถ”์ ์„ ์›ํ•˜๋Š” ๋™์‹œ ์˜ค๋ฅ˜ ์ˆ˜๋ฅผ ๋™์‹œ์— ์ „ํŒŒํ•ด์•ผํ•˜๋Š” ๊ฒฝ์šฐ๊ฐ€ ์žˆ์Šต๋‹ˆ๊นŒ?

๋” ๊ฐ„๋‹จํ•œ ์†”๋ฃจ์…˜์ด ์ž‘๋™ ํ•  ๋•Œ ๊ฐœ์ธ์ ์œผ๋กœ Result -ํŠน์ • ์ปดํŒŒ์ผ๋Ÿฌ ํ•ดํ‚น์„ ์ถ”๊ฐ€ํ•˜๋Š” ๊ฒƒ์— ๋ฐ˜๋Œ€ํ•ฉ๋‹ˆ๋‹ค.

@eddyb ์˜ค๋ฅ˜๊ฐ€ ์Šคํƒ ์œ„๋กœ ์ „๋‹ฌ๋ฉ๋‹ˆ๋‹ค. ๋‹น์‹ ์ด ์›ํ•˜๋Š” ๊ฒƒ์€ ๊ทธ๊ฒƒ์ด ์‹œ์ž‘๋˜๋Š” ๊ณณ๋ฟ๋งŒ ์•„๋‹ˆ๋ผ ๋ชจ๋“  ์Šคํƒ ์ˆ˜์ค€์˜ EIP์ž…๋‹ˆ๋‹ค. ๋˜ํ•œ ์˜ค๋ฅ˜๋Š” a) ํ˜„์žฌ ๋น„๊ตํ•  ์ˆ˜ ์—†์œผ๋ฉฐ b) ๋™์ผํ•˜๊ฒŒ ๋น„๊ตํ•œ๋‹ค๊ณ ํ•ด์„œ ๋™์ผํ•œ ์˜ค๋ฅ˜๋ผ๋Š” ์˜๋ฏธ๋Š” ์•„๋‹™๋‹ˆ๋‹ค.

์Šคํƒ ์ถ”์ ์„ ์›ํ•˜๋Š” ๋™์‹œ ์˜ค๋ฅ˜ ์ˆ˜๋ฅผ ๋™์‹œ์— ์ „ํŒŒํ•ด์•ผํ•ฉ๋‹ˆ๋‹ค.

๋ชจ๋“  ์˜ค๋ฅ˜๊ฐ€ ํฌ์ฐฉ๋˜์–ด ๋‹ค๋ฅธ ์˜ค๋ฅ˜๋กœ ๋‹ค์‹œ ๋ฐœ์ƒํ•ฉ๋‹ˆ๋‹ค.

๋” ๊ฐ„๋‹จํ•œ ์†”๋ฃจ์…˜์ด ์ž‘๋™ ํ•  ๋•Œ ๊ฐœ์ธ์ ์œผ๋กœ ๊ฒฐ๊ณผ ๋ณ„ ์ปดํŒŒ์ผ๋Ÿฌ ํ•ดํ‚น์„ ์ถ”๊ฐ€ํ•˜๋Š” ๊ฒƒ์— ๋ฐ˜๋Œ€ํ•ฉ๋‹ˆ๋‹ค.

๋” ๊ฐ„๋‹จํ•œ ์†”๋ฃจ์…˜์ด ์–ด๋–ป๊ฒŒ ์ž‘๋™ํ•˜๋Š”์ง€ ์•Œ ์ˆ˜ ์—†์ง€๋งŒ ๊ฑฐ๊ธฐ์— ๋ญ”๊ฐ€ ๋น ์กŒ์„ ์ˆ˜๋„ ์žˆ์Šต๋‹ˆ๋‹ค.

? ๋งˆ๋‹ค ๋ช…๋ น ํฌ์ธํ„ฐ๋ฅผ ์ €์žฅํ•˜๊ณ  ์˜ค๋ฅ˜ ์œ ํ˜•๊ณผ ์—ฐ๊ด€์‹œํ‚ฌ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.
"๋ชจ๋“  ์˜ค๋ฅ˜๊ฐ€ ํฌ์ฐฉ๋˜์–ด ๋‹ค๋ฅธ ์˜ค๋ฅ˜๋กœ ๋‹ค์‹œ ๋ฐœ์ƒํ•ฉ๋‹ˆ๋‹ค." ํ•˜์ง€๋งŒ Result ์— ์ˆจ๊ฒจ์ง„ ์ •๋ณด๋Š” ์–ด๋–ป๊ฒŒ ๋ณด์กดํ• ๊นŒ์š”?

ํ•˜์ง€๋งŒ ๊ฒฐ๊ณผ์— ์ˆจ๊ฒจ์ง„ ์ •๋ณด๋Š” ์–ด๋–ป๊ฒŒ ๋ณด์กดํ• ๊นŒ์š”?

๊ฒฐ๊ณผ์— ํ•ด๋‹น ์ •๋ณด๋ฅผ ์ €์žฅํ•  ํ•„์š”๊ฐ€ ์—†์Šต๋‹ˆ๋‹ค. ์ €์žฅํ•ด์•ผํ•˜๋Š” ๊ฒƒ์€ ์‹คํŒจ์˜ ์›์ธ์— ๋Œ€ํ•œ ๊ณ ์œ  ID์ด๋ฏ€๋กœ ์ƒ๊ด€ ๊ด€๊ณ„๋ฅผ ๋ถ„์„ ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ๊ทธ๋ฆฌ๊ณ  ์˜ค๋ฅ˜ ํŠน์„ฑ์€ ํŠน์„ฑ ์ผ ๋ฟ์ด๋ฉฐ ์ €์žฅ ๊ณต๊ฐ„์ด ์—†๊ธฐ ๋•Œ๋ฌธ์— ๋Œ€์‹  ๊ฒฐ๊ณผ์— ์ €์žฅํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ๋ช…๋ น์–ด ํฌ์ธํ„ฐ vec ์ž์ฒด๋Š” ๊ฒฐ๊ณผ์— ์ €์žฅ ๋  ํ•„์š”๊ฐ€ ์—†์œผ๋ฉฐ TLS๋กœ ์ด๋™ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

ํ•œ ๊ฐ€์ง€ ๋ฐฉ๋ฒ•์€ ๊ฒฐ๊ณผ์— ๋Œ€ํ•ด failure_id(&self) ๋ฉ”์„œ๋“œ๋ฅผ ํ˜ธ์ถœํ•˜๊ณ  i64 / uuid ๋˜๋Š” ์‹คํŒจ์˜ ์›์ธ์„ ์‹๋ณ„ํ•˜๋Š” ๋ฌด์–ธ๊ฐ€๋ฅผ ๋ฐ˜ํ™˜ํ•˜๋Š” ๊ฒƒ์ž…๋‹ˆ๋‹ค.

๊ฒฐ๊ณผ๊ฐ€ ์Šคํƒ์„ ํ†ตํ•ด ์œ„์ชฝ์œผ๋กœ ์ „๋‹ฌ ๋  ๋•Œ ์ปดํŒŒ์ผ๋Ÿฌ๊ฐ€ ํ†ต๊ณผํ•˜๋Š” ์Šคํƒ ํ”„๋ ˆ์ž„์„ ๊ธฐ๋กํ•˜๋Š” ๋ช…๋ น์–ด๋ฅผ ์ฃผ์ž…ํ•˜๊ธฐ ๋•Œ๋ฌธ์— ํ•„์š”ํ•œ ๊ฒƒ์ด ๋ฌด์—‡์ด๋“  ์ƒ๊ด€์—†์ด ์–ธ์–ด ์ง€์›์ด ํ•„์š”ํ•ฉ๋‹ˆ๋‹ค. ๋”ฐ๋ผ์„œ ๊ฒฐ๊ณผ์˜ ๋ฐ˜ํ™˜์€ ๋””๋ฒ„๊ทธ ๋นŒ๋“œ์—์„œ ๋‹ค๋ฅด๊ฒŒ ๋ณด์ผ ๊ฒƒ์ž…๋‹ˆ๋‹ค.

"์ปดํŒŒ์ผ๋Ÿฌ๊ฐ€ ์Šคํƒ ํ”„๋ ˆ์ž„์„ ๊ธฐ๋กํ•˜๋Š” ๋ช…๋ น์–ด๋ฅผ ์‚ฝ์ž…ํ•ฉ๋‹ˆ๋‹ค."-ํ•˜์ง€๋งŒ ? ๋Š” ๋ช…์‹œ ์ ์ž…๋‹ˆ๋‹ค. ์˜ˆ์™ธ์™€๋Š” ๋‹ค๋ฆ…๋‹ˆ๋‹ค. ์•„๋‹ˆ๋ฉด ํ†ต๊ณผ ํ•œ ? ๋งŒ ๊ธฐ๋กํ•˜๋Š” ๊ฒƒ์„ ์ข‹์•„ํ•˜์ง€ ์•Š์Šต๋‹ˆ๊นŒ?

์–ด์จŒ๋“  ์ˆ˜๋™์œผ๋กœ ์˜ค๋ฅ˜์˜ ์••์ถ•์„ ํ’€๊ณ  Err ๋‹ค์‹œ ๋„ฃ์œผ๋ฉด ํ•ด๋‹น ID๊ฐ€ ์–ด๋–ป๊ฒŒ ์œ ์ง€๋ฉ๋‹ˆ๊นŒ?

"์˜ค๋ฅ˜ ํŠน์„ฑ์€ ํŠน์„ฑ ์ผ ๋ฟ์ด๋ฉฐ ์ €์žฅ ๊ณต๊ฐ„์ด ์—†๊ธฐ ๋•Œ๋ฌธ์— ๋Œ€์‹  ๊ฒฐ๊ณผ์— ์ €์žฅํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค."
์ด์— ๋Œ€ํ•œ ๋ณ€ํ˜•์ด ์žˆ์Šต๋‹ˆ๋‹ค. Error ํŠน์„ฑ์„ ๊ตฌํ˜„ํ•˜๋Š” ๊ฒƒ์€ ์ปดํŒŒ์ผ๋Ÿฌ์—์„œ ํŠน์ˆ˜ํ•œ ๊ฒฝ์šฐ์— ๋”ฐ๋ผ ์œ ํ˜•์— ์ •์ˆ˜ ํ•„๋“œ๋ฅผ ์ถ”๊ฐ€ํ•˜๊ณ  ์œ ํ˜•์„ ์ƒ์„ฑํ•˜๋ฉด ID๊ฐ€ ์ƒ์„ฑ ๋˜๊ณ  ๋ณต์‚ฌ / ์‚ญ์ œ๊ฐ€ ์ˆ˜ํ–‰๋ฉ๋‹ˆ๋‹ค. refcount๋ฅผ ํšจ๊ณผ์ ์œผ๋กœ ์ฆ๊ฐ€ / ๊ฐ์†Œ์‹œํ‚ต๋‹ˆ๋‹ค (๊ทธ๋ฆฌ๊ณ  ๊ฒฐ๊ตญ Result::unwrap ๊ฐ€ ์‚ฌ์šฉ๋˜์ง€ ์•Š๋Š” ๊ฒฝ์šฐ TLS "in-flight error set"์—์„œ์ด๋ฅผ ์ง€ ์›๋‹ˆ๋‹ค).

๊ทธ๋Ÿฌ๋‚˜ ๊ทธ๊ฒƒ์€ Copy ํŠน์„ฑ๊ณผ ์ถฉ๋Œํ•ฉ๋‹ˆ๋‹ค. ๊ท€ํ•˜์˜ ๊ณ„ํš๋„ ? ๋˜๋Š” ๊ธฐํƒ€ ํŠน์ • ์‚ฌ์šฉ์ž ์ž‘์—…์— ์˜ํ•ด ํŠธ๋ฆฌ๊ฑฐ๋˜์ง€ _ ์•Š๋Š” _ Result ํŠน๋ณ„ํ•œ ๋™์ž‘์„ ์ถ”๊ฐ€ํ•˜๋ฉด Copy ๋ถˆ๋ณ€์„ฑ์ด ๋ฌดํšจํ™” ๋  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

ํŽธ์ง‘ :์ด ์‹œ์ ์—์„œ Rc<ErrorTrace> ๋ฅผ ๊ฑฐ๊ธฐ์— ํฌํ•จ์‹œํ‚ฌ ์ˆ˜๋„ ์žˆ์Šต๋‹ˆ๋‹ค.
EDIT2 : ๋‚ด๊ฐ€ ๋งํ•˜๋Š” ๊ฒƒ์€ catch ์—์„œ ๊ด€๋ จ ์˜ค๋ฅ˜ ์ถ”์ ์„ ์ง€์šธ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.
EDIT3 : ์‹ค์ œ๋กœ ๋“œ๋กญ์‹œ ๋” ๋‚˜์€ ์„ค๋ช…์„ ์ฐธ์กฐํ•˜์‹ญ์‹œ์˜ค.

"์ปดํŒŒ์ผ๋Ÿฌ๋Š” ์ž์‹ ์ด ํ†ต๊ณผํ•˜๋Š” ์Šคํƒ ํ”„๋ ˆ์ž„์„ ๊ธฐ๋กํ•˜๋Š” ๋ช…๋ น์„ ์ฃผ์ž…ํ•ฉ๋‹ˆ๋‹ค"-ํ•˜์ง€๋งŒ? ๋ช…์‹œ ์ ์ž…๋‹ˆ๋‹ค. ์ด๊ฒƒ์€ ์˜ˆ์™ธ์™€ ๊ฐ™์ง€ ์•Š์Šต๋‹ˆ๋‹ค. ์•„๋‹ˆ๋ฉด? ํ†ต๊ณผ ํ–ˆ๋‚˜์š”?

? ์‚ฌ์šฉํ•˜์ง€ ์•Š๊ณ  ๋„˜์–ด๊ฐˆ ์ˆ˜์žˆ๋Š” ํ”„๋ ˆ์ž„์ด ๋„ˆ๋ฌด ๋งŽ๊ธฐ ๋•Œ๋ฌธ์— ์ž‘๋™ํ•˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค. ๋ชจ๋‘๊ฐ€ ? ๋งŒ์œผ๋กœ ์˜ค๋ฅ˜๋ฅผ ์ฒ˜๋ฆฌํ•˜๋Š” ๊ฒƒ์€ ์•„๋‹™๋‹ˆ๋‹ค.

์–ด์จŒ๋“  ์ˆ˜๋™์œผ๋กœ ์˜ค๋ฅ˜์˜ ์••์ถ•์„ ํ’€๊ณ  ๋‹ค์‹œ Err์— ๋„ฃ์œผ๋ฉด ๊ทธ ID๊ฐ€ ์–ด๋–ป๊ฒŒ ์œ ์ง€๋ฉ๋‹ˆ๊นŒ?

์ด๊ฒƒ์ด ์ปดํŒŒ์ผ๋Ÿฌ ์ง€์›์ด ํ•„์š”ํ•œ ์ด์œ ์ž…๋‹ˆ๋‹ค. ์ปดํŒŒ์ผ๋Ÿฌ๋Š” ๊ฒฐ๊ณผ ์ธ ์ง€์—ญ ๋ณ€์ˆ˜๋ฅผ ์ถ”์ ํ•ด์•ผํ•˜๋ฉฐ ์žฌ ๋ž˜ํ•‘์„ ์œ„ํ•ด ๊ฒฐ๊ณผ ID๋ฅผ ์•ž์œผ๋กœ ์ „ํŒŒํ•˜๋Š” ๊ฒƒ์ด ๊ฐ€์žฅ ์ข‹์Šต๋‹ˆ๋‹ค. ์ด๊ฒƒ์ด ๋„ˆ๋ฌด ๋งˆ๋ฒ•์ ์ธ ๊ฒฝ์šฐ ์ž‘์—…์˜ ํ•˜์œ„ ์ง‘ํ•ฉ์œผ๋กœ ์ œํ•œ ๋  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

? ์‚ฌ์šฉํ•˜์ง€ ์•Š๊ณ  ๋„˜์–ด๊ฐˆ ์ˆ˜์žˆ๋Š” ํ”„๋ ˆ์ž„์ด ๋„ˆ๋ฌด ๋งŽ๊ธฐ ๋•Œ๋ฌธ์— ์ž‘๋™ํ•˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค. ๋ชจ๋‘๊ฐ€ ? ๋งŒ์œผ๋กœ ์˜ค๋ฅ˜๋ฅผ ์ฒ˜๋ฆฌํ•˜๋Š” ๊ฒƒ์€ ์•„๋‹™๋‹ˆ๋‹ค.

์ข‹์Šต๋‹ˆ๋‹ค. Result ๋ฐ˜ํ™˜์€ ์—ฌ๋Ÿฌ ๋ฐ˜ํ™˜ ๊ฒฝ๋กœ๊ฐ€์žˆ๋Š” ๋ณต์žกํ•œ ํ•จ์ˆ˜์—์„œ ์ง์ ‘ ํŠน์ˆ˜ํ•œ ๊ฒฝ์šฐ๋ฅผ ๋ณผ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค (์ผ๋ถ€๋Š” ? ์ดˆ๊ธฐ ๋ฐ˜ํ™˜).

์ด๊ฒƒ์ด ๋„ˆ๋ฌด ๋งˆ๋ฒ•์ ์ธ ๊ฒฝ์šฐ ์ž‘์—…์˜ ํ•˜์œ„ ์ง‘ํ•ฉ์œผ๋กœ ์ œํ•œ ๋  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

๋˜๋Š” ์™„์ „ํžˆ ๋ช…์‹œ ์ ์œผ๋กœ ๋งŒ๋“ค์—ˆ์Šต๋‹ˆ๋‹ค. ์ปดํŒŒ์ผ๋Ÿฌ๊ฐ€ ๋งˆ์ˆ ์ฒ˜๋Ÿผ ์ถ”์ ํ•ด์•ผํ•˜๋Š” ๋น„ ? ์žฌ ๋ž˜ํ•‘์˜ ์˜ˆ๊ฐ€ ์žˆ์Šต๋‹ˆ๊นŒ?

@eddyb ์˜ค๋ฅ˜๋ฅผ ์ˆ˜๋™์œผ๋กœ ์ฒ˜๋ฆฌํ•˜๋Š” ์ผ๋ฐ˜์ ์ธ ๊ฒฝ์šฐ๋Š” ํ•˜์œ„ ์ง‘ํ•ฉ์„ ์ฒ˜๋ฆฌํ•˜๋ ค๋Š” IoError์ž…๋‹ˆ๋‹ค.

loop {
  match establish_connection() {
    Ok(conn) => { ... },
    Err(err) => {
      if err.kind() == io::ErrorKind::ConnectionRefused {
        continue;
      } else {
        return Err(err);
      }
    }
  }
}

@mitsuhiko ๊ทธ๋Ÿฌ๋ฉด ID๋ฅผ io::Error ์•ˆ์— ๋ณด๊ด€ํ•˜๋ฉด ํ™•์‹คํžˆ ์ž‘๋™ํ•ฉ๋‹ˆ๋‹ค.

์š”์•ฝํ•˜์ž๋ฉด, TLS์˜ Vec<Option<Trace>> "sparse integer map"์€ struct ErrorId(usize) ํ‚ค๊ฐ€ ์ง€์ •๋˜๊ณ  3 ๊ฐœ์˜ lang ํ•ญ๋ชฉ์œผ๋กœ ์•ก์„ธ์Šค๋ฉ๋‹ˆ๋‹ค.

  • fn trace_new(Location) -> ErrorId , ๋น„ const ์˜ค๋ฅ˜ ๊ฐ’ ์ƒ์„ฑ์‹œ
  • fn trace_return(ErrorId, Location) , _declared_ ํ•จ์ˆ˜์—์„œ -> Result<...> ๋กœ ๋ฐ˜ํ™˜ํ•˜๊ธฐ ์ง์ „ (์ฆ‰, Result ์œ ํ˜•๊ณผ ํ•จ๊ป˜ ์‚ฌ์šฉ๋˜๋Š” _happens_ ๋ฐ˜ํ™˜์‹œ ์ผ๋ฐ˜ ํ•จ์ˆ˜๊ฐ€ ์•„๋‹˜)
  • fn trace_destroy(ErrorId) , ์˜ค๋ฅ˜ ๊ฐ’์„ ์‚ญ์ œํ•  ๋•Œ

MIR์—์„œ ๋ณ€ํ™˜์ด ์ˆ˜ํ–‰๋˜๋ฉด Location ๋Š” ์˜ค๋ฅ˜ ๊ฐ’ ์ƒ์„ฑ ๋˜๋Š” Lvalue::Return ์“ฐ๊ธฐ๋ฅผ ํŠธ๋ฆฌ๊ฑฐํ•˜๋Š” ๋ช…๋ น์–ด์˜ Span ์—์„œ ๊ณ„์‚ฐ ๋  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ๋ช…๋ น ํฌ์ธํ„ฐ IMO๋ณด๋‹ค (์–ด์จŒ๋“  LLVM์—์„œ ์‰ฝ๊ฒŒ ์–ป์„ ์ˆ˜์žˆ๋Š” ๋ฐฉ๋ฒ•์€ ์—†์Šต๋‹ˆ๋‹ค. ๊ฐ ํŠน์ • ํ”Œ๋žซํผ์— ๋Œ€ํ•ด ์ธ๋ผ์ธ asm ๋ฅผ ๋‚ด ๋ณด๋‚ด์•ผํ•ฉ๋‹ˆ๋‹ค).

@eddyb

๋ฐ”์ด๋„ˆ๋ฆฌ ํฌ๊ธฐ๊ฐ€ ์ปค์ง€์ง€ ์•Š์Šต๋‹ˆ๊นŒ?

@ arielb1 ์–ด์จŒ๋“  debuginfo๊ฐ€ ๋ฐ”์ด๋„ˆ๋ฆฌ๋ฅผ ๋ถ€

@eddyb ์ด ๊ฒฝ์šฐ ์œ„์น˜๋Š” ๋ฌด์—‡์ž…๋‹ˆ๊นŒ? IP๋ฅผ ์ฝ๋Š” ๊ฒƒ์ด ์–ด๋ ค์šด ๊ฒƒ์ด ๋ฌด์—‡์ธ์ง€ ํ™•์‹คํ•˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค. ๋ฌผ๋ก , ๊ฐ ๋Œ€์ƒ์— ๋Œ€ํ•œ ์‚ฌ์šฉ์ž ์ •์˜ JS๊ฐ€ ํ•„์š”ํ•˜์ง€๋งŒ ๊ทธ๋‹ค์ง€ ์–ด๋ ค์šด ๊ฒƒ์€ ์•„๋‹™๋‹ˆ๋‹ค.

@mitsuhiko ์˜ค๋ฒ„ํ”Œ๋กœ ๊ฒ€์‚ฌ ๋ฐ ๊ธฐํƒ€ ์ปดํŒŒ์ผ๋Ÿฌ์—์„œ ๋ฐœ์ƒํ•˜๋Š” ํŒจ๋‹‰์— ์‚ฌ์šฉํ•˜๋Š” ๊ฒƒ๊ณผ ๋™์ผํ•œ ์ •๋ณด ์ผ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. core::panicking::panic ์ฐธ์กฐํ•˜์‹ญ์‹œ์˜ค.

์Šคํƒ์ด ํ’€๋ฆฌ๋Š” ๋™์•ˆ ์™œ ๊ทธ๋ ‡๊ฒŒ ๋งŽ์€ ์Šคํƒ ์ •๋ณด๋ฅผ Error / Result ์— ์••์ถ•ํ•ฉ๋‹ˆ๊นŒ? ์Šคํƒ์ด ์•„์ง์žˆ๋Š” ๋™์•ˆ ์ฝ”๋“œ๋ฅผ ์‹คํ–‰ํ•˜์ง€ ์•Š๋Š” ์ด์œ ๋Š” ๋ฌด์—‡์ž…๋‹ˆ๊นŒ? ์˜ˆ๋ฅผ ๋“ค์–ด ์Šคํƒ ๊ฒฝ๋กœ์˜ ๋ณ€์ˆ˜์— ๊ด€์‹ฌ์ด ์žˆ๋‹ค๋ฉด ์–ด๋–จ๊นŒ์š”? Err ๊ฐ€ ํ˜ธ์ถœ ๋  ๋•Œ ์‚ฌ๋žŒ๋“ค์ด ์‚ฌ์šฉ์ž ์ง€์ • ์ฝ”๋“œ๋ฅผ ์‹คํ–‰ํ•  ์ˆ˜ ์žˆ๋„๋กํ•ฉ๋‹ˆ๋‹ค (์˜ˆ : ์›ํ•˜๋Š” ๋””๋ฒ„๊ฑฐ ํ˜ธ์ถœ). ์ด๊ฒƒ์€ (์žฌ์ •์˜ ๊ฐ€๋Šฅํ•œ) ๋งคํฌ๋กœ์ด๊ธฐ ๋•Œ๋ฌธ์— try! ์ด๋ฏธ ์ œ๊ณตํ•˜๋Š” ๊ฒƒ์ž…๋‹ˆ๋‹ค. ๊ฐ€์žฅ ์‰ฌ์šด ๋ฐฉ๋ฒ•์€ ์˜ฌ๋ฐ”๋ฅธ ๋งค๊ฐœ ๋ณ€์ˆ˜๋กœ ํ”„๋กœ๊ทธ๋žจ์„ ์‹œ์ž‘ํ–ˆ๋‹ค๋ฉด ์Šคํƒ์„ ์ธ์‡„ํ•˜๋Š” Err ์ผ€์ด์Šค์— ๋‹นํ™ฉํ•˜๋Š” ๊ฒƒ์ž…๋‹ˆ๋‹ค.

try ๋ฅผ ์‚ฌ์šฉํ•˜๋ฉด Err ์ผ€์ด์Šค์—์„œ ์›ํ•˜๋Š” ๋ชจ๋“  ์ž‘์—…์„ ์ˆ˜ํ–‰ ํ•  ์ˆ˜ ์žˆ์œผ๋ฉฐ ๋งคํฌ๋กœ ํฌ๋ ˆ์ดํŠธ ์ „์ฒด๋ฅผ ์žฌ์ •์˜ํ•˜๊ฑฐ๋‚˜ ์„ฑ๋Šฅ์— ์ค‘์š”ํ•œ ์ฝ”๋“œ๋ฅผ ๊ฑด๋“œ๋ฆฌ์ง€ ์•Š๋„๋ก ๋งค์šฐ ๋ฒ”์œ„๋ฅผ ์ง€์ •ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ์˜ˆ๋ฅผ ๋“ค์–ด ์˜ค๋ฅ˜๋ฅผ ์žฌํ˜„ํ•˜๊ธฐ ์–ด๋ ต๊ณ  ์„ฑ๋Šฅ์— ์ค‘์š”ํ•œ ์ฝ”๋“œ๋ฅผ ๋งŽ์ด ์‹คํ–‰ํ•ด์•ผํ•ฉ๋‹ˆ๋‹ค.

์‹ค์ œ ์ •๋ณด๋Š” ํŒŒ๊ดด ๋  ๊ฒƒ์ด๊ธฐ ๋•Œ๋ฌธ์— ์ถ•์  ๋œ ์ธ๊ณต ์Šคํƒ์—์žˆ๋Š” ์ •๋ณด์˜ ์ผ๋ถ€๋ฅผ ๋ณด์กด ํ•  ํ•„์š”๊ฐ€ ์—†์Šต๋‹ˆ๋‹ค. ๋ชจ๋“  ๋งคํฌ๋กœ ์žฌ์ •์˜ ๋ฐฉ๋ฒ•์€ ๋‹ค์Œ๊ณผ ๊ฐ™์ด ๊ฐœ์„  ๋  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

  • ? ๋Š” ๋น„์Šทํ•œ ๋ฐฉ์‹์œผ๋กœ ์žฌ์ •์˜ ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ๊ฐ€์žฅ ์‰ฌ์šด ๋ฐฉ๋ฒ•์€ try! ๋Œ€ํ•œ ์„คํƒ•์œผ๋กœ ? ๋ฅผ ์ •์˜ํ•˜๋Š” ๊ฒƒ์ž…๋‹ˆ๋‹ค. ํŠนํžˆ ์ƒ์ž ํ…Œ๋‘๋ฆฌ์—์„œ ๋‹ค์Œ๊ณผ ๊ฐ™์ด ๋น„ ์›๋ž˜ ์˜ค๋ฅ˜๋ฅผ ํฌ์ฐฉํ•˜๊ธฐ ์œ„ํ•ด ํ•„์š”ํ•ฉ๋‹ˆ๋‹ค. ์œ„์˜ ๋‚ด ์˜๊ฒฌ์— ์„ค๋ช…๋˜์–ด ์žˆ์Šต๋‹ˆ๋‹ค.
  • ๋” ๋งŽ์€ ์œ ์—ฐ์„ฑ์„ ํ—ˆ์šฉํ•˜๊ธฐ ์œ„ํ•ด ์œ ํ˜• ์ผ์น˜์™€ ๊ฐ™์€ ๋” ๊ฐ•๋ ฅํ•œ ๋งคํฌ๋กœ ์‹œ์Šคํ…œ์„ ๊ฐ€์ง€๊ณ  ์žˆ์Šต๋‹ˆ๋‹ค. ์˜ˆ, ์ด๊ฒƒ์„ ์ „ํ†ต์ ์ธ ํŠน์„ฑ ์‹œ์Šคํ…œ์— ๋„ฃ๋Š” ๊ฒƒ์— ๋Œ€ํ•ด ์ƒ๊ฐํ•  ์ˆ˜ ์žˆ์ง€๋งŒ rust๋Š” ํŠน์„ฑ ๊ตฌํ˜„์„ ์žฌ์ •์˜ ํ•  ์ˆ˜ ์—†์œผ๋ฏ€๋กœ ์•ฝ๊ฐ„ ๋ณต์žก ํ•  ๊ฒƒ์ž…๋‹ˆ๋‹ค.

@ est31 ์Šคํƒ์€ ํŒจ๋‹‰์ฒ˜๋Ÿผ _automatically_ "unwound"๋˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค. ์ด๊ฒƒ์€ ์ดˆ๊ธฐ ์ˆ˜์ต์„์œ„ํ•œ ๊ตฌ๋ฌธ ์  ์„คํƒ•์ž…๋‹ˆ๋‹ค.
๊ทธ๋ฆฌ๊ณ  ์˜ˆ, ์ปดํŒŒ์ผ๋Ÿฌ๊ฐ€ ์ค‘๋‹จ ์ ์„ ์ง€์ •ํ•  ์ˆ˜์žˆ๋Š” ๊ณ ์ • ๋œ ์ด๋ฆ„์„ ๊ฐ€์ง„ ์ผ๋ถ€ ๋นˆ ํ•จ์ˆ˜์˜ ํ˜ธ์ถœ์„ ์‚ฝ์ž…ํ•˜๋„๋ก ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ์ด๊ฒƒ์€ ๋งค์šฐ ์‰ฝ์Šต๋‹ˆ๋‹ค (์˜ˆ : call dump(data) -์—ฌ๊ธฐ์„œ dump ๋ฐ data ๋Š” ๋””๋ฒ„๊ฑฐ๊ฐ€ ๋ณผ ์ˆ˜์žˆ๋Š” ์ธ์ˆ˜์ž…๋‹ˆ๋‹ค.

@eddyb ๋นˆ ํ•จ์ˆ˜๋Š” ๋กœ๊ทธ์— ์˜ค๋ฅ˜๊ฐ€ ๋‚˜ํƒ€๋‚˜๋Š”์ง€ ํ™•์ธํ•˜๊ธฐ ์œ„ํ•ด ๋Œ€๊ทœ๋ชจ ๋ฐฐํฌ์— ๋ช‡ ๊ฐœ์˜ "์นด๋‚˜๋ฆฌ์•„"๋””๋ฒ„๊ทธ ์ธ์Šคํ„ด์Šค๋ฅผ ์œ ์ง€ ํ•œ ๋‹ค์Œ ๋Œ์•„๊ฐ€์„œ ๋ฌธ์ œ๋ฅผ ํ•ด๊ฒฐํ•˜๋Š” ๋“ฑ์˜ ์‚ฌ์šฉ ์‚ฌ๋ก€๋ฅผ ํ—ˆ์šฉํ•˜์ง€ ์•Š์„ ๊ฒƒ์ด๋ผ๊ณ  ์ƒ๊ฐํ•ฉ๋‹ˆ๋‹ค. ์‚ฌํ›„ ๋Œ€์‘๋ณด๋‹ค ์‚ฌ์ „ ๋Œ€์‘ํ•˜๋Š” ๊ฒƒ์ด ๋” ๋ฐ”๋žŒ์งํ•˜์ง€๋งŒ ๋ชจ๋“  ๊ฒƒ์ด ์˜ˆ์ธกํ•˜๊ธฐ ์‰ฌ์šด ๊ฒƒ์€ ์•„๋‹™๋‹ˆ๋‹ค.

@hexsel ์˜ˆ, ๊ทธ๋ž˜์„œ Result::unwrap ๋˜๋Š” ์ผ๋ถ€ ์ƒˆ๋กœ์šด ignore ๋ฉ”์„œ๋“œ (๋˜๋Š” ์˜ค๋ฅ˜๋ฅผ ์‚ญ์ œํ•  ๋•Œ ํ•ญ์ƒ ํ•ญ์ƒ?)๊ฐ€ ์ถ”์ ์„ stderr๋กœ ๋คํ”„ํ•˜๋Š” TLS ๊ธฐ๋ฐ˜ ๋ฉ”์„œ๋“œ๋ฅผ ์„ ํ˜ธํ•ฉ๋‹ˆ๋‹ค.

@eddyb ๋ช…๋ น์–ด ํฌ์ธํ„ฐ ๋˜๋Š” ๊ฐ’์—์„œ ํŒŒ์ƒ ๋œ ๊ฒƒ์„ TLS์˜ ๋ฐ์ดํ„ฐ ๊ตฌ์กฐ์™€ ๊ฐ™์€ ์Šคํƒ์— ์ถ”๊ฐ€ํ•˜๋ฉด ๊ธฐ๋ณธ์ ์œผ๋กœ ์‹ค์ œ ์Šคํƒ์˜ ์ž‘์€ ๋ฒ„์ „์„ ๋‹ค์‹œ ๋นŒ๋“œํ•ฉ๋‹ˆ๋‹ค. ๋ฐ˜ํ™˜์€ ์Šคํƒ์„ ํ•œ ํ•ญ๋ชฉ ์”ฉ ์ค„์ž…๋‹ˆ๋‹ค. ๋”ฐ๋ผ์„œ RAM์˜ ๋‹ค๋ฅธ ์œ„์น˜์— ์ œํ•œ๋œ ๋ฒ„์ „์„ ๋นŒ๋“œํ•˜๋ฉด์„œ ์Šคํƒ์˜ ์ผ๋ถ€๋ฅผ _unwind_ ๋ฐ˜ํ™˜ํ•˜๋Š” ๋™์•ˆ ๊ทธ๋ ‡๊ฒŒํ•˜๋ฉด. ์•„๋งˆ๋„ "unwind"๋Š” "legal"๋ฐ˜ํ™˜์œผ๋กœ ์ธํ•œ ๋™์ž‘์— ๋Œ€ํ•œ ์ž˜๋ชป๋œ ์šฉ์–ด ์ผ ์ˆ˜ ์žˆ์ง€๋งŒ ๋ชจ๋“  ์ฝ”๋“œ๊ฐ€ ? ๋˜๋Š” try! ๋ฅผ ์ˆ˜ํ–‰ํ•˜๊ณ  ๋งˆ์ง€๋ง‰์— ๊ฐ€๋กœ ์ฑ„๋ฉด ์ตœ์ข… ๊ฒฐ๊ณผ๊ฐ€ ๋™์ผํ•ฉ๋‹ˆ๋‹ค. Rust๊ฐ€ ์˜ค๋ฅ˜ ์ „ํŒŒ๋ฅผ ์ž๋™์œผ๋กœ ๋งŒ๋“ค์ง€ ์•Š๋Š”๋‹ค๋Š” ๊ฒƒ์ด ์ข‹์Šต๋‹ˆ๋‹ค. ์ €๋Š” Java๊ฐ€ throws ํ‚ค์›Œ๋“œ ๋‹ค์Œ์— ๋ชจ๋“  ์˜ˆ์™ธ๋ฅผ ๋‚˜์—ดํ•˜๋„๋ก ์š”๊ตฌ ํ•œ ๋ฐฉ์‹์ด ์ •๋ง ๋งˆ์Œ์— ๋“ค์—ˆ์Šต๋‹ˆ๋‹ค. rust๋Š” ์ด์— ๋Œ€ํ•œ ์ข‹์€ ๊ฐœ์„ ์ž…๋‹ˆ๋‹ค.

@hexsel ์žฌ์ •์˜ (์ด๋ฏธ try! ๋Œ€ํ•ด ์ด๋ฏธ ์กด์žฌํ•˜๋ฏ€๋กœ) ๊ธฐ๋ฐ˜ ์ ‘๊ทผ ๋ฐฉ์‹์„ ์‚ฌ์šฉํ•˜๋ฉด ์›ํ•˜๋Š” ๋ชจ๋“  ์ฝ”๋“œ๋ฅผ ์‹คํ–‰ํ•  ์ˆ˜ ์žˆ์œผ๋ฉฐ ๋ชจ๋“  ๋กœ๊น… ์‹œ์Šคํ…œ์— ๋กœ๊น… ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ์—ฌ๋Ÿฌ try ๊ฐ€ ์Šคํƒ ์œ„๋กœ ์ „ํŒŒ ๋  ๋•Œ ๋™์ผํ•œ ์˜ค๋ฅ˜๋ฅผ ํฌ์ฐฉ ํ•  ๋•Œ "์ค‘๋ณต"์— ๋Œ€ํ•œ ๊ฐ์ง€๊ฐ€ ํ•„์š”ํ•ฉ๋‹ˆ๋‹ค.

@ est31 try! ์žฌ์ •์˜๋Š” ์ž์‹ ์˜ ์ฝ”๋“œ์—์„œ๋งŒ ์ž‘๋™ํ•ฉ๋‹ˆ๋‹ค (๋ง ๊ทธ๋Œ€๋กœ ๋งคํฌ๋กœ ์ž„ํฌํŠธ ์„€๋„ ์ž‰). "์•ฝํ•œ lang ํ•ญ๋ชฉ"๊ณผ ๊ฐ™์ด ๋‹ค๋ฅธ ๊ฒƒ์ด๋˜์–ด์•ผํ•ฉ๋‹ˆ๋‹ค.

@ est31 ๊ทธ๊ฒƒ์€ ์ •๋ง๋กœ ์ •ํ™•ํ•˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค (ํ’€๊ธฐ์— ๋Œ€ํ•ด), ํŠธ๋ ˆ์ด์Šค์™€ ์‹ค์ œ ์Šคํƒ์€ ๋ฐ˜๋“œ์‹œ ๊ด€๊ณ„๊ฐ€์žˆ๋Š” ๊ฒƒ์€ ์•„๋‹™๋‹ˆ๋‹ค. ์™œ๋ƒํ•˜๋ฉด Result ๋ฅผ ์ด๋™ํ•˜๋Š” ๊ฒƒ์€ ์›๋ž˜์˜ ์—ญ ์ถ”์ ์—์„œ ์˜ฌ๋ผ๊ฐˆ ํ•„์š”๊ฐ€ ์—†๊ธฐ ๋•Œ๋ฌธ์ž…๋‹ˆ๋‹ค. ์˜†์œผ๋กœ๋„.
๋˜ํ•œ ๋ฐ”์ด๋„ˆ๋ฆฌ๊ฐ€ ์ตœ์ ํ™”๋˜๋ฉด ๋Œ€๋ถ€๋ถ„์˜ ์—ญ ์ถ”์ ์ด ์‚ฌ๋ผ์ง€๊ณ  ๋””๋ฒ„๊ทธ ์ •๋ณด๊ฐ€ ์—†์œผ๋ฉด Location ๊ฐ€ ์—„๊ฒฉํ•˜๊ฒŒ ์šฐ์ˆ˜ํ•ฉ๋‹ˆ๋‹ค. ๋ชจ๋“  ์†Œ์Šค ์ •๋ณด๋ฅผ ์ผ๋ถ€ ๋น„๊ณต๊ฐœ ์†Œ์Šค ์ œํ’ˆ์˜ ๊ฐœ๋ฐœ์ž๊ฐ€ ์ผ์น˜์‹œํ‚ฌ ์ˆ˜์žˆ๋Š” ์ž„์˜์˜ ํ•ด์‹œ๋กœ ๋Œ€์ฒดํ•˜๋Š” ๋‚œ๋… ํ™” ํ”Œ๋Ÿฌ๊ทธ์ธ์„ ์‹คํ–‰ํ•  ์ˆ˜๋„ ์žˆ์Šต๋‹ˆ๋‹ค.

๋””๋ฒ„๊ฑฐ๋Š” ์œ ์šฉํ•˜์ง€๋งŒ (์ œ์™ธ๋กœ lldb ์˜ ๋” ๊นจ๋—ํ•œ ์—ญ ์ถ”์  ์ถœ๋ ฅ์„ ์ข‹์•„ํ•ฉ๋‹ˆ๋‹ค) ๋งŒ๋ณ‘ ํ†ต์น˜์•ฝ์ด ์•„๋‹ˆ๋ฉฐ ์ด๋ฏธ ํŒจ๋‹‰์— ๋Œ€ํ•œ ์ •๋ณด๋ฅผ ์ถœ๋ ฅํ•˜์—ฌ ๋‹ค์Œ๊ณผ ๊ฐ™์€ ๋‹จ์„œ๋ฅผ ์–ป์„ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ๋ฌด์Šจ ์ผ์ด์•ผ.

๊ทธ๊ฒƒ์— ๋Œ€ํ•ด- {Option,Result}::unwrap ์— ์ถ”๊ฐ€ ์œ ํ˜• ์ธ์ˆ˜๊ฐ€์žˆ๋Š” ์œ ํ˜• ์‹œ์Šคํ…œ ์ˆ˜์ค€์˜ ํŠธ๋ฆญ์— ๋Œ€ํ•ด ๋ช‡ ๊ฐ€์ง€ ์ƒ๊ฐ์„ํ–ˆ์Šต๋‹ˆ๋‹ค. ๊ธฐ๋ณธ์ ์œผ๋กœ ํ•จ์ˆ˜๊ฐ€ ํ˜ธ์ถœ ๋œ ์œ„์น˜์— ๋”ฐ๋ผ ์œ ํ˜•์ด ์ง€์ •๋˜์–ด ํŒจ๋‹‰์ด ๋ฐœ์ƒํ•ฉ๋‹ˆ๋‹ค. ๋” ์œ ์šฉํ•œ ์œ„์น˜ ์ •๋ณด.

๊ฐ€์น˜ ๋งค๊ฐœ ๋ณ€์ˆ˜ํ™”๊ฐ€ ์ง„ํ–‰๋จ์— ๋”ฐ๋ผ ์—ฌ์ „ํžˆ ์˜ต์…˜์ด ๋  ์ˆ˜ ์žˆ์ง€๋งŒ ํ™•์‹คํžˆ ์œ ์ผํ•œ ๊ฒƒ์€ ์•„๋‹ˆ๋ฉฐ Result ํŠธ๋ ˆ์ด์Šค๋ฅผ ์™„์ „ํžˆ ๋ฌด์‹œํ•˜๊ณ  ์‹ถ์ง€๋Š” ์•Š์ง€๋งŒ ๋Œ€์‹  _implementable_ ์ธ ๋ชจ๋ธ์„ ์ฐพ์œผ๋ ค๊ณ ํ•ฉ๋‹ˆ๋‹ค.

try! ์žฌ์ •์˜๋Š” ์ž์‹ ์˜ ์ƒ์ž์— ํฌํ•จ๋˜์–ด ์žˆ๊ธฐ ๋•Œ๋ฌธ์— ์ „ํ˜€ ํ•ด๊ฒฐ์ฑ…์ด ์•„๋‹™๋‹ˆ๋‹ค. ๊ทธ๊ฒƒ์€ ๋””๋ฒ„๊น… ๊ฒฝํ—˜์œผ๋กœ ๋ฐ›์•„ ๋“ค์ผ ์ˆ˜ ์—†์Šต๋‹ˆ๋‹ค. ๋‚˜๋Š” ์ด๋ฏธ ํ˜„์žฌ try! ์ฒ˜๋ฆฌํ•˜๊ธฐ ์œ„ํ•ด ๋งŽ์€ ๊ฒƒ์„ ์‹œ๋„ํ–ˆ์Šต๋‹ˆ๋‹ค. ํŠนํžˆ ๋งŽ์€ ์ƒ์ž๊ฐ€ ๊ด€๋ จ๋˜์–ด ์žˆ๊ณ  ์Šคํƒ์„ ํ†ต๊ณผํ•˜๋Š” ๋„์ค‘ ์˜ค๋ฅ˜๊ฐ€ ์—ฌ๋Ÿฌ ๋ฒˆ ๋ณ€ํ™˜๋˜๋Š” ๊ฒฝ์šฐ ์˜ค๋ฅ˜์˜ ์›์ธ๊ณผ ์›์ธ์„ ํŒŒ์•…ํ•˜๋Š” ๊ฒƒ์€ ๊ฑฐ์˜ ๋ถˆ๊ฐ€๋Šฅํ•ฉ๋‹ˆ๋‹ค. ์ด์™€ ๊ฐ™์€ ๋ฐ˜์ฐฝ๊ณ ๊ฐ€ ํ•ด๊ฒฐ์ฑ…์ด๋ผ๋ฉด ๋Œ€๊ทœ๋ชจ Rust ํ”„๋กœ์ ํŠธ์—์„œ ์ผ๋ฐ˜์ ์œผ๋กœ ์˜ค๋ฅ˜ ์ฒ˜๋ฆฌ๋ฅผ ์žฌ๊ฒ€ํ† ํ•ด์•ผํ•ฉ๋‹ˆ๋‹ค.

@eddyb ๊ทธ๋ž˜์„œ ์šฐ๋ฆฌ๊ฐ€ ๋ง ๊ทธ๋Œ€๋กœ ํŒŒ์ผ ์ด๋ฆ„, ํ•จ์ˆ˜ ์ด๋ฆ„, ์ค„ ๋ฒˆํ˜ธ ๋ฐ ์—ด ๋ฒˆํ˜ธ๋ฅผ ํ•ด๋‹น ๋ฒกํ„ฐ์— ํฌํ•จํ•˜๋ผ๋Š” ์ œ์•ˆ์ž…๋‹ˆ๊นŒ? ํŠนํžˆ ํ•ด๋‹น ์ •๋ณด๊ฐ€ DWARF์—์„œ ํ›จ์”ฌ ๋” ์ฒ˜๋ฆฌ ๊ฐ€๋Šฅํ•œ ํ˜•์‹์œผ๋กœ ์ด๋ฏธ ํฌํ•จ๋˜์–ด ์žˆ๊ธฐ ๋•Œ๋ฌธ์— ๋งค์šฐ ๋‚ญ๋น„์ ์ธ ๊ฒƒ ๊ฐ™์Šต๋‹ˆ๋‹ค. ๋˜ํ•œ DWARF๋ฅผ ์‚ฌ์šฉํ•˜๋ฉด ํ”„๋กœ๋•์…˜์—์„œ ๋™์ผํ•œ ํ”„๋กœ์„ธ์Šค๋ฅผ ํ•ฉ๋ฆฌ์ ์œผ๋กœ ์ €๋ ดํ•˜๊ฒŒ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ์ง€๋งŒ ์ด๋Ÿฌํ•œ ์ข…๋ฅ˜์˜ ์œ„์น˜ ์ •๋ณด๋Š” ๋„ˆ๋ฌด ๋‚ญ๋น„๋˜์–ด ์•„๋ฌด๋„ ๋ฆด๋ฆฌ์Šค ๋ฐ”์ด๋„ˆ๋ฆฌ๋ฅผ ์‹คํ–‰ํ•  ์ˆ˜ ์—†์Šต๋‹ˆ๋‹ค.

DWARF ์ •๋ณด๋ณด๋‹ค ํ›จ์”ฌ ๋” ๋‚ญ๋น„ ์ ์ผ๊นŒ์š”? ํŒŒ์ผ ์ด๋ฆ„์€ ์ค‘๋ณต ์ œ๊ฑฐ๋˜๊ณ  x64์—์„œ๋Š” ์ „์ฒด๊ฐ€ ํฌ์ธํ„ฐ 3 ๊ฐœ์˜ ํฌ๊ธฐ์ž…๋‹ˆ๋‹ค.

@mitsuhiko ๊ทธ๋ž˜์„œ ๊ธฐ๋ณธ์ ์œผ๋กœ, ๋‹น์‹ ์€ ์ผ๋ฐ˜์ ์ธ ๋ฐฉํ–ฅ์— ๋™์˜ํ•˜์ง€๋งŒ ๊ทธ๊ฒƒ์˜ ๊ธฐ์ˆ ์  ์„ธ๋ถ€ ์‚ฌํ•ญ์—๋Š” ๋™์˜ํ•˜์ง€ ์•Š์Šต๋‹ˆ๊นŒ?

DWARF ์ •๋ณด๋ฅผ ์ผ๋ฐ˜ Rust API์— ๋…ธ์ถœํ•˜๋Š” ๊ฒƒ์ด ์–ผ๋งˆ๋‚˜ ์‰ฌ์šด๊ฐ€์š”?

@eddyb ๋Š” DWARF ์ •๋ณด๊ฐ€ ๋ฆด๋ฆฌ์Šค ๋ฐ”์ด๋„ˆ๋ฆฌ์— ํฌํ•จ๋˜์ง€ ์•Š๊ณ  ๋ณ„๋„์˜ ํŒŒ์ผ์— ํฌํ•จ๋˜์–ด ์žˆ๊ธฐ ๋•Œ๋ฌธ์ž…๋‹ˆ๋‹ค. ๊ทธ๋ž˜์„œ ์‹ฌ๋ณผ ์„œ๋ฒ„์— ๋””๋ฒ„๊ทธ ํŒŒ์ผ์„ ๊ฐ–๊ณ  ์‚ฌ์šฉ์ž์—๊ฒŒ ์ŠคํŠธ๋ฆฝ ๋œ ๋ฐ”์ด๋„ˆ๋ฆฌ๋ฅผ ๋ณด๋‚ผ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

@mitsuhiko ์•„, ๊ทธ๊ฒƒ์€ ๋‚ด๊ฐ€ ์ƒ๊ฐํ–ˆ๋˜ ๊ฒƒ๊ณผ ์™„์ „ํžˆ ๋‹ค๋ฅธ ์ ‘๊ทผ ๋ฐฉ์‹์ž…๋‹ˆ๋‹ค. Rust๋Š” ํ˜„์žฌ ๊ทธ atm, AFAIK๋ฅผ ์ง€์›ํ•˜์ง€ ์•Š์ง€๋งŒ, ๊ทธ๋ž˜์•ผํ•œ๋‹ค๋Š” ๋ฐ ๋™์˜ํ•ฉ๋‹ˆ๋‹ค.

๋ฆด๋ฆฌ์Šค ๋ฐ”์ด๋„ˆ๋ฆฌ ๋””๋ฒ„๊น…์„ ์œ„ํ•ด ๋นŒ๋“œ ์‹œ์Šคํ…œ์—์„œ ์ƒ์„ฑ ํ•œ ์ž„์˜์˜ ์‹๋ณ„์ž์— ๋น„ํ•ด ๋ช…๋ น ํฌ์ธํ„ฐ๊ฐ€ ์‹ค์ œ๋กœ ์œ ์šฉํ•˜๋‹ค๊ณ  ์ƒ๊ฐํ•˜์‹ญ๋‹ˆ๊นŒ?

๋‚ด ๊ฒฝํ—˜์— ๋”ฐ๋ฅด๋ฉด ๋ชจ๋“  ์ธ๋ผ์ธ ๋””๋ฒ„๊ฑฐ๋Š” ๋ช…์‹œ ์  ์ž์ฒด / ์ƒํ˜ธ ์žฌ๊ท€ ๋ฐ ๋งค์šฐ ํฐ ํ•จ์ˆ˜๋ฅผ ์ œ์™ธํ•˜๊ณ  ์Šคํƒ ์ถ”์ ์˜ ๋Œ€๋ถ€๋ถ„์„ ๋ณต๊ตฌํ•˜๋Š” ๋ฐ ์–ด๋ ค์›€์„ ๊ฒช์—ˆ์Šต๋‹ˆ๋‹ค.

์˜ˆ, try! ์€ (๋Š”) ์ƒ์ž ์•ˆ์— ๋“ค์–ด ์žˆ์Šต๋‹ˆ๋‹ค. ํ•จ์ˆ˜ ํฌ์ธํ„ฐ ๋˜๋Š” ์œ ์‚ฌํ•œ ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ ์ฝ”๋“œ๋ฅผ ์ „๋‹ฌํ•˜๊ณ  ํ•จ์ˆ˜์— ์˜ค๋ฅ˜๊ฐ€์žˆ๋Š” ๊ฒฝ์šฐ try ์ ‘๊ทผ ๋ฐฉ์‹์ด ๊ณ„์† ์ž‘๋™ํ•ฉ๋‹ˆ๋‹ค. ์‚ฌ์šฉํ•˜๋Š” ํฌ๋ ˆ์ดํŠธ์— ๋‚ด๋ถ€ ์˜ค๋ฅ˜ ๋˜๋Š” ๋ฒ„๊ทธ๊ฐ€์žˆ๋Š” ๊ฒฝ์šฐ ๋ฐ˜ํ™˜ ๋œ Err ์˜ ์ •๋ณด๊ฐ€ ๋„์›€์ด๋˜์ง€ ์•Š๋Š” ๊ฒฝ์šฐ ์ด๋ฏธ ๋””๋ฒ„๊ทธํ•˜๊ธฐ ์œ„ํ•ด ์†Œ์Šค ์ฝ”๋“œ๊ฐ€ ํ•„์š”ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ์Šคํƒ ์ถ”์ ์€ ์ฝ”๋“œ์— ๋Œ€ํ•œ ์•ก์„ธ์Šค ๊ถŒํ•œ์ด์žˆ๋Š” ๊ฒฝ์šฐ์—๋งŒ ์œ ์šฉํ•˜๋ฏ€๋กœ ํ์‡„ ๋œ ์†Œ์Šค ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ (์ฝ”๋“œ๋ฅผ ์ˆ˜์ •ํ•  ์ˆ˜์—†๋Š” ๊ฒฝ์šฐ)๋Š” ์–ด๋–ค ์‹ ์œผ๋กœ๋“  ์ง€์›์„ ๋ฐ›์•„์•ผํ•ฉ๋‹ˆ๋‹ค.

๋‘ ๊ฐ€์ง€ ์ ‘๊ทผ ๋ฐฉ์‹์„ ๋ชจ๋‘ ํ™œ์„ฑํ™”ํ•˜๊ณ  ๊ฐœ๋ฐœ์ž๊ฐ€ ๊ฐ€์žฅ ์ ํ•ฉํ•œ ๋ฐฉ์‹์„ ๊ฒฐ์ •ํ•˜๋„๋กํ•˜๋Š” ๊ฒƒ์€ ์–ด๋–ป์Šต๋‹ˆ๊นŒ? ๋‚˜๋Š” TLS ๊ธฐ๋ฐ˜ ์ ‘๊ทผ ๋ฐฉ์‹์ด ์ด์ ์ด ์—†๋‹ค๋Š” ๊ฒƒ์„ ๋ถ€์ •ํ•˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค.

try ๋ชจ๋ธ์€ ๋งค์šฐ ์‰ฝ๊ฒŒ ๊ตฌํ˜„ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ? ์—์„œ try ๊ฐ„๋‹จํžˆ ์ œ๊ฑฐํ•ฉ๋‹ˆ๋‹ค. catch ์ด ๋“ค์–ด ์˜ค๋ฉด ์ถ”๊ฐ€ ์–ธ์–ด ํ™•์žฅ ๋งŒ ํ•„์š”ํ•ฉ๋‹ˆ๋‹ค (ํ•˜๋“œ ์ฝ”๋”ฉ ๋œ ๋™์ž‘ ์•ˆ์— ํ•ด๋‹น ๋™์ž‘์„ ์ถ”๊ฐ€ํ–ˆ์„ ๊ฒƒ์ž…๋‹ˆ๋‹ค) ์–ด์จŒ๋“  ? )

@eddyb "๋ช…๋ น ํฌ์ธํ„ฐ๊ฐ€ ๋ฆด๋ฆฌ์Šค ๋ฐ”์ด๋„ˆ๋ฆฌ ๋””๋ฒ„๊น…์„ ์œ„ํ•ด ๋นŒ๋“œ ์‹œ์Šคํ…œ์—์„œ ์ƒ์„ฑ ๋œ ์ž„์˜์˜ ์‹๋ณ„์ž์™€ ๋น„๊ตํ•  ๋•Œ ์‹ค์ œ๋กœ ์œ ์šฉํ•˜๋‹ค๊ณ  ์ƒ๊ฐํ•˜์‹ญ๋‹ˆ๊นŒ?"

์ด๊ฒƒ์ด ์ผ๋ฐ˜์ ์œผ๋กœ ๋„ค์ดํ‹ฐ๋ธŒ ๋ฐ”์ด๋„ˆ๋ฆฌ ๋””๋ฒ„๊น…์ด ์ž‘๋™ํ•˜๋Š” ๋ฐฉ์‹์ž…๋‹ˆ๋‹ค. ์šฐ๋ฆฌ (Sentry)๋Š” ํ˜„์žฌ ๊ฑฐ์˜ ์ „์ ์œผ๋กœ iOS ์ง€์›์„ ์œ„ํ•ด ์‚ฌ์šฉํ•˜๊ณ  ์žˆ์Šต๋‹ˆ๋‹ค. ํฌ๋ž˜์‹œ ๋คํ”„๋ฅผ ์–ป๊ณ  llvm-symbolizer๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ ์ฃผ์†Œ๋ฅผ ์‹ค์ œ ๊ธฐํ˜ธ๋กœ ํ™•์ธํ•ฉ๋‹ˆ๋‹ค.

@mitsuhiko ์ด๋ฏธ libbacktrace ํฌํ•จํ–ˆ๊ธฐ ๋•Œ๋ฌธ์— ์†Œ์Šค ์œ„์น˜์— ๋Œ€ํ•œ ์ฝ”๋“œ ํฌ์ธํ„ฐ๋ฅผ ํ•ด์„ํ•˜๋Š” ๋ฐ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ์œผ๋ฏ€๋กœ ์ „์ ์œผ๋กœ ๋ฐ˜๋Œ€ํ•˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค.

@eddyb ์˜ˆ. ํŒจ๋‹‰ ์ฝ”๋“œ๋ฅผ ๋ณด์•˜์Šต๋‹ˆ๋‹ค. ๊ทธ๊ฒƒ์ด ์‹ค์ œ๋กœ Rust ์ฝ”๋“œ๊ฐ€ ์‚ฌ์šฉํ•  ์ˆ˜์žˆ๋Š” API๋ผ๋ฉด ์ข‹์„ ๊ฒƒ์ž…๋‹ˆ๋‹ค. ๋” ๋งŽ์€ ๊ณณ์—์„œ ์ด๊ฒƒ์ด ์œ ์šฉํ•˜๋‹ค๋Š” ๊ฒƒ์„ ์•Œ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

๊ทธ๊ฒƒ์— ๋Œ€ํ•ด-๋‚˜๋Š” {Option, Result} :: unwrap์— ์ถ”๊ฐ€ ์œ ํ˜• ์ธ์ˆ˜๊ฐ€์žˆ๋Š” ์œ ํ˜• ์‹œ์Šคํ…œ ์ˆ˜์ค€์˜ ํŠธ๋ฆญ์— ๋Œ€ํ•ด ๋ช‡ ๊ฐ€์ง€ ์ƒ๊ฐ์„ํ–ˆ์Šต๋‹ˆ๋‹ค. ๋” ์œ ์šฉํ•œ ์œ„์น˜ ์ •๋ณด๊ฐ€ ์žˆ์Šต๋‹ˆ๋‹ค.

๋งํ•˜์ž๋ฉด...

@glaebhoerl Hah, ์•„๋งˆ๋„ ๊ทธ๊ฒƒ์€ ์‹ค์ œ๋กœ ์ถ”๊ตฌ ํ•  ๊ฐ€์น˜๊ฐ€ ์žˆ์Šต๋‹ˆ๊นŒ? ์ ์–ด๋„ ๋ถˆ์•ˆ์ •ํ•œ ์‹คํ—˜๋งŒํผ.

@eddyb ๋ชจ๋ฅด๊ฒ ์–ด์š”. ์•„๋งˆ๋„ ๋จผ์ € ๊ทธ๊ฒƒ์— ๊ด€๋ จ๋œ GHCer๋“ค๊ณผ ๋…ผ์˜ ํ•  ๊ฐ€์น˜๊ฐ€์žˆ์„ ๊ฒƒ์ž…๋‹ˆ๋‹ค. ๋‚˜๋Š” ๋‹จ์ง€ ์ด๊ฒƒ์— ๋Œ€ํ•ด ๋“ค์—ˆ๊ณ  ๋ฐฉ๊ธˆ ๋งํฌ๋ฅผ ๋ดค์Šต๋‹ˆ๋‹ค. ๊ทธ๋ฆฌ๊ณ  Rust๋Š” GHC์™€ ๊ฐ™์€ ๋ฐฉ์‹์œผ๋กœ ์‹ค์ œ ์•”์‹œ ์  ๋งค๊ฐœ ๋ณ€์ˆ˜๋ฅผ ๊ฐ€์ง€๊ณ  ์žˆ์ง€ ์•Š์Šต๋‹ˆ๋‹ค. ๊ธฐ๋ณธ ์œ ํ˜• ๋งค๊ฐœ ๋ณ€์ˆ˜๊ฐ€ ๋Œ€์‹  ์ž‘๋™ ํ•  ์ˆ˜ ์žˆ๋Š”์ง€ ์—ฌ๋ถ€๋Š” ํฅ๋ฏธ๋กœ์šด ์งˆ๋ฌธ์ž…๋‹ˆ๋‹ค (์•„๋งˆ๋„ ๋‚˜๋ณด๋‹ค ๋” ๋งŽ์ด ์ƒ๊ฐํ•œ ์งˆ๋ฌธ ์ผ ๊ฒƒ์ž…๋‹ˆ๋‹ค).

๊ทธ๋ƒฅ ์ƒ๊ฐํ•˜์„ธ์š” : rustc ๋ฅผ Err ๊ตฌ์„ฑํ•˜๋Š” ํŠน์ˆ˜ํ•œ ๊ฒฝ์šฐ๋กœ ์ „ํ™˜ํ•˜๋Š” ์Šค์œ„์น˜๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ ๋ฐ˜ํ™˜ํ•˜๊ธฐ ์ „์— ํŽ˜์ด๋กœ๋“œ์™€ ํ•จ๊ป˜ fn(TypeId, *mut ()) ํ•จ์ˆ˜๋ฅผ ํ˜ธ์ถœํ•˜๋Š” ๊ฒƒ์ด ์œ ์šฉ ํ•  ๊ฒƒ์ž…๋‹ˆ๋‹ค. . ํŽ˜์ด๋กœ๋“œ๋ฅผ ๊ธฐ๋ฐ˜์œผ๋กœ ์˜ค๋ฅ˜๋ฅผ ํ•„ํ„ฐ๋งํ•˜๊ฑฐ๋‚˜, ๊ด€์‹ฌ์žˆ๋Š” ์˜ค๋ฅ˜๊ฐ€ ๋ฐœ๊ฒฌ๋˜๋ฉด ๋””๋ฒ„๊ฑฐ์— ํŠธ๋žฉํ•˜๊ฑฐ๋‚˜, ํŠน์ • ์ข…๋ฅ˜์˜ ์˜ค๋ฅ˜์— ๋Œ€ํ•œ ์—ญ ์ถ”์ ์„ ์บก์ฒ˜ํ•˜๋Š” ๊ฒƒ๊ณผ ๊ฐ™์€ ๊ธฐ๋ณธ์ ์ธ ์ž‘์—…์œผ๋กœ ์‹œ์ž‘ํ•˜๊ธฐ์— ์ถฉ๋ถ„ํ•ฉ๋‹ˆ๋‹ค.

PR 33389 ๋Š” Carrier ํŠน์„ฑ์— ๋Œ€ํ•œ ์‹คํ—˜์  ์ง€์›์„ ์ถ”๊ฐ€ํ•ฉ๋‹ˆ๋‹ค. ์›๋ž˜ RFC์˜ ์ผ๋ถ€๊ฐ€ ์•„๋‹ˆ๊ธฐ ๋•Œ๋ฌธ์— FCP๋กœ ์ด๋™ํ•˜๊ธฐ ์ „์— ํŠนํžˆ ๊ฐ€๊นŒ์šด ๊ฒ€์‚ฌ ๋ฐ ๋…ผ์˜ ๊ธฐ๊ฐ„์„ ๊ฑฐ์ณ์•ผํ•ฉ๋‹ˆ๋‹ค (๋‚˜๋จธ์ง€ ? ์—ฐ์‚ฐ์ž์— ๋Œ€ํ•ด์„œ๋Š” FCP์™€ ๋ถ„๋ฆฌ๋˜์–ด์•ผ ํ•จ). ์ž์„ธํ•œ ๋‚ด์šฉ์€์ด ํ† ๋ก  ์Šค๋ ˆ๋“œ ๋ฅผ ์ฐธ์กฐํ•˜์‹ญ์‹œ์˜ค.

? ๋ฅผ Option ๋กœ ์—ฐ์žฅํ•˜๋Š” ๊ฒƒ์— ๋ฐ˜๋Œ€ํ•ฉ๋‹ˆ๋‹ค.

RFC์˜ ํ‘œํ˜„์€ ? ์—ฐ์‚ฐ์ž๊ฐ€ ์˜ค๋ฅ˜ / "์˜ˆ์™ธ"์ „ํŒŒ์— ๊ด€ํ•œ ๊ฒƒ์ด๋ผ๋Š” ์‚ฌ์‹ค์— ๋Œ€ํ•ด ๋งค์šฐ ๋ช…ํ™•ํ•ฉ๋‹ˆ๋‹ค.
Option ๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ ์˜ค๋ฅ˜๋ฅผ๋ณด๊ณ ํ•˜๋Š” ๊ฒƒ์€ ์ž˜๋ชป๋œ ๋„๊ตฌ์ž…๋‹ˆ๋‹ค. None ๋ฐ˜ํ™˜์€ ์„ฑ๊ณต์ ์ธ ํ”„๋กœ๊ทธ๋žจ์˜ ์ •์ƒ์ ์ธ ์›Œํฌ ํ”Œ๋กœ์˜ ์ผ๋ถ€์ด๋ฉฐ Err ๋ฐ˜ํ™˜

์˜ค๋ฅ˜ ์ฒ˜๋ฆฌ์˜ ์ผ๋ถ€ ์˜์—ญ (์˜ˆ : ์Šคํƒ ์ถ”์  ์ถ”๊ฐ€)์„ ๊ฐœ์„ ํ•˜๋ ค๋Š” ๊ฒฝ์šฐ ? ์— Option ? ๋ฅผ ๊ตฌํ˜„ํ•˜๋ฉด ? ๋ฅผ ๋ณ€๊ฒฝ์—์„œ ์ œ์™ธํ•ด์•ผํ•ฉ๋‹ˆ๋‹ค. .

@tomaka ํ† ๋ก  ์Šค๋ ˆ๋“œ ์—์„œ ํ† ๋ก ์„ ๊ณ„์†ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๊นŒ? ( ์ด๋ฏธ ๊ท€ํ•˜์˜ ์ด์˜๋ฅผ ์š”์•ฝํ–ˆ์Šต๋‹ˆ๋‹ค. ) ์ €๋Š” ๊ฐœ์ธ์ ์œผ๋กœ GH์— ๋Œ€ํ•œ ๊ธด ๋…ผ์˜๊ฐ€ ์ƒ๋‹นํžˆ ๋‹ค๋ฃจ๊ธฐ ํž˜๋“ค๋‹ค๋Š” ๊ฒƒ์„ ์•Œ๊ณ  ์žˆ์œผ๋ฉฐ,์ด ํŠน์ • ๋…ผ์˜๋ฅผ ๋‹ค๋ฅธ ๋ฏธ๋ž˜์˜ ํฌ์ธํŠธ ๋˜๋Š” ๋ฐœ์ƒํ•  ์ˆ˜์žˆ๋Š” ์งˆ๋ฌธ๊ณผ ๋ถ„๋ฆฌ ํ•  ์ˆ˜์žˆ๋Š” ๊ฒƒ๋„ ์ข‹์„ ๊ฒƒ์ž…๋‹ˆ๋‹ค.

@eddyb ์—ฌ๊ธฐ I ๊ธฐ๋Šฅ GHC ์•”์‹œ ์  ํ˜ธ์ถœ ์Šคํƒ์˜ ์ถœ์‹œ ๋ฒ„์ „์˜ ๋ฌธ์„œ ์•ž์—์„œ ์–ธ๊ธ‰ .

์ž ์‹œ ๋™์•ˆ ์—ฌ๊ธฐ์— ์—…๋ฐ์ดํŠธ๊ฐ€ ์—†์Šต๋‹ˆ๋‹ค. ์ด ๋ฌธ์ œ๋ฅผ ํ•ด๊ฒฐํ•˜๊ธฐ ์œ„ํ•ด ๋…ธ๋ ฅํ•˜๋Š” ์‚ฌ๋žŒ์ด ์žˆ์Šต๋‹ˆ๊นŒ? OP์˜ ๋‚˜๋จธ์ง€ ์ž‘์—…์ด ์—ฌ์ „ํžˆ ์ •ํ™•ํ•ฉ๋‹ˆ๊นŒ? ์—ฌ๊ธฐ์— ์ „์ž ๋„์›€์ด ํ•„์š”ํ•œ ๊ฒƒ์ด ์žˆ์Šต๋‹ˆ๊นŒ?

๋‚˜๋Š” ์ง€๋‚œ ์ฃผ๋ง์— Rust ์šฉ Sentry ํด๋ผ์ด์–ธํŠธ๋ฅผ ์ž‘์„ฑํ•˜๋Š” ๊ฒƒ์ด ๊ฐ€๋Šฅํ•˜๋‹ค๋ฉด ๋†€์•˜์Šต๋‹ˆ๋‹ค. ๋Œ€๋ถ€๋ถ„์˜ ์˜ค๋ฅ˜ ์ฒ˜๋ฆฌ๋Š” ์‹ค์ œ๋กœ ํŒจ๋‹‰ ๋Œ€์‹  ๊ฒฐ๊ณผ๋ฅผ ๊ธฐ๋ฐ˜์œผ๋กœํ•˜๊ธฐ ๋•Œ๋ฌธ์— ์ด๊ฒƒ์˜ ์œ ์šฉ์„ฑ์€ ๋‚ด๊ฐ€ ์ด๊ฒƒ์„ ์™„์ „ํžˆ ํฌ๊ธฐํ•˜๊ธฐ๋กœ ๊ฒฐ์ •ํ•œ ์ง€์ ์œผ๋กœ ์‹ฌ๊ฐํ•˜๊ฒŒ ์ œํ•œ๋œ๋‹ค๋Š” ๊ฒƒ์„ ์•Œ์•˜์Šต๋‹ˆ๋‹ค.

์˜ค๋ฅ˜๋ณด๊ณ  ์‹œ์Šคํ…œ์„ ์—ฌ๊ธฐ์— ํ†ตํ•ฉํ•˜๊ธฐ ์œ„ํ•ด crates.io ์ฝ”๋“œ๋ฒ ์ด์Šค๋ฅผ ์˜ˆ๋กœ ๋“ค์–ด ๋ณด์•˜์Šต๋‹ˆ๋‹ค. ๊ฒฐ๊ณผ๊ฐ€ ์ „๋‹ฌ๋˜๊ณ  ๋‹ค๋ฅธ ์Šคํƒ ํŠธ๋ ˆ์ด์Šค์—์„œ ๋ณ€ํ™˜ ๋  ๋•Œ ์–ด๋–ป๊ฒŒ ๋“  ๋ช…๋ น ํฌ์ธํ„ฐ๋ฅผ ๊ธฐ๋ก ํ•  ์ˆ˜ ์—†๋‹ค๋ฉด ์ ์ ˆํ•œ ์˜ค๋ฅ˜๋ณด๊ณ ๋ฅผ ์–ป์„ ์ˆ˜ ์—†๋‹ค๊ณ  ์ƒ๊ฐํ•˜๊ธฐ ๋•Œ๋ฌธ์—์ด RFC๋กœ ๋‹ค์‹œ ๋Œ์•„ ์™”์Šต๋‹ˆ๋‹ค. ๋‚˜๋Š” ์ด๋ฏธ ์ด๊ฒƒ์ด ๋‚ด๊ฐ€ _ ์ƒ๊ฐํ•˜๋Š” _ ์˜ค๋ฅ˜๊ฐ€ ๋ฐœ์ƒํ•œ ๊ณณ์— ํŒจ๋‹‰์„ ์ถ”๊ฐ€ํ•˜๋Š” ๋ฐ ์˜์ง€ํ•˜๋Š” ์ง€์—ญ์˜ ๋ณต์žกํ•œ ๋…ผ๋ฆฌ ์˜ค๋ฅ˜๋ฅผ ๋””๋ฒ„๊น…ํ•˜๋Š” ๊ฒƒ๋งŒ์œผ๋กœ๋„ ์—„์ฒญ๋‚œ ๊ณ ํ†ต์ž„์„ ์ด๋ฏธ ์•Œ๊ณ  ์žˆ์Šต๋‹ˆ๋‹ค.

๋ถˆํ–‰ํžˆ๋„ ๊ฒฐ๊ณผ๊ฐ€ ์ž‘๋™ํ•˜๋Š” ๋ฐฉ์‹์„ ํฌ๊ฒŒ ๋ณ€๊ฒฝํ•˜์ง€ ์•Š๊ณ  IP๋ฅผ ๊ธฐ๋ก ํ•  ์ˆ˜์žˆ๋Š” ๋ฐฉ๋ฒ•์„ ํ˜„์žฌ ์•Œ ์ˆ˜ ์—†์Šต๋‹ˆ๋‹ค. ๋‹ค๋ฅธ ์‚ฌ๋žŒ์ด ์ „์—์ด ์•„์ด๋””์–ด๋ฅผ ๊ฐ€์ง€๊ณ  ๋†€์•˜ ๋˜ ์ ์ด ์žˆ์Šต๋‹ˆ๊นŒ?

์šฐ๋ฆฌ๋Š” @ rust-lang / lang ํšŒ์˜์—์„œ ์ด์— ๋Œ€ํ•ด ๋…ผ์˜ํ–ˆ์Šต๋‹ˆ๋‹ค. ์˜ฌ๋ผ์˜จ ๋ช‡ ๊ฐ€์ง€ :

์ฒซ์งธ, ? ๊ฐ€ ๊ฐ€๋Šฅํ•œ ํ•œ ๋นจ๋ฆฌ ์•ˆ์ •ํ™”๋˜๋Š” ๊ฒƒ์„ ๋ณด๋Š” ๋ฐ ํ™•์‹คํ•œ ๊ด€์‹ฌ์ด ์žˆ์Šต๋‹ˆ๋‹ค. ๊ทธ๋Ÿฌ๋‚˜ ์šฐ๋ฆฌ ๋Œ€๋ถ€๋ถ„์€ Result ๋ฟ๋งŒ ์•„๋‹ˆ๋ผ Option ์—์„œ ? ์ž‘๋™ํ•˜๋Š” ๊ฒƒ์„๋ณด๊ณ  ์‹ถ์–ดํ•œ๋‹ค๊ณ  ์ƒ๊ฐํ•ฉ๋‹ˆ๋‹ค (ํ•˜์ง€๋งŒ bool ๋ผ๊ณ  ์ƒ๊ฐํ•ฉ๋‹ˆ๋‹ค. ๋˜ํ•œ ์ œ์•ˆ๋˜์—ˆ์Šต๋‹ˆ๋‹ค). ์•ˆ์ •ํ™”์— ๋Œ€ํ•œ ํ•œ ๊ฐ€์ง€ ์šฐ๋ ค ์‚ฌํ•ญ์€ Result ์ด์™ธ์˜ ์œ ํ˜•์„ ์‚ฌ์šฉํ•  ์ˆ˜์žˆ๋Š” ์–ด๋–ค ์ข…๋ฅ˜์˜ ํŠน์„ฑ๋„ ์ œ๊ณตํ•˜์ง€ ์•Š๊ณ  ์•ˆ์ •ํ™”ํ•˜๋ฉด ๋‚˜์ค‘์— ์ถ”๊ฐ€ ํ•  ์ˆ˜์žˆ๋Š” ํ•˜์œ„ ํ˜ธํ™˜์„ฑ์ด ์—†๋‹ค๋Š” ๊ฒƒ์ž…๋‹ˆ๋‹ค.

์˜ˆ๋ฅผ ๋“ค์–ด, ์ €๋Š” ๊ทœ์น™์ ์œผ๋กœ ๋‹ค์Œ๊ณผ ๊ฐ™์€ ์ฝ”๋“œ๋ฅผ ์ž‘์„ฑํ•ฉ๋‹ˆ๋‹ค.

let v: Vec<_> = try!(foo.iter().map(|x| x.to_result()).collect());

try! ์„ ์‚ฌ์šฉํ•˜์—ฌ collect ์ด Result<Vec<_>, _> ๋ฅผ ๋ฐ˜ํ™˜ ํ•  ๊ฒƒ์œผ๋กœ ์˜ˆ์ƒํ•˜๋Š” ์œ ํ˜• ์ถ”๋ก ์„ ์•Œ๋ฆฝ๋‹ˆ๋‹ค. ? ๋ฅผ ์‚ฌ์šฉํ•œ๋‹ค๋ฉด์ด ์ถ”๋ก ์€ _ ๋ฏธ๋ž˜์— ์‹คํŒจ ํ•  ์ˆ˜๋„ ์žˆ์Šต๋‹ˆ๋‹ค.

๊ทธ๋Ÿฌ๋‚˜ ์ด์ „ ๋…ผ์˜์—์„œ ์šฐ๋ฆฌ๋Š” ๋˜ํ•œ ๋ชจ๋“  ์ข…๋ฅ˜์˜ "์šด๋ฐ˜์ž"ํŠน์„ฑ์— ๋Œ€ํ•œ ์„ธ๋ถ€ ์‚ฌํ•ญ์„ ๋…ผ์˜ํ•˜๊ธฐ ์œ„ํ•ด ์ˆ˜์ • RFC๊ฐ€ ํ•„์š”ํ•˜๋‹ค๊ณ  ๊ฒฐ์ •ํ–ˆ์Šต๋‹ˆ๋‹ค. ๋ถ„๋ช…ํžˆ์ด RFC๋Š” ์ตœ๋Œ€ํ•œ ๋นจ๋ฆฌ ์ž‘์„ฑํ•ด์•ผํ•˜์ง€๋งŒ ํ•ด๋‹น ํ† ๋ก ์—์„œ ? ์ง„ํ–‰์„ ์ฐจ๋‹จํ•˜์ง€ ์•Š๋Š” ๊ฒƒ์ด ์ข‹์Šต๋‹ˆ๋‹ค.

ํ•œ ๊ฐ€์ง€ ์ƒ๊ฐ์€ @nrc ์˜ ๊ตฌํ˜„์„ ๊ฐ€์ ธ Result ๋ฐ ์ผ๋ถ€ ๊ฐœ์ธ ๋”๋ฏธ ์œ ํ˜•์— ๋Œ€ํ•ด์„œ๋งŒ ๊ตฌํ˜„ํ•˜๋ฉด ? ๋งŒ ๋งŒ๋“ค๋ฉด์„œ ์ถ”๋ก ์„ ์–ต์ œํ•ด์•ผํ•œ๋‹ค๋Š” ๊ฒƒ์ž…๋‹ˆ๋‹ค. Result .

๋งˆ์ง€๋ง‰ ์š”์  : ์šฐ๋ฆฌ ๋Œ€๋ถ€๋ถ„์€ Option ๊ฐ’์— ? ๋ฅผ ์‚ฌ์šฉํ•˜๋Š” ๊ฒฝ์šฐ ํ•จ์ˆ˜์˜ ๋ฐ˜ํ™˜ ์œ ํ˜•๋„ Option ์—ฌ์•ผํ•ฉ๋‹ˆ๋‹ค (์˜ˆ : Result<T,()> ). ์ด๊ฒƒ์€ ์ถ”๋ก  ์ œํ•œ์— ๋„์›€์ด ๋  ๊ฒƒ์ž…๋‹ˆ๋‹ค. ๋งŽ์€ ๊ฒฝ์šฐ์— ์„ ์–ธ ๋œ ๋ฐ˜ํ™˜ ์œ ํ˜•์—์„œ ์–ด๋–ค ์œ ํ˜•์ด ํ•„์š”ํ•œ์ง€ ์ถ”๋ก  ํ•  ์ˆ˜ ์žˆ๊ธฐ ๋•Œ๋ฌธ์ž…๋‹ˆ๋‹ค.

์ƒํ˜ธ ๋ณ€ํ™˜์„ ์›ํ•˜์ง€ ์•Š๋Š” ์ด์œ ๋Š” x ์— ์ •์ˆ˜ ์œ ํ˜•์ด ์žˆ๋”๋ผ๋„ C๊ฐ€ if x ํ—ˆ์šฉํ•˜๋Š” ๊ฒƒ๊ณผ ์œ ์‚ฌํ•œ ๋Š์Šจํ•œ ๋…ผ๋ฆฌ๋กœ ์ด์–ด์งˆ ๊ฐ€๋Šฅ์„ฑ์ด ์žˆ๊ธฐ ๋•Œ๋ฌธ์ž…๋‹ˆ๋‹ค. ์ฆ‰, Option<T> ๊ฐ€ ๊ฐ’์„ ๋‚˜ํƒ€๋‚ด๋ฉฐ None ๋Š” ํ•ด๋‹น ๊ฐ’์˜ ๋„๋ฉ”์ธ์˜ ์ผ๋ถ€์ด๊ณ  Result<> ๋Š” (์ผ๋ฐ˜์ ์œผ๋กœ) ํ•จ์ˆ˜์˜ ์‹คํŒจ๋ฅผ ๋‚˜ํƒ€๋ƒ…๋‹ˆ๋‹ค. ์„ฑ๊ณตํ•˜๋ ค๋ฉด None ํ•จ์ˆ˜๊ฐ€ ์˜ค๋ฅ˜๊ฐ€ ์˜์‹ฌ ์Šค๋Ÿฌ์›Œ์•ผํ•œ๋‹ค๋Š” ๊ฒƒ์„ ์˜๋ฏธํ•œ๋‹ค๊ณ  ๊ฐ€์ •ํ•˜๋ฉด (๊ทธ๋ฆฌ๊ณ  ์ž„์˜์˜ ๊ทœ์น™์ฒ˜๋Ÿผ). ๊ทธ๋Ÿฌ๋‚˜ ๊ทธ ๋…ผ์˜๋Š” RFC๋ฅผ ๊ธฐ๋‹ค๋ฆด ์ˆ˜ ์žˆ๋‹ค๊ณ  ์ƒ๊ฐํ•ฉ๋‹ˆ๋‹ค.

์ƒํ˜ธ ๋ณ€ํ™˜์„ ์›ํ•˜์ง€ ์•Š๋Š” ์ด์œ ๋Š” x ์— ์ •์ˆ˜ ์œ ํ˜•์ด ์žˆ๋”๋ผ๋„ C๊ฐ€ if x ํ—ˆ์šฉํ•˜๋Š” ๊ฒƒ๊ณผ ์œ ์‚ฌํ•œ ๋Š์Šจํ•œ ๋…ผ๋ฆฌ๋กœ ์ด์–ด์งˆ ๊ฐ€๋Šฅ์„ฑ์ด ์žˆ๊ธฐ ๋•Œ๋ฌธ์ž…๋‹ˆ๋‹ค. ์ฆ‰, Option<T> ๊ฐ€ ๊ฐ’์„ ๋‚˜ํƒ€๋‚ด๋ฉฐ None ๋Š” ํ•ด๋‹น ๊ฐ’์˜ ๋„๋ฉ”์ธ์˜ ์ผ๋ถ€์ด๊ณ  Result<> ๋Š” (์ผ๋ฐ˜์ ์œผ๋กœ) ํ•จ์ˆ˜์˜ ์‹คํŒจ๋ฅผ ๋‚˜ํƒ€๋ƒ…๋‹ˆ๋‹ค. ์„ฑ๊ณตํ•˜๋ ค๋ฉด None ํ•จ์ˆ˜๊ฐ€ ์˜ค๋ฅ˜๊ฐ€ ์˜์‹ฌ ์Šค๋Ÿฌ์›Œ์•ผํ•œ๋‹ค๋Š” ๊ฒƒ์„ ์˜๋ฏธํ•œ๋‹ค๊ณ  ๊ฐ€์ •ํ•˜๋ฉด (๊ทธ๋ฆฌ๊ณ  ์ž„์˜์˜ ๊ทœ์น™์ฒ˜๋Ÿผ). ๊ทธ๋Ÿฌ๋‚˜ ๊ทธ ๋…ผ์˜๋Š” RFC๋ฅผ ๊ธฐ๋‹ค๋ฆด ์ˆ˜ ์žˆ๋‹ค๊ณ  ์ƒ๊ฐํ•ฉ๋‹ˆ๋‹ค.

๋‚˜๋Š” ์ด๊ฒƒ์— ์ง„์‹ฌ์œผ๋กœ ๋™์˜ํ•ฉ๋‹ˆ๋‹ค.

๊ฒŒ์ดํŠธ ์•ˆ์ •ํ™”์— ๋™์˜ ํ•œ ๋˜ ๋‹ค๋ฅธ ์งˆ๋ฌธ์€ From ํŠน์„ฑ์˜ impl s๊ฐ€ ๋”ฐ๋ผ์•ผ ํ•  ๊ณ„์•ฝ (๋˜๋Š” Err -upcasting ).

๋ฟก ๋นต๋€จ

๊ฒŒ์ดํŠธ ์•ˆ์ •ํ™”์— ๋™์˜ ํ•œ ๋˜ ๋‹ค๋ฅธ ์งˆ๋ฌธ์€ From ํŠน์„ฑ์˜ impls๊ฐ€ ์ค€์ˆ˜ํ•ด์•ผํ•˜๋Š” ๊ณ„์•ฝ (๋˜๋Š” Err-upcasting์— ์‚ฌ์šฉํ•˜๋Š” ํŠน์„ฑ)์„ ์ •ํ•˜๋Š” ๊ฒƒ์ด ์—ˆ์Šต๋‹ˆ๋‹ค.

๊ณผ์—ฐ. ๋‚ด ๊ธฐ์–ต์„ ๋˜ ์‚ด๋ฆฌ๊ณ  ๊ธˆ์ง€๋˜์–ด์•ผํ•œ๋‹ค๊ณ  ์ƒ๊ฐํ•˜๋Š” ๋ช‡ ๊ฐ€์ง€ ์˜ˆ๋ถ€ํ„ฐ ์‹œ์ž‘ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๊นŒ? ์•„๋‹ˆ๋ฉด ๋‹น์‹ ์ด ์—ผ๋‘์—๋‘๊ณ ์žˆ๋Š” ๋ฒ•์น™์ผ๊นŒ์š”? ๋‚˜๋Š” ์ด์™€ ๊ฐ™์€ "๋ฒ•๋ฅ "์„ ๊ฒฝ๊ณ„ํ•˜๊ณ  ์žˆ์Œ์„ ์ธ์ •ํ•ด์•ผํ•ฉ๋‹ˆ๋‹ค. ์šฐ์„ , ๊ทธ๋“ค์€ ์‹ค์ œ๋กœ ๋ฌด์‹œ๋˜๋Š” ๊ฒฝํ–ฅ์ด ์žˆ์Šต๋‹ˆ๋‹ค. ์‚ฌ๋žŒ๋“ค์€ ์˜๋„ ๋œ ํ•œ๊ณ„๋ฅผ ๋„˜์–ด์„œ๋”๋ผ๋„ ๋ชฉ์ ์— ๋งž์„ ๋•Œ ์‹ค์ œ ํ–‰๋™์„ ์ด์šฉํ•ฉ๋‹ˆ๋‹ค. ๊ทธ๋ž˜์„œ ๊ทธ๊ฒƒ์€ ๋˜ ๋‹ค๋ฅธ ์งˆ๋ฌธ์œผ๋กœ ์ด์–ด์ง‘๋‹ˆ๋‹ค. ๋งŒ์•ฝ ์šฐ๋ฆฌ์—๊ฒŒ ๋ฒ•์ด ์žˆ๋‹ค๋ฉด, ์šฐ๋ฆฌ๋Š” ๊ทธ๊ฒƒ์„ ์–ด๋–ค ์šฉ๋„๋กœ ์‚ฌ์šฉํ•  ๊ฒƒ์ธ๊ฐ€? ์ตœ์ ํ™”? (ํ•˜์ง€๋งŒ ๋‚˜์—๊ฒŒ๋Š” ์—†์„ ๊ฒƒ ๊ฐ™์Šต๋‹ˆ๋‹ค.)

๊ทธ๋Ÿฐ๋ฐ catch ํ‘œํ˜„์‹์˜ ์ƒํƒœ๋Š” ์–ด๋–ป์Šต๋‹ˆ๊นŒ? ๊ตฌํ˜„ ๋˜์—ˆ์Šต๋‹ˆ๊นŒ?

์Šฌํ”„๊ฒŒ๋„ ์•„๋‹ˆ์˜ค :(

2016 ๋…„ 7 ์›” 26 ์ผ ํ™”์š”์ผ 06:41:44 AM -0700์— Alexander Bulaev๋Š” ๋‹ค์Œ๊ณผ ๊ฐ™์ด ์ผ์Šต๋‹ˆ๋‹ค.

๊ทธ๋Ÿฐ๋ฐ catch ํ‘œํ˜„์‹์˜ ์ƒํƒœ๋Š” ์–ด๋–ป์Šต๋‹ˆ๊นŒ? ๊ตฌํ˜„ ๋˜์—ˆ์Šต๋‹ˆ๊นŒ?


์Šค๋ ˆ๋“œ๋ฅผ ์ž‘์„ฑํ–ˆ๊ธฐ ๋•Œ๋ฌธ์— ์ˆ˜์‹  ํ•œ ๊ฒƒ์ž…๋‹ˆ๋‹ค.
์ด ์ด๋ฉ”์ผ์— ์ง์ ‘ ๋‹ต์žฅํ•˜๊ฑฐ๋‚˜ GitHub์—์„œ ํ™•์ธํ•˜์„ธ์š”.
https://github.com/rust-lang/rust/issues/31436#issuecomment -235270663

๊ตฌํ˜„์„ ๊ณ„ํšํ•ด์•ผํ• ๊นŒ์š”? ๋ฐ›์•„ ๋“ค์—ฌ์กŒ์ง€๋งŒ ๊ตฌํ˜„๋˜์ง€ ์•Š์€ RFC๋ณด๋‹ค ๋” ์šฐ์šธํ•œ ๊ฒƒ์€ ์—†์Šต๋‹ˆ๋‹ค ...

์ฐธ์กฐ # 35056

์ฐธ๊ณ ๋กœ, https://github.com/rust-lang/rfcs/pull/1450 (์—ด๊ฑฐ ํ˜• ๋ณ€ํ˜• ์œ ํ˜•)์€ Carrier ๊ตฌํ˜„ํ•˜๋Š” ๋ช‡ ๊ฐ€์ง€ ํฅ๋ฏธ๋กœ์šด ๋ฐฉ๋ฒ•์„ ์—ด ๊ฒƒ์ž…๋‹ˆ๋‹ค. ์˜ˆ๋ฅผ ๋“ค๋ฉด ๋‹ค์Œ๊ณผ ๊ฐ™์Šต๋‹ˆ๋‹ค.

trait Carrier {
    type Success: CarrierSuccess;
    type Error: CarrierError;
}

trait CarrierSuccess {
    type Value;
    fn into_value(self) -> Self::Value;
}

// (could really use some HKT...)
trait CarrierError<Equivalent: CarrierError> {
    fn convert_error(self) -> Equivalent;
}

impl<T, E> Carrier for Result<T, E>
{
    type Success = Result::Ok<T, E>;
    type Error = Result::Err<T, E>;
}

impl<T, E> CarrierSuccess for Result::Ok<T, E> {
    type Value = T;
    fn into_value(self) -> Self::Value {
        self.0
    }
}

impl<T, E1, E2> CarrierError<Result::Err<T, E2>> for Result::Err<T, E1>
    where E2: From<E1>,
{
    fn convert_error(self) -> Result::Err<T, E2> {
        Err(self.into())
    }
}

impl<T> Carrier for Option<T>
{
    type Success = Option::Some<T>;
    type Error = None;
}

impl<T> CarrierSuccess for Option::Some<T> {
    type Value = T;
    fn into_value(self) -> Self::Value {
        self.0
    }
}

impl<T> CarrierError<Option::None> for Option::None {
    fn convert_error(self) -> Option::None {
        self
    }
}

fn main() {
    let value = match might_be_err() {
        ok @ Carrier::Success => ok.into_value(),
        err @ Carrier::Error => return err.convert_error(),
    }
}

https://github.com/rust-lang/rust/pull/35056#issuecomment -240129923์—์„œ ๋ช‡ ๊ฐ€์ง€ ์ƒ๊ฐ์„ ๊ต์ฐจ ๊ฒŒ์‹œํ•˜๊ณ  ์‹ถ์—ˆ์Šต๋‹ˆ๋‹ค. ๊ทธ PR์€ ๋”๋ฏธ ์œ ํ˜•์˜ Carrier ํŠน์„ฑ์„ ์†Œ๊ฐœํ•ฉ๋‹ˆ๋‹ค. ์˜๋„๋Š” ๋ณดํ˜ธ๋ฅผ์œ„ํ•œ ๊ฒƒ์ด ์—ˆ์Šต๋‹ˆ๋‹ค. ํŠนํžˆ ์œ ํ˜• ์ถ”๋ก ๊ณผ์˜ ์ƒํ˜ธ ์ž‘์šฉ์„ ์•ˆ์ •ํ™”ํ•˜์ง€ ์•Š๊ณ ๋„ ? ๋ฅผ ์•ˆ์ •ํ™”ํ•˜๊ณ ์žํ–ˆ์Šต๋‹ˆ๋‹ค. ์ด ํŠน์„ฑ๊ณผ ๋”๋ฏธ ์œ ํ˜•์˜ ์กฐํ•ฉ์€ ์•ˆ์ „ํ•˜๊ฒŒ ๋ณด์ˆ˜์  ์ผ ๊ฒƒ ๊ฐ™์•˜์Šต๋‹ˆ๋‹ค.

์•„์ด๋””์–ด๋Š” ์šฐ๋ฆฌ๊ฐ€ Carrier ๋…ผ์˜ํ•˜๋Š” RFC๋ฅผ ์ž‘์„ฑํ•˜๊ณ  ์ผ์น˜ํ•˜๋„๋ก ๋””์ž์ธ์„ ์ˆ˜์ •ํ•˜์—ฌ ์ „์ฒด ๋ชจ์–‘์— ๋งŒ์กฑํ•  ๋•Œ๋งŒ ์•ˆ์ •ํ™” (๋˜๋Š” Carrier ์ œ๊ฑฐ ๊ฐ€๋Šฅ) ์šฐ๋ฆฌ๊ฐ€ ์ข‹์•„ํ•˜๋Š” ๋””์ž์ธ์— ๋„๋‹ฌ ํ•  ์ˆ˜์—†๋Š” ๊ฒฝ์šฐ ๋ชจ๋‘

์ด์ œ ์กฐ๊ธˆ ๋” ์ถ”์ธก ์ ์œผ๋กœ ๋งํ•˜๋ฉด, Carrier ํŠน์„ฑ์„ ์ฑ„ํƒํ•˜๋ฉด ์บ๋ฆฌ์–ด ๊ฐ„์˜ ์ƒํ˜ธ ๋ณ€ํ™˜์„ ํ—ˆ์šฉํ•˜์ง€ ์•Š์„ ๊ฒƒ์ž…๋‹ˆ๋‹ค (์ด ํŠน์„ฑ์€ ๊ธฐ๋ณธ์ ์œผ๋กœ Result ๋กœ /์—์„œ ๋ณ€ํ™˜ํ•˜๋Š” ๋ฐฉ๋ฒ•์ž…๋‹ˆ๋‹ค). ? ๋ฅผ Option ์— ์ ์šฉํ•˜๋ฉด fn์ด Option ๋ฐ˜ํ™˜ํ•ด๋„ ๊ดœ์ฐฎ์Šต๋‹ˆ๋‹ค. ? ๋ฅผ Result<T,E> ์— ์ ์šฉํ•˜๋ฉด fn์ด Result<U,F> ๋ฐ˜ํ™˜ํ•˜๋ฉด ๊ดœ์ฐฎ์Šต๋‹ˆ๋‹ค. ์—ฌ๊ธฐ์„œ E: Into<F> ; ํ•˜์ง€๋งŒ ? ์„ Option ํ•˜๊ณ  fn์ด Result<..> ๋ฐ˜ํ™˜ํ•˜๋ฉด ๊ดœ์ฐฎ์ง€ ์•Š์Šต๋‹ˆ๋‹ค.

์ฆ‰, ์ด๋Ÿฌํ•œ ์ข…๋ฅ˜์˜ ๊ทœ์น™์€ ์˜ค๋Š˜๋‚ ์˜ ์œ ํ˜• ์‹œ์Šคํ…œ์—์„œ ํ‘œํ˜„ํ•˜๊ธฐ ์–ด๋ ต์Šต๋‹ˆ๋‹ค. ๊ฐ€์žฅ ๋ถ„๋ช…ํ•œ ์‹œ์ž‘์ ์€ HKT์™€ ๊ฐ™์€ ๊ฒƒ์ž…๋‹ˆ๋‹ค (๋ฌผ๋ก  ์‹ค์ œ๋กœ๋Š” ์—†์ง€๋งŒ ์ง€๊ธˆ์€ ๋ฌด์‹œํ•˜๊ฒ ์Šต๋‹ˆ๋‹ค). ๊ทธ๋Ÿฌ๋‚˜ ๊ทธ๊ฒƒ์€ ๋ถ„๋ช…ํžˆ ์™„๋ฒฝํ•˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค. ์šฐ๋ฆฌ๊ฐ€ ๊ทธ๊ฒƒ์„ ์‚ฌ์šฉํ•œ๋‹ค๋ฉด, ํ•˜๋‚˜๋Š” ๊ฐ€์ • ๊ฒƒ์ด ๊ทธ Self ๋งค๊ฐœ ๋ณ€์ˆ˜ Carrier ์ด ์ข…๋ฅ˜์˜ type -> type -> type , ์ดํ›„ Result ๊ตฌํ˜„ํ•  ์ˆ˜ Carrier . ๊ทธ๋Ÿฌ๋ฉด Self<T,E> -> Self<U,F> ๊ฐ™์€ ๊ฒƒ์„ ํ‘œํ˜„ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ๊ทธ๋Ÿฌ๋‚˜ type -> type ์ข…๋ฅ˜๊ฐ€์žˆ๋Š” Option ๋ฐ˜๋“œ์‹œ ์ ์šฉ๋˜๋Š” ๊ฒƒ์€ _ ์•„๋‹™๋‹ˆ๋‹ค _ (์ด ๋ชจ๋“  ๊ฒƒ์€ ์šฐ๋ฆฌ๊ฐ€ ์ฑ„ํƒํ•œ HKT ์‹œ์Šคํ…œ์˜ ์ข…๋ฅ˜์— ๋”ฐ๋ผ ์ •ํ™•ํžˆ ๋‹ฌ๋ผ ์ง€๊ฒ ์ง€๋งŒ ์ €๋Š” ์šฐ๋ฆฌ๊ฐ€ "์ผ๋ฐ˜ํ˜• ๋žŒ๋‹ค"๋กœ ๋๊นŒ์ง€ ๊ฐˆ ๊ฒƒ์ž…๋‹ˆ๋‹ค). ๋” ๊ทน๋‹จ์  ์ธ ๊ฒƒ์€ bool ์™€ ๊ฐ™์€ ์œ ํ˜•์ผ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค (๋ถ€์šธ์— ๋Œ€ํ•ด Carrier ๋ฅผ ๊ตฌํ˜„ํ•˜๊ณ  ์‹ถ์ง€๋Š” ์•Š์ง€๋งŒ ์ผ๋ถ€ ์‚ฌ๋žŒ๋“ค์€ newtype์— ๋Œ€ํ•ด Carrier ๋ฅผ ๊ตฌํ˜„ํ•˜๊ณ  ์‹ถ์„ ๊ฒƒ์ž…๋‹ˆ๋‹ค. 'd bool).

์ œ๊ฐ€ ๊ณ ๋ คํ•œ ๊ฒƒ์€ ? ๋Œ€ํ•œ ์ž…๋ ฅ ๊ทœ์น™ ์ž์ฒด๊ฐ€ ํŠน๋ณ„ ํ•  ์ˆ˜ ์žˆ๋‹ค๋Š” ๊ฒƒ์ž…๋‹ˆ๋‹ค. ์˜ˆ๋ฅผ ๋“ค์–ด ? Foo<..> ๋Š” _some_์˜ ๋ช…๋ชฉ ์œ ํ˜• Carrier ํŠน์„ฑ๊ณผ ์ผ์น˜ํ•˜์ง€๋งŒ fn์„ ๋‘˜๋Ÿฌ์‹ผ ๋ฐ˜ํ™˜ ์œ ํ˜•๋„ Foo<..> ํ•ฉ๋‹ˆ๋‹ค. ๋”ฐ๋ผ์„œ ๊ธฐ๋ณธ์ ์œผ๋กœ ์ƒˆ๋กœ์šด ์œ ํ˜• ๋งค๊ฐœ ๋ณ€์ˆ˜๋กœ Foo ๋ฅผ ์ธ์Šคํ„ด์Šคํ™”ํ•ฉ๋‹ˆ๋‹ค. ์ด ์•„์ด๋””์–ด์˜ ๋‹จ์ ์€ ? ์ด ์ ์šฉ๋˜๋Š” ์œ ํ˜•์ด๋‚˜ ๋‘˜๋Ÿฌ์‹ธ๋Š” fn์˜ ์œ ํ˜•์„ ์•Œ ์ˆ˜์—†๋Š” ๊ฒฝ์šฐ ์ƒˆ๋กœ์šด ์ข…๋ฅ˜์˜ ํŠน์„ฑ ์˜๋ฌด๋ฅผ ์ถ”๊ฐ€ํ•˜์ง€ ์•Š๊ณ ๋Š”์ด ์ œ์•ฝ์„ ์ ์šฉ ํ•  ์ˆ˜ ์—†๋‹ค๋Š” ๊ฒƒ์ž…๋‹ˆ๋‹ค. ๋˜ํ•œ ๋‹ค์†Œ ์ž„์‹œ์ ์ž…๋‹ˆ๋‹ค. :)ํ•˜์ง€๋งŒ ์ž‘๋™ํ•ฉ๋‹ˆ๋‹ค.

๋˜ ๋‹ค๋ฅธ ์ƒ๊ฐ์€ Carrier ํŠน์„ฑ์„ ์žฌ๊ณ  ํ•  ์ˆ˜ ์žˆ๋‹ค๋Š” ๊ฒƒ์ž…๋‹ˆ๋‹ค. ์•„์ด๋””์–ด๋Š” Expr: Carrier<Return> ๋ฅผ ๊ฐ–๋Š” ๊ฒƒ์ž…๋‹ˆ๋‹ค. ์—ฌ๊ธฐ์„œ Expr ๋Š” ? ์œ ํ˜•์ด ์ ์šฉ๋˜๊ณ  Return ๋Š” ํ™˜๊ฒฝ ์œ ํ˜•์ž…๋‹ˆ๋‹ค. ์˜ˆ๋ฅผ ๋“ค์–ด ๋‹ค์Œ๊ณผ ๊ฐ™์ด ๋ณด์ผ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

trait Carrier<Target> {
    type Ok;
    fn is_ok(&self) -> bool; // if true, represents the "ok-like" variant
    fn unwrap_into_ok(self) -> Self::Ok; // may panic if not ok
    fn unwrap_into_error(self) -> Target; // may panic if not error
}

๊ทธ๋Ÿฐ ๋‹ค์Œ expr? ํƒˆ๋‹น :

let val = expr;
if Carrier::is_ok(&val) {
    val.unwrap_into_ok()
} else {
    return val.unwrap_into_error();
}

์—ฌ๊ธฐ์„œ ์ค‘์š”ํ•œ ์ฐจ์ด์ ์€ Target ๋Š” _error_ ์œ ํ˜•์ด ์•„๋‹ˆ๋ผ ์ƒˆ๋กœ์šด Result ์œ ํ˜•์ด๋ผ๋Š” ๊ฒƒ์ž…๋‹ˆ๋‹ค. ์˜ˆ๋ฅผ ๋“ค์–ด ๋‹ค์Œ๊ณผ ๊ฐ™์€ impl์„ ์ถ”๊ฐ€ ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

impl<T,U,E,F> Carrier<Result<U,F>> for Result<T,E>
    where E: Into<F>
{
    type Ok = T;
    fn is_ok(&self) -> bool { self.is_ok() }
    fn unwrap_into_ok(self) -> Self::Ok { self.unwrap() }
    fn unwrap_into_error(self) -> { Err(F::from(self.unwrap_err())) }
}

๊ทธ๋ฆฌ๊ณ  ๋‹ค์Œ์„ ์ถ”๊ฐ€ ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

impl<T> Carrier<Option<T>> for Option<T> {
    type Ok = T;
    fn is_ok(&self) -> bool { self.is_some() }
    fn unwrap_into_ok(self) -> Self::Ok { self.unwrap() }
    fn unwrap_into_error(self) -> { debug_assert!(self.is_none()); None }
}

๋งˆ์ง€๋ง‰์œผ๋กœ ๋‹ค์Œ๊ณผ ๊ฐ™์ด bool์„ ๊ตฌํ˜„ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

struct MyBool(bool);
impl<T> Carrier<MyBool> for MyBool {
    type Ok = ();
    fn is_ok(&self) -> bool { self.0 }
    fn unwrap_into_ok(self) -> Self::Ok { debug_assert!(self.0); () }
    fn unwrap_into_error(self) -> { debug_assert!(!self.0); self }
}

์ด์ œ์ด ๋ฒ„์ „์€ ๋” ์œ ์—ฐํ•ฉ๋‹ˆ๋‹ค. ์˜ˆ๋ฅผ ๋“ค์–ด ๋‹ค์Œ๊ณผ ๊ฐ™์ด Result ์„ ์ถ”๊ฐ€ํ•˜์—ฌ impl Option ๊ฐ’ ๊ฐ„์˜ ์ƒํ˜ธ ๋ณ€ํ™˜์„ Result ๋กœ ๋ณ€ํ™˜ ํ•  ์ˆ˜ _ ๊ฐ€๋Šฅํ•ฉ๋‹ˆ๋‹ค _.

impl<T> Carrier<Result<T,()>> for Option<T> { ... }

๊ทธ๋Ÿฌ๋‚˜ ๋ฌผ๋ก  ์šฐ๋ฆฌ๋Š” ๊ทธ๋Ÿด ํ•„์š”๊ฐ€ ์—†์Šต๋‹ˆ๋‹ค (๊ทธ๋ฆฌ๊ณ  ๊ทธ๋ ‡๊ฒŒํ•˜์ง€ ์•Š์„ ๊ฒƒ์ž…๋‹ˆ๋‹ค).

๋ฟก๋ฟก

์ฐธ๊ณ ๋กœ rust-lang / rfcs # 1450 (์—ด๊ฑฐ ํ˜• ๋ณ€ํ˜•์˜ ์œ ํ˜•)์€ Carrier๋ฅผ ๊ตฌํ˜„ํ•˜๋Š” ๋ช‡ ๊ฐ€์ง€ ํฅ๋ฏธ๋กœ์šด ๋ฐฉ๋ฒ•์„ ์—ด ๊ฒƒ์ž…๋‹ˆ๋‹ค.

๋ฐฉ๊ธˆ ์ž‘์„ฑํ•œ ์•„์ด๋””์–ด๋ฅผ ์ž‘์„ฑํ•˜๋ฉด์„œ ์—ด๊ฑฐ ํ˜• ๋ณ€ํ˜•์— ๋Œ€ํ•œ ์œ ํ˜•์„ ๊ฐ–๋Š” ๊ฒƒ๊ณผ ๊ทธ๊ฒƒ์ด ์–ด๋–ค ์˜ํ–ฅ์„ ๋ฏธ์น ์ง€์— ๋Œ€ํ•ด ์ƒ๊ฐํ•˜๊ณ ์žˆ์—ˆ์Šต๋‹ˆ๋‹ค.

? ๋ฅผ ์‚ฌ์šฉํ•˜๋Š” ์ฝ”๋“œ๋ฅผ ์ž‘์„ฑํ•˜๋Š” ํ•œ ๊ฐ€์ง€ ์‚ฌ์‹ค์€ "throw"ํ‚ค์›Œ๋“œ๋ฅผ ์‚ฌ์šฉํ•˜์ง€ ์•Š๋Š” ๊ฒƒ์ด ์•ฝ๊ฐ„ ์„ฑ๊ฐ€์‹  ๊ฒƒ์ž…๋‹ˆ๋‹ค. ํŠนํžˆ Err(foo)? ๋ฅผ ์ž‘์„ฑํ•˜๋ฉด ์ปดํŒŒ์ผ๋Ÿฌ๊ฐ€ t _know_ ์ด๊ฒƒ์ด ๋ฐ˜ํ™˜ ๋  ๊ฒƒ์ด๋ฏ€๋กœ return Err(foo) ๋ฅผ ์ž‘์„ฑํ•ด์•ผํ•ฉ๋‹ˆ๋‹ค. ๊ดœ์ฐฎ์ง€ ๋งŒ ์ง์ ‘ ์ž‘์„ฑํ•˜์ง€ ์•Š๊ณ ๋Š” into() ์ „ํ™˜์„ ์–ป์„ ์ˆ˜ ์—†์Šต๋‹ˆ๋‹ค.

์ด๊ฒƒ์€ ๋‹ค์Œ๊ณผ ๊ฐ™์€ ๊ฒฝ์šฐ์— ๋‚˜ํƒ€๋‚ฉ๋‹ˆ๋‹ค.

let value = if something_or_other() { foo } else { return Err(bar) };

์•„, ํ•œ ๊ฐ€์ง€ ๋” ์ถ”๊ฐ€ํ•ด์•ผํ•ฉ๋‹ˆ๋‹ค. impls๊ฐ€ ์œ ํ˜• ์ถ”๋ก ์— ์˜ํ–ฅ์„ ๋ฏธ์น  ์ˆ˜ ์žˆ๋„๋ก ํ—ˆ์šฉํ•œ๋‹ค๋Š” ์‚ฌ์‹ค์€ _should_ fn์ด Result<..> ๋ฐ˜ํ™˜ํ•˜๋Š” ์ปจํ…์ŠคํŠธ์—์„œ foo.iter().map().collect()? ์˜๋ฏธํ•ฉ๋‹ˆ๋‹ค. fn ๋ฐ˜ํ™˜ ์œ ํ˜•์€ Result ์ด๋ฉฐ ํ•˜๋‚˜์˜ impl ๋งŒ ์ž ์žฌ์ ์œผ๋กœ ์ ์šฉ๋ฉ๋‹ˆ๋‹ค (์ ์–ด๋„ ๋กœ์ปฌ์—์„œ).

์•„, ๊ทธ๋ฆฌ๊ณ  ๋‚ด Carrier ํŠน์„ฑ์˜ ์•ฝ๊ฐ„ ๋” ๋‚˜์€ ๋ฒ„์ „์€ ์•„๋งˆ๋„ ๋‹ค์Œ๊ณผ ๊ฐ™์„ ๊ฒƒ์ž…๋‹ˆ๋‹ค.

trait Carrier<Target> {
    type Ok;
    fn into_carrier(self) -> Result<Self::Ok, Target>;
}

๋‹ค์Œ๊ณผ ๊ฐ™์ด ๊ตฌํ˜„ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

impl<T,U,E,F> Carrier<Result<U,F>> for Result<T,E>
    where E: Into<F>
{
    type Ok = T;
    fn into_carrier(self) -> Result<T, Result<U,F>> {
        match self { Ok(v) => Ok(v), Err(e) => Err(e.into()) }
    }
}

๊ทธ๋ฆฌ๊ณ  expr? ๋Š” ๋‹ค์Œ๊ณผ ๊ฐ™์€ ์ฝ”๋“œ๋ฅผ ์ƒ์„ฑํ•ฉ๋‹ˆ๋‹ค.

match Carrier::into_carrier(expr) {
    Ok(v) => v,
    Err(e) => return e,
}

๋ฌผ๋ก  ์ด๊ฒƒ์˜ ๋‹จ์  (๋˜๋Š” ์žฅ์  ...)์€ Into ๋ณ€ํ™˜์ด impls๋กœ ํ‘ธ์‹œ๋œ๋‹ค๋Š” ๊ฒƒ์ž…๋‹ˆ๋‹ค. ์ฆ‰, ์‚ฌ๋žŒ๋“ค์ด ์˜๋ฏธ๊ฐ€์žˆ์„ ๋•Œ ์‚ฌ์šฉํ•˜์ง€ ์•Š์„ ์ˆ˜๋„ ์žˆ์Šต๋‹ˆ๋‹ค. ๊ทธ๋Ÿฌ๋‚˜ ์›ํ•˜์ง€ ์•Š๋Š” ๊ฒฝ์šฐ (ํŠน์ • ์œ ํ˜•์— ๋Œ€ํ•ด) ๋น„ํ™œ์„ฑํ™” ํ•  ์ˆ˜๋„ ์žˆ์Šต๋‹ˆ๋‹ค.

@nikomatsakis IMO, ํŠน์„ฑ์€ IntoCarrier ์ด์–ด์•ผํ•˜๋ฉฐ IntoCarrier::into_carrier ๋Š” ์ด์™€ ๊ฐ™์€ ๊ฒฐ๊ณผ๋ฅผ ์žฌ์‚ฌ์šฉํ•˜๋Š” ๋Œ€์‹  Carrier (์ƒˆ ์—ด๊ฑฐ ํ˜•)์„ ๋ฐ˜ํ™˜ํ•ด์•ผํ•ฉ๋‹ˆ๋‹ค. ๊ทธ๊ฑด:

enum Carrier<C, R> {
    Continue(C),
    Return(R),
}
trait IntoCarrier<Return> {
    type Continue;
    fn into_carrier(self) -> Carrier<Self::Continue, Return>;
}

@ Stebalien ํ™•์‹คํžˆ ๊ดœ์ฐฎ์•„ ๋ณด์ž…๋‹ˆ๋‹ค.

lang ํŒ€ ํšŒ์˜์—์„œ ํ† ๋ก  (๋ฐ ? ์šด์˜์ž ๋งŒ ๊ฐ€๋Šฅํ•œ FCP)์„ ์œ„ํ•ด ์ง€๋ช…ํ•ฉ๋‹ˆ๋‹ค. ๋‚˜๋Š” ์šฐ๋ฆฌ๊ฐ€ FCP์— ์•ž์œผ๋กœ ๋ฉฐ์น  ์•ˆ์— ์ผ์ข…์˜ ์ผ์‹œ์ ์ธ Carrier ํŠน์„ฑ์„ ์ฐฉ๋ฅ™์‹œ์ผœ์•ผํ•œ๋‹ค๊ณ  ์ƒ๊ฐํ•ฉ๋‹ˆ๋‹ค.

Carrier ํŠน์„ฑ์— ๋Œ€ํ•ด ๋…ผ์˜ํ•˜๊ธฐ ์œ„ํ•ด rust-lang / rfcs # 1718์„ ์—ด์—ˆ์Šต๋‹ˆ๋‹ค.

๋“ค์œผ์‹ญ์‹œ์˜ค, ๋“ค์œผ์‹ญ์‹œ์˜ค! ? ์—ฐ์‚ฐ์ž๋Š” ์ด์ œ ์ตœ์ข… ๋Œ“๊ธ€ ๊ธฐ๊ฐ„์„ ์ž…๋ ฅํ•˜๊ณ  ์žˆ์Šต๋‹ˆ๋‹ค. ์ด ํ† ๋ก ์€ 8 ์›” 18 ์ผ์— ์‹œ์ž‘๋œ ๋Œ€๋žต์ด ๋ฆด๋ฆฌ์Šค์ฃผ๊ธฐ ๋™์•ˆ ์ง€์†๋ฉ๋‹ˆ๋‹ค. ๊ฒฝํ–ฅ์€ ? ์—ฐ์‚ฐ์ž๋ฅผ ์•ˆ์ •ํ™” ํ•˜๋Š” ๊ฒƒ์ž…๋‹ˆ๋‹ค.

์บ๋ฆฌ์–ด ํŠน์„ฑ ๊ณผ ๊ด€๋ จํ•˜์—ฌ, ์œ ํ˜• ์ถ”๋ก ๊ณผ์˜ ์›์น˜ ์•Š๋Š” ์ƒํ˜ธ ์ž‘์šฉ์„ ๋ฐฉ์ง€ํ•˜์—ฌ ์–ด๋Š ์ชฝ์ด๋“  ์ž์œ ๋กญ๊ฒŒ ๊ฒฐ์ •ํ•  ์ˆ˜ ์žˆ๋„๋กํ•˜๋Š” ์ž„์‹œ ๋ฒ„์ „์ด # 35777์— ๋„์ฐฉํ–ˆ์Šต๋‹ˆ๋‹ค.

@ rust-lang / lang ํšŒ์›๋‹˜, ๋™์˜๋ฅผ ํ‘œ์‹œํ•˜๋ ค๋ฉด ์ด๋ฆ„์„ ํ™•์ธํ•˜์„ธ์š”. ์šฐ๋ ค ์‚ฌํ•ญ์ด๋‚˜ ์ด์˜๊ฐ€์žˆ๋Š” ์˜๊ฒฌ์„ ๋‚จ๊ฒจ์ฃผ์„ธ์š”. ๊ธฐํƒ€ ์˜๊ฒฌ์„ ๋‚จ๊ฒจ์ฃผ์„ธ์š”. ๊ฐ์‚ฌ!

  • [x] @nikomatsakis
  • [x] @nrc
  • [x] @aturon
  • [x] @eddyb
  • [] @pnkfelix (ํœด๊ฐ€ ์ค‘)

tokio ๊ธฐ๋ฐ˜ ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ๊ฐ€ and_then ๋งŽ์ด ์‚ฌ์šฉํ•˜๊ฒŒ ๋ ์ง€ ๊ถ๊ธˆํ•ฉ๋‹ˆ๋‹ค. ์ด๋Š” foo().?bar() ๋ฅผ foo().and_then(move |v| v.bar()) ์ถ•์•ฝ ํ˜•์œผ๋กœ ์‚ฌ์šฉํ•˜์—ฌ ๊ฒฐ๊ณผ์™€ ์„ ๋ฌผ์ด ๋™์ผํ•œ ํ‘œ๊ธฐ๋ฒ•์„ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ๋„๋กํ•˜๋Š” ํ•˜๋‚˜์˜ ์ธ์ˆ˜์ž…๋‹ˆ๋‹ค.

๋ช…ํ™•ํ•˜๊ฒŒ ๋งํ•˜๋ฉด,์ด FCP๋Š” question_mark ๊ธฐ๋Šฅ์— ๊ด€ํ•œ ๊ฒƒ์ด์ง€ catch๊ฐ€ ์•„๋‹™๋‹ˆ๋‹ค. ๋งž์Šต๋‹ˆ๊นŒ? ์ด ํ˜ธ์˜ ์ œ๋ชฉ์€ ์ด๋ฒˆ ํ˜ธ์—์„œ ๋‘ ๊ธฐ๋Šฅ์„ ๋ชจ๋‘ ์ถ”์ ํ•œ๋‹ค๋Š” ๊ฒƒ์„ ์˜๋ฏธํ•ฉ๋‹ˆ๋‹ค.

@seanmonstar ํ›„์ž๋Š” ๊ตฌํ˜„๋˜์ง€ ์•Š์•˜์œผ๋ฏ€๋กœ ์˜ˆ. ์•„๋งˆ๋„ FCP๊ฐ€ ์ˆ˜๋ฝ ๊ฒฐ๊ณผ๋ฅผ ๊ฐ€์ ธ ์˜ค๋ฉด catch ์ถ”์ ํ•˜๋„๋ก ๋ณ€๊ฒฝ ๋  ๊ฒƒ์ž…๋‹ˆ๋‹ค.

๋ช…ํ™•ํ•˜๊ฒŒ ๋งํ•˜๋ฉด์ด FCP๋Š” question_mark ๊ธฐ๋Šฅ์— ๊ด€ํ•œ ๊ฒƒ์ด์ง€ catch๊ฐ€ ์•„๋‹™๋‹ˆ๋‹ค. ๋งž์Šต๋‹ˆ๊นŒ? ์ด ํ˜ธ์˜ ์ œ๋ชฉ์€ ์ด๋ฒˆ ํ˜ธ์—์„œ ๋‘ ๊ธฐ๋Šฅ์„ ๋ชจ๋‘ ์ถ”์ ํ•œ๋‹ค๋Š” ๊ฒƒ์„ ์˜๋ฏธํ•ฉ๋‹ˆ๋‹ค.

์˜ˆ, question_mark ๊ธฐ๋Šฅ

https://github.com/rust-lang/rfcs/issues/1718#issuecomment -241764523 ํ›„์† ์กฐ์น˜. ๋‚˜๋Š” ํ˜„์žฌ์˜ ํ–‰๋™์„ ์ƒ๊ฐํ–ˆ๋‹ค ? "๋ฐ”์ธ๋“œ ํ˜„์žฌ ๊ณ„์†"์œผ๋กœ ์ผ๋ฐ˜ํ™”ํ•˜์ง€๋งŒ, ์ˆ˜ map_err(From::from) ๋ถ€๋ถ„ ? / : ๊ทธ๊ฒƒ์€ ์•ฝ๊ฐ„ ๋” ๋ฐฉ๊ธˆ ๋ฐ”์ธ๋“œ๋ณด๋‹ค ์ˆ˜์—๊ฒŒ. ๊ฒฐ๊ณผ์— ๋Œ€ํ•ด From ์ธ์Šคํ„ด์Šค๋ฅผ ๋ชจ๋‘ ์ถ”๊ฐ€ํ•˜๋ฉด ์˜๋ฏธ ์ฒด๊ณ„๊ฐ€ v? => from(v.bind(current-continuation)) ์ˆ˜ ์žˆ๋‹ค๊ณ  ๊ฐ€์ •ํ•ฉ๋‹ˆ๋‹ค.

์ด ๋‚ด๋ถ€ ์Šค๋ ˆ๋“œ์—์„œ ? ์˜ ์ƒ๋Œ€์ ์ธ ์žฅ์ ์— ๋Œ€ํ•ด ๋งŽ์€ ๋…ผ์˜๊ฐ€์žˆ์—ˆ์Šต๋‹ˆ๋‹ค.

https://internals.rust-lang.org/t/the-operator-will-be-harmful-to-rust/3882/

์ง€๊ธˆ์€ ์‹ฌ์ธต ์š”์•ฝ์„ ํ•  ์‹œ๊ฐ„์ด ์—†์Šต๋‹ˆ๋‹ค. ๋‚ด ๊ธฐ์–ต์€ ๋Œ“๊ธ€์ด ? ๊ฐ€ ์˜ค๋ฅ˜์—์ฃผ์˜๋ฅผ ๊ธฐ์šธ์ผ๋งŒํผ ์ถฉ๋ถ„ํžˆ ๋ณด์ด๋Š”์ง€์— ๋Œ€ํ•œ ์งˆ๋ฌธ์— ์ดˆ์ ์„ ๋งž์ถ”๊ณ  ์žˆ๋‹ค๋Š” ๊ฒƒ์ž…๋‹ˆ๋‹ค.ํ•˜์ง€๋งŒ ํ† ๋ก ์˜ ๋‹ค๋ฅธ ์ธก๋ฉด์„ ๊ฐ„๊ณผํ•˜๊ณ  ์žˆ์Šต๋‹ˆ๋‹ค. ๋‹ค๋ฅธ ์‚ฌ๋žŒ์ด ์š”์•ฝ ํ•  ์‹œ๊ฐ„์ด ์žˆ๋‹ค๋ฉด ์ข‹์„ ๊ฒƒ์ž…๋‹ˆ๋‹ค!

๋‚˜๋Š” ์ด์ „์— ์ฃผ์„์„ ๋‹ฌ์ง€ ์•Š์•˜๊ณ  ์ด๊ฒƒ์€ ๋„ˆ๋ฌด ๋Šฆ์—ˆ์„ ์ˆ˜๋„ ์žˆ์ง€๋งŒ ? ์—ฐ์‚ฐ์ž๊ฐ€ ์ˆจ๊ฒจ์ง„ return ๋ฌธ์œผ๋กœ ์‚ฌ์šฉ๋˜๋ฉด ํ˜ผ๋ž€ ์Šค๋Ÿฝ์Šต๋‹ˆ๋‹ค. @ hauleth ๊ฐ€ @๋ฅผ ๋งํฌ ํ•œ ํ† ๋ก ์—์„œ ์ง€์ ํ–ˆ๋“ฏ์ด nikomatsakis.

try! ํ•˜๋ฉด ๋งคํฌ๋กœ๊ฐ€์ด๋ฅผ ์ˆ˜ํ–‰ ํ•  ์ˆ˜ ์žˆ๊ธฐ ๋•Œ๋ฌธ์— ์–ด๋”˜๊ฐ€์— ๋ฐ˜ํ™˜์ด์žˆ์„ ์ˆ˜ ์žˆ์Œ์ด ๋ถ„๋ช…ํ–ˆ์Šต๋‹ˆ๋‹ค. ? ๋ฅผ ์ˆจ๊ฒจ์ง„ return ๋กœ ์‚ฌ์šฉํ•˜๋ฉด ํ•จ์ˆ˜์—์„œ ๊ฐ’์„ ๋ฐ˜ํ™˜ํ•˜๋Š” ์„ธ ๊ฐ€์ง€ ๋ฐฉ๋ฒ•์ด ์žˆ์Šต๋‹ˆ๋‹ค.

  • ์•”์‹œ ์  ๋ฐ˜ํ™˜
  • ๋ช…์‹œ ์  ๋ฐ˜ํ’ˆ
  • ?

@CryZe๊ฐ€ ๋งํ–ˆ๋“ฏ์ด ๋‚˜๋Š” ์ด๊ฒƒ์„ ์ข‹์•„ํ•ฉ๋‹ˆ๋‹ค.

์ด๋ ‡๊ฒŒํ•˜๋ฉด ๋ชจ๋“  ์‚ฌ๋žŒ์—๊ฒŒ ์นœ์ˆ™ํ•˜๊ณ  ์˜ค๋ฅ˜๋ฅผ ๋๊นŒ์ง€ ์ „๋‹ฌํ•˜์—ฌ ์ฒ˜๋ฆฌ ํ•  ์ˆ˜ โ€‹โ€‹์žˆ์œผ๋ฉฐ ์•”์‹œ ์  ๋ฐ˜ํ™˜์ด ์—†์Šต๋‹ˆ๋‹ค. ๋”ฐ๋ผ์„œ ๋Œ€๋žต ๋‹ค์Œ๊ณผ ๊ฐ™์ด ๋ณด์ผ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

let a = try! (x? .y? .z);

์ด๋Š” ์ฝ”๋“œ๋ฅผ ๋” ๊ฐ„๊ฒฐํ•˜๊ฒŒ ๋งŒ๋“ค๊ณ  ๋ฐ˜ํ™˜์„ ์ˆจ๊ธฐ์ง€ ์•Š๋Š” ๋ฐ ๋„์›€์ด๋ฉ๋‹ˆ๋‹ค. ๊ทธ๋ฆฌ๊ณ  coffeescript ์™€ ๊ฐ™์€ ๋‹ค๋ฅธ ์–ธ์–ด์—์„œ๋„ ์ต์ˆ™ํ•ฉ๋‹ˆ๋‹ค.

? ํ•จ์ˆ˜ ์ˆ˜์ค€ ๋Œ€์‹  ์‹ ์ˆ˜์ค€์—์„œ ํ•ด๊ฒฐํ•˜๋ฉด ์„ ๋ฌผ์— ์–ด๋–ค ์˜ํ–ฅ์„ ๋ฏธ์น ๊นŒ์š”? ๋‹ค๋ฅธ ๋ชจ๋“  ์‚ฌ์šฉ ์‚ฌ๋ก€์—์„œ๋Š” ๊ดœ์ฐฎ์•„ ๋ณด์ž…๋‹ˆ๋‹ค.

@CryZe๊ฐ€ ๋งํ–ˆ๋“ฏ์ด ๋‚˜๋Š” ์ด๊ฒƒ์„ ์ข‹์•„ํ•ฉ๋‹ˆ๋‹ค.

์ด๋ ‡๊ฒŒํ•˜๋ฉด ๋ชจ๋“  ์‚ฌ๋žŒ์—๊ฒŒ ์นœ์ˆ™ํ•˜๊ณ  ์˜ค๋ฅ˜๋ฅผ ๋๊นŒ์ง€ ์ „๋‹ฌํ•˜์—ฌ ์ฒ˜๋ฆฌ ํ•  ์ˆ˜ โ€‹โ€‹์žˆ์œผ๋ฉฐ ์•”์‹œ ์  ๋ฐ˜ํ™˜์ด ์—†์Šต๋‹ˆ๋‹ค. ๋”ฐ๋ผ์„œ ๋Œ€๋žต ๋‹ค์Œ๊ณผ ๊ฐ™์ด ๋ณด์ผ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

let a = try! (x? .y? .z);

๋‚˜๋Š” ์ด๊ฒƒ์„ ๊ฐ€์ •ํ–ˆ๋‹ค. ์™„๋ฒฝํ•œ ํ•ด๊ฒฐ์ฑ…์ด ๋  ๊ฒƒ ๊ฐ™์•„์š”.

try!๋ฅผ ์‚ฌ์šฉํ•˜๋ฉด ๋งคํฌ๋กœ๊ฐ€์ด๋ฅผ ์ˆ˜ํ–‰ ํ•  ์ˆ˜ ์žˆ๊ธฐ ๋•Œ๋ฌธ์— ์–ด๋”˜๊ฐ€์— ๋ฐ˜ํ™˜์ด์žˆ์„ ์ˆ˜ ์žˆ๋‹ค๋Š” ๊ฒƒ์ด ๋ถ„๋ช…ํ–ˆ์Šต๋‹ˆ๋‹ค.

Rust์—์„œ ๋งคํฌ๋กœ๊ฐ€ ์ž‘๋™ํ•˜๋Š” ๋ฐฉ์‹์— ์ต์ˆ™ํ•˜๊ธฐ ๋•Œ๋ฌธ์— ๋ถ„๋ช…ํ•ฉ๋‹ˆ๋‹ค. ? ๊ฐ€ ์•ˆ์ •์ ์ด๊ณ  ๋„๋ฆฌ ํผ์ ธ ์žˆ๊ณ  Rust์— ๋Œ€ํ•œ ๋ชจ๋“  ์†Œ๊ฐœ์—์„œ ์„ค๋ช…๋˜๋ฉด ๋˜‘๊ฐ™์„ ๊ฒƒ์ž…๋‹ˆ๋‹ค.

์•ˆ๋…•ํ•˜์„ธ์š”.

ํ•จ์ˆ˜์—์„œ ๊ฐ’์„ ๋ฐ˜ํ™˜ํ•˜๋Š” ์„ธ ๊ฐ€์ง€ ๋ฐฉ๋ฒ•์ด ์žˆ์Šต๋‹ˆ๋‹ค.

  • ์•”์‹œ ์  ๋ฐ˜ํ™˜

Rust์—๋Š” "์•”์‹œ ์  ๋ฐ˜ํ™˜"์ด ์—†์œผ๋ฉฐ ๊ฐ’์œผ๋กœ ํ‰๊ฐ€๋˜๋Š” ํ‘œํ˜„์‹์ด ์žˆ์Šต๋‹ˆ๋‹ค. ์ด๊ฒƒ์€ ์ค‘์š”ํ•œ ์ฐจ์ด์ ์ž…๋‹ˆ๋‹ค.

if foo {
    5
}

7

Rust๊ฐ€ "์•”์‹œ ์  ๋ฆฌํ„ด"์„ ๊ฐ€์กŒ๋‹ค๋ฉด์ด ์ฝ”๋“œ๋Š” ์ปดํŒŒ์ผ๋ฉ๋‹ˆ๋‹ค. ํ•˜์ง€๋งŒ ๊ทธ๋ ‡์ง€ ์•Š์Šต๋‹ˆ๋‹ค. return 5 ํ•ฉ๋‹ˆ๋‹ค.

์–ด๋Š ๊ฒƒ์ด ํ•œ ๋ฒˆ ๋˜‘๊ฐ™ ์„๊นŒ์š”? ์•ˆ์ •์ ์ด๊ณ  ๋„๋ฆฌ ํผ์ ธ ์žˆ์œผ๋ฉฐ Rust์— ๋Œ€ํ•œ ๋ชจ๋“  ์†Œ๊ฐœ์—์„œ ์„ค๋ช…๋ฉ๋‹ˆ๋‹ค.

์˜ˆ๋ฅผ ๋“ค์–ด https://github.com/rust-lang/book/pull/134

try!๋ฅผ ์‚ฌ์šฉํ•˜๋ฉด ๋งคํฌ๋กœ๊ฐ€์ด๋ฅผ ์ˆ˜ํ–‰ ํ•  ์ˆ˜ ์žˆ๊ธฐ ๋•Œ๋ฌธ์— ์–ด๋”˜๊ฐ€์— ๋ฐ˜ํ™˜์ด์žˆ์„ ์ˆ˜ ์žˆ๋‹ค๋Š” ๊ฒƒ์ด ๋ถ„๋ช…ํ–ˆ์Šต๋‹ˆ๋‹ค.
Rust์—์„œ ๋งคํฌ๋กœ๊ฐ€ ์ž‘๋™ํ•˜๋Š” ๋ฐฉ์‹์— ์ต์ˆ™ํ•˜๊ธฐ ๋•Œ๋ฌธ์— ๋ถ„๋ช…ํ•ฉ๋‹ˆ๋‹ค. ์–ด๋Š ๊ฒƒ์ด ํ•œ ๋ฒˆ ๋˜‘๊ฐ™ ์„๊นŒ์š”? ์•ˆ์ •์ ์ด๊ณ  ๋„๋ฆฌ ํผ์ ธ ์žˆ์œผ๋ฉฐ Rust์— ๋Œ€ํ•œ ๋ชจ๋“  ์†Œ๊ฐœ์—์„œ ์„ค๋ช…๋ฉ๋‹ˆ๋‹ค.

๋‚ด๊ฐ€ ์•Œ๊ณ ์žˆ๋Š” ์–ด๋–ค ์–ธ์–ด๋กœ๋“  "๋งคํฌ๋กœ"๋Š” "์šฉ์ด ์—ฌ๊ธฐ์žˆ๋‹ค"๋ผ๋Š” ๋œป์ด๋ฉฐ ๋ฌด์Šจ ์ผ์ด๋“  ์ผ์–ด๋‚  ์ˆ˜ ์žˆ๋‹ค๋Š” ๋œป์ž…๋‹ˆ๋‹ค. ๊ทธ๋ž˜์„œ "In Rust"๋ถ€๋ถ„์—†์ด "๋งคํฌ๋กœ๊ฐ€ ์ž‘๋™ํ•˜๋Š” ๋ฐฉ์‹์— ์ต์ˆ™ํ•˜๊ธฐ ๋•Œ๋ฌธ์—"๋กœ ๋‹ค์‹œ ํ‘œํ˜„ํ•˜๊ฒ ์Šต๋‹ˆ๋‹ค.

@hauleth

let a = try! (x? .y? .z);

๋‚˜๋Š” ์ด๊ฒƒ์„ ๊ฐ€์ •ํ–ˆ๋‹ค. ์™„๋ฒฝํ•œ ํ•ด๊ฒฐ์ฑ…์ด ๋  ๊ฒƒ ๊ฐ™์•„์š”.

๋‚˜๋Š” ๋งค์šฐ ๋™์˜ํ•˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค. try! ์—์„œ๋งŒ ์ž‘๋™ํ•˜๊ณ  ์™ธ๋ถ€์—์„œ๋Š” ์ž‘๋™ํ•˜์ง€ ์•Š๋Š” ๋งˆ์ˆ  ๊ธฐํ˜ธ๋ฅผ ์–ป๊ฒŒ๋ฉ๋‹ˆ๋‹ค.

@hauleth

let a = try! (x? .y? .z);
๋‚˜๋Š” ์ด๊ฒƒ์„ ๊ฐ€์ •ํ–ˆ๋‹ค. ์™„๋ฒฝํ•œ ํ•ด๊ฒฐ์ฑ…์ด ๋  ๊ฒƒ ๊ฐ™์•„์š”.
๋‚˜๋Š” ๋งค์šฐ ๋™์˜ํ•˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค. ์‹œ๋„์—์„œ๋งŒ ์ž‘๋™ํ•˜๋Š” ๋งˆ๋ฒ•์˜ ์ƒ์ง•์„ ์–ป์„ ๊ฒƒ์ž…๋‹ˆ๋‹ค! ์™ธ๋ถ€๊ฐ€ ์•„๋‹™๋‹ˆ๋‹ค.

? ๋Š” try! ์—์„œ๋งŒ ์ž‘๋™ํ•ด์•ผํ•œ๋‹ค๊ณ  ๋งํ•˜์ง€ ์•Š์•˜์Šต๋‹ˆ๋‹ค. ๋‚ด๊ฐ€ ๋งํ•œ ๊ฒƒ์€ ? ๊ฐ€ ๋ฐ์ดํ„ฐ๋ฅผ ์ŠคํŠธ๋ฆผ ์•„๋ž˜๋กœ ๋ฐ€์–ด ๋‚ด๊ณ  ๋ฐœ์ƒํ•˜์ž๋งˆ์ž ์˜ค๋ฅ˜๋ฅผ ๋ฐ˜ํ™˜ํ•˜๋Š” ํŒŒ์ดํ”„ ์—ฐ์‚ฐ์ž์ฒ˜๋Ÿผ ์ž‘๋™ํ•ด์•ผํ•œ๋‹ค๋Š” ๊ฒƒ์ž…๋‹ˆ๋‹ค. try! ๋Š” ํ•„์š”ํ•˜์ง€ ์•Š์ง€๋งŒ ํ˜„์žฌ ์‚ฌ์šฉ๋˜๋Š” ๊ฒƒ๊ณผ ๋™์ผํ•œ ์ปจํ…์ŠคํŠธ์—์„œ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

@steveklabnik ์ €๋Š” Rust๋ฅผ ์•”์‹œ ์  ๋ฐ˜ํ™˜์„ ๊ฐ–๋Š” ์–ธ์–ด๋กœ ์ƒ๊ฐํ•ฉ๋‹ˆ๋‹ค. ๊ท€ํ•˜์˜ ์˜ˆ์—์„œ 5 ๋Š” ์•”์‹œ ์ ์œผ๋กœ ๋ฐ˜ํ™˜๋˜์ง€ ์•Š์•˜์ง€๋งŒ ๋‹ค์Œ์„ ์ˆ˜ํ–‰ํ•ฉ๋‹ˆ๋‹ค.

fn test() -> i32 {
    5
}

์—ฌ๊ธฐ์—์„œ 5 ๊ฐ€ ์•”์‹œ ์ ์œผ๋กœ ๋ฐ˜ํ™˜๋˜์ง€ ์•Š์Šต๋‹ˆ๊นŒ? return 5; ์™€๋Š” ๋ฐ˜๋Œ€๋กœ ๊ท€ํ•˜์˜ ์˜ˆ์—์„œ ํ•„์š”ํ•ฉ๋‹ˆ๋‹ค. ์ด๋ ‡๊ฒŒํ•˜๋ฉด ๊ฐ’์„ ๋ฐ˜ํ™˜ํ•˜๋Š” ๋‘ ๊ฐ€์ง€ ๋ฐฉ๋ฒ•์ด ์žˆ์Šต๋‹ˆ๋‹ค. Rust์— ๋Œ€ํ•ด ๋‹ค์†Œ ํ˜ผ๋ž€ ์Šค๋Ÿฝ์Šต๋‹ˆ๋‹ค. ์„ธ ๋ฒˆ์งธ๋ฅผ ์ถ”๊ฐ€ํ•˜๋ฉด IMO์— ๋„์›€์ด๋˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค.

๊ทธ๋ ‡์ง€ ์•Š์Šต๋‹ˆ๋‹ค. ํ‘œํ˜„์‹, ํŠนํžˆ ํ•จ์ˆ˜ ๋ณธ๋ฌธ์˜ ๊ฒฐ๊ณผ์ž…๋‹ˆ๋‹ค. "์•”์‹œ ์  ๋ฐ˜ํ™˜"์€ ๋ฌต์‹œ์ ์œผ๋กœ ์–ด๋””์—์„œ๋‚˜ ๋ฐ˜ํ™˜ ํ•  ์ˆ˜ ์žˆ์Œ์„ ์˜๋ฏธํ•˜์ง€๋งŒ ์‚ฌ์‹ค์ด ์•„๋‹™๋‹ˆ๋‹ค. ๋‹ค๋ฅธ ํ‘œํ˜„์‹ ๊ธฐ๋ฐ˜ ์–ธ์–ด์—์„œ๋Š” ์œ„์˜ ์ฝ”๋“œ ์ƒ˜ํ”Œ์ฒ˜๋Ÿผ "์•”์‹œ ์  ๋ฐ˜ํ™˜"์ด๋ผ๊ณ  ๋ถ€๋ฅด์ง€ ์•Š์Šต๋‹ˆ๋‹ค.

@steveklabnik ์ข‹์Šต๋‹ˆ๋‹ค . ์‹œ๊ฐ„์„๋‚ด์–ด ์„ค๋ช…ํ•ด ์ฃผ์…”์„œ ๊ฐ์‚ฌํ•ฉ๋‹ˆ๋‹ค : +1 :

์ „๋ถ€๋‹ค ๊ดœ์ฐฎ์•„! ๋‚˜๋Š” ๋‹น์‹ ์ด ์–ด๋””์—์„œ ์™”๋Š”์ง€ ์™„์ „ํžˆ ๋ณผ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ์‚ฌ๋žŒ๋“ค์ด ์ข…์ข… ์ž˜๋ชป๋œ ๋ฐฉ์‹์œผ๋กœ ์‚ฌ์šฉํ•˜๋Š” ๋‘ ๊ฐ€์ง€ ๋‹ค๋ฅธ ๊ฒƒ์ž…๋‹ˆ๋‹ค. ๋‚˜๋Š” ์‚ฌ๋žŒ๋“ค์ด "์•”์‹œ ์  ๋ฐ˜ํ™˜"์ด๋ž€ ; ๋ฅผ ์†Œ์Šค์˜ ์–ด๋””์—์„œ๋‚˜ ๋ฐ˜ํ™˜ ํ•  ์ˆ˜ ์žˆ๋‹ค๋Š” ๊ฒƒ์„ ์˜๋ฏธํ•œ๋‹ค๊ณ  ๊ฐ€์ •ํ•˜๋Š” ๊ฒƒ์„ ๋ณด์•˜์Šต๋‹ˆ๋‹ค.

@hauleth ๋Š”? ์—ฐ์‚ฐ์ž๋Š”์ด ๊ฒฝ์šฐ and_then์— ๋Œ€ํ•œ ๊ตฌ๋ฌธ ์„คํƒ• ์ผ ๊ฒƒ์ž…๋‹ˆ๋‹ค. ์ด๋ ‡๊ฒŒํ•˜๋ฉด ๋” ๋งŽ์€ ๊ฒฝ์šฐ์— ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ์œผ๋ฉฐ ๋ฐ˜ํ’ˆ์„ ๋†“์น˜๊ธฐ ์–ด๋ ค์šธ ํ•„์š”๊ฐ€ ์—†์Šต๋‹ˆ๋‹ค. ์ด๊ฒƒ์€ ๋˜ํ•œ ๋‹ค๋ฅธ ๋ชจ๋“  ์–ธ์–ด๊ฐ€ ๋ฌด์—‡์ž…๋‹ˆ๊นŒ? ์šด์˜์ž. ๋Ÿฌ์ŠคํŠธ? ํ˜„์žฌ ๊ตฌํ˜„์—์„œ ์—ฐ์‚ฐ์ž๋Š” ๋‹ค๋ฅธ ๋ชจ๋“  ์–ธ์–ด๊ฐ€ ์ˆ˜ํ–‰ํ•˜๋Š” ๊ฒƒ๊ณผ ์ •ํ™•ํžˆ ๋ฐ˜๋Œ€์ž…๋‹ˆ๋‹ค. ๋˜ํ•œ and_then์€ ๊ธฐ๋Šฅ์  ์ ‘๊ทผ ๋ฐฉ์‹์ด๋ฉฐ ๋ช…ํ™•ํ•œ ์ œ์–ด ํ๋ฆ„์ด ์žˆ๊ธฐ ๋•Œ๋ฌธ์— ์–ด์จŒ๋“  ๊ถŒ์žฅ๋ฉ๋‹ˆ๋‹ค. ๊ทธ๋ž˜์„œ ๊ทธ๋ƒฅ ๋งŒ๋“ค์–ด? and_then์— ๋Œ€ํ•œ ๊ตฌ๋ฌธ ์„คํƒ•์„ ์‚ฌ์šฉํ•œ ๋‹ค์Œ ํ˜„์žฌ ์‹œ๋„๋ฅผ ์œ ์ง€ํ•˜์‹ญ์‹œ์˜ค! ๋ช…์‹œ ์ ์œผ๋กœ "์–ธ ๋ž˜ํ•‘ ๋ฐ ๋ฐ˜ํ™˜"์˜ ๊ฒฝ์šฐ ๋ฐ˜ํ™˜์„ ๋” ์ž˜ ๋ณด์ด๊ฒŒํ•˜๊ณ ? ์—ฐ์‚ฐ์ž๊ฐ€ ๋” ์œ ์—ฐํ•ฉ๋‹ˆ๋‹ค (ํŒจํ„ด ์ผ์น˜์™€ ๊ฐ™์€ ๋น„ ๋ฐ˜ํ™˜ ์‚ฌ๋ก€์—์„œ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ์Œ).

๋ฐ”๋กœ ๊ทธ๊ฑฐ์ฃ .

ลukasz Niemier
[email protected]

Wiadomoล›ฤ‡ napisana przez Christopher Serr [email protected] w dniu 02.09.2016, o godz. 21:05 :

@hauleth https://github.com/hauleth ? ์—ฐ์‚ฐ์ž๋Š”์ด ๊ฒฝ์šฐ and_then์— ๋Œ€ํ•œ ๊ตฌ๋ฌธ ์„คํƒ• ์ผ ๊ฒƒ์ž…๋‹ˆ๋‹ค. ์ด๋ ‡๊ฒŒํ•˜๋ฉด ๋” ๋งŽ์€ ๊ฒฝ์šฐ์— ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ์œผ๋ฉฐ ๋ฐ˜ํ’ˆ์„ ๋†“์น˜๊ธฐ ์–ด๋ ค์šธ ํ•„์š”๊ฐ€ ์—†์Šต๋‹ˆ๋‹ค. ์ด๊ฒƒ์€ ๋˜ํ•œ ๋‹ค๋ฅธ ๋ชจ๋“  ์–ธ์–ด๊ฐ€ ๋ฌด์—‡์ž…๋‹ˆ๊นŒ? ์šด์˜์ž. ๋Ÿฌ์ŠคํŠธ? ํ˜„์žฌ ๊ตฌํ˜„์—์„œ ์—ฐ์‚ฐ์ž๋Š” ๋‹ค๋ฅธ ๋ชจ๋“  ์–ธ์–ด๊ฐ€ ์ˆ˜ํ–‰ํ•˜๋Š” ๊ฒƒ๊ณผ ์ •ํ™•ํžˆ ๋ฐ˜๋Œ€์ž…๋‹ˆ๋‹ค. ๋˜ํ•œ and_then์€ ๊ธฐ๋Šฅ์  ์ ‘๊ทผ ๋ฐฉ์‹์ด๋ฉฐ ๋ช…ํ™•ํ•œ ์ œ์–ด ํ๋ฆ„์ด ์žˆ๊ธฐ ๋•Œ๋ฌธ์— ์–ด์จŒ๋“  ๊ถŒ์žฅ๋ฉ๋‹ˆ๋‹ค. ๊ทธ๋ž˜์„œ ๊ทธ๋ƒฅ ๋งŒ๋“ค์–ด? and_then์— ๋Œ€ํ•œ ๊ตฌ๋ฌธ ์„คํƒ•์„ ์‚ฌ์šฉํ•œ ๋‹ค์Œ ํ˜„์žฌ ์‹œ๋„๋ฅผ ์œ ์ง€ํ•˜์‹ญ์‹œ์˜ค! ๋ช…์‹œ ์ ์œผ๋กœ "์–ธ ๋ž˜ํ•‘ ๋ฐ ๋ฐ˜ํ™˜"์˜ ๊ฒฝ์šฐ ๋ฐ˜ํ™˜์„ ๋” ์ž˜ ๋ณด์ด๊ฒŒํ•˜๊ณ ? ์—ฐ์‚ฐ์ž๊ฐ€ ๋” ์œ ์—ฐํ•ฉ๋‹ˆ๋‹ค (ํŒจํ„ด ์ผ์น˜์™€ ๊ฐ™์€ ๋น„ ๋ฐ˜ํ™˜ ์‚ฌ๋ก€์—์„œ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ์Œ).

โ€”
๋‹น์‹ ์ด ์–ธ๊ธ‰ ๋˜์—ˆ๊ธฐ ๋•Œ๋ฌธ์— ์ด๊ฒƒ์„ ๋ฐ›๊ณ  ์žˆ์Šต๋‹ˆ๋‹ค.
์ด ์ด๋ฉ”์ผ์— ์ง์ ‘ ๋‹ต์žฅํ•˜๊ฑฐ๋‚˜ GitHub https://github.com/rust-lang/rust/issues/31436#issuecomment -244461722์—์„œ ๋ณด๊ฑฐ๋‚˜ https://github.com/notifications/unsubscribe-auth/ ์Šค๋ ˆ๋“œ๋ฅผ ์Œ์†Œ๊ฑฐํ•ฉ๋‹ˆ๋‹ค.

๊ทธ๋ฆฌ๊ณ  Rust ๋ฆฌํฌ์ง€ํ† ๋ฆฌ์— ๋Œ€ํ•œ Pull Request ์ž‘์—…์„ ํ•  ๋•Œ ์‹ค์ œ๋กœ? ์—ฐ์‚ฐ์ž์™€ ์‚ฌ์‹ค ๊ทธ๊ฒƒ์€ ๋‚˜์—๊ฒŒ ์ •๋ง ๊ฐ€๋…์„ฑ์„ ํ•ด์นœ๋‹ค. (์ •์‹ ์ ์œผ๋กœ, ๋‡Œ์—์„œ ๊ฑธ๋Ÿฌ์ง€๋Š” ์†Œ์Œ ์ผ ๋ฟ์ด ๊ธฐ ๋•Œ๋ฌธ์—) ์—„์ฒญ๋‚˜๊ฒŒ ์ˆจ๊ฒจ์ ธ ์žˆ์—ˆ๊ณ  ์ €๋Š” ๊ทธ๊ฒƒ์„ ๋งŽ์ด ๊ฐ„๊ณผํ–ˆ์Šต๋‹ˆ๋‹ค. ๊ทธ๋ฆฌ๊ณ  ๋‚˜๋Š” ๊ทธ๊ฒƒ์ด ๋งค์šฐ ๋ฌด์„ญ๋‹ค๋Š” ๊ฒƒ์„ ์•ˆ๋‹ค.

์šฐ๋ฆฌ๊ฐ€ "์•”์‹œ ๋ณต๊ท€"๋ฅผ ํ˜ธ์ถœ @steveklabnik ๋•Œ๋ฌธ์— ์šฐ๋ฆฌ๊ฐ€ ํ•˜์ง€ ์œ ์ผํ•œ ๊ฒƒ๋“ค .

@hauleth ํ—ˆ, ๋ฃจ๋น„๋ฅผ ์‚ฌ์šฉํ•˜๋Š” ๋™์•ˆ ๋‚˜๋Š” ๊ทธ๊ฒƒ์„ ์•”์‹œ ์  ๋ฐ˜ํ™˜์ด๋ผ๊ณ  ๋ถ€๋ฅด๋Š” ์‚ฌ๋žŒ์„ ๋“ค์–ด ๋ณธ ์ ์ด ์—†์Šต๋‹ˆ๋‹ค. ๋‚˜๋Š” ๊ทธ๊ฒƒ์ด ๊ทธ๊ฒƒ์— ๋Œ€ํ•ด ์ƒ๊ฐํ•˜๋Š” ์ž˜๋ชป๋œ ๋ฐฉ๋ฒ•์ด๋ผ๊ณ  ์—ฌ์ „ํžˆ ์ฃผ์žฅํ•ฉ๋‹ˆ๋‹ค.

๋‚˜๋Š” ๋ช‡ ๊ฐ€์ง€ ํ”„๋กœ์ ํŠธ์—์„œ ? ๋ฅผ ์‚ฌ์šฉํ–ˆ๊ณ  try! ๋ณด๋‹ค ์„ ํ˜ธํ–ˆ๋Š”๋ฐ, ๋Œ€๋ถ€๋ถ„์€ ์ ‘๋ฏธ์‚ฌ ์œ„์น˜์— ์žˆ๊ธฐ ๋•Œ๋ฌธ์ž…๋‹ˆ๋‹ค. ์ผ๋ฐ˜์ ์œผ๋กœ, "์ง„์งœ"๋…น ์ฝ”๋“œ๋Š” ๊ฝค ๋งŽ์ด ๋“ค์–ด๊ฐ‘๋‹ˆ๋‹ค Result ์—์„œ '๋ชจ๋‚˜๋“œ' main ๊ฐ€๋” ๋ฆฌํ”„ ๋…ธ๋“œ์—์„œ ์ œ์™ธ๋ฅผ ๊ฒฐ์ฝ” ๋– ๋‚˜์ง€ ์•Š๋Š”๋‹ค; ์ด๋Ÿฌํ•œ ์ฝ”๋“œ๋Š” ํ•ญ์ƒ ์˜ค๋ฅ˜๋ฅผ ์ „ํŒŒ ํ•  ๊ฒƒ์œผ๋กœ ์˜ˆ์ƒ๋ฉ๋‹ˆ๋‹ค. ๋Œ€๋ถ€๋ถ„์˜ ๊ฒฝ์šฐ ์–ด๋–ค ํ‘œํ˜„์‹์ด ์˜ค๋ฅ˜๋ฅผ ์ƒ์„ฑํ•˜๋Š”์ง€๋Š” ์ค‘์š”ํ•˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค. ๋ชจ๋‘ ์Šคํƒ์œผ๋กœ ๋‹ค์‹œ ๋ณด๋‚ด์ง€๊ณ  ์žˆ์œผ๋ฉฐ ์ฝ”๋“œ์˜ ์ฃผ์š” ๋…ผ๋ฆฌ๋ฅผ ์ฝ์„ ๋•Œ์ด๋ฅผ๋ณด๊ณ  ์‹ถ์ง€ ์•Š์Šต๋‹ˆ๋‹ค.

? ๋Œ€ํ•œ ๋‚˜์˜ ์ฃผ์š” ๊ด€์‹ฌ์‚ฌ๋Š” ๋ฉ”์„œ๋“œ ๋งคํฌ๋กœ๊ฐ€ ์กด์žฌํ•œ๋‹ค๋ฉด ๋™์ผํ•œ ์ด์  (์ ‘๋ฏธ์‚ฌ ์œ„์น˜)์„ ์–ป์„ ์ˆ˜ ์žˆ๋‹ค๋Š” ๊ฒƒ์ž…๋‹ˆ๋‹ค. ๋‚˜๋Š” ์•„๋งˆ๋„ ํ˜„์žฌ์˜ ๊ณต์‹์„ ์•ˆ์ •ํ™”ํ•จ์œผ๋กœ์จ ์šฐ๋ฆฌ๊ฐ€ ์˜ค๋ฅ˜ ์ฒ˜๋ฆฌ์—์„œ ๋ฏธ๋ž˜์˜ ํ‘œํ˜„์„ฑ์„ ์ œํ•œํ•˜๊ณ  ์žˆ๋‹ค๋Š” ๋‹ค๋ฅธ ์šฐ๋ ค๊ฐ€ ์žˆ์Šต๋‹ˆ๋‹ค. ํ˜„์žฌ Result ๋ณ€ํ™˜์€ Rust์—์„œ ์˜ค๋ฅ˜ ์ฒ˜๋ฆฌ๋ฅผ ์›ํ•˜๋Š”๋งŒํผ ์ธ์ฒด ๊ณตํ•™์ ์œผ๋กœ ๋งŒ๋“ค๊ธฐ์— ์ถฉ๋ถ„ํ•˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค. ์šฐ๋ฆฌ๋Š” ์ด๋ฏธ ์ˆ˜์ •ํ•˜๊ธฐ ์–ด๋ ค์šด Rust ์˜ค๋ฅ˜ ์ฒ˜๋ฆฌ๋กœ ์—ฌ๋Ÿฌ ๋””์ž์ธ ์‹ค์ˆ˜๋ฅผ ์ €์งˆ๋ € ๊ณ , ์ด๊ฒƒ์€ ์šฐ๋ฆฌ๋ฅผ ๋” ๊นŠ์ด ํŒŒ๊ณ ๋“ค ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ๊ตฌ์ฒด์ ์ธ ์ฆ๊ฑฐ๋Š” ์—†์ง€๋งŒ

๋‚˜๋Š” ์ „์— ์ด๊ฒƒ์„ ์—ฌ๋Ÿฌ ๋ฒˆ ์ผ์ง€ ๋งŒ ? ์™€ ์บ๋ฆฌ์–ด ํŠน์„ฑ์˜ ๊ฐ€๋Šฅ์„ฑ์„ ์ ˆ๋Œ€์ ์œผ๋กœ ์ข‹์•„ํ•ฉ๋‹ˆ๋‹ค. ๋‚˜๋Š” ํ•˜๋‚˜์˜ ํ”„๋กœ์ ํŠธ๋ฅผ ? ์™„์ „ํžˆ ์‚ฌ์šฉํ•˜๋„๋ก ์ „ํ™˜ํ–ˆ๊ณ  try! ๊ณผ๋Š” ๋„ˆ๋ฌด ๋ณต์žกํ•œ ๋งŽ์€ ์ผ์„ ๊ฐ€๋Šฅํ•˜๊ฒŒํ–ˆ์Šต๋‹ˆ๋‹ค (ํŠนํžˆ ์ฒด์ธ๊ณผ ๊ด€๋ จํ•˜์—ฌ). ๋‚˜๋Š” ๋˜ํ•œ ์žฌ๋ฏธ๋กœ ? ์–ด๋–ค ์ผ์„ ํ•  ์ˆ˜ ์žˆ๋Š”์ง€๋ณด๊ธฐ ์œ„ํ•ด ๋‹ค๋ฅธ ํ”„๋กœ์ ํŠธ๋ฅผ ์‚ดํŽด ๋ดค๊ณ  ์ „๋ฐ˜์ ์œผ๋กœ ๋‚˜๋Š” ๊ทธ๊ฒƒ์— ์–ด๋–ค ๋ฌธ์ œ๋„ ๋ฐœ์ƒํ•˜์ง€ ์•Š์•˜์Šต๋‹ˆ๋‹ค.

๋”ฐ๋ผ์„œ ์ €๋Š” ๋” ๋‚˜์€ ์ด๋ฆ„์˜ Carrier ํŠน์„ฑ์„ ๊ธฐ๋ฐ˜์œผ๋กœ ? ์•ˆ์ •ํ™”์— ํฐ +1์„ ์ œ๊ณตํ•ฉ๋‹ˆ๋‹ค.์ด ํŠน์„ฑ์€ ์ด์ƒ์ ์œผ๋กœ๋Š” ๋‹ค๋ฅธ ํ† ๋ก ์—์„œ ์–ธ๊ธ‰ ํ•œ ๋‹ค๋ฅธ ์ผ๋ถ€ ์‚ฌ๋ก€๋„ ํฌํ•จํ•ฉ๋‹ˆ๋‹ค.

๋‚˜์˜ ์ฃผ์š” ๊ด€์‹ฌ์‚ฌ๋Š”? ๋ฉ”์†Œ๋“œ ๋งคํฌ๋กœ๊ฐ€ ์กด์žฌํ•œ๋‹ค๋ฉด ๋™์ผํ•œ ์ด์  (์ ‘๋ฏธ์‚ฌ ์œ„์น˜)์„ ์–ป์„ ์ˆ˜ ์žˆ๋‹ค๋Š” ๊ฒƒ์ž…๋‹ˆ๋‹ค.

RFC๊ฐ€ ํ•„์š”ํ• ๊นŒ์š”? ๋Œ€๋ถ€๋ถ„์˜ ์‚ฌ๋žŒ๋“ค์€?์˜ ๊ธฐ๋Šฅ์„ ์ข‹์•„ํ•˜๋Š” ๊ฒƒ ๊ฐ™์ง€๋งŒ? ๊ทธ ์ž์ฒด.

RFC๊ฐ€ ํ•„์š”ํ• ๊นŒ์š”? ๋Œ€๋ถ€๋ถ„์˜ ์‚ฌ๋žŒ๋“ค์€?์˜ ๊ธฐ๋Šฅ์„ ์ข‹์•„ํ•˜๋Š” ๊ฒƒ ๊ฐ™์ง€๋งŒ? ๊ทธ ์ž์ฒด.

์ด์— ๋Œ€ํ•ด ๋งŽ์€ ๋…ผ์˜๊ฐ€์žˆ๋Š” RFC ๊ฐ€ ์žˆ์Šต๋‹ˆ๋‹ค. ๋˜ํ•œ ๋‚˜๋Š” ๋‹น์‹ ์ด ๊ทธ "๋Œ€๋ถ€๋ถ„์˜ ์‚ฌ๋žŒ๋“ค"์„ ์–ด๋””์„œ ์–ป๋Š” ์ง€ ๋ชจ๋ฆ…๋‹ˆ๋‹ค. ์ด ๋ฌธ์ œ์— ์ฐธ์—ฌํ•œ ์‚ฌ๋žŒ์ด๋ผ๋ฉด ๋ฌผ๋ก  ์•ˆ์ •ํ™”๊ฐ€ _ ์ด๋ฏธ _ ํŒ€์˜ ๊ธฐ๋ณธ ์กฐ์น˜์ด๊ธฐ ๋•Œ๋ฌธ์— ๋” ๋งŽ์€ ์‚ฌ๋žŒ๋“ค์ด ๋ฐ˜๋Œ€ํ•˜๋Š” ๊ฒƒ์„ ๋ณด๊ฒŒ ๋  ๊ฒƒ์ž…๋‹ˆ๋‹ค.
? ๋Š” RFC๊ฐ€ ๋ณ‘ํ•ฉ๋˜๊ธฐ ์ „์— ํฌ๊ฒŒ ๋…ผ์˜๋˜์—ˆ์œผ๋ฉฐ, ์ง€์ง€์ž๋กœ์„œ ์•ˆ์ •ํ™”์— ๋Œ€ํ•ด ๋…ผ์˜ ํ•  ๋•Œ ๋™์ผํ•œ ์ž‘์—…์„ ์ˆ˜ํ–‰ํ•ด์•ผํ•˜๋Š” ๊ฒƒ์€ ๋‹ค์†Œ ํ”ผ๊ณคํ•ฉ๋‹ˆ๋‹ค.

์–ด์จŒ๋“  ์—ฌ๊ธฐ์— @mitsuhiko ๋‹˜ ์˜ ๊ฐ์ •์— ๋Œ€ํ•œ +1์„

์ด์— ๋Œ€ํ•ด ๋งŽ์€ ๋…ผ์˜๊ฐ€์žˆ๋Š” RFC๊ฐ€ ์žˆ์Šต๋‹ˆ๋‹ค. ๋˜ํ•œ ๋‚˜๋Š” ๋‹น์‹ ์ด ๊ทธ "๋Œ€๋ถ€๋ถ„์˜ ์‚ฌ๋žŒ๋“ค"์„ ์–ด๋””์„œ ์–ป๋Š” ์ง€ ๋ชจ๋ฆ…๋‹ˆ๋‹ค. ์ด ๋ฌธ์ œ์— ์ฐธ์—ฌํ•œ ์‚ฌ๋žŒ๋“ค์˜ ๊ฒฝ์šฐ ์•ˆ์ •ํ™”๊ฐ€ ์ด๋ฏธ ํŒ€์˜ ๊ธฐ๋ณธ ์กฐ์น˜์ด๊ธฐ ๋•Œ๋ฌธ์— ๋” ๋งŽ์€ ์‚ฌ๋žŒ๋“ค์ด ๋ฐ˜๋Œ€ํ•˜๋Š” ๊ฒƒ์„ ๋ณผ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

์ฃ„์†กํ•ฉ๋‹ˆ๋‹ค. ์ œ ๋Œ“๊ธ€์ด ๋„ˆ๋ฌด ์งง์Šต๋‹ˆ๋‹ค. ์˜ˆ๋ฅผ ๋“ค์–ด func1().try!().func2().try!() ์™€ ๊ฐ™์€ ์ผ์ข…์˜ "๋ฉ”์„œ๋“œ ๋งคํฌ๋กœ"์— ๋Œ€ํ•œ RFC๋ฅผ ๋งŒ๋“œ๋Š” ๊ฒƒ์„ ์–ธ๊ธ‰ํ–ˆ์Šต๋‹ˆ๋‹ค (๋‚ด๊ฐ€ ์•„๋Š” ํ•œ ํ˜„์žฌ ๋ถˆ๊ฐ€๋Šฅํ•ฉ๋‹ˆ๋‹ค).

๊ฐœ์ธ์ ์œผ๋กœ ๋‚˜๋Š”? ์—ฐ์‚ฐ์ž์ด์ง€๋งŒ @brson ๊ณผ ๋™์ผํ•œ ์šฐ๋ ค๋ฅผ ๊ณต์œ  @nikomatsakis๊ฐ€ ์—ฐ๊ฒฐ ํ•œ ๋‚ด๋ถ€ ์Šค๋ ˆ๋“œ๋ฅผ ํฌํ•จํ•˜์—ฌ ๋™์ผํ•œ ์ธ์ˆ˜๊ฐ€ ๋ฐ˜๋ณต

๊ธฐ๋Šฅ์„ ์™„์ „ํžˆ ๊ตฌํ˜„ํ•˜์ง€ ์•Š๊ณ  ์•ˆ์ •ํ™”ํ•˜๋Š” ๊ฒƒ์€ ์‹œ๊ธฐ์ƒ์กฐ ์ธ ๊ฒƒ ๊ฐ™์Šต๋‹ˆ๋‹ค.์ด ๊ฒฝ์šฐ catch {..} ํ‘œํ˜„์‹์ž…๋‹ˆ๋‹ค.

์ด์ „์—์ด ๊ธฐ๋Šฅ์— ๋Œ€ํ•œ ์šฐ๋ ค๋ฅผ ํ‘œ๋ช…ํ–ˆ์ง€๋งŒ ์—ฌ์ „ํžˆ ๋‚˜์œ ์ƒ๊ฐ์ด๋ผ๊ณ  ์ƒ๊ฐํ•ฉ๋‹ˆ๋‹ค. ํ›„์œ„ ์กฐ๊ฑด๋ถ€ ๋ฐ˜ํ™˜ ์—ฐ์‚ฐ์ž๋ฅผ ์‚ฌ์šฉํ•˜๋Š” ๊ฒƒ์€ ๋‹ค๋ฅธ ํ”„๋กœ๊ทธ๋ž˜๋ฐ ์–ธ์–ด์™€๋Š” ๋‹ค๋ฅด๋ฉฐ Rust๊ฐ€ ์ด๋ฏธ ๋Š˜์–ด๋‚œ ๋ณต์žก์„ฑ ์˜ˆ์‚ฐ์„ ๋„˜์–ด์„œ๊ณ  ์žˆ๋‹ค๊ณ  ์ƒ๊ฐํ•ฉ๋‹ˆ๋‹ค.

@mcpherrinm ๋‹ค๋ฅธ ์–ธ์–ด๋Š” ์˜ค๋ฅ˜ ์ฒ˜๋ฆฌ๋ฅผ ์œ„ํ•ด ํ˜ธ์ถœ ํ•  ๋•Œ๋งˆ๋‹ค ํ•ด์ œ ๊ฒฝ๋กœ๋ฅผ ์ˆจ๊ฒผ์Šต๋‹ˆ๋‹ค. operator() ๋ฅผ "์กฐ๊ฑด๋ถ€ ๋ฐ˜ํ™˜ ์—ฐ์‚ฐ์ž"๋ผ๊ณ  ๋ถ€๋ฅด๊ฒ ์Šต๋‹ˆ๊นŒ?

๋ณต์žก์„ฑ ์˜ˆ์‚ฐ์— ๊ด€ํ•ด์„œ๋Š” try! ์™€ ๊ตฌ๋ฌธ ์ ์œผ๋กœ ๋งŒ ๋‹ค๋ฆ…๋‹ˆ๋‹ค. ์ ์–ด๋„ ๋ถˆํ‰ํ•˜๋Š” ๋ถ€๋ถ„์ž…๋‹ˆ๋‹ค.
try! ๋ฌด๊ฑฐ์šด ์ฝ”๋“œ์— ๋Œ€ํ•œ ์ฃผ์žฅ์ด ? ๋งŒ ๋” ์ฝ๊ธฐ ์‰ฝ๊ฒŒ ๋งŒ๋“ค๊นŒ์š”?
๊ทธ๋ ‡๋‹ค๋ฉด "์˜ค๋ฅ˜ ์ „ํŒŒ ์ž๋™ํ™” _ ์ „ํ˜€ _ ์—†์Œ"์ด์™ธ์˜ ์‹ฌ๊ฐํ•œ ๋Œ€์•ˆ์ด ์žˆ๋Š”์ง€ ๋™์˜ํ•ฉ๋‹ˆ๋‹ค.

ํƒ€ํ˜‘ ์ œ์•ˆ : https://github.com/rust-lang/rfcs/pull/1737

๋ฐ›์•„ ๋“ค์ผ ๊ธฐํšŒ๊ฐ€ ์—†์„ ์ˆ˜๋„ ์žˆ์ง€๋งŒ ์–ด์จŒ๋“  ๋…ธ๋ ฅํ•˜๊ณ  ์žˆ์Šต๋‹ˆ๋‹ค.

"๋ฉ”์„œ๋“œ ๋งคํฌ๋กœ"์— ๋Œ€ํ•œ @keeperofdakeys ์˜ ์•„์ด๋””์–ด๋ฅผ ์ข‹์•„ํ•ฉ๋‹ˆ๋‹ค. ? ๊ตฌ๋ฌธ์€ ์‚ผํ•ญ ์—ฐ์‚ฐ์ž๊ฐ€ ๋…น์Šฌ์ง€ ์•Š๋Š” ๊ฒƒ๊ณผ ๊ฐ™์€ ์ด์œ ๋กœ ๋ฐ›์•„ ๋“ค์—ฌ ์ ธ์•ผํ•œ๋‹ค๊ณ  ์ƒ๊ฐํ•˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค. ? ์ž์ฒด๋Š” ์•„๋ฌด ๋ง๋„ํ•˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค. ๋Œ€์‹  "๋ฉ”์„œ๋“œ ๋งคํฌ๋กœ"๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ ? ์˜ ๋™์ž‘์„ ์ผ๋ฐ˜ํ™” ํ•  ์ˆ˜์žˆ๋Š” ๊ธฐ๋Šฅ์„ ํ™•์ธํ•˜๋Š” ๊ฒƒ์ด ์ข‹์Šต๋‹ˆ๋‹ค.

a.some_macro!(b);
// could be syntax sugar for
some_macro!(a, b); 
a.try!();
// could be syntax sugar for
try!(a); 

์ด๋ ‡๊ฒŒํ•˜๋ฉด ๋™์ž‘์ด ๋ฌด์—‡์ธ์ง€ ๋ช…ํ™• ํ•ด์ง€๊ณ  ์‰ฝ๊ฒŒ ์—ฐ๊ฒฐ๋  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

result.try!() ์™€ ๊ฐ™์€ ๋ฉ”์„œ๋“œ ๋งคํฌ๋กœ๋Š” ์–ธ์–ด ์ธ์ฒด ๊ณตํ•™์— ๋Œ€ํ•œ๋ณด๋‹ค ์ผ๋ฐ˜์ ์ธ ๊ฐœ์„ ์œผ๋กœ ๋ณด์ด๋ฉฐ ์ƒˆ๋กœ์šด ? ์—ฐ์‚ฐ์ž๋ณด๋‹ค ์ž„์‹œ์ ์ธ ๋Š๋‚Œ์ด ๋œํ•ฉ๋‹ˆ๋‹ค.

@brson

๋‚˜๋Š” ํ˜„์žฌ ๊ณต์‹์„ ์•ˆ์ •ํ™”ํ•จ์œผ๋กœ์จ ์šฐ๋ฆฌ๊ฐ€ ์˜ค๋ฅ˜ ์ฒ˜๋ฆฌ์—์„œ ๋ฏธ๋ž˜์˜ ํ‘œํ˜„์„ฑ์„ ์ œํ•œํ•˜๊ณ  ์žˆ๋‹ค๋Š” ๋‹ค๋ฅธ ์šฐ๋ ค๊ฐ€ ์žˆ์Šต๋‹ˆ๋‹ค. ํ˜„์žฌ ๊ฒฐ๊ณผ ๋ณ€ํ™˜์€ Rust์—์„œ ์˜ค๋ฅ˜ ์ฒ˜๋ฆฌ๋ฅผ ์›ํ•˜๋Š”๋งŒํผ ์ธ์ฒด ๊ณตํ•™์ ์œผ๋กœ ๋งŒ๋“ค๊ธฐ์— ์ถฉ๋ถ„ํ•˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค.

์ด๊ฒƒ์€ ํฅ๋ฏธ๋กœ์šด ์ ์ž…๋‹ˆ๋‹ค. ์ด๊ฒƒ์— ์ง‘์ค‘ํ•  ๊ฐ€์น˜๊ฐ€์žˆ์„ ๊ฒƒ์ž…๋‹ˆ๋‹ค (์•„๋งˆ ๋‹น์‹ ๊ณผ ์ œ๊ฐ€ ์กฐ๊ธˆ ์ด์•ผ๊ธฐ๋ฅผ ๋‚˜๋ˆŒ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค). ๋‚˜๋Š” ์šฐ๋ฆฌ๊ฐ€ ์—ฌ๊ธฐ์„œ ๋” ์ž˜ํ•  ์ˆ˜ ์žˆ๋‹ค๋Š” ๋ฐ ๋™์˜ํ•ฉ๋‹ˆ๋‹ค. Carrier ํŠน์„ฑ์— ๋Œ€ํ•œ ์ œ์•ˆ ๋œ ๋””์ž์ธ (https://github.com/rust-lang/rfcs/issues/1718 ์ฐธ์กฐ)์€ ํŠนํžˆ ์ „๋ฌธํ™”์™€ ๊ฒฐํ•ฉํ•˜๋ฉด ์ƒํ™ฉ์„ ๋” ์œ ์—ฐํ•˜๊ฒŒ ๋งŒ๋“ค๊ธฐ ๋•Œ๋ฌธ์— ์—ฌ๊ธฐ์„œ ๋„์›€์ด ๋  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

๋ฉ”์„œ๋“œ ๋งคํฌ๋กœ๊ฐ€ ์–ธ์–ด์— ๋Œ€ํ•œ ์ข‹์€ ํ™•์žฅ์ด ๋ ์ง€ ์˜์‹ฌ ์Šค๋Ÿฝ์Šต๋‹ˆ๋‹ค.

macro_rules! ๋งคํฌ๋กœ๋Š” ํ˜„์žฌ ํ•จ์ˆ˜๋ฅผ ํ•ด์ œํ•˜๋Š” ๊ฒƒ๊ณผ ์œ ์‚ฌํ•œ ๋ฐฉ์‹์œผ๋กœ ์„ ์–ธ๋˜์–ด ์žˆ์œผ๋ฉฐ ์ƒˆ๋กœ์šด ์ž„ํฌํŠธ ์‹œ์Šคํ…œ์ด ์ฑ„ํƒ๋˜๋ฉด ๋”์šฑ ์œ ์‚ฌํ•ด์งˆ ๊ฒƒ์ž…๋‹ˆ๋‹ค. ๋‚ด ๋ง์€ ์ตœ์ƒ์œ„ ํ•ญ๋ชฉ์ฒ˜๋Ÿผ ์„ ์–ธ๋˜๊ณ  ์ตœ์ƒ์œ„ ํ•ญ๋ชฉ์ฒ˜๋Ÿผ ํ˜ธ์ถœ๋˜๋ฉฐ ๊ณง ์ตœ์ƒ์œ„ ํ•ญ๋ชฉ์ฒ˜๋Ÿผ ๊ฐ€์ ธ ์˜ค๊ฒŒ๋œ๋‹ค๋Š” ๊ฒƒ์ž…๋‹ˆ๋‹ค.

์ด๊ฒƒ์€ ๋ฐฉ๋ฒ•์ด ์ž‘๋™ํ•˜๋Š” ๋ฐฉ์‹์ด ์•„๋‹™๋‹ˆ๋‹ค. ๋ฉ”์„œ๋“œ์—๋Š” ๋‹ค์Œ๊ณผ ๊ฐ™์€ ์†์„ฑ์ด ์žˆ์Šต๋‹ˆ๋‹ค.

  1. ๋ชจ๋“ˆ ๋ฒ”์œ„์—์„œ ์„ ์–ธ ํ•  ์ˆ˜ ์—†์ง€๋งŒ impl ๋ธ”๋ก ๋‚ด์—์„œ ์„ ์–ธํ•ด์•ผํ•ฉ๋‹ˆ๋‹ค.
  2. ์ง์ ‘ ๊ฐ€์ ธ ์˜ค๋Š” ๋Œ€์‹  impl ๋ธ”๋ก๊ณผ ์—ฐ๊ฒฐ๋œ ์œ ํ˜• / ํŠน์„ฑ์œผ๋กœ ๊ฐ€์ ธ์˜ต๋‹ˆ๋‹ค.
  3. ์ด ๋ฒ”์œ„์—์„œ ๋ชจํ˜ธํ•˜์ง€ ์•Š์€ ๋‹จ์ผ ๊ธฐํ˜ธ๋ฅผ ๊ธฐ์ค€์œผ๋กœ ์ „๋‹ฌ๋˜์ง€ ์•Š๊ณ  ์ˆ˜์‹ ์ž ์œ ํ˜•์„ ๊ธฐ์ค€์œผ๋กœ ์ „๋‹ฌ๋ฉ๋‹ˆ๋‹ค.

์œ ํ˜• ๊ฒ€์‚ฌ ์ „์— ๋งคํฌ๋กœ๊ฐ€ ํ™•์žฅ๋˜๊ธฐ ๋•Œ๋ฌธ์— ์ด๋Ÿฌํ•œ ์†์„ฑ ์ค‘ ์–ด๋Š ๊ฒƒ๋„ ๋‚ด๊ฐ€ ๋งํ•  ์ˆ˜์žˆ๋Š” ํ•œ ๋ฉ”์„œ๋“œ ๊ตฌ๋ฌธ์„ ์‚ฌ์šฉํ•˜๋Š” ๋งคํฌ๋กœ์— ํ•ด๋‹น๋˜์ง€ ์•Š์„ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ๋ฌผ๋ก  ์šฐ๋ฆฌ๋Š” ๋ฉ”์†Œ๋“œ ๊ตฌ๋ฌธ์„ ์‚ฌ์šฉํ•˜์ง€๋งŒ 'free'๋งคํฌ๋กœ์™€ ๊ฐ™์€ ๋ฐฉ์‹์œผ๋กœ ์ „๋‹ฌ๋˜๊ณ  ๊ฐ€์ ธ ์˜ค๋Š” ๋งคํฌ๋กœ๋ฅผ ๊ฐ€์งˆ ์ˆ˜ ์žˆ์ง€๋งŒ,์ด ์ฐจ์ด๋กœ ์ธํ•ด ๋งค์šฐ ํ˜ผ๋ž€์Šค๋Ÿฌ์šด ๊ธฐ๋Šฅ์ด ๋  ๊ฒƒ์ด๋ผ๊ณ  ์ƒ๊ฐํ•ฉ๋‹ˆ๋‹ค.

์ด๋Ÿฌํ•œ ์ด์œ ๋กœ ๋‚˜๋Š” "๋ฉ”์†Œ๋“œ ๋งคํฌ๋กœ"๊ฐ€ ์–ธ์  ๊ฐ€ ๋‚˜ํƒ€๋‚  ์ˆ˜ ์žˆ๋‹ค๋Š” ๋ฏฟ์Œ์œผ๋กœ ? ๋ฅผ ์—ฐ๊ธฐํ•˜๋Š” ๊ฒƒ์ด ์ข‹์€ ์„ ํƒ์ด๋ผ๊ณ  ์ƒ๊ฐํ•˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค.

๋”๊ตฌ๋‚˜ ์ผ๋ถ€ ๊ตฌ์กฐ๊ฐ€ ๋„ˆ๋ฌด ๋„๋ฆฌ ์‚ฌ์šฉ๋˜๊ณ  ์ค‘์š”ํ•ด์„œ ๋งคํฌ๋กœ์—์„œ ์„คํƒ•์œผ๋กœ ์Šน๊ฒฉ๋˜์–ด์•ผํ•˜๋Š” ์„ ์ด ์žˆ๋‹ค๊ณ  ์ƒ๊ฐํ•ฉ๋‹ˆ๋‹ค. for ๋ฃจํ”„๊ฐ€ ์ข‹์€ ์˜ˆ์ž…๋‹ˆ๋‹ค. ? ๋™์ž‘์€ Rust์˜ ์˜ค๋ฅ˜ ์ฒ˜๋ฆฌ ์Šคํ† ๋ฆฌ์— ํ•„์ˆ˜์ ์ด๋ฉฐ ๋งคํฌ๋กœ ๋Œ€์‹  ์ผ๋ฅ˜ ์„คํƒ•์ด๋˜๋Š” ๊ฒƒ์ด ์ ์ ˆํ•˜๋‹ค๊ณ  ์ƒ๊ฐํ•ฉ๋‹ˆ๋‹ค.

@hauleth , @CryZe

? ์ด and_then ์—ฐ์‚ฐ์ž ์—ฌ์•ผํ•œ๋‹ค๊ณ  ์ œ์•ˆํ•˜๋Š” ์‚ฌ๋žŒ๋“ค์—๊ฒŒ ์‘๋‹ตํ•˜๊ธฐ ์œ„ํ•ด ํ™•์žฅ ๊ธฐ๋Šฅ์„ ๊ด‘๋ฒ”์œ„ํ•˜๊ฒŒ ์‚ฌ์šฉํ•˜๊ธฐ ๋•Œ๋ฌธ์— Kotlin (๋‚˜๋Š” coffeescript์— ์ต์ˆ™ํ•˜์ง€ ์•Š์Œ)๊ณผ ๊ฐ™์€ ์–ธ์–ด์—์„œ ์ž˜ ์ž‘๋™ํ•˜์ง€๋งŒ ๊ทธ๋ ‡์ง€ ์•Š์Šต๋‹ˆ๋‹ค. ๋…น์— ๋„ˆ๋ฌด ๊ฐ„๋‹จํ•ฉ๋‹ˆ๋‹ค. ๊ธฐ๋ณธ์ ์œผ๋กœ and_then ์˜ ๋Œ€๋ถ€๋ถ„์˜ ์šฉ๋„๋Š” maybe_i.and_then(|i| i.foo()) maybe_i.and_then(|i| Foo::foo(i)) . ์ „์ž๋Š” maybe_i?.foo() ๋กœ ํ‘œํ˜„ํ•  ์ˆ˜ ์žˆ์ง€๋งŒ ํ›„์ž๋Š” ํ•  ์ˆ˜ ์—†์Šต๋‹ˆ๋‹ค. Foo::foo(maybe_i?, maybe_j?) ๊ฐ€ maybe_i.and_then(|i| maybe_j.and_then(|j| Foo::foo(i, j))) ๋กœ ๋ฐ”๋€๋‹ค ๊ณ  ๋งํ•  ์ˆ˜ ์žˆ์ง€๋งŒ ์ด๊ฒƒ์€ ๋‹จ์ง€ ์˜ค๋ฅ˜๋กœ ํ‰๊ฐ€๋˜๋Š” ์ฒซ ๋ฒˆ์งธ ? ๋ฅผ ์ณค์„ ๋•Œ ๋…น์ด ์ผ์ฐ ๋Œ์•„ ์˜จ๋‹ค๊ณ  ๋งํ•˜๋Š” ๊ฒƒ๋ณด๋‹ค ํ›จ์”ฌ ๋” ํ˜ผ๋ž€ ์Šค๋Ÿฝ์Šต๋‹ˆ๋‹ค. ๊ทธ๋Ÿฌ๋‚˜ ์ด๊ฒƒ์€ ํ‹€๋ฆผ์—†์ด ๋” ๊ฐ•๋ ฅ ํ•  ๊ฒƒ์ž…๋‹ˆ๋‹ค.

@Stebalien ํ—ˆ์šฉ ๋œ RFC์—์„œ catch { Foo::foo(maybe_i?, maybe_j?) } ๋Š” ์›ํ•˜๋Š” ์ž‘์—…์„ ์ˆ˜ํ–‰ํ•ฉ๋‹ˆ๋‹ค.

@eddyb ์ข‹์€ ์ง€์ ์ž…๋‹ˆ๋‹ค. ๋‚˜๋Š” "๊ทธ๋Ÿฌ๋‚˜ ์ด๊ฒƒ์€ ํ‹€๋ฆผ์—†์ด ๋” ๊ฐ•๋ ฅ ํ•  ๊ฒƒ์ด๋‹ค"๋ฅผ ์ƒ๋žต ํ•  ์ˆ˜ ์žˆ๋‹ค๊ณ  ์ƒ๊ฐํ•œ๋‹ค. ์•”์‹œ ์  ์บ์น˜ / ๋ช…์‹œ ์  ์‹œ๋„ ๋Œ€ ๋ช…์‹œ ์  ์บ์น˜ / ์•”์‹œ ์  ์‹œ๋„๋กœ ๊ท€๊ฒฐ๋ฉ๋‹ˆ๋‹ค.

let x: i32 = try Foo::foo(a?.b?.c()?));
let y: Result<i32, _> = Foo::foo(a?.b?.c()?);

๋Œ€:

let x: i32 = Foo::foo(a?.b?.c()?);
let y: Result<i32, _> = catch  Foo::foo(a?.b?.c()?);

(๋ชจ๋“ˆ๋กœ ๊ตฌ๋ฌธ)

@Stebalien ๋˜ ๋‹ค๋ฅธ ์˜ˆ : Foo ํ•จ์ˆ˜์— bar ํ•˜๋ ค๋ฉด ์ œ์•ˆ๊ณผ ํ•จ๊ป˜ ๋‹ค์Œ์„ ์ˆ˜ํ–‰ํ•ด์•ผํ•ฉ๋‹ˆ๋‹ค.

bar(Foo::foo(a?.b?.c()?)?)

์ด๊ฒƒ์ด ๋‹น์‹ ์ด ์—ผ๋‘์—๋‘๊ณ ์žˆ๋Š” ๊ฒƒ์ž…๋‹ˆ๊นŒ? ์ถ”๊ฐ€ ์ฐธ๊ณ  ? ์—†์ด, bar ์–ป์„ ๊ฒƒ Result ๋Œ€์‹ ์˜ Foo .

@eddyb ์•„๋งˆ. ์ฐธ๊ณ  : ์‹ค์ œ๋กœ ์ œ์•ˆํ•˜๋Š” ๊ฒƒ์ด ์•„๋‹™๋‹ˆ๋‹ค! ? ๋ฅผ ํŒŒ์ดํ”„ ์—ฐ์‚ฐ์ž๋กœ ์‚ฌ์šฉํ•˜๋Š” ๊ฒƒ์€ Foo::foo(bar?) ์ผ€์ด์Šค๋ฅผ ์ฒ˜๋ฆฌ ํ•  ๋ฐฉ๋ฒ• ์—†์ด๋Š” rust์—์„œ ํŠน๋ณ„ํžˆ ์œ ์šฉํ•˜์ง€ ์•Š๋‹ค๊ณ  ์ฃผ์žฅํ•˜๊ณ  ์žˆ์Šต๋‹ˆ๋‹ค.

์ œ๊ฐ€ ๋ฉ”์„œ๋“œ ๋งคํฌ๋กœ์— ๋Œ€ํ•œ ์•„์ด๋””์–ด๊ฐ€ ์‹ซ๊ณ  ๋” ๊ฐ•๋ ฅํ•˜๊ฒŒ ๋ฐ˜๋Œ€ ํ•  ์–ธ์–ด ๊ธฐ๋Šฅ์„ ์ƒ๊ฐํ•  ์ˆ˜ ์—†๋‹ค๋Š” ์ ์— ์œ ์˜ํ•˜์‹ญ์‹œ์˜ค. ๊ทธ๊ฒƒ๋“ค์€ ์ปดํŒŒ์ผ๋Ÿฌ์˜ ์œ„์ƒ์„ ๋ชจํ˜ธํ•˜๊ฒŒ ๋งŒ๋“ค๊ณ , ์šฐ๋ฆฌ๊ฐ€ ์–ธ์–ด๋ฅผ ์•„์ฃผ ๊ทผ๋ณธ์ ์œผ๋กœ ๋ณ€๊ฒฝํ•˜์ง€ ์•Š๋Š” ํ•œ, ๊ทธ๊ฒƒ๋“ค์ด ์กด์žฌํ•  ์ˆ˜ ์žˆ๊ณ  ๋†€๋ผ์šด ํ–‰๋™์„ ํ•  ๋ฐฉ๋ฒ•์ด ์—†์Šต๋‹ˆ๋‹ค. ๋˜ํ•œ ํ˜„๋ช…ํ•˜๊ฒŒ ๊ตฌ๋ฌธ ๋ถ„์„ํ•˜๊ธฐ ์–ด๋ ต๊ณ  ๊ฑฐ์˜ ํ™•์‹คํžˆ ์ด์ „ ๋ฒ„์ „๊ณผ ํ˜ธํ™˜๋˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค.

@Stebalien , ? ๋ฅผ ํŒŒ์ดํ”„ ์—ฐ์‚ฐ์ž Foo::foo(bar?) ํ•˜๋ฉด Foo::foo(try!(bar)) ๋ฐ bar(Foo::foo(a?.b?.c()?)?) ( Foo::foo : fn(Result<_, _>) -> Result<_, _> ๋ผ๊ณ  ๊ฐ€์ •) : bar(try!(Foo::foo(a?.b?.c()?)))

@hauleth ๋‚ด ์š”์ ์€ Foo::foo(bar?)? ์ด ๋…น์—์„œ bar?.foo()? ๋ณด๋‹ค _ ํ›จ์”ฌ _ ๋” ์ผ๋ฐ˜์ ์ด๋ผ๋Š” ๊ฒƒ์ž…๋‹ˆ๋‹ค. ๋”ฐ๋ผ์„œ ์œ ์šฉํ•˜๊ฒŒ ์‚ฌ์šฉํ•˜๋ ค๋ฉด ? ๊ฐ€์ด ๊ฒฝ์šฐ๋ฅผ ์ง€์›ํ•ด์•ผํ•ฉ๋‹ˆ๋‹ค (๋˜๋Š” ๋‹ค๋ฅธ ๊ธฐ๋Šฅ์„ ๋„์ž…ํ•ด์•ผ ํ•จ). ๋‚˜๋Š” ๊ทธ๋ ‡๊ฒŒํ•˜๋Š” ๋ฐฉ๋ฒ•์„ ๊ฐ€์ •ํ•˜๊ณ  ๊ทธ ๋ฐฉ๋ฒ•์ด ์ ์–ด๋„ ์ง€์ €๋ถ„ํ•ด์งˆ ๊ฒƒ์ž„์„ ๋ณด์—ฌ์ฃผ์—ˆ์Šต๋‹ˆ๋‹ค. ? ์˜ ์ „์ฒด ์š”์ ์€ try!(foo(try!(bar(try!(baz()))))) (๊ด„ํ˜ธ์˜ 2 ๋ฐฐ!)๋ฅผ ์“ฐ๋Š” ๊ฒƒ์„ ํ”ผํ•  ์ˆ˜ ์žˆ๋‹ค๋Š” ๊ฒƒ์ž…๋‹ˆ๋‹ค. ์ผ๋ฐ˜์ ์œผ๋กœ try!(baz()?.bar()?.foo()) ๋กœ ๋‹ค์‹œ ์ž‘์„ฑํ•  ์ˆ˜ ์—†์Šต๋‹ˆ๋‹ค.

ํ•˜์ง€๋งŒ ์–ธ์ œ๋“ ์ง€ ๋‹ค์Œ์„ ์ˆ˜ํ–‰ ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

try!(baz().and_then(bar).and_then(foo))

ลukasz Niemier
[email protected]

Wiadomoล›ฤ‡ napisana przez Steven Allen [email protected] w dniu 05.09.2016, o godz. 15:39 :

@hauleth https://github.com/hauleth ๋‚ด ์š”์ ์€ Foo :: foo (bar?)? bar? .foo ()๋ณด๋‹ค ํ›จ์”ฌ ๋” ์ผ๋ฐ˜์ ์ž…๋‹ˆ๊นŒ? ๋…น์—. ๋”ฐ๋ผ์„œ ์œ ์šฉํ•˜๊ฒŒ ์‚ฌ์šฉํ•˜๋ ค๋ฉด? ์ด ๊ฒฝ์šฐ๋ฅผ ์ง€์›ํ•ด์•ผํ•ฉ๋‹ˆ๋‹ค (๋˜๋Š” ๋‹ค๋ฅธ ๊ธฐ๋Šฅ์„ ๋„์ž…ํ•ด์•ผ ํ•จ). ๋‚˜๋Š” ๊ทธ๋ ‡๊ฒŒํ•˜๋Š” ๋ฐฉ๋ฒ•์„ ๊ฐ€์ •ํ•˜๊ณ  ๊ทธ ๋ฐฉ๋ฒ•์ด ์ ์–ด๋„ ์ง€์ €๋ถ„ํ•ด์งˆ ๊ฒƒ์ž„์„ ๋ณด์—ฌ์ฃผ์—ˆ์Šต๋‹ˆ๋‹ค. ์˜ ์ „์ฒด ํฌ์ธํŠธ? try! (foo (try! (bar (try! (baz ()))))) (๊ด„ํ˜ธ 2 ๋ฐฐ!); ์ผ๋ฐ˜์ ์œผ๋กœ ์ด๊ฒƒ์„ try! (baz () ?. bar () ?. foo ())๋กœ ๋‹ค์‹œ ์ž‘์„ฑํ•  ์ˆ˜ ์—†์Šต๋‹ˆ๋‹ค.

โ€”
๋‹น์‹ ์ด ์–ธ๊ธ‰ ๋˜์—ˆ๊ธฐ ๋•Œ๋ฌธ์— ์ด๊ฒƒ์„ ๋ฐ›๊ณ  ์žˆ์Šต๋‹ˆ๋‹ค.
์ด ์ด๋ฉ”์ผ์— ์ง์ ‘ ๋‹ต์žฅํ•˜๊ฑฐ๋‚˜ GitHub https://github.com/rust-lang/rust/issues/31436#issuecomment -244749275์—์„œ ๋ณด๊ฑฐ๋‚˜ https://github.com/notifications/unsubscribe-auth/ ์Šค๋ ˆ๋“œ๋ฅผ ์Œ์†Œ๊ฑฐํ•ฉ๋‹ˆ๋‹ค.

์•ฝ๊ฐ„ ๊ด€๋ จ์ด์žˆ๋Š” ๋ฉ”๋ชจ์—์„œ,?-๊ธฐ๋Šฅ์€ ์ฃผ๋กœ ๋นŒ๋”๊ฐ€ ์‚ฌ์šฉํ•˜๋Š” ๊ฒƒ์œผ๋กœ ๋ณด์ด๋ฏ€๋กœ ๊ฒฐ๊ณผ๋ฅผ ๋ž˜ํ•‘ํ•˜๋Š” ๋นŒ๋”๋ฅผ ๊ตฌ์„ฑํ•˜๋Š” ์‰ฌ์šด ๋ฐฉ๋ฒ•์„ ์ œ๊ณตํ•˜์—ฌ?-๊ธฐ๋Šฅ์˜ ํ•„์š”์„ฑ์„ ํ”ผํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.. ์—ฌ๊ธฐ์„œ ์ œ์•ˆํ•œ ๊ฒƒ์ด ์žˆ์ง€๋งŒ ์กฐ๊ธˆ ๋” ์ž‘์—…์ด ํ•„์š”ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

https://github.com/colin-kiegel/rust-derive-builder/issues/25

๋ฉ”์„œ๋“œ ๋งคํฌ๋กœ ์•„์ด๋””์–ด @nrc ๋ฐ @withoutboats ์— ๋Œ€ํ•œ ์˜๊ฒฌ์„ ๋ณด๋‚ด ์ฃผ์…”์„œ ๊ฐ์‚ฌํ•ฉ๋‹ˆ๋‹ค. ์ž‘๋™ํ•˜์ง€ ์•Š๋Š” ๊ตฌ์ฒด์ ์ธ ์ด์œ ๋ฅผ ๋“ค์–ด ์ฃผ์…”์„œ ๊ฐ์‚ฌํ•ฉ๋‹ˆ๋‹ค.

@nielsle ๋‚˜๋Š” ? ๊ฐ€ "์ฃผ๋กœ"๊ฑด์ถ•์—…์ž๋“ค์ด ์‚ฌ์šฉํ•˜๊ณ  ์žˆ๋‹ค๊ณ  ๋งํ•˜๋Š” ๊ฒƒ์ด ์ •ํ™•ํ•˜์ง€ ์•Š๋‹ค๊ณ  ์ƒ๊ฐํ•ฉ๋‹ˆ๋‹ค. ๋นŒ๋”๋Š” ๊ฒฝ๋Ÿ‰์˜ ์ ‘๋ฏธ์‚ฌ ์—ฐ์‚ฐ์ž์˜ ์žฅ์ ์ด ์‹ค์ œ๋กœ ๋น›์„ ๋ฐœํ•˜๋Š” ์˜ˆ๋ผ๊ณ  ์ƒ๊ฐํ•˜์ง€๋งŒ ๋ชจ๋“  ์ƒํ™ฉ์—์„œ ? try! ๋ฅผ ์„ ํ˜ธํ•ฉ๋‹ˆ๋‹ค.

@nielsle ์„ ๋ฌผ์— ๊ด€ํ•ด์„œ๋Š” ์›๋ž˜ ๋น„์Šทํ•œ ์ด์œ ๋กœ ์šฐ๋ คํ–ˆ์Šต๋‹ˆ๋‹ค. ํ•˜์ง€๋งŒ ์ƒ๊ฐํ•ด ๋ณด๋ฉด async / await ์ด (๊ฐ€) ํ•ด๋‹น ์ปจํ…์ŠคํŠธ์—์„œ ? ์— ๋Œ€ํ•œ ๋ชจ๋“  ์š”๊ตฌ๋ฅผ ๋Œ€์ฒด ํ•  ๊ฒƒ์ด๋ผ๊ณ  ์ƒ๊ฐํ•ฉ๋‹ˆ๋‹ค. ๊ทธ๋“ค์€ ์‹ค์ œ๋กœ ์ƒ๋‹นํžˆ ์ง๊ตํ•ฉ๋‹ˆ๋‹ค. (await future)?.bar() ๊ฐ™์€ ๊ฒƒ์„ ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

(ํ‚ค์›Œ๋“œ await ๋Œ€์‹  ์ ‘๋ฏธ์‚ฌ ์—ฐ์‚ฐ์ž๋ฅผ ์‚ฌ์šฉํ•˜๋Š” ๊ฒƒ์ด ์ข‹์„ ์ˆ˜ ์žˆ์œผ๋ฏ€๋กœ ๊ด„ํ˜ธ๊ฐ€ ํ•„์š”ํ•˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค. ์•„๋‹ˆ๋ฉด ์‹ ์ค‘ํ•˜๊ฒŒ ์กฐ์ • ๋œ ์šฐ์„  ์ˆœ์œ„๋กœ ์ถฉ๋ถ„ํ•  ์ˆ˜๋„ ์žˆ์Šต๋‹ˆ๋‹ค.)

์šฐ๋ฆฌ๊ฐ€ ์•ˆ์ •ํ™”๋˜๊ธฐ ์ „์— ์ž‘์„ฑ๋œ ๋ฌธ์„œ๋ฅผ๋ณด๊ณ  ์‹ถ์Šต๋‹ˆ๋‹ค. ๋‚˜๋Š” ์ฐธ๊ณ  ๋ฌธํ—Œ์„ ์‚ดํŽด ๋ณด์•˜์ง€๋งŒ ์–ด๋–ค ์–ธ๊ธ‰๋„ ์ฐพ์„ ์ˆ˜ ์—†์—ˆ๋‹ค. ์ด ๊ธฐ๋Šฅ์„ ์–ด๋””์— ๋ฌธ์„œํ™”ํ•ด์•ผํ•ฉ๋‹ˆ๊นŒ?

@cbreeden ๋‚˜๋Š” @steveklabnik์ด ์ผ๋ฐ˜์ ์œผ๋กœ ๋ถˆ์•ˆ์ •ํ•œ ๊ธฐ๋Šฅ์„ ๋ฌธ์„œํ™”ํ•˜์ง€ ์•Š๋Š”๋‹ค๋Š” ๊ฒƒ์„ ์•Œ๊ณ  ์žˆ์Šต๋‹ˆ๋‹ค. ์•ˆ์ •ํ™”๋˜์ง€ ์•Š์œผ๋ฉด ์‹œ๊ฐ„ ๋‚ญ๋น„๊ฐ€ ๋  ๊ฐ€๋Šฅ์„ฑ์ด ์žˆ๊ธฐ ๋•Œ๋ฌธ์ž…๋‹ˆ๋‹ค. ์ด์ „์— ๋ฌธ์„œ ์ž‘์„ฑ์— ๋Œ€ํ•œ ์•ˆ์ •ํ™”๋ฅผ ์ฐจ๋‹จ ํ•œ ์ ์ด ์žˆ๋Š”์ง€ ๋ชจ๋ฅด๊ฒ ์Šต๋‹ˆ๋‹ค.

@solson ๋งž์Šต๋‹ˆ๋‹ค. ์—ฌ๊ธฐ๋Š” ์•„๋งˆ๋„ ๊ทธ๊ฒƒ์„ ์ œ๊ธฐ ํ•  ๊ณณ์ด ์•„๋‹ˆ ์—ˆ๊ฑฐ๋‚˜ ์ ์–ด๋„ ์•ˆ์ •ํ™” ์งˆ๋ฌธ๊ณผ ๊ด€๋ จ๋˜์–ด์„œ๋Š” ์•ˆ๋ฉ๋‹ˆ๋‹ค. ๊ธฐ๋Šฅ ์•ˆ์ •ํ™”๋ฅผ ๊ฒฐ์ •ํ•  ์ˆ˜ ์žˆ์ง€๋งŒ ์•ˆ์ •์ ์ธ rustc๋กœ ์ถœ์‹œ๋˜๊ธฐ ์ „์— ๋ฌธ์„œํ™”๊ฐ€ ํ•„์š”ํ•œ ์ƒํ™ฉ์„ ์ƒ์ƒ ํ•œ ๊ฒƒ ๊ฐ™์Šต๋‹ˆ๋‹ค. ๋ฌธ์„œ๋ฅผ ๊ธฐ๋Šฅ ์•ˆ์ •ํ™” ๋ฐ ๋ฆด๋ฆฌ์Šค์™€ ํ†ตํ•ฉํ•˜๋Š” ๊ฒƒ๊ณผ ๊ด€๋ จ๋œ RFC๊ฐ€ ์žˆ์œผ๋ฏ€๋กœ ํ•ด๋‹น ํ”„๋กœ์„ธ์Šค๊ฐ€ ์•ˆ์ •ํ™” ๋  ๋•Œ๊นŒ์ง€ ๊ธฐ๋‹ค๋ฆด ๊ฒƒ์ž…๋‹ˆ๋‹ค (๋ฌผ๋ก  ์ ์ ˆํ•œ ๋ฌธ์„œ๊ฐ€ ์—†์œผ๋ฉด ๋จผ์ €).

์ด RFC์˜ ์ค‘์š”ํ•œ ๋ถ€๋ถ„์€ try! ์ฒ˜๋Ÿผ ์ž‘๋™ํ•˜๋Š” ํ‘œํ˜„์‹์˜ ์˜ค๋ฅธ์ชฝ ๋ถ€๋ถ„์„ ๊ฐ–๋Š” ๊ฒƒ์ž…๋‹ˆ๋‹ค. ์™œ๋ƒํ•˜๋ฉด "try"_much_์˜ ์ˆœ์ฐจ / ์—ฐ์‡„ ์‚ฌ์šฉ๋ฒ•์„ ๋” ์ฝ๊ธฐ ์‰ฝ๊ณ  "catch"๋ฅผ ๊ฐ–๋„๋กํ•˜๊ธฐ ๋•Œ๋ฌธ์ž…๋‹ˆ๋‹ค. . ์›๋ž˜๋Š” ? ๋ฅผ ๊ตฌ๋ฌธ์œผ๋กœ ์‚ฌ์šฉํ•˜๋Š” 100 % ์„œํฌํ„ฐ ์˜€์ง€๋งŒ ์ตœ๊ทผ์—๋Š” ์ด๋ฏธ ? ๋ฅผ ์‚ฌ์šฉํ•˜๋Š” ์ผ๋ถ€ (๊นจ๋—ํ•œ!) ์ฝ”๋“œ๋ฅผ ๋ฐœ๊ฒฌํ•˜์—ฌ ๊ฐ„๋‹จํ•œ ์˜ˆ์ œ ? ๋Š” ๋งค์šฐ ์‰ฝ๊ฒŒ ๊ฐ„๊ณผ ๋ฉ๋‹ˆ๋‹ค. ์ด์ œ "์ƒˆ๋กœ์šด ์‹œ๋„"๋ฅผ์œ„ํ•œ ๊ตฌ๋ฌธ์œผ๋กœ ? ๋ฅผ ์‚ฌ์šฉํ•˜๋Š” ๊ฒƒ์ด ํฐ ์‹ค์ˆ˜ ์ผ ์ˆ˜ ์žˆ๋‹ค๊ณ  ๋ฏฟ๊ฒŒ๋˜์—ˆ์Šต๋‹ˆ๋‹ค.

๋”ฐ๋ผ์„œ ? ๋˜๋Š” ๋‹ค๋ฅธ ๊ธฐํ˜ธ (๋“ค)๋ฅผ ๊ตฌ๋ฌธ์œผ๋กœ ์‚ฌ์šฉํ•˜๋Š” ๊ฒƒ์— ๋Œ€ํ•œ ํ”ผ๋“œ๋ฐฑ์„ ์–ป๊ธฐ ์œ„ํ•ด (ํฌ๋Ÿผ์— ๋Œ€ํ•œ ์•Œ๋ฆผ๊ณผ ํ•จ๊ป˜) ์™„๋ฃŒํ•˜๊ธฐ ์ „์— _ ์ผ๋ถ€ ์„ค๋ฌธ ์กฐ์‚ฌ๋ฅผ ์˜ฌ๋ฆฌ๋Š” ๊ฒƒ์ด ์ข‹์Šต๋‹ˆ๋‹ค _. . ๋” ๊ธด ๊ธฐ๋Šฅ์—์„œ์˜ ์‚ฌ์šฉ ์˜ˆ์™€ ํ•จ๊ป˜ ์ตœ์ ์ž…๋‹ˆ๋‹ค. ๋‹ค๋ฅธ ๊ฒƒ์„ ๋ณ€๊ฒฝํ•˜์ง€ ์•Š์œผ๋ ค๋ฉด ? ์ด๋ฆ„์„ ๋ฐ”๊พธ๋Š” ๊ฒƒ์ด ์ข‹์Šต๋‹ˆ๋‹ค. ์—ฌ๋ก  ์กฐ์‚ฌ๋Š” ?! (๋˜๋Š” ?? ) ๋˜๋Š” "์‚ฌ์šฉ? vs. ๋ฌธ์ž๋ณด๋‹ค ๋งŽ์ด ์‚ฌ์šฉ"๊ณผ ๊ฐ™์ด ๊ณผ๊ฑฐ์— ํŠ€์–ด ๋‚˜์™”๋˜ ๊ฐ€๋Šฅํ•œ ๋‹ค๋ฅธ ์ด๋ฆ„์„ ๋‚˜์—ด ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

Btw. ? ๋ฅผ ์‚ฌ์šฉํ•˜์ง€ ์•Š์œผ๋ฉด ๋‹ค๋ฅธ ์–ธ์–ด ์˜ต์…˜ ์œ ํ˜•๊ณผ ๋™์ผํ•œ ๊ตฌ๋ฌธ์ด๊ธฐ ๋•Œ๋ฌธ์— ์‹ซ์–ดํ•˜๋Š” ์‚ฌ๋žŒ๋“ค์„ ๋งŒ์กฑ์‹œํ‚ฌ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ๊ทธ๋ฆฌ๊ณ  ๊ทธ๊ฒƒ์„ rust ์˜ต์…˜ ์œ ํ˜•์— ๋Œ€ํ•œ ์„ ํƒ์  ๊ตฌ๋ฌธ์œผ๋กœ ๋งŒ๋“ค๊ณ ์žํ•˜๋Š” ์‚ฌ๋žŒ๋“ค. (์ด๋ฅผ ํ†ตํ•ด ๋‚ด๊ฐ€ ๊ณต์œ ํ•˜๋Š” ๋ฌธ์ œ๊ฐ€ ์•„๋‹™๋‹ˆ๋‹ค).

๋˜ํ•œ ์ด๋Ÿฌํ•œ ์„ค๋ฌธ ์กฐ์‚ฌ๋ฅผ ํ†ตํ•ด ์ผ๋ฐ˜์ ์œผ๋กœ RFC ํ”„๋กœ์„ธ์Šค์— ์ฐธ์—ฌํ•˜์ง€ ์•Š๋Š” ์‚ฌ๋žŒ๋“ค์—๊ฒŒ ๋„๋‹ฌ ํ•  ์ˆ˜ ์žˆ๋‹ค๊ณ  ์ƒ๊ฐํ•ฉ๋‹ˆ๋‹ค. ์ผ๋ฐ˜์ ์œผ๋กœ ์ด๊ฒƒ์€ ํ•„์š”ํ•˜์ง€ ์•Š์„ ์ˆ˜ ์žˆ์ง€๋งŒ try! => ? ์€ Rust ์ฝ”๋“œ๋ฅผ ์ž‘์„ฑํ•˜๊ฑฐ๋‚˜ ์ฝ๋Š” ๋ชจ๋“  ์‚ฌ๋žŒ์—๊ฒŒ ๋งค์šฐ ํฐ ๋ณ€ํ™”์ž…๋‹ˆ๋‹ค.

์ถ”์‹ :
์œ„์™€ ๊ฐ™์€ ๊ธฐ๋Šฅ์„ ๋‹ค์–‘ํ•œ ๋ณ€ํ˜• ( "?", "?!", "??")์œผ๋กœ ์š”์  ์„ ์˜ฌ๋ ธ์Šต๋‹ˆ๋‹ค. ๋” ์žˆ์—ˆ๋Š”์ง€ ๋ชจ๋ฅด๊ฒ ์Šต๋‹ˆ๋‹ค. ๋˜ํ•œ์ด ์žˆ์—ˆ๋‹ค RFC ์ด๋ฆ„ ๋ณ€๊ฒฝ ? ์— ?! ์ด ๋…ผ์˜๋กœ ์—ฐ๊ฒฐ๋˜์—ˆ๋‹ค.

์ฃ„์†กํ•ฉ๋‹ˆ๋‹ค. ์ด๋ฏธ ์˜ค๋žซ๋™์•ˆ ์ง„ํ–‰์ค‘์ธ ํ† ๋ก ์„ ๋‹ค์‹œ ์‹œ์ž‘ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. : smiley_cat :.

( expr??? ๋Š” ๋ชจํ˜ธํ•˜๋ฏ€๋กœ Option์— ? ๋ฅผ ๊ณ„์† ๋„์ž…ํ•˜๋ ค๋Š” ๊ฒฝ์šฐ ?? ๋Š” ์ข‹์ง€ ์•Š์Šต๋‹ˆ๋‹ค.)

? ๋Š” ๋งค์šฐ ์‰ฝ๊ฒŒ ๊ฐ„๊ณผ๋ฉ๋‹ˆ๋‹ค.

์—ฌ๊ธฐ์„œ ๋ฌด์—‡์„ ๋…ผ์˜ํ•˜๊ณ  ์žˆ์Šต๋‹ˆ๊นŒ? ์™„์ „ํžˆ ๊ฐ•์กฐ๋˜์ง€ ์•Š์€ ์ฝ”๋“œ? ์ •๊ธฐ์ ์œผ๋กœ ๊ฐ•์กฐ ํ‘œ์‹œ๋œ ์ฝ”๋“œ ๊ฒ€์ƒ‰?
์•„๋‹ˆ๋ฉด ํ•จ์ˆ˜์—์„œ ? ์„ ์ ๊ทน์ ์œผ๋กœ ์ฐพ๊ณ  ์žˆ์Šต๋‹ˆ๊นŒ?

ํŽธ์ง‘๊ธฐ์—์„œ ? ํ•˜๋‚˜๋ฅผ ์„ ํƒํ•˜๋ฉด _all_ ํŒŒ์ผ์˜ ๋‹ค๋ฅธ ? ๊ฐ€ ๋ฐ์€ ๋…ธ๋ž€์ƒ‰ ๋ฐฐ๊ฒฝ์œผ๋กœ ๊ฐ•์กฐ ํ‘œ์‹œ๋˜๊ณ  ๊ฒ€์ƒ‰ ๊ธฐ๋Šฅ๋„ ์ž‘๋™ํ•˜๋ฏ€๋กœ ๋งˆ์ง€๋ง‰ ํ•ญ๋ชฉ์ด ํ‘œ์‹œ๋˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค. ๋‚˜์—๊ฒŒ _any_ ๋‚œ์ด๋„๋ฅผ ์ œ๊ธฐํ•˜๋Š” ๊ฒƒ์ฒ˜๋Ÿผ.

๋‹ค๋ฅธ ๊ฒฝ์šฐ์™€ ๋งˆ์ฐฌ๊ฐ€์ง€๋กœ ?? ๋˜๋Š” ?! ๋๋‚˜๋Š” ๊ฒƒ๋ณด๋‹ค ๋” ๋‚˜์€ ๊ฐ•์กฐ ํ‘œ์‹œ๋กœ์ด ๋ฌธ์ œ๋ฅผ ํ•ด๊ฒฐํ•˜๊ณ  ์‹ถ์Šต๋‹ˆ๋‹ค.

@dathinab ๋‚˜๋Š” .try! () ๋˜๋Š” ๋ฌด์–ธ๊ฐ€๊ฐ€ ๋” ์ข‹์„ ๊ฒƒ์ด๋ผ๊ณ  ์ƒ๊ฐํ•˜์ง€๋งŒ ๋งคํฌ๋กœ์—๋Š” UFCS๊ฐ€ ํ•„์š”ํ•ฉ๋‹ˆ๋‹ค.

let namespace = namespace_opt.ok_or(Error::NoEntry).try!();

์ด๋ ‡๊ฒŒํ•˜๋ฉด ๋†“์น˜๊ธฐ ์–ด๋ ต์ง€๋งŒ .unwrap() ๋ณด๋‹ค ์ž…๋ ฅํ•˜๊ธฐ๊ฐ€ ๋” ์‰ฝ์ง€๋Š” ์•Š์ง€๋งŒ ๊ฐ„๋‹จํ•ฉ๋‹ˆ๋‹ค.

@eddyb : ์˜ˆ๋ฅผ ๋“ค์–ด github์™€ ๊ฐ™์€ ์ผ๋ฐ˜ ๊ฐ•์กฐ ์ฝ”๋“œ์— ๊ด€ํ•œ ๊ฒƒ์ž…๋‹ˆ๋‹ค. ์˜ˆ๋ฅผ ๋“ค์–ด ์ฝ”๋“œ๋ฒ ์ด์Šค๋ฅผ ์ฝ์„ ๋•Œ. ๋‚ด ๊ด€์ ์—์„œ ๋ณผ ๋•Œ ? ๋ฅผ ์‰ฝ๊ฒŒ ๊ฐ„๊ณผํ•˜์ง€ ์•Š๊ธฐ ์œ„ํ•ด ๊ฐ•๋ ฅํ•œ ๊ฐ•์กฐ ํ‘œ์‹œ๊ฐ€ ํ•„์š”ํ•˜๋ฉด ๋‹ค๋ฅธ ๋ฐ˜ํ™˜ ๊ฒฝ๋กœ (/ path to catch)๋ฅผ ๋„์ž…ํ•˜๊ณ  Result<T> ์—์„œ ๋ณ€์ˆ˜ ์œ ํ˜•์„ ๋ณ€๊ฒฝํ•  ์ˆ˜์žˆ๋Š” ๊ฒƒ์€ ์ž˜๋ชป๋œ ๊ฒƒ ๊ฐ™์Šต๋‹ˆ๋‹ค T

@CryZe : ๋™์˜ํ•˜์ง€๋งŒ ๊ฐ€๊นŒ์šด ์‹œ์ผ ๋‚ด์— ์–ป์„ ์ˆ˜์žˆ์„ ๊ฒƒ ๊ฐ™์ง€ ์•Š์Šต๋‹ˆ๋‹ค. ๊ทธ๋ฆฌ๊ณ  .try!() ๋ณด๋‹ค ์•ฝ๊ฐ„ ์งง์€ ๊ฒƒ์„ ๊ฐ–๋Š” ๊ฒƒ๋„ ๊ทธ๋ ‡๊ฒŒ ๋‚˜์˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค.

@CryZe ์ €๋„ ๊ทธ ๊ตฌ๋ฌธ์„ ์ข‹์•„ํ•˜์ง€๋งŒ @withoutboats ๋Š” ๋ฉ”์†Œ๋“œ ๋งคํฌ๋กœ๊ฐ€ ์–ธ์–ด๋ฅผ ์†์ƒ์‹œํ‚ฌ ์ˆ˜์žˆ๋Š” ํ™•์‹คํ•œ ์ด์œ ๋ฅผ ์–ธ๊ธ‰ํ–ˆ์Šต๋‹ˆ๋‹ค.
๋ฐ˜๋ฉด์— ๋ฉ”์„œ๋“œ ๋งคํฌ๋กœ๊ฐ€ ๋‚˜ํƒ€๋‚˜๋ฉด ? ์™€ ์ž˜ ์ž‘๋™ํ•˜์ง€ ์•Š์„ ๊ฒƒ์ด๋ผ๊ณ  ์ƒ๊ฐํ•ฉ๋‹ˆ๋‹ค.

๋‚˜๋Š” ๋ณธ์งˆ์ ์œผ๋กœ์ด์‹œ๊ธธ์— ๋‘ ๋ฌธ์ž๋ฅผ ์‚ฌ์šฉํ•˜๋Š” ๊ฒƒ์— ๋ฐ˜๋Œ€ํ•˜์ง€๋Š” ์•Š์ง€๋งŒ ์˜ˆ์ œ๋ฅผ ์‚ดํŽด ๋ณด์•˜์ง€๋งŒ ? ์ด ๋” ์ด์ƒ ๋ˆˆ์— ๋„๊ฒŒ ๋ณด์ด๊ฒŒ ๋งŒ๋“  ๋ณ€๊ฒฝ ์‚ฌํ•ญ์„ ์ฐพ์ง€ ๋ชปํ–ˆ์Šต๋‹ˆ๋‹ค.

๊ทธ๋ž˜. ์ผ๋ฐ˜์ ์œผ๋กœ ๊ธฐํ˜ธ๋Š” ์ผ๋ฐ˜ ์–ธ์–ด์™€ ํ”„๋กœ๊ทธ๋ž˜๋ฐ ์–ธ์–ด ๋ชจ๋‘์—์„œ ๊ตฌ์กฐํ™”์— ๋” ๋งŽ์ด ์‚ฌ์šฉ๋˜๋ฏ€๋กœ ์ผ์ข…์˜ ํ‚ค์›Œ๋“œ๊ฐ€ ํ•„์š”ํ•˜๋‹ค๊ณ  ์ƒ๊ฐํ•ฉ๋‹ˆ๋‹ค.

@CryZe : ์•„๋งˆ๋„ ?try ์™€ ๊ฐ™์€ ๊ฒƒ์ด ์ผ์ข…์˜ ํ‚ค์›Œ๋“œ ์ผ ๊ฒƒ์ž…๋‹ˆ๋‹ค. ๊ทธ๋Ÿฌ๋‚˜ ์†”์งํžˆ ๋‚˜๋Š” ๊ทธ๊ฒƒ์„ ์ข‹์•„ํ•˜์ง€ ์•Š๋Š”๋‹ค ( ?try ).

@eddyb

๊ฒ€์ƒ‰ ๊ธฐ๋Šฅ๋„ ์ž‘๋™ํ•ฉ๋‹ˆ๋‹ค.

? ํ•˜๋ฉด ์˜ค ํƒ์ง€๊ฐ€ ๋ฐœ์ƒํ•˜์ง€๋งŒ ๋” ๊ธด ๋ฒ„์ „์€ ๊ทธ๋ ‡์ง€ ์•Š์„ ๊ฐ€๋Šฅ์„ฑ์ด ๋†’์Šต๋‹ˆ๋‹ค.

๊ฒ€์ƒ‰ ์ค‘? ๋” ๊ธด ๋ฒ„์ „์€ ๊ทธ๋ ‡์ง€ ์•Š์„ ๊ฒƒ์ž…๋‹ˆ๋‹ค.

๊ตฌ๋ฌธ ํ•˜์ด ๋ผ์ดํ„ฐ๊ฐ€์ด๋ฅผ ๋‚ด๋ถ€์ ์œผ๋กœ ์ฒ˜๋ฆฌ ํ•  ๊ฒƒ์œผ๋กœ ์˜ˆ์ƒํ•ฉ๋‹ˆ๋‹ค (๊ฐ€์–‘ ์„ฑ ๋ฐฉ์ง€). ์‚ฌ์‹ค, ํ”„๋ฆฐ์ง€ (์ค„ ๋ฒˆํ˜ธ ์˜†)์— "๋ฐ˜ํ™˜ ํ•  ์ˆ˜์žˆ๋Š”"๋งˆ์ปค๋ฅผ ์‚ฝ์ž… ํ•  ์ˆ˜๋„ ์žˆ์Šต๋‹ˆ๋‹ค.

์˜ˆ๋ฅผ ๋“ค๋ฉด
screen-2016-09-15-175131

์™€์šฐ, ํ™•์‹คํžˆ ๋งŽ์€ ๋„์›€์ด๋ฉ๋‹ˆ๋‹ค. ํ•˜์ง€๋งŒ ๋‹น์‹ ์€ ์ •๋ง๋กœ ๋‹น์‹ ์ด
ํŽธ์ง‘๊ธฐ๋ฅผ ์˜ฌ๋ฐ”๋ฅด๊ฒŒ ๊ตฌ์„ฑํ•ด์•ผํ•ฉ๋‹ˆ๋‹ค. ํ•ญ์ƒ ์ˆ˜ํ–‰ ํ•  ์ˆ˜๋Š” ์—†์Šต๋‹ˆ๋‹ค (์˜ˆ :
์˜ˆ๋ฅผ ๋“ค์–ด GitHub์—์„œ).

2016-09-15 23:52 GMT + 02 : 00 Steven Allen [email protected] :

์˜ˆ๋ฅผ ๋“ค๋ฉด
[์ด๋ฏธ์ง€ : screen-2016-09-15-175131]
https://cloud.githubusercontent.com/assets/310393/18568833/1deed796-7b6d-11e6-99af-75f0d7ddd778.png

โ€”
๋‹น์‹ ์ด ์–ธ๊ธ‰ ๋˜์—ˆ๊ธฐ ๋•Œ๋ฌธ์— ์ด๊ฒƒ์„ ๋ฐ›๊ณ  ์žˆ์Šต๋‹ˆ๋‹ค.
์ด ์ด๋ฉ”์ผ์— ์ง์ ‘ ๋‹ต์žฅํ•˜๊ณ  GitHub์—์„œ ํ™•์ธํ•˜์„ธ์š”.
https://github.com/rust-lang/rust/issues/31436#issuecomment -247465972,
๋˜๋Š” ์Šค๋ ˆ๋“œ ์Œ์†Œ๊ฑฐ
https://github.com/notifications/unsubscribe-auth/ABYmbjyrt07NXKMUdmlBfaciRZq7uBVEks5qqb4sgaJpZM4HUm_-
.

@CryZe GitHub๊ฐ€ ์˜คํ”ˆ ์†Œ์Šค ๊ตฌ๋ฌธ

๋‚˜๋Š” ์ผ๋ฐ˜์ ์œผ๋กœ Rust ํ”„๋กœ์ ํŠธ๊ฐ€ Rust์˜ ๊ตฌ๋ฌธ ํ•˜์ด ๋ผ์ดํ„ฐ๊ฐ€ ๊ฐ€์‹œ์„ฑ์— ๋Œ€ํ•œ ์šฐ๋ ค์˜ ๊ท ํ˜•์„ ๋งž์ถ”๊ธฐ ์œ„ํ•ด ? ์—์„œ ๋งค์šฐ ๋ˆˆ์— ์ž˜ ๋„๋Š” ์Šคํƒ€์ผ์„ ์‚ฌ์šฉํ•ด์•ผํ•œ๋‹ค๊ณ  ์ถ”์ฒœํ•˜๋Š” ๊ฒƒ์ด ์ข‹์€ ์ƒ๊ฐ์ด๋ผ๊ณ  ์ƒ๊ฐํ•ฉ๋‹ˆ๋‹ค.

๋‚˜๋Š” ? ์ด ์šฐ๋ฆฌ๊ฐ€ ์—ฌ๊ธฐ์„œ ํ•  ์ˆ˜์žˆ๋Š” ์ตœ์„ ์˜ ์„ ํƒ์ด๋ผ๊ณ  ์ƒ๊ฐํ•˜๊ณ , ์šฐ๋ฆฌ๋Š” Miri ์—์„œ ๊ฝค ๋งŽ์ด ์‚ฌ์šฉํ•˜๊ณ  ์žˆ์Šต๋‹ˆ๋‹ค.

์›๋ž˜์˜ ๋™๊ธฐ๋กœ ๋Œ์•„๊ฐ€์„œ try!(...) ๋Š” ๋ˆˆ์— ๊ฑฐ์Šฌ ๋ฆฌ๊ณ  ์˜ค๋ฅ˜์˜ ํ๋ฆ„์„ ๋ฌด์‹œํ•˜๊ณ  ํ–‰๋ณตํ•œ ๊ธธ์„ ์ฝ๋Š” ๊ฒƒ์„ ์–ด๋ ต๊ฒŒ ๋งŒ๋“ญ๋‹ˆ๋‹ค. ์ด๊ฒƒ์€ ์ „ํ†ต์ ์ธ ์–ธ์–ด์˜ ๋ณด์ด์ง€ ์•Š๋Š” ์˜ˆ์™ธ์— ๋น„ํ•ด ๋‹จ์ ์ž…๋‹ˆ๋‹ค. ? ๋ฅผ ๋” ๊ด€๋ จ์„ฑ์ด ๋†’์€ ํ‚ค์›Œ๋“œ๋กœ ํ™•์žฅํ•˜๋ฉด ๋™์ผํ•œ ๋‹จ์ ์ด ์žˆ์Šต๋‹ˆ๋‹ค.

๋ฐ˜๋ฉด์— ? ๋ฅผ ์‚ฌ์šฉํ•˜๋ฉด ์˜ค๋ฅ˜์˜ ํ๋ฆ„์— ์‹ ๊ฒฝ ์“ฐ์ง€ ์•Š์œผ๋ฉด ๋ฌด์‹œํ•˜๊ณ  ๋ฐฑ๊ทธ๋ผ์šด๋“œ๋กœ ์‚ฌ๋ผ์ง€๊ฒŒ ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ๊ทธ๋ฆฌ๊ณ  ์ œ๊ฐ€ ์ •๋ง๋กœ ์˜ค๋ฅ˜์˜ ํ๋ฆ„์— ์‹ ๊ฒฝ์„ ์จ๋„ ? ๋Š” ๊ดœ์ฐฎ์Šต๋‹ˆ๋‹ค. ? ๋ฐ๊ฒŒ ๊ฐ•์กฐํ•˜๋Š” ๊ฒƒ์€ ๋‚˜์—๊ฒŒ๋„ ํ•„์š”ํ•˜์ง€ ์•Š์ง€๋งŒ ๋‹ค๋ฅธ ์‚ฌ๋žŒ๋“ค์—๊ฒŒ ๋„์›€์ด๋œ๋‹ค๋ฉด ์ข‹์Šต๋‹ˆ๋‹ค. ์ด๊ฒƒ์€ ๋ณด์ด์ง€ ์•Š๋Š” ์˜ˆ์™ธ์™€ try! ๋‘˜ ๋‹ค์— ๋Œ€ํ•œ ๊ฐœ์„ ์ž…๋‹ˆ๋‹ค.

?! ์™€ ๊ฐ™์ด ์‚ฌ์†Œํ•œ์‹œ๊ธธ๋กœ ์ „ํ™˜ํ•˜๋Š” ๊ฒƒ์€ ์–ด๋–ค ์‹ ์œผ๋กœ๋“  ๋„์›€์ด๋˜์ง€๋Š” ์•Š์ง€๋งŒ ์˜ค๋ฅ˜ ์ฒ˜๋ฆฌ ์ฝ”๋“œ๋ฅผ ์ฝ๊ณ  ์“ฐ๋Š” ๊ฒƒ์€ ์•ฝ๊ฐ„ ๋” ๋‚˜๋น ์ง‘๋‹ˆ๋‹ค.

๋งˆ์ง€๋ง‰ ๋Œ“๊ธ€์„ ์ž‘์„ฑ ํ•ด์ฃผ์‹  ๋ชจ๋“  ๋ถ„๋“ค๊ป˜ ๊ฐ์‚ฌ๋“œ๋ฆฝ๋‹ˆ๋‹ค ( ์ด์ „ ๋‚ด๋ถ€ ์Šค๋ ˆ๋“œ๋„ ํฌํ•จ ). ์ง€๊ธˆ๊นŒ์ง€ ๊ฐ€์žฅ ๋งŽ์ด ์–ธ๊ธ‰ ๋œ RFC์— ๋Œ€ํ•ด ์ด์•ผ๊ธฐํ•˜๊ณ  ์žˆ๋‹ค๋Š” ์ ์„ ๊ฐ์•ˆํ•  ๋•Œ ์•ˆ์ •ํ™”์— ๋Œ€ํ•œ ๋…ผ์˜๊ฐ€ ํ™œ๋ฐœํ•˜๊ฒŒ ์ง„ํ–‰๋˜๊ณ  ์žˆ๋‹ค๋Š” ์‚ฌ์‹ค์— ๋†€๋ž์ง€ ์•Š์Šต๋‹ˆ๋‹ค.

๋จผ์ € ์ถ”์ ์„ ์‹œ์ž‘ํ•˜๊ฒ ์Šต๋‹ˆ๋‹ค . @ rust-lang / lang ํŒ€์€ Result ์œ ํ˜•์˜ ๊ฐ’์— ์ ์šฉ๋  ๋•Œ ? ์—ฐ์‚ฐ์ž๋ฅผ ์•ˆ์ •ํ™”ํ•˜๊ธฐ๋กœ ๊ฒฐ์ •ํ–ˆ์Šต๋‹ˆ๋‹ค. catch ๊ธฐ๋Šฅ์€ ์•ˆ์ •ํ™”๋˜์ง€ ์•Š์•˜์œผ๋ฉฐ ์‹ค์ œ๋กœ ์•„์ง ๊ตฌํ˜„๋˜์ง€ ์•Š์•˜์Šต๋‹ˆ๋‹ค. ๋งˆ์ฐฌ๊ฐ€์ง€๋กœ, ? ๋ฅผ Option ์™€ ๊ฐ™์€ ์œ ํ˜•์œผ๋กœ ํ™•์žฅํ•˜๋Š” ์ˆ˜๋‹จ ์ธ ์†Œ์œ„ "์šด๋ฐ˜์ž ํŠน์„ฑ"์€ ์•„์ง RFC ์ด์ „ ๋…ผ์˜ ๋‹จ๊ณ„์— ์žˆ์Šต๋‹ˆ๋‹ค. ๊ทธ๋Ÿฌ๋‚˜ ๋‚˜์ค‘์— Carrier ํŠน์„ฑ์„ ์ถ”๊ฐ€ ํ•  ์ˆ˜ ์žˆ๋„๋ก ํ˜„์žฌ ๊ตฌํ˜„์—์„œ ๋‹จ๊ณ„๋ฅผ ์ˆ˜ํ–‰ํ–ˆ์Šต๋‹ˆ๋‹ค (์ถ”๋ก ๊ณผ์˜ ์ž ์žฌ์  ์ƒํ˜ธ ์ž‘์šฉ์— ๋Œ€ํ•œ ์ด์ „ ์šฐ๋ ค ์‚ฌํ•ญ ์ค‘ ์ผ๋ถ€๋ฅผ ํ•ด๊ฒฐ ํ•จ).

8 ์›” 22 ์ผ FCP๊ฐ€ ์‹œ์ž‘๋œ ์ดํ›„๋กœ ์ง„ํ–‰๋œ ๋…ผ์˜๋ฅผ ์š”์•ฝํ•˜๊ธฐ ์œ„ํ•ด ์ž ์‹œ ์‹œ๊ฐ„์„ ํ• ์• ํ•˜๊ณ  ์‹ถ์Šต๋‹ˆ๋‹ค. ์ด๋Ÿฌํ•œ ํ…Œ๋งˆ์˜ ๋Œ€๋ถ€๋ถ„์€ ์›๋ž˜ RFC ์Šค๋ ˆ๋“œ ์—์„œ๋„ ๋ฐœ์ƒํ–ˆ์Šต๋‹ˆ๋‹ค. ์Šค๋ ˆ๋“œ๋ฅผ ์ฝ๋Š” ๋ฐ ๊ด€์‹ฌ์ด ์žˆ๋‹ค๋ฉด ํ•ด๋‹น ์Šค๋ ˆ๋“œ์˜ FCP ์ฃผ์„ ๊ณผ ์š”์•ฝ ์ฃผ์„ ์ด ๋Œ€ํ™”๋ฅผ ์‹ฌ๋„์žˆ๊ฒŒ ๋‹ค๋ฃจ๋ ค๊ณ  ์‹œ๋„ํ•ฉ๋‹ˆ๋‹ค. ์–ด๋–ค ๊ฒฝ์šฐ์—๋Š”์ด ์Šค๋ ˆ๋“œ์˜ ํ•ด๋‹นํ•˜๋Š” ๊ฒƒ๋ณด๋‹ค ๋” ์‹ฌ๋„์žˆ๋Š” ๊ฒฝ์šฐ ์›๋ž˜ ์Šค๋ ˆ๋“œ์˜ ์ฃผ์„์— ๋งํฌ ํ•  ๊ฒƒ์ž…๋‹ˆ๋‹ค.

? ์—ฐ์‚ฐ์ž์˜ ๋ฒ”์œ„๋Š” ํ˜„์žฌ ํ•จ์ˆ˜๊ฐ€ ์•„๋‹Œ ํ˜„์žฌ ํ‘œํ˜„์‹์ด์–ด์•ผํ•ฉ๋‹ˆ๋‹ค.

์˜ค๋ฅ˜๊ฐ€ ๋ฐœ์ƒํ•˜๋ฉด ์˜ค๋Š˜์˜ try! ๋งคํฌ๋กœ๋Š” ํ•ด๋‹น ์˜ค๋ฅ˜๋ฅผ ํ˜ธ์ถœ ํ•จ์ˆ˜์— ๋ฌด์กฐ๊ฑด ์ „ํŒŒํ•ฉ๋‹ˆ๋‹ค (์ฆ‰, ์˜ค๋ฅ˜์™€ ํ•จ๊ป˜ return ๋ฅผ ์‹คํ–‰ ํ•จ). ํ˜„์žฌ ์„ค๊ณ„๋œ๋Œ€๋กœ ? ์—ฐ์‚ฐ์ž๋Š”์ด ์„ ๋ก€๋ฅผ ๋”ฐ๋ฅด์ง€๋งŒ ์‚ฌ์šฉ์ž๊ฐ€ ๋” ์ œํ•œ๋œ ๋ฒ”์œ„๋ฅผ ์ง€์ •ํ•  ์ˆ˜ ์žˆ๋„๋ก ํ—ˆ์šฉํ•˜๋Š” catch ํ‚ค์›Œ๋“œ๋ฅผ ์ง€์›ํ•ฉ๋‹ˆ๋‹ค. ์ด๋Š” ์˜ˆ๋ฅผ ๋“ค์–ด x.and_then(|b| foo(b)) ๋ฅผ catch { foo(x?) } ๋กœ ์“ธ ์ˆ˜ ์žˆ๋‹ค๋Š” ๊ฒƒ์„ ์˜๋ฏธํ•ฉ๋‹ˆ๋‹ค. ๋ฐ˜๋ฉด, ? ์—ฐ์‚ฐ์ž๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ and_then ์œ ์‚ฌํ•œ ๊ฒƒ์„ ์˜๋ฏธํ•ฉ๋‹ˆ๋‹ค

๊ถ๊ทน์ ์œผ๋กœ catch ๊ฐ€ ๊ตฌํ˜„๋˜๋ฉด ์ด๊ฒƒ์€ ๊ธฐ๋ณธ๊ฐ’ ๋ฌธ์ œ์ž…๋‹ˆ๋‹ค . ๊ทธ๋ฆฌ๊ณ  Rust์˜ ? ์— "break out of function"(์‚ฌ์šฉ์ž ์ •์˜ ์˜ต์…˜ ํฌํ•จ)์˜ ๊ธฐ๋ณธ๊ฐ’์ด ๋” ์ ์ ˆํ•˜๋‹ค๊ณ  ์ƒ๊ฐํ•˜๋Š” ๋ช‡ ๊ฐ€์ง€ ์ด์œ ๊ฐ€ ์žˆ์Šต๋‹ˆ๋‹ค.

? ์‹๋ณ„ํ•˜๊ธฐ ์–ด๋ ต ๊ธฐ ๋•Œ๋ฌธ์— ์ œ์–ด ํ๋ฆ„์„๊ฐ€๋ฆฝ๋‹ˆ๋‹ค.

์ผ๋ฐ˜์ ์ธ ๋ฌธ์ œ๋Š” ? ์—ฐ์‚ฐ์ž๊ฐ€ ๋„ˆ๋ฌด ์‰ฝ๊ฒŒ ๊ฐ„๊ณผ๋œ๋‹ค๋Š” ๊ฒƒ ์ž…๋‹ˆ๋‹ค. ์ด๊ฒƒ์€ ๋ถ„๋ช…ํžˆ ๊ท ํ˜• ์žกํžŒ ํ–‰๋™์ž…๋‹ˆ๋‹ค. ๊ฒฝ๋Ÿ‰ ์—ฐ์‚ฐ์ž๋ฅผ ๊ฐ–๋Š” ๊ฒƒ์€ ๊ทธ๊ฒƒ์ด ์‰ฝ๊ฒŒ "ํ–‰๋ณตํ•œ ๊ฒฝ๋กœ"๋‹น์‹ ์ด ์›ํ•˜๋Š” ๊ฒฝ์šฐ์— ์ดˆ์ ์„ ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค -ํ•˜์ง€๋งŒ ์˜ค๋ฅ˜๊ฐ€ (์•”์‹œ ์  ์ œ์–ด ํ๋ฆ„์„ ์†Œ๊ฐœ ์˜ˆ์™ธ๋Š” ๋‹ฌ๋ฆฌ)๊ฐ€ ๋ฐœ์ƒํ•  ์ˆ˜์žˆ๋Š” ์–ด๋–ค ํ‘œ์‹œ๋ฅผํ•˜๋Š” ๊ฒƒ์ด ์ค‘์š”ํ•ฉ๋‹ˆ๋‹ค. ๋˜ํ•œ ๊ตฌ๋ฌธ ๊ฐ•์กฐ ํ‘œ์‹œ (์˜ˆ : 1 , 2 )๋ฅผ ํ†ตํ•ด ? ์‰ฝ๊ฒŒ ์ฐพ์„ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

๋ฐฉ๋ฒ• ๋งคํฌ๋กœ๋Š” ์™œ ์•ˆ๋ฉ๋‹ˆ๊นŒ?

? ์˜ ๊ฐ€์žฅ ํฐ ์žฅ์  ์ค‘ ํ•˜๋‚˜๋Š” ์ˆ˜์ • ํ›„ ์œ„์น˜์—์„œ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ์ง€๋งŒ
foo.try! ์™€ ๊ฐ™์€ "๋ฉ”์„œ๋“œ ๋งคํฌ๋กœ"์—์„œ ์œ ์‚ฌํ•œ ์ด์ ์„ ์–ป์„ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค . ์‚ฌ์‹ค์ด์ง€๋งŒ, ๋ฉ”์„œ๋“œ ๋งคํฌ๋กœ ๋Š” ํŠนํžˆ ๋ฉ”์„œ๋“œ ์ฒ˜๋Ÿผ ๋™์ž‘ํ•˜๊ธฐ๋ฅผ ์›ํ•˜๋Š” ๊ฒฝ์šฐ ์ž์ฒด์ ์œผ๋กœ ๋งŽ์€ ๋ณต์žก์„ฑ์„ ์—ด์–ด์ค๋‹ˆ๋‹ค (์˜ˆ : ์–ดํœ˜ ๋ฒ”์œ„๋ฅผ ์‚ฌ์šฉํ•˜์ง€ ์•Š๊ณ  ์ˆ˜์‹ ์ž ์œ ํ˜• ์— ๋”ฐ๋ผ ์ „๋‹ฌ๋จ). ๋˜ํ•œ foo.try! ์™€ ๊ฐ™์€ ๋ฉ”์„œ๋“œ ๋งคํฌ๋กœ๋ฅผ ์‚ฌ์šฉํ•˜๋ฉด foo? ๋ณด๋‹ค ํ›จ์”ฌ ๋” ๋ฌด๊ฑฐ์šด ๋ฌด๊ฒŒ๊ฐ์„ ๋Š๋‚„ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค (์ด์ „ ์š”์  ์ฐธ์กฐ).

From ๋Š” ์–ด๋–ค ๊ณ„์•ฝ์„ ์ œ๊ณตํ•ด์•ผํ•ฉ๋‹ˆ๊นŒ?

์›๋ž˜ RFC ํ† ๋ก ์—์„œ ์šฐ๋ฆฌ๋Š” [ From ๋Œ€ํ•œ "๊ณ„์•ฝ"์ด ์žˆ์–ด์•ผํ•˜๋Š”์ง€ ์—ฌ๋ถ€] ((https://github.com/rust-lang/rust/issues/31436#issuecomment)์— ๋Œ€ํ•œ ์งˆ๋ฌธ์„ ์—ฐ๊ธฐํ•˜๊ธฐ๋กœ ๊ฒฐ์ •ํ–ˆ์Šต๋‹ˆ๋‹ค. lang ํŒ€์˜ ์ผ๋ฐ˜์ ์ธ ํ•ฉ์˜ ๋Š” ? ์—ฐ์‚ฐ์ž๋ฅผ From ํŠน์„ฑ์„ ํ˜ธ์ถœํ•˜๋Š” ๊ฒƒ์œผ๋กœ ๊ฐ„์ฃผ ํ•ด์•ผํ•˜๋ฉฐ From ํŠน์„ฑ impls๊ฐ€ ์ž์—ฐ์Šค๋Ÿฝ๊ฒŒ ๋ฌด์—‡์ด๋“  ํ•  ์ˆ˜ ์žˆ๋‹ค๋Š” ๊ฒƒ์ž…๋‹ˆ๋‹ค. From ํŠธ๋ ˆ์ด ํŠธ์˜ ์—ญํ• ์€ ์–ด์จŒ๋“  ์—ฌ๊ธฐ์—์„œ ์ƒ๋‹นํžˆ ์ œํ•œ์ ์ด๋ผ๋Š” ์ ์— ์œ ์˜ํ•˜์‹ญ์‹œ์˜ค. ์ด๊ฒƒ์€ ๋‹จ์ˆœํžˆ ํ•œ ์ข…๋ฅ˜์˜ ์˜ค๋ฅ˜์—์„œ ๋‹ค๋ฅธ ์ข…๋ฅ˜์˜ ์˜ค๋ฅ˜๋กœ ๋ณ€ํ™˜ํ•˜๋Š” ๋ฐ ์‚ฌ์šฉ๋ฉ๋‹ˆ๋‹ค (ํ•˜์ง€๋งŒ ํ•ญ์ƒ Result ์˜ ์ปจํ…์ŠคํŠธ์—์„œ

๊ทธ๋Ÿฌ๋‚˜ "๋ณด์œ ์ž"ํŠน์„ฑ์— ๋Œ€ํ•œ ๋…ผ์˜๊ฐ€ ์ง„ํ–‰ ์ค‘์ด๋ฉฐ์ด ์‹œ๋‚˜๋ฆฌ์˜ค์—์„œ ๊ฐ•๋ ฅํ•œ ๊ด€์Šต์„ ์ฑ„ํƒํ•˜๋Š” ๊ฒƒ์ด ๋” ์ค‘์š”ํ•˜๋‹ค๋Š” ์ ์— ์ฃผ๋ชฉํ•˜๊ณ  ์‹ถ์Šต๋‹ˆ๋‹ค. ํŠนํžˆ, ์บ๋ฆฌ์–ด ํŠธ๋ ˆ์ด ํŠธ๋Š” ์–ด๋–ค ์œ ํ˜•์˜ "์„ฑ๊ณต"๊ณผ "์‹คํŒจ"๋ฅผ ๊ตฌ์„ฑํ•˜๋Š”์ง€, ํ•œ ์ข…๋ฅ˜์˜ ๊ฐ’ (์˜ˆ : Option )์ด ๋‹ค๋ฅธ ๊ฐ’์œผ๋กœ ๋ณ€ํ™˜ ๋  ์ˆ˜ ์žˆ๋Š”์ง€ ์—ฌ๋ถ€ (์˜ˆ : Result ). ๋งŽ์€ ์‚ฌ๋žŒ๋“ค์ด "์˜ค๋ฅ˜ ์œ ์‚ฌ"์œ ํ˜• ๊ฐ„์˜ ์ž„์˜์˜ ์ƒํ˜ธ ๋ณ€ํ™˜์„ ์ง€์›ํ•˜์ง€ ์•Š๊ธฐ๋ฅผ ์›ํ•œ๋‹ค๊ณ  ์ฃผ์žฅํ–ˆ์Šต๋‹ˆ๋‹ค (์˜ˆ : ? ๋Š” Option ๋ฅผ Result ๋กœ ๋ณ€ํ™˜ ํ•  ์ˆ˜ ์—†์–ด์•ผํ•ฉ๋‹ˆ๋‹ค). ๋ถ„๋ช…ํžˆ ์ตœ์ข… ์‚ฌ์šฉ์ž๋Š” ์ž์‹ ์ด ์„ ํƒํ•œ ์œ ํ˜•์— ๋Œ€ํ•ด Carrier ํŠน์„ฑ์„ ๊ตฌํ˜„ํ•  ์ˆ˜ ์žˆ์œผ๋ฏ€๋กœ ์ด๋Š” ๊ถ๊ทน์ ์œผ๋กœ ์ง€์นจ์ด์ง€๋งŒ ์ค‘์š”ํ•œ ๊ฒƒ์ž…๋‹ˆ๋‹ค.

ํฌํŠธ ์‹œ๋„! ์‚ฌ์šฉ ?

๋‚˜๋Š” ์šฐ๋ฆฌ๊ฐ€ ์ด๊ฒƒ์„ ์—ญ ํ˜ธํ™˜ ์ ์œผ๋กœ ํ•  ์ˆ˜ ์—†๋‹ค๊ณ  ์ƒ๊ฐํ•˜๋ฉฐ try! ์˜ ๊ตฌํ˜„์„ ๊ทธ๋Œ€๋กœ ๋‘์–ด์•ผํ•ฉ๋‹ˆ๋‹ค. try! ํ๊ธฐํ•ด์•ผํ•ฉ๋‹ˆ๊นŒ?

@nrc ์™œ ์ด์ „ ๋ฒ„์ „๊ณผ ํ˜ธํ™˜๋˜์ง€ ์•Š์Šต๋‹ˆ๊นŒ?

@withoutboats try!(x) ๋Š” (x : Result<_, _>)? ์ด๋ฉฐ ์šฐ๋ฆฌ๊ฐ€ _ ์›ํ•œ๋‹ค๋ฉด ๊ทธ๋ ‡๊ฒŒ ๊ตฌํ˜„ํ•  ์ˆ˜ ์žˆ์ง€๋งŒ ์ผ๋ฐ˜์ ์œผ๋กœ x? ๋Š” Carrier ๋ฅผ ์ง€์›ํ•˜๋Š” ๋ชจ๋“  ๊ฒƒ์„ ์ถ”๋ก  ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ํŠน์„ฑ (ํ–ฅํ›„), ํ•œ ๊ฐ€์ง€ ์˜ˆ๋Š” iter.collect()? ์ด๋ฉฐ try! ๊ฒฝ์šฐ Result ๋ฟ์ด์ง€ ๋งŒ ํ˜„์‹ค์ ์œผ๋กœ Option ์žˆ์Šต๋‹ˆ๋‹ค.

๋ง์ด ๋˜๋„ค์š”. ๋‚˜๋Š” ์šฐ๋ฆฌ๊ฐ€ std์— impls๋ฅผ ์ถ”๊ฐ€ํ•˜๋ฉด ์ถ”๋ก ์ด ๋ชจํ˜ธํ•ด์งˆ ์ˆ˜ ์žˆ๋‹ค๋Š” ๊ฒƒ์„ ๋ฐ›์•„ ๋“ค์˜€๋‹ค๊ณ  ์ƒ๊ฐํ–ˆ์Šต๋‹ˆ๋‹ค. ์—ฌ๊ธฐ์„œ๋„ ๋ฐ›์•„๋“ค์ด์ง€ ์•Š๊ฒ ์Šต๋‹ˆ๊นŒ?

์–ด๋Š ์ชฝ์ด๋“ , try! ๋Š” ๋” ์ด์ƒ ์‚ฌ์šฉ๋˜์ง€ ์•Š์•„์•ผํ•œ๋‹ค๊ณ  ์ƒ๊ฐํ•ฉ๋‹ˆ๋‹ค.

? ์ปจํ…์ŠคํŠธ์™€ ๊ฐ™์€ ๋นŒ๋” ํŒจํ„ด์—์„œ ๋” ์œ ์šฉํ•˜์ง€๋งŒ try๋Š” ์ปจํ…์ŠคํŠธ์™€ ๊ฐ™์€ ์ค‘์ฒฉ ๋œ ๋ฉ”์„œ๋“œ์—์„œ ๋” ์œ ์šฉํ•ฉ๋‹ˆ๋‹ค. ๋‚˜๋Š” ๊ทธ๊ฒƒ์ด ์˜๋ฏธํ•˜๋Š” ๋ฐ”๊ฐ€ ๋ฌด์—‡์ด๋“  ๋น„์ถ”์ฒœ๋˜์–ด์„œ๋Š” ์•ˆ๋œ๋‹ค๊ณ  ์ƒ๊ฐํ•ฉ๋‹ˆ๋‹ค.

@ est31 ์ถ”๋ก ์„ ์ œ์™ธํ•˜๊ณ ๋Š” ์ง€๊ธˆ ์ •ํ™•ํžˆ ๋˜‘๊ฐ™์€ ์ผ์„ํ•ฉ๋‹ˆ๋‹ค. ์ •ํ™•ํžˆ ๋ฌด์—‡์„ ์˜๋ฏธํ•˜๋Š”์ง€ ํ™•์‹คํ•˜์ง€ ์•Š์ง€๋งŒ ? ์€ ์ผ๋ฐ˜์ ์œผ๋กœ ์—„๊ฒฉํ•˜๊ฒŒ ๋” ๋ช…ํ™•ํ•ฉ๋‹ˆ๋‹ค (๋‹ค์‹œ ๋ชจ๋“ˆ๋กœ ์ถ”๋ก ). ์˜ˆ๋ฅผ ๋“ค์–ด ์ฃผ์‹œ๊ฒ ์Šต๋‹ˆ๊นŒ?

@eddyb foo()?.bar()?.baz() ๋Š” try!(try!(foo()).bar()).baz() ๋ณด๋‹ค ์ข‹์œผ๋ฉฐ foo()?.bar()?.baz() try!(bar(try!(foo()))) ๋Š” bar(foo()?)? ๋ณด๋‹ค ์ข‹์Šต๋‹ˆ๋‹ค

๋‘ ๊ฒฝ์šฐ ๋ชจ๋‘ ? ๋” ์ฝ๊ธฐ ์‰ฝ์Šต๋‹ˆ๋‹ค. ๋ถˆํ•„์š”ํ•œ ๊ด„ํ˜ธ ํ˜ผ๋ž€์„ ์ค„์ž…๋‹ˆ๋‹ค.

์–ธ์ œ ์•ˆ์ • ์ƒํƒœ๊ฐ€ ๋ ๊นŒ์š”?

@ofek ์ด๊ฒƒ์€ ์•„์ง ์™„์ „ํ•˜์ง€ ์•Š์€ ๋ชจ๋“  ๊ฒƒ์„์œ„ํ•œ ๊ฒƒ์ด๋ฏ€๋กœ ๋งํ•˜๊ธฐ๊ฐ€ ์–ด๋ ต์Šต๋‹ˆ๋‹ค. https://github.com/rust-lang/rust/pull/36995 ๋Š” 1.14์—์„œ ์•ˆ์ •์ ์ด์–ด์•ผํ•˜๋Š” ๊ธฐ๋ณธ ? ๊ตฌ๋ฌธ์„ ์•ˆ์ •ํ™”ํ–ˆ์Šต๋‹ˆ๋‹ค.

์ถ”๊ฐ€ํ•˜๋Š” ๊ฒƒ์„ ์žŠ์ง€ ๋งˆ์„ธ์š”? ์ด์ œ ์•ˆ์ •์ ์ธ ์ฐธ์กฐ ์—ฐ์‚ฐ์ž : https://doc.rust-lang.org/nightly/reference.html#unary -operator-expressions

๊ทธ๋ฆฌ๊ณ  @bluss ๋Š” ์ฑ…์ด ๊ตฌ์‹์ด๋ผ๊ณ  ์ง€์ ํ–ˆ์Šต๋‹ˆ๋‹ค : https://doc.rust-lang.org/nightly/book/syntax-index.html

ํ†  ๋งˆ์นด

๋‚˜๋Š” ์—ฐ์žฅํ•˜๋Š” ๊ฒƒ์— ๋ฐ˜๋Œ€ํ•ฉ๋‹ˆ๊นŒ? ์˜ต์…˜.

์˜ค๋ฅ˜ ๋ชฉ์ ์œผ๋กœ ์‚ฌ์šฉํ•  ํ•„์š”๋Š” ์—†์Šต๋‹ˆ๋‹ค. ์˜ˆ๋ฅผ ๋“ค์–ด, get ๋ฅผ ๊ฐ€์ ธ ์™€์„œ ์–ด๋–ค ํ•จ์ˆ˜๋กœ ๋งคํ•‘ํ•˜๋Š” ๋ž˜ํผ ๋ฉ”์„œ๋“œ๋ฅผ ๋งŒ๋“ค๋ฉด None ์ผ€์ด์Šค๋ฅผ ์ „ํŒŒ ํ•  ์ˆ˜ ์žˆ๊ธฐ๋ฅผ ์›ํ•ฉ๋‹ˆ๋‹ค.

? ๋‹จ์ง€ ์˜ค๋ฅ˜์— ๋Œ€ํ•œ ๊ฒƒ์œผ๋กœ ๊ฐ„์ฃผ๋˜์—ˆ์Šต๋‹ˆ๋‹ค. ์ด์™€ ๊ฐ™์€ ์ผ๋ฐ˜์ ์ธ ์ „ํŒŒ์— ๋Œ€ํ•œ ๋” ์ผ๋ฐ˜์ ์ธ do ํ‘œ๊ธฐ๋ฒ•์€ ๋ชฉํ‘œ๊ฐ€ ์•„๋‹™๋‹ˆ๋‹ค.

2016 ๋…„ 10 ์›” 29 ์ผ 11:08 -0400, ticki [email protected] , ์ž‘์„ฑ :

@tomaka (https://github.com/tomaka)

๋‚˜๋Š” ์—ฐ์žฅํ•˜๋Š” ๊ฒƒ์— ๋ฐ˜๋Œ€ํ•ฉ๋‹ˆ๊นŒ? ์˜ต์…˜.

์˜ค๋ฅ˜ ๋ชฉ์ ์œผ๋กœ ์‚ฌ์šฉํ•  ํ•„์š”๋Š” ์—†์Šต๋‹ˆ๋‹ค. ์˜ˆ๋ฅผ ๋“ค์–ด, get์„ ๊ฐ€์ ธ ์™€์„œ ์ผ๋ถ€ ํ•จ์ˆ˜๋กœ ๋งคํ•‘ํ•˜๋Š” ๋ž˜ํผ ๋ฉ”์„œ๋“œ๋ฅผ ์‚ฌ์šฉํ•œ๋‹ค๋ฉด None ์ผ€์ด์Šค๋ฅผ ์ „ํŒŒ ํ•  ์ˆ˜ ์žˆ๊ธฐ๋ฅผ ๋ฐ”๋ž๋‹ˆ๋‹ค.

โ€”
๋‹น์‹ ์ด ์–ธ๊ธ‰ ๋˜์—ˆ๊ธฐ ๋•Œ๋ฌธ์— ์ด๊ฒƒ์„ ๋ฐ›๊ณ  ์žˆ์Šต๋‹ˆ๋‹ค.
์ด ์ด๋ฉ”์ผ์— ์ง์ ‘ ๋‹ต์žฅํ•˜๊ฑฐ๋‚˜ GitHub (https://github.com/rust-lang/rust/issues/31436#issuecomment-257096575)์—์„œ ๋ณด๊ฑฐ๋‚˜ ์Šค๋ ˆ๋“œ๋ฅผ ์Œ์†Œ๊ฑฐ (https://github.com/notifications/unsubscribe)ํ•ฉ๋‹ˆ๋‹ค. -auth / AABsipGIpTF1-7enk-z_5JRYYtl46FLPks5q42DCgaJpZM4HUm_-).

์ด (= ? ์ž์ฒด)๋Š” ์ด์ œ ์•ˆ์ •์ ์ธ ๊ธฐ๋Šฅ์ž…๋‹ˆ๋‹ค! (Rust 1.13๋ถ€ํ„ฐ)

๋‘ ๊ฐ€์ง€ ๋ฌธ์„œ ๋ฌธ์ œ :

  • [x] ์ฑ… # 37750์˜ ์˜ค๋ฅ˜ ์ฒ˜๋ฆฌ ์žฅ ์—…๋ฐ์ดํŠธ
  • [x] ํ˜„์žฌ ์ƒํ™ฉ # 37751์— ๋Œ€ํ•œ Carrier ํŠธ๋ ˆ์ด ํŠธ ๋ฌธ์„œ ์—…๋ฐ์ดํŠธ

catch ๋˜๋Š” Carrier ํŠธ๋ ˆ์ด ํŠธ๋Š” ์•„์ง ์ œ๋Œ€๋กœ ๊ตฌํ˜„๋˜์ง€ ์•Š์•˜์œผ๋ฉฐ, ๋ฒ ์–ด ? ๊ธฐ๋Šฅ

Carrier ์ด ์กด์žฌํ•˜๊ณ  ? ์‚ฌ์šฉํ•  ๋•Œ ์˜ค๋ฅ˜ ๋ฉ”์‹œ์ง€๊ฐ€์ด๋ฅผ ์ฐธ์กฐํ•˜๋ฏ€๋กœ Carrier ๋ฌธ์ œ๊ฐ€ ๊ฑฐ๋ถ€๋˜๋Š” ๊ฒƒ๋ณด๋‹ค ์ˆ˜์ • ๋œ ๊ฒƒ์ด ๋” ์ข‹์Šต๋‹ˆ๋‹ค. ๋ฌธ์„œ๋Š” Option์— ๋Œ€ํ•ด ๊ตฌํ˜„๋˜๋Š” ๊ฒƒ์„ ์ฐธ์กฐํ•˜๊ธฐ ๋•Œ๋ฌธ์— ๋ฌธ์„œ๋„ ์—…๋ฐ์ดํŠธํ•ด์•ผํ•ฉ๋‹ˆ๋‹ค. (๊ฑฐ์ง“).

35946์€ ์˜ค๋ฅ˜ ๋ฉ”์‹œ์ง€์—์„œ Carrier ๋Œ€ํ•œ ์–ธ๊ธ‰์„ ์ œ๊ฑฐํ•ด์•ผํ•ฉ๋‹ˆ๋‹ค. ์ ์–ด๋„ Carrier ๋ฌธ์„œ์—์„œ Option ๋ฉ˜์…˜์„ ์ œ๊ฑฐํ•ด์•ผํ•˜๋Š” ๊ฒƒ์ฒ˜๋Ÿผ ๋“ค๋ฆฝ๋‹ˆ๋‹ค.

Carrier ํŠธ๋ ˆ์ด ํŠธ์™€์˜ ์ƒํ˜ธ ์ž‘์šฉ์œผ๋กœ ์ธํ•ด์ด ๋ฌธ์ œ์— T-libs ์„ ์ถ”๊ฐ€ํ•ฉ๋‹ˆ๋‹ค.

@cramertj ๊ฐ€ ๋งŒ๋‚œ ์งˆ๋ฌธ : https://internals.rust-lang.org/t/grammatical-ambiguity-around-catch-blocks/4807

์•ˆ๋…•ํ•˜์„ธ์š”; # 31954์—์„œ ์˜ค๋ฅ˜ ์œ ํ˜•์— ๋Œ€ํ•œ ์—… ์บ์ŠคํŠธ๋Š” From (๋ฐ ํ˜„์žฌ head ์—์„œ๋„ ๋™์ผ)์„ ์‚ฌ์šฉํ•˜์—ฌ ์ˆ˜ํ–‰๋˜์ง€๋งŒ RFC 243 ์—์„œ๋Š” ๋ณ€ํ™˜์— Into ์‚ฌ์šฉํ•ด์•ผํ•œ๋‹ค๊ณ  ๋ถ„๋ช…ํžˆ ๋ช…์‹œํ•ฉ๋‹ˆ๋‹ค.

From ๊ฐ€ ๋Œ€์‹  ์‚ฌ์šฉ ๋œ ์ด์œ ๊ฐ€ ์žˆ์Šต๋‹ˆ๊นŒ? ์ผ๋ฐ˜ ์˜ค๋ฅ˜ ์œ ํ˜• (์˜ˆ : io::Error ๋˜๋Š” ์™ธ๋ถ€ ํฌ๋ ˆ์ดํŠธ์˜ ๋‹ค๋ฅธ ํ•ญ๋ชฉ)์œผ๋กœ ์—… ์บ์ŠคํŠธํ•˜๋ ค๊ณ  ํ•  ๋•Œ ๋กœ์ปฌ ์˜ค๋ฅ˜ ์œ ํ˜•์— ๋Œ€ํ•ด From ๋ฅผ ๊ตฌํ˜„ํ•  ์ˆ˜ ์—†์Šต๋‹ˆ๋‹ค.

(RFC 243์˜ ์ž‘์„ฑ์ž ์ธ FWIW๋Š” From ๋˜๋Š” Into ๊ฐ€ ๋” ๋‚ซ๋‹ค๊ณ  ์ƒ๊ฐํ•˜์ง€ ์•Š์•˜์œผ๋ฉฐ ์˜ฌ๋ฐ”๋ฅธ ์„ ํƒ์„ํ–ˆ์„ ์ˆ˜๋„ ์•„๋‹ ์ˆ˜๋„ ์žˆ์Šต๋‹ˆ๋‹ค. ์งˆ๋ฌธ์€ RFC์— ์“ฐ์—ฌ์ง„ ๋‚ด์šฉ์ด ์•„๋‹Œ ์žฅ์  (์ด ์‹œ์ ์—์„œ ์ด์ „ ๋ฒ„์ „๊ณผ์˜ ํ˜ธํ™˜์„ฑ์„ ํฌํ•จ ํ•  ์ˆ˜ ์žˆ์Œ)์— ๋”ฐ๋ผ ๊ฒฐ์ •๋˜์–ด์•ผํ•ฉ๋‹ˆ๋‹ค.)

์Šฌํ”„๊ฒŒ๋„ ํšŒ๊ท€๊ฐ€์žˆ์„ ๊ฒƒ์ž…๋‹ˆ๋‹ค. ์—†๋Š” (์ ์ง€ ์•Š์€) ๊ฒฝ์šฐ From<...> ์‚ฌ์šฉํ•  ๋•Œ ๊ตฌํ˜„๋˜๋Š” ์˜ค๋ฅ˜ ์œ ํ˜• ์ธ์Šคํ„ด์Šค ์ปดํŒŒ์ผ๋Ÿฌ๋Š” ํŠน์ • ๊ฒฝ์šฐ์— ํƒ€์ž…์„ ์ถ”๋ก  ํ•  ์ˆ˜ ์–ด๋””์„œ ๊ทธ๊ฒƒ์„ ์ถ”๋ก  ํ•  ์ˆ˜ Into ์˜ (์„ธํŠธ From ์ธ์Šคํ„ด์Šค๋Š” ํ˜„์žฌ ํฌ๋ ˆ์ดํŠธ์— ์˜ํ•ด ์ œํ•œ๋˜๋ฉฐ Into ์ธ์Šคํ„ด์Šค์˜ ์ „์ฒด ์„ธํŠธ๋Š” ํฌ๋ ˆ์ดํŠธ๋ฅผ ์ปดํŒŒ์ผํ•˜๋Š” ๋™์•ˆ ์•Œ ์ˆ˜ ์—†์Šต๋‹ˆ๋‹ค.

์ฐธ์กฐ https://play.rust-lang.org/?gist=6d3ee9f93c8b40094a80d3481b12dd00๋ฅผ (ํฌํ•จํ•˜๋Š” ์‹ค์ œ ๋ฌธ์ œ์—์„œ "๋‹จ์ˆœํ™”" fmt::Error ์˜ SRC / librustc / ํด๋”์˜ ์œ ํ‹ธ๋ฆฌํ‹ฐ / ppaux.rs # L81 )

? ๋ฅผ ์„ค๋ช…ํ•˜๋Š” ์ธก๋ฉด์—์„œ ์ด์ „ RFC๋ฅผ ๋Œ€์ฒด ํ•  ์ƒˆ๋กœ์šด RFC๊ฐ€ ์žˆ์Šต๋‹ˆ๋‹ค. rust-lang / rfcs / pull / 1859

catch ๋ธ”๋ก์ด ์ด๋ฏธ ํ›จ์”ฌ ๋” ๊ฐ„๊ฒฐ ํ•  ๋•Œ ๋‚˜๋Š” -1์ž…๋‹ˆ๋‹ค.

ํด๋กœ์ €๋Š” ํ๋ฆ„ ์ œ์–ด ๋ฌธ์„ ๋ฐฉํ•ดํ•ฉ๋‹ˆ๋‹ค. ( break , continue , return )

https://github.com/rust-lang/rfcs/pull/1859 ๊ฐ€ ๋ณ‘ํ•ฉ๋˜์—ˆ๊ณ ์ด ๋ฌธ์ œ๋ฅผ ์ถ”์  ๋ฌธ์ œ๋กœ ์žฌ์‚ฌ์šฉํ•œ๋‹ค๊ณ  ์ฃผ์žฅ ํ–ˆ์œผ๋ฏ€๋กœ catch ์žฌํ‰๊ฐ€ ํ•  ๊ฒƒ์„ ์ œ์•ˆํ•ฉ๋‹ˆ๋‹ค. RFC 243์˜

๋‚˜๋Š” ์šฐ๋ฆฌ๊ฐ€ ์ฒ ์ €ํ•˜๊ฒŒ ๊ทธ๊ฒƒ์„ ์ œ๊ฑฐ ๊ฒƒ์„ ์ œ์•ˆํ•˜์ง€๋งŒ, ๋Œ€ํ•œ ์—ด์ • ์•„๋‹ˆ์—์š” catch ๊ทธ๊ฒƒ์„ ์œ„ํ•ด์ด์—ˆ๋‹ค ์œ„๋Œ€ํ•œ๋กœ ๊ฒฐ์ฝ” ? ๋‚˜๋Š” ๊ทธ๊ฒƒ์˜ ๊ฐ€์น˜๊ฐ€ ์žˆ๋Š”์ง€ ์—ฌ์ „ํžˆ ๋น›์— ์˜๋ฏธ๊ฐ€ ์žˆ์Œ์„ ๋งŒ๋“ค ์ƒ๊ฐ ? ๋ฅผ ์œ„ํ•ด ๋“ฑ์žฅํ–ˆ์œผ๋ฉฐ Try ์— ๋น„์ถ”์–ด ๋“ฑ์žฅ ํ•  ๊ฒƒ์œผ๋กœ ์˜ˆ์ƒ๋˜๋Š” ๊ด€์šฉ๊ตฌ์ž…๋‹ˆ๋‹ค.

๋‚˜๋Š” ์—ฌ์ „ํžˆ ์žก๊ธฐ๋ฅผ ์—ด๋งํ•ฉ๋‹ˆ๋‹ค. ์˜ค๋Š˜ ์ผ์ฐ ๋‚˜๋Š” catch๊ฐ€ ์•ˆ์ •์ ์ด๋ผ๋ฉด ํ”ผํ•  ์ˆ˜์žˆ๋Š” ๋ฐฉ์‹์œผ๋กœ ์ฝ”๋“œ๋ฅผ ์ˆ˜์ •ํ•ด์•ผํ–ˆ๋‹ค.

์ด ๊ธฐ๋Šฅ์€ do catch ๊ตฌ๋ฌธ์œผ๋กœ ์•ผ๊ฐ„์— ๊ตฌํ˜„๋˜์—ˆ์Šต๋‹ˆ๋‹ค. ๊ทธ๋ ‡์ง€ ์•Š์Šต๋‹ˆ๊นŒ?

@withoutboats ์˜ˆ, catch { ... } ๋Š” ๊ตฌ์กฐ์ฒด ๋ฆฌํ„ฐ๋Ÿด ( struct catch { }; catch { } )๊ณผ ์ถฉ๋Œํ•˜๋ฏ€๋กœ ํ˜„์žฌ do catch ์ž…๋‹ˆ๋‹ค.
.
@archshift @SimonSapin ์ด ์œ„์—์„œ ์ง€์ ํ–ˆ๋“ฏ์ด, ํด๋กœ์ €๋Š” break , continue ๋ฐ return ๋ฐฉํ•ดํ•ฉ๋‹ˆ๋‹ค.

@bstrie ์š”์ฆ˜์—๋Š” catch ์ž์ฃผ ์›ํ•ฉ๋‹ˆ๋‹ค. ๋ฆฌํŒฉํ† ๋ง ์ค‘์— ๋งŽ์ด ๋ฐœ์ƒํ•ฉ๋‹ˆ๋‹ค.

๊ตฌ๋ฌธ์œผ๋กœ do catch ์„ (๋ฅผ) ์š”๊ตฌํ•  ๊ณ„ํš์ด๋ผ๋Š” ์‚ฌ์‹ค์„ ๋ชฐ๋ž์Šต๋‹ˆ๋‹ค. ์‹ค์ œ ํŒŒ์†์˜ ์œ„ํ—˜์ด ๋งค์šฐ ๋‚ฎ๋‹ค๋Š” ์ ์„ ๊ฐ์•ˆํ•  ๋•Œ (๋‘˜ ๋‹ค ๊ตฌ์กฐ์ฒด ์ด๋ฆ„ ์ง€์ • ์ง€์นจ์„ ์œ„๋ฐ˜ํ•˜๊ณ  ์ƒ์„ฑ์ž๊ฐ€ ๋ช…๋ น๋ฌธ์˜ ์ฒซ ๋ฒˆ์งธ ํ‘œํ˜„์‹ (๋ฐ˜ํ™˜ ์œ„์น˜ ๋ฐ–์—์„œ๋Š” ๋“œ๋ญ…๋‹ˆ๋‹ค)์ด์–ด์•ผ ํ•จ)์„ ๊ณ ๋ คํ•  ๋•Œ rustfmt๋ฅผ ํ™œ์šฉํ•˜์—ฌ ๋ฌธ์ œ๊ฐ€๋˜๋Š” ์‹๋ณ„์ž๋ฅผ catch_ ๋‹ค์‹œ ์ž‘์„ฑ ํ•˜์‹œ๊ฒ ์Šต๋‹ˆ๊นŒ? ๊ทธ๋ ‡๊ฒŒํ•˜๊ธฐ ์œ„ํ•ด Rust 2.0์ด ํ•„์š”ํ•˜๋‹ค๋ฉด, ๊ธ€์Ž„์š”, ์ €๋Š” Rust 2.0์ด ์–ด์จŒ๋“  ์‚ฌ์†Œํ•œ ๋ณ€๊ฒฝ ์‚ฌํ•ญ ๋งŒ ํฌํ•จํ•ด์•ผํ•œ๋‹ค๊ณ  ํ•ญ์ƒ ๋งํ•˜๊ณ  ์žˆ์Šต๋‹ˆ๋‹ค ... : P

@bstrie ์šฐ๋ฆฌ๋Š” ์ ˆ๋Œ€์ ์œผ๋กœ do catch ์žฅ๊ธฐ๋ฅผ ์š”๊ตฌํ•˜๊ณ  ์‹ถ์ง€ ์•Š์Šต๋‹ˆ๋‹ค. ํ˜„์žฌ ํ•ด๋‹น ๊ตฌ๋ฌธ์„ ์‚ฌ์šฉํ•˜๊ฒŒ ๋œ ํ† ๋ก ์€ ๋‹ค์Œ๊ณผ ๊ฐ™์Šต๋‹ˆ๋‹ค. https://github.com/rust-lang/rust/pull/39921

ํ›Œ๋ฅญํ•ฉ๋‹ˆ๋‹ค. ์ปจํ…์ŠคํŠธ์— ๊ฐ์‚ฌ๋“œ๋ฆฝ๋‹ˆ๋‹ค.

๋‚˜๋Š” ํฌ๋ง ๋•Œ๋ฌธ์— ๋‚œ ๊ทธ๋ƒฅ ์—ฌ๊ธฐ ์˜จ catch ๋œ ์•ˆ์ •, ๊ทธ๊ฒƒ์„ ๋ฐฐ์›Œ์•ผํ–ˆ๋‹ค๋˜์ง€ ์•Š๋Š” - ๊ทธ๋ž˜์„œ ์˜ˆ, ์ ˆ๋Œ€์ ์œผ๋กœ, ์ง€๊ธˆ ? ์•ˆ์ •์ ์ด๊ณ , ๋˜ํ•œ ๊ฐ€์ง€๊ณ  ํฐ ๊ฒƒ catch .

๋‚˜๋Š” ์šฐ๋ฆฌ๊ฐ€ ์ด๊ฒƒ์˜ ๋‚˜๋จธ์ง€ ๋ถ€๋ถ„์— ์–ผ๋งˆ๋‚˜ ๋ฉ€๋ฆฌ ๋„๋‹ฌํ–ˆ๋Š”์ง€๋ณด๊ณ  ์‹ถ์—ˆ๊ณ  do catch ํ† ๋ก ์„ ๋ณด์•˜์Šต๋‹ˆ๋‹ค.

๋‚˜๋Š” ๋‹ค์Œ๊ณผ ๊ฐ™์€ ๊ฒฝ์šฐ์— ๋„์›€์ด ๋  ์–ด๋ฆฌ์„์€ ์•„์ด๋””์–ด๋ฅผ ๊ณ ๋ คํ•ด ์™”์Šต๋‹ˆ๋‹ค. ์„ ํƒ์ ์œผ๋กœ ํ‚ค์›Œ๋“œ ์ ‘๋‘์‚ฌ์— @ ๋˜๋Š” ๋‹ค๋ฅธ์‹œ๊ธธ์„ ํ—ˆ์šฉ ํ•œ ๋‹ค์Œ ๋ชจ๋“  ์ƒˆ ํ‚ค์›Œ๋“œ์—์‹œ๊ธธ ๋งŒ ์‚ฌ์šฉํ•˜๋„๋กํ•ฉ๋‹ˆ๋‹ค. ์ฝ” ๋ฃจํ‹ด ํ† ๋ก ์—์„œ๋„ ๋น„์Šทํ•œ ๋ฌธ์ œ๊ฐ€์žˆ์—ˆ์Šต๋‹ˆ๋‹ค. ๋‚ด๊ฐ€ ๊ฑฐ๊ธฐ์— ํ•ด๊ฒฐ์ฑ…์œผ๋กœ ๋“ค์–ด ๊ฐ”๋Š”์ง€ ๊ธฐ์–ต์ด ๋‚˜์ง€ ์•Š์ง€๋งŒ-๋‚ด๊ฐ€ ๊ฐ€์งˆ ์ˆ˜๋„ ์žˆ์ง€๋งŒ-์ด๊ฒƒ์ด ๊ณ„์† ๋‚˜์˜ฌ ๊ฒƒ ๊ฐ™์Šต๋‹ˆ๋‹ค.

FWIW, C #์€ ์‹ค์ œ๋กœ ํ‚ค์›Œ๋“œ๋ฅผ ์‹๋ณ„์ž๋กœ ์‚ฌ์šฉํ•˜๊ธฐ ์œ„ํ•ด @ ๋ฅผ ์ง€์›ํ•ฉ๋‹ˆ๋‹ค. HTML ๋…ธ๋“œ์—์„œ ์†์„ฑ์„ ์„ค์ •ํ•˜๊ธฐ ์œ„ํ•ด new { <strong i="6">@class</strong> = "errorbox" } ์™€ ๊ฐ™์€ ๊ฒƒ์„ ์ „๋‹ฌํ•˜๋Š” Razor์—์„œ ํ”ํžˆ ๋ณผ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

๋ฟก๋ฟก
๊ทธ ํฅ๋ฏธ ๋กญ๊ตฐ์š”. ๋‚˜๋Š” ๊ทธ๊ฒƒ์— ๋Œ€ํ•ด ๋ชฐ๋ž๋‹ค. ๊ทธ๋Ÿฌ๋‚˜ Rust์˜ ๊ฒฝ์šฐ ํ˜ธํ™˜์„ฑ ๋•Œ๋ฌธ์— ๋‹ค๋ฅธ ๋ฐฉํ–ฅ์œผ๋กœ ๊ฐ€์•ผํ•ฉ๋‹ˆ๋‹ค.

๊ทธ๋ž˜๋„ ๊น”๋”ํ•œ ์•„์ด๋””์–ด. .net ์ƒํƒœ๊ณ„์—๋Š” ์„œ๋กœ ๋‹ค๋ฅธ ํ‚ค์›Œ๋“œ๋ฅผ ์‚ฌ์šฉํ•˜๊ณ  ๋ชจ๋‘ ์„œ๋กœ ์ „ํ™” ํ•  ์ˆ˜์žˆ๋Š” ๋งŽ์€ ์–ธ์–ด๊ฐ€ ์žˆ์Šต๋‹ˆ๋‹ค.

ํ‚ค์›Œ๋“œ์˜ ๋ฏธ๋ž˜์— ๋Œ€ํ•œ ๋˜ ํ•˜๋‚˜์˜ ๊ฐ€๋Šฅ์„ฑ : ์ผ์ข…์˜ ์•ˆ์ •์ ์ธ #[feature] ๊ฐ™์€ ์†์„ฑ ๋’ค์— ํ‚ค์›Œ๋“œ๋ฅผ ๋ฐฐ์น˜ํ•˜๋Š” ๊ฒƒ์ž…๋‹ˆ๋‹ค.

์ด ๋ฌธ์ œ๋Š” ์žฅ๊ธฐ์ ์œผ๋กœ ๋” ์ผ๋ฐ˜์ ์ธ ํ•ด๊ฒฐ์ฑ…์ด ํ•„์š”ํ•˜๋‹ค๊ณ  ์ƒ๊ฐํ•ฉ๋‹ˆ๋‹ค.

@camlorn ์ด ์Šค๋ ˆ๋“œ, ํŠนํžˆ Rust "epochs"์— ๋Œ€ํ•œ Aaron์˜ ์•„์ด๋””์–ด์— ๊ด€์‹ฌ์ด์žˆ์„ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. https://internals.rust-lang.org/t/pre-rfc-stable-features-for-breaking-changes/5002

์—ฌ๊ธฐ ๋ฌธ์ œ ์„ค๋ช…์—์„œ https://github.com/rust-lang/rust/issues/42327 ์„ ๋งํฌํ•ด์•ผํ•œ๋‹ค๊ณ  ์ƒ๊ฐํ•ฉ๋‹ˆ๋‹ค. (๋˜ํ•œ RFC ํ…์ŠคํŠธ๋ฅผ ์—ฌ๊ธฐ ๋Œ€์‹  ๋งํฌํ•˜๋„๋ก ์—…๋ฐ์ดํŠธํ•ด์•ผ ํ•  ์ˆ˜๋„ ์žˆ์Šต๋‹ˆ๋‹ค.)

(ํŽธ์ง‘ํ•˜๋‹ค : ๋‚˜๋Š” ๊ฑฐ๊ธฐ์— ๋Œ“๊ธ€์„ ์˜ฌ๋ ธ๊ณ , ๋ˆ„๊ฐ€ ์ด๋ฏธ ๊ทธ๊ฒƒ์„ ๊ตฌ๋…ํ–ˆ๋Š”์ง€ ํ™•์‹คํ•˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค!)

@camlorn ๊ทธ๋Ÿฌ๋‚˜ "rustfmt๋Š” ์ž ์‹œ ๋™์•ˆ ์‚ฌ์†Œํ•œ ์žฌ ์ž‘์„ฑ์„ ํ•œ ๋‹ค์Œ ํ‚ค์›Œ๋“œ๊ฐ€๋ฉ๋‹ˆ๋‹ค"๊ฒฝ๋กœ๋ฅผ ์—ด ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. AKA๋Š” ์•ˆ์ •์„ฑ ๋ณด์žฅ์—์„œ "๋‘ ๊ฐ€์ง€ ๋ชจ๋‘์—์„œ ์ž‘๋™ํ•˜๋„๋ก ์ž‘์„ฑ ๋  ์ˆ˜์žˆ๋Š” ์ถ”๊ฐ€ ์ฃผ์„์ด ์žˆ์œผ๋ฉด ๊นจ์ง€์ง€ ์•Š์Šต๋‹ˆ๋‹ค."์ด์Šค์ผ€์ดํ”„ ํ•ด์น˜๋ฅผ ํ™œ์šฉํ•ฉ๋‹ˆ๋‹ค. ๊ทธ๋ฆฌ๊ณ  ์ถ”๋ก  ๋ณ€๊ฒฝ์„์œ„ํ•œ UFCS์™€ ์œ ์‚ฌํ•˜๊ฒŒ ๊ฐ€์ƒ์˜ "์™„์ „ํžˆ ์ •๊ตํ•œ ํ˜•ํƒœ์˜ ์ €์žฅ์†Œ"๋ชจ๋ธ์€ ์˜ค๋ž˜๋œ ์ƒ์ž๋ฅผ ๊ณ„์† ์ž‘๋™์‹œํ‚ฌ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

catch ๋ธ”๋ก์˜ ๊ตฌ๋ฌธ์ด do { โ€ฆ } ๋˜๋Š” ?{ โ€ฆ } ๋ผ๋„ ์ƒ๊ด€ ์—†์Šต๋‹ˆ๋‹ค.

do ์—๋Š” ์ด๋ฏธ ํ‚ค์›Œ๋“œ๋ผ๋Š” ์ข‹์€ ์†์„ฑ์ด ์žˆ์Šต๋‹ˆ๋‹ค. ๊ทธ๊ฒƒ์€ ๊ณผ๊ฑฐ์˜ ์‚ฌ์šฉ์„ ๋ฉˆ์ถ”์ง€ ์•Š์•˜์ง€๋งŒ Haskell๊ณผ ๊ฐ™์€ do -notation์„ ํ˜ธ์ถœํ•˜๋Š” ๋ชจํ˜ธํ•œ (๋‹น์‹ ์˜ ๊ด€์ ์— ๋”ฐ๋ผ) ์†์„ฑ์„ ๊ฐ€์ง€๊ณ  ์žˆ์œผ๋ฉฐ ์ด๊ฒƒ์€ ์‚ฌ์šฉ ์‚ฌ๋ก€์—์„œ ๋‹ค์†Œ ๋” ๊ฐ€๊น์Šต๋‹ˆ๋‹ค.

๊ทธ๊ฒƒ์€ ๋˜ํ•œ ๋น„์Šทํ•˜์ง€๋งŒ ์ œ์•ˆ ๋œ ์ž๋ฐ” ์Šคํฌ๋ฆฝํŠธ ์™€ ๋‹ค๋ฅด๊ฒŒ ์ž‘๋™

์ด ์ œ์•ˆ์€ ์ด๋ฏธ ๋ฒ ์–ด ๋ธ”๋ก์„ ํ‘œํ˜„์‹์œผ๋กœ ์‚ฌ์šฉํ•˜๋Š” Rust์™€๋Š” ๊ด€๋ จ์ด ์—†์Šต๋‹ˆ๋‹ค.

๋‚˜๋Š” ๋‘˜ ๋‹ค ๋˜‘๊ฐ™์•„ ๋ณด์ด์ง€๋งŒ ์™„์ „ํžˆ ๋‹ค๋ฅธ ์ผ์„ ํ•  ๊ฒƒ์ด๊ธฐ ๋•Œ๋ฌธ์— ๊ฐ€๋Šฅํ•œ ํ˜ผ๋ž€์„ ์ง€์ ํ–ˆ์Šต๋‹ˆ๋‹ค.

Haskell๊ณผ ์œ ์‚ฌํ•œ do-notation์„ ํ˜ธ์ถœํ•˜๋Š” ๋ชจํ˜ธํ•œ (๋‹น์‹ ์˜ ๊ด€์ ์— ๋”ฐ๋ผ) ์†์„ฑ์ด ์žˆ์Šต๋‹ˆ๋‹ค.

@rpjohnst Result ๋ฐ Option์€ ๋ชจ๋‚˜๋“œ์ด๋ฏ€๋กœ ์ตœ์†Œํ•œ ๊ฐœ๋…์ ์œผ๋กœ ์œ ์‚ฌํ•ฉ๋‹ˆ๋‹ค. ๋˜ํ•œ ์•ž์œผ๋กœ ๋ชจ๋“  ๋ชจ๋‚˜๋“œ๋ฅผ ์ง€์›ํ•˜๋„๋ก ํ™•์žฅํ•˜๋ ค๋ฉด ํฌ์›Œ๋“œ ํ˜ธํ™˜์ด ๊ฐ€๋Šฅํ•ด์•ผํ•ฉ๋‹ˆ๋‹ค.

๋งž์Šต๋‹ˆ๋‹ค. ๊ณผ๊ฑฐ์—๋Š” ๋ชจ๋‚˜๋“œ์™€ ๊ฐœ๋…์ ์œผ๋กœ ์œ ์‚ฌํ•œ ๊ฒƒ์— do ๋ฅผ ์ถ”๊ฐ€ํ•˜๋ฉด ์™„์ „ํžˆ ์ง€์›ํ•˜์ง€ ์•Š์œผ๋ฉด ์‚ฌ๋žŒ๋“ค์„ ์Šฌํ”„๊ฒŒ ํ•  ๊ฒƒ์ด๋ผ๋Š” ์ด์˜๊ฐ€์žˆ์—ˆ์Šต๋‹ˆ๋‹ค.

๋™์‹œ์—, ์ „์ฒด do-notation๊ณผ ํฌ์›Œ๋“œ ํ˜ธํ™˜์ด ๊ฐ€๋Šฅํ•˜๋„๋ก ๋งŒ๋“ค ์ˆ˜ ์žˆ์ง€๋งŒ ์ „์ฒด do-notation์„ ์ถ”๊ฐ€ ํ•ด์„œ๋Š” ์•ˆ๋ฉ๋‹ˆ๋‹ค . if / while / for / loop ๋˜๋Š” break / continue /์™€ ๊ฐ™์€ ์ œ์–ด ๊ตฌ์กฐ๋กœ๋Š” ๊ตฌ์„ฑ ํ•  ์ˆ˜ ์—†์Šต๋‹ˆ๋‹ค. return , catch (๋˜๋Š”์ด ๊ฒฝ์šฐ do ) ๋ธ”๋ก ๋‚ด๋ถ€ ๋ฐ ์ „์ฒด ์—์„œ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ์–ด์•ผํ•ฉ๋‹ˆ๋‹ค. (์ด๊ฒƒ์€ ์ „์ฒด do-notation์ด ๊ณ ์ฐจ ํ•จ์ˆ˜ ์ธก๋ฉด์—์„œ ์ •์˜๋˜๊ณ  catch ๋ธ”๋ก์˜ ๋‚ด์šฉ์„ ์ผ๋ จ์˜ ์ค‘์ฒฉ ๋œ ํด๋กœ์ €์— ์ฑ„์šฐ๋ฉด ๊ฐ‘์ž๊ธฐ ๋ชจ๋“  ์ค‘๋‹จ ํ๋ฆ„์„ ์ œ์–ดํ•˜๊ธฐ ๋•Œ๋ฌธ์ž…๋‹ˆ๋‹ค.)

๊ทธ๋ž˜์„œ ๊ฒฐ๊ตญ ์ด๋Ÿฌํ•œ ๋‹จ์  do ์‹ค์ œ๋กœ์žˆ๋Š” DO-ํ‘œ๊ธฐ์—†์ด ํ•  ํ‘œ๊ธฐ๋ฒ•๊ณผ ๊ฐ™์€ ๋ฐ DO-ํ‘œ๊ธฐ๋ฒ•์ด๋˜๊ธฐ ์œ„ํ•ด ์•ž์œผ๋กœ ์ข‹์€ ๊ฒฝ๋กœ ์•Š๊ณ  ์žˆ๋‹ค๋Š” ์ ์ด๋‹ค. ๊ฐœ์ธ์ ์œผ๋กœ ๋‚˜๋Š” Rust๊ฐ€ ์–ด์จŒ๋“  do ํ‘œ๊ธฐ๋ฒ•์„ ์–ป์ง€ ์•Š์„ ๊ฒƒ์ด๊ธฐ ๋•Œ๋ฌธ์— ์ด๊ฒƒ์œผ๋กœ ์™„์ „ํžˆ ๊ดœ์ฐฎ์Šต๋‹ˆ๋‹ค. ๊ทธ๋Ÿฌ๋‚˜ ๊ทธ๊ฒƒ์€ ํ˜ผ๋ž€์ž…๋‹ˆ๋‹ค.

@nikomatsakis , #

catch ํ‚ค์›Œ๋“œ๋ฅผ ๋ฌธ๋งฅ์— ๋งž๊ฒŒ ๋งŒ๋“ค ์ˆ˜ ์žˆ์ง€๋งŒ struct catch ์ด ๋ฒ”์œ„ ๋‚ด์— ์žˆ์œผ๋ฉด ๋น„ํ™œ์„ฑํ™”ํ•˜๊ณ  ์ง€์› ์ค‘๋‹จ ๊ฒฝ๊ณ ๋ฅผ ๋ฐœํ–‰ ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๊นŒ?

์ด๊ฒƒ์ด ์–ผ๋งˆ๋‚˜ ์ ์ ˆํ•œ ์ง€ ํ™•์‹คํ•˜์ง€ ์•Š์ง€๋งŒ ์ข…์ข… ์›ํ•˜๋Š” ๊ฒฝ์šฐ return ๋ฅผ ์‚ฌ์šฉํ•  ๋•Œ ํ˜„์žฌ ๊ฐ€๋Šฅํ•œ ์˜ค๋ฅ˜ ๊ฐ’์ด ์•„๋‹Œ ok๋ฅผ ์ค‘๋‹จํ•˜๋ ค๋Š” ๊ฒฝ์šฐ๊ฐ€ ์žˆ๋‹ค๋Š” ์ ์—์„œ ํ•ด๊ฒฐํ•  ํ•„์š”๊ฐ€์žˆ๋Š” ๋ฌธ์ œ๊ฐ€ ๋ฐœ์ƒํ–ˆ์Šต๋‹ˆ๋‹ค. _outer_ ok๋ฅผ ํ†ตํ•ด _inner_ ์˜ค๋ฅ˜๋ฅผ ์ค‘๋‹จํ•ฉ๋‹ˆ๋‹ค. say ํ•จ์ˆ˜๊ฐ€ Option<Result<_,_>> ๋ฅผ ๋ฐ˜ํ™˜ ํ•  ๋•Œ์™€ ๊ฐ™์ด ๋ฐ˜๋ณต์ž์—์„œ ํ”ํžˆ ๋ณผ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

ํŠนํžˆ ์ง€๊ธˆ ๋‹น์žฅ ๋งŽ์ด ์‚ฌ์šฉํ•˜๋Š” ํ”„๋กœ์ ํŠธ์— ๋งคํฌ๋กœ๊ฐ€ ์žˆ์Šต๋‹ˆ๋‹ค.

macro-rules! option_try {
    ( $expr:expr ) => {
        match $expr {
            Ok(x)  => x,
            Err(e) => return Some(Err(e.into())),
        }
    }
}

Iterator::next ๊ตฌํ˜„ ๋‚ด์—์„œ ํ˜ธ์ถœ ๋œ ํ•จ์ˆ˜๊ฐ€ ์‹คํŒจ์‹œ Some(Err(e)) ์™€ ํ•จ๊ป˜ ์ฆ‰์‹œ ์ค‘๋‹จ๋˜์–ด์•ผํ•˜๋Š” ๊ฒƒ์€ ๋งค์šฐ ์ผ๋ฐ˜์ ์ž…๋‹ˆ๋‹ค. ์ด ๋งคํฌ๋กœ๋Š” ์ผ๋ฐ˜ ํ•จ์ˆ˜ ๋ณธ๋ฌธ ๋‚ด๋ถ€์—์„œ ์ž‘๋™ํ•˜์ง€๋งŒ catch ๋ธ”๋ก ๋‚ด๋ถ€์—์„œ๋Š” ์ž‘๋™ํ•˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค. catch๋Š” ๋ฒ”์ฃผ ์ ์œผ๋กœ return ๊ฐ€์ ธ ์˜ค์ง€ ์•Š๊ณ  ํŠน์ˆ˜ํ•œ ? ๊ตฌ๋ฌธ

๊ฒฐ๊ตญ ๋ ˆ์ด๋ธ” ๋ฐ˜ํ™˜์€ ์ „์ฒด catch ๋ธ”๋ก ์•„์ด๋””์–ด๋ฅผ ์ค‘๋ณต๋˜๊ฒŒ ๋งŒ๋“ค ๊ฒƒ์ด์ง€๋งŒ ๊ทธ๋ ‡์ง€ ์•Š์Šต๋‹ˆ๊นŒ?

# 41414๊ฐ€ ์™„๋ฃŒ๋œ ๊ฒƒ ๊ฐ™์Šต๋‹ˆ๋‹ค. ๋ˆ„๊ตฐ๊ฐ€ OP๋ฅผ ์—…๋ฐ์ดํŠธ ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๊นŒ?

์—…๋ฐ์ดํŠธ : RFC rust-lang / rfcs # 2388์ด ์ด์ œ ๋ณ‘ํ•ฉ๋˜์—ˆ์œผ๋ฏ€๋กœ catch { .. } ๋Š” try { .. } ๋กœ ๋Œ€์ฒด๋ฉ๋‹ˆ๋‹ค.
์ด ๋Œ“๊ธ€ ๋ฐ”๋กœ ์œ„์—์žˆ๋Š” ์ถ”์  ๋ฌธ์ œ๋ฅผ ์ฐธ์กฐํ•˜์„ธ์š”.

์ด๊ฒƒ์ด 2015 ๋…„ํŒ์—์„œ ์˜๋ฏธํ•˜๋Š” ๋ฐ”๋Š” do catch { .. } ๊ตฌ๋ฌธ์ด ์—ฌ์ „ํžˆ ์•ˆ์ •ํ™” ๊ณผ์ •์—์žˆ๋Š” ๊ฒƒ์ž…๋‹ˆ๊นŒ? ์•„๋‹ˆ๋ฉด 2018 ๋…„ํŒ ์ด์ƒ์—์„œ try { .. } ๋ฅผ ํ†ตํ•ด์„œ๋งŒ ์‚ญ์ œ๋˜๊ณ  ์ง€์›๋ฉ๋‹ˆ๊นŒ?

@ Nemo157 ํ›„์ž.

ํ˜„์žฌ ์ œ์•ˆ์„œ์— try ... catch ... ๋‘ ๊ฐœ ๋ฌธ์ด ์žˆ์Šต๋‹ˆ๊นŒ? ๊ทธ๋ ‡๋‹ค๋ฉด ์˜๋ฏธ๋ฅผ ์–ป์ง€ ๋ชปํ•ฉ๋‹ˆ๋‹ค.

์–ด์จŒ๋“ ,์ด ์ œ์•ˆ์ด ๋‹จ์ง€ ํƒˆ๋‹น์— ๊ด€ํ•œ ๊ฒƒ์ด๋ผ๋ฉด ๋‚˜๋Š” ๊ทธ๊ฒƒ์— ๋Œ€ํ•ด ๋ฉ‹์ง€๋‹ค. ์ฆ‰, catch ๋ธ”๋ก์€ ? ์—ฐ์‚ฐ์ž๊ฐ€ ์ข…๋ฃŒํ•˜๋Š” ์œ„์น˜๋ฅผ ๋ณ€๊ฒฝํ•ฉ๋‹ˆ๊นŒ?

๋ชจ๋“  ํ™•์ธ๋ž€์ด ์ƒ๋‹จ ๊ฒŒ์‹œ๋ฌผ์— ํ‘œ์‹œ๋˜์–ด ์žˆ์œผ๋ฏ€๋กœ ์–ธ์ œ ์•ž์œผ๋กœ ๋‚˜์•„๊ฐˆ๊นŒ์š”? ์—ฌ์ „ํžˆ ํ•ด๊ฒฐ๋˜์ง€ ์•Š์€ ๋ฌธ์ œ๊ฐ€์žˆ๋Š” ๊ฒฝ์šฐ ์ƒˆ ํ™•์ธ๋ž€์„ ์ถ”๊ฐ€ํ•ด์•ผํ•ฉ๋‹ˆ๋‹ค.

๊ธฐ๋ก๋˜์ง€ ์•Š์€ ํ•ด๊ฒฐ๋˜์ง€ ์•Š์€ ์งˆ๋ฌธ์ด ๋งŽ์ด ๋‚จ์•„์žˆ์„ ๊ฒƒ์ž…๋‹ˆ๋‹ค.
์˜ˆ๋ฅผ ๋“ค์–ด ok-wrapping ๋™์ž‘์ด lang ํŒ€ ๋‚ด์—์„œ ํ•ด๊ฒฐ๋˜์ง€ ์•Š๊ณ  Try ์˜ ๋””์ž์ธ์ด ์™„๋ฃŒ๋˜์ง€ ์•Š๋Š” ๋“ฑ์˜ ์ž‘์—…์ด ์ง„ํ–‰๋ฉ๋‹ˆ๋‹ค. ์ด ๋ฌธ์ œ๋Š” ์œ ์šฉ์„ฑ๋ณด๋‹ค ์˜ค๋ž˜๋˜์—ˆ์„ ๊ฐ€๋Šฅ์„ฑ์ด ์žˆ์œผ๋ฏ€๋กœ์ด ๋ฌธ์ œ๋ฅผ ๋” ๋งŽ์€ ๋ชฉํ‘œ๋ฅผ ๊ฐ€์ง„ ์—ฌ๋Ÿฌ ๋ฌธ์ œ๋กœ ๋ถ„ํ• ํ•ด์•ผํ•ฉ๋‹ˆ๋‹ค.

ํ  ..์ด ์งˆ๋ฌธ์ด ๊ธฐ๋ก๋˜์ง€ ์•Š์•˜๋‹ค๋Š” ๊ฒƒ์ด ์ €๋ฅผ ๊ดด๋กญ ํž™๋‹ˆ๋‹ค.

@ mark-im ๊ทธ๋ž˜์„œ ๋ช…ํ™•ํžˆํ•˜๊ธฐ ์œ„ํ•ด ๊ทธ๋“ค์ด ์–ด๋”˜๊ฐ€์— ์žˆ์—ˆ๋‹ค๊ณ  ์ƒ๊ฐํ•ฉ๋‹ˆ๋‹ค; ๊ทธ๋Ÿฌ๋‚˜ ํ•œ ์œ„์น˜์—๋Š” ์—†์Šต๋‹ˆ๋‹ค. ๋‹ค์–‘ํ•œ RFC ๋ฐ ๋ฌธ์ œ ๋“ฑ์— ์•ฝ๊ฐ„ ํฉ์–ด์ ธ์žˆ๋Š” atm์ด๋ฏ€๋กœ ์ ์ ˆํ•œ ์œ„์น˜์— ๊ธฐ๋กํ•ด์•ผํ•ฉ๋‹ˆ๋‹ค.

์ง€์› ํŠน์„ฑ์˜ ๋””์ž์ธ์€ https://github.com/rust-lang/rust/issues/42327 ์—์„œ ์ถ”์ ๋ฉ๋‹ˆ๋‹ค

๊ทธ๋ž˜์„œ ์ €๋Š” ์—ฌ๊ธฐ์— try{} ๋งŒ ๋‚จ์•˜๊ณ , ์ œ๊ฐ€ ์•„๋Š” ์œ ์ผํ•œ ๋ถˆ์ผ์น˜๋Š” RFC์—์„œ ํ•ด๊ฒฐ๋˜๊ณ  ์œ„์—์„œ ์–ธ๊ธ‰ ํ•œ ๋ฌธ์ œ ์ค‘ ํ•˜๋‚˜์—์„œ ์žฌํ™•์ธ ๋œ ๊ฒƒ์ž…๋‹ˆ๋‹ค. ๊ทธ๋ž˜๋„ ๋šœ๋ ทํ•œ ์ถ”์  ๋ฌธ์ œ๊ฐ€์žˆ๋Š” ๊ฒƒ์ด ์ข‹์Šต๋‹ˆ๋‹ค.

์•„์ง ์ˆ˜ํ–‰ํ•ด์•ผํ•˜๋Š” ๋ณด๋ฅ˜์ค‘์ธ ๊ตฌํ˜„ ์ž‘์—…์— ๋Œ€ํ•œ ํ™•์ธ๋ž€์„ ์ถ”๊ฐ€ํ•˜๊ฒ ์Šต๋‹ˆ๋‹ค.

๋‚˜๋Š” @joshtriplettํ•ฉ๋‹ˆ๋‹ค (์—์„œ ์–ธ๊ธ‰ OK-ํฌ์žฅ์— ๋Œ€ํ•œ ์šฐ๋ ค๊ฐ€ ์žˆ์—ˆ๋‹ค ์•Œ๊ณ  @scottmcm try RFC๋ฅผ) ๋‚˜๋Š” ๊ฐœ์ธ์ ์œผ๋กœ ๊ฐ™์€ ์ œํ•œ ํ•  ๊ฒƒ break ์˜ ์ดˆ๊ธฐ ์•ˆ์ •ํ™”์— try { .. } ๊ทธ๋ ‡๊ฒŒ loop { try { break } } ๋“ฑ์„ ํ•  ์ˆ˜ ์—†์Šต๋‹ˆ๋‹ค.

์„ผํŠธ๋ฆด

loop { try { break } } ํ•  ์ˆ˜ ์—†๋„๋ก

์ง€๊ธˆ ๋‹น์žฅ์€ ๋น„ ๋ฃจํ”„ ๋ธ”๋ก์—์„œ break ๋ฅผ ์‚ฌ์šฉํ•  ์ˆ˜ ์—†์œผ๋ฉฐ ์ •ํ™•ํ•ฉ๋‹ˆ๋‹ค. break ๋Š” ๋ฃจํ”„์—์„œ๋งŒ ์‚ฌ์šฉํ•ด์•ผํ•ฉ๋‹ˆ๋‹ค. try ๋ธ”๋ก์„ ์ผ์ฐ ๋– ๋‚˜๋ ค๋ฉด ํ‘œ์ค€ ๋ฐฉ์‹์€ Err(e)? ์ž…๋‹ˆ๋‹ค. ๊ทธ๋ฆฌ๊ณ  ๊ทธ๊ฒƒ์€ ์ดˆ๊ธฐ ์žŽ์ด ํ•ญ์ƒ "๋น„์ •์ƒ์ ์ธ"ํ†ต์ œ ๊ฒฝ๋กœ์— ์žˆ๋„๋ก ๊ฐ•์ œํ•ฉ๋‹ˆ๋‹ค.

๋”ฐ๋ผ์„œ ๋‚ด ์ œ์•ˆ์€ ํ‘œ์‹œ๋œ ์ฝ”๋“œ๊ฐ€ ํ—ˆ์šฉ๋˜์–ด์•ผํ•˜๋ฉฐ try ๋– ๋‚˜๋Š” ๊ฒƒ์ด ์•„๋‹ˆ๋ผ loop ๊นจ์•ผํ•ฉ๋‹ˆ๋‹ค.

์ฆ‰๊ฐ์ ์ธ ์ด์ ์€ break ๊ฐ€ ํ‘œ์‹œ ๋  ๋•Œ ๋ฃจํ”„์—์„œ ์ค‘๋‹จ๋œ๋‹ค๋Š” ๊ฒƒ์„ ์•Œ ์ˆ˜ ์žˆ์œผ๋ฉฐ ํ•ญ์ƒ continue ๋ฐ”๊ฟ€ ์ˆ˜ ์žˆ๋‹ค๋Š” ๊ฒƒ์ž…๋‹ˆ๋‹ค. ๋˜ํ•œ try ๋‚ด๋ถ€์—์„œ loop try ๋ธ”๋ก์„ ์‚ฌ์šฉํ•˜๊ณ  ๋ฃจํ”„๋ฅผ ์ข…๋ฃŒํ•˜๋ ค๋Š” ๊ฒฝ์šฐ ์ค‘๋‹จ ์ ์— ๋ ˆ์ด๋ธ”์„ ์ง€์ •ํ•  ํ•„์š”๊ฐ€ ์—†์Šต๋‹ˆ๋‹ค.

@Centril ํ‚ค์›Œ ์ฃผ์…”์„œ ๊ฐ์‚ฌํ•ฉ๋‹ˆ๋‹ค.

break ์— ๊ด€ํ•ด์„œ๋Š” ๊ฐœ์ธ์ ์œผ๋กœ try ๋Š” break ์— ๋Œ€ํ•ด ์‹ ๊ฒฝ ์“ฐ์ง€ ์•Š๊ณ  ํฌํ•จํ•˜๋Š” ๋ฃจํ”„๋ฅผ ํ†ต๊ณผํ•œ๋‹ค๊ณ  ๊ฐ„๋‹จํžˆ ๋งํ•˜๋ฉด ๊ดœ์ฐฎ์„ ๊ฒƒ์ž…๋‹ˆ๋‹ค. break ์ด try ์™€ (๊ณผ) ์ƒํ˜ธ ์ž‘์šฉํ•˜๋Š” ๊ฒƒ์„ ์ „ํ˜€ ์›ํ•˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค.

Ok -wrapping์˜ ๊ฒฝ์šฐ ์˜ˆ, try ์„ (๋ฅผ) ์•ˆ์ •ํ™”ํ•˜๊ธฐ ์ „์—์ด ๋ฌธ์ œ๋ฅผ ํ•ด๊ฒฐํ•˜๊ณ  ์‹ถ์Šต๋‹ˆ๋‹ค.

@centril ์˜ˆ, ์•Œ๊ณ  ์žˆ์Šต๋‹ˆ๋‹ค. ๊ทธ๋Ÿฌ๋‚˜ ๊ทธ ๋ฌธ์ œ๋ฅผ ์ œ๊ธฐ ๋‹ค์‹œ ์žฌ์žˆ์–ด ๊ฒƒ์„ ๊ธฐ์–ตํ•˜๋Š” ๊ฒƒ์ด ์ค‘์š”ํ•ฉ๋‹ˆ๋‹ค. RFC ๋Š” ๊ทธ๊ฒƒ์„ ๊ฐ–๊ธฐ๋กœ ๊ฒฐ์ •ํ–ˆ๊ณ  ๊ทธ๊ฒƒ ์—†์ด ๊ตฌํ˜„๋˜์—ˆ์ง€๋งŒ ์›๋ž˜ ์˜๋„๋Š” _again_ ์ทจํ•ด์กŒ๊ณ  ๊ตฌํ˜„์€ RFC๋ฅผ ๋”ฐ๋ฅด๋„๋ก ๋ณ€๊ฒฝ๋˜์—ˆ์Šต๋‹ˆ๋‹ค. ๊ทธ๋ž˜์„œ ์ €์˜ ํฐ ์งˆ๋ฌธ์€ ์ค‘์š”ํ•œ ์‚ฌ์‹ค์ด ๋ณ€๊ฒฝ๋˜์—ˆ๋Š”์ง€ ์—ฌ๋ถ€์ž…๋‹ˆ๋‹ค. ํŠนํžˆ ์ด๊ฒƒ์ด RFC + IRLO์—์„œ ๋…ผ์˜ํ•œ ๊ฒƒ ์ค‘ ๊ฐ€์žฅ ์‹œ๋„๋Ÿฌ์šด ์ฃผ์ œ ์ค‘ ํ•˜๋‚˜๋ผ๋Š” ์ ์„ ๊ฐ์•ˆํ•  ๋•Œ.

@scottmcm ๋ฌผ๋ก  ์•„์‹œ๋‹ค์‹œํ”ผ, ์ €๋Š” Ok -wrapping;) ์œ ์ง€์— ๋™์˜ํ•˜๋ฉฐ ๋ฌธ์ œ๊ฐ€ ํ•ด๊ฒฐ ๋œ ๊ฒƒ์œผ๋กœ ๊ฐ„์ฃผ๋˜์–ด์•ผํ•œ๋‹ค๋Š” ๋ฐ ๋™์˜ํ•ฉ๋‹ˆ๋‹ค.

๋‚˜๋Š” ์ด๊ฒƒ์ด ์˜ณ์€์ง€ ํ™•์‹คํ•˜์ง€ ์•Š์€ ๊ฒƒ์— ๋Œ€ํ•ด ์–ธ๊ธ‰ํ•˜๊ณ  ์‹ถ์—ˆ์Šต๋‹ˆ๋‹ค.

๋ณธ์งˆ์ ์œผ๋กœ ๋‚ด๊ฐ€ ๊ฐ€์ง„ ์ƒํ™ฉ์€ GUI ํ”„๋ ˆ์ž„ ์›Œํฌ์˜ ์ฝœ๋ฐฑ์ž…๋‹ˆ๋‹ค. Option ๋˜๋Š” Result ๋ฅผ ๋ฐ˜ํ™˜ํ•˜๋Š” ๋Œ€์‹  UpdateScreen ๋ฅผ ๋ฐ˜ํ™˜ํ•ด์•ผํ•ฉ๋‹ˆ๋‹ค. ์—…๋ฐ์ดํŠธ๊ฐ€ ํ•„์š”ํ•ฉ๋‹ˆ๋‹ค. ์ข…์ข… ๋‚˜๋Š” ๋กœ๊น…์ด ์ „ํ˜€ ํ•„์š”ํ•˜์ง€ ์•Š์œผ๋ฉฐ (๋ชจ๋“  ์‚ฌ์†Œํ•œ ์˜ค๋ฅ˜์— ๋กœ๊ทธ์˜จํ•˜๋Š” ๊ฒƒ์€ ์‹ค์šฉ์ ์ด์ง€ ์•Š์Œ) ์˜ค๋ฅ˜๊ฐ€ ๋ฐœ์ƒํ•˜๋ฉด UpdateScreen::DontRedraw ๋ฅผ ๋ฐ˜ํ™˜ํ•ฉ๋‹ˆ๋‹ค. ๊ทธ๋Ÿฌ๋‚˜ ํ˜„์žฌ ? ์—ฐ์‚ฐ์ž๋ฅผ ์‚ฌ์šฉํ•˜๋ฉด ํ•ญ์ƒ ๋‹ค์Œ๊ณผ ๊ฐ™์ด ์ž‘์„ฑํ•ด์•ผํ•ฉ๋‹ˆ๋‹ค.

let thing = match fs::read(path) {
    Ok(o) => o,
    Err(_) => return UpdateScreen::DontRedraw,
};

Try ์—ฐ์‚ฐ์ž๋ฅผ ํ†ตํ•ด Result::Err ์—์„œ UpdateScreen::DontRedraw ๋กœ ๋ณ€ํ™˜ ํ•  ์ˆ˜ ์—†๊ธฐ ๋•Œ๋ฌธ์— ์ด๊ฒƒ์€ ๋งค์šฐ ์ง€๋ฃจํ•ด์ง‘๋‹ˆ๋‹ค. ์ข…์ข… ์‹คํŒจ ํ•  ์ˆ˜์žˆ๋Š” ํ•ด์‹œ ๋งต์—์„œ ๊ฐ„๋‹จํ•œ ์กฐํšŒ๋ฅผํ•ฉ๋‹ˆ๋‹ค (์˜ค๋ฅ˜๊ฐ€ ์•„๋‹™๋‹ˆ๋‹ค. )-๋„ˆ๋ฌด ์ž์ฃผ ํ•˜๋‚˜์˜ ์ฝœ๋ฐฑ์—์„œ ? ์—ฐ์‚ฐ์ž๋ฅผ 5-10 ๋ฒˆ ์‚ฌ์šฉํ–ˆ์Šต๋‹ˆ๋‹ค. ์œ„์—์„œ ์“ฐ๊ธฐ์— ๋งค์šฐ ์ƒ์„ธํ•˜๊ธฐ ๋•Œ๋ฌธ์—, ๋‚ด ํ˜„์žฌ์˜ ์†”๋ฃจ์…˜์ด๋‹ค impl From<Result<T>> for UpdateScreen ๊ณผ ๊ฐ™์ด , ๋‹ค์Œ๊ณผ ๊ฐ™์ด ์ฝœ๋ฐฑ์—์„œ ๋‚ด๋ถ€ ํ•จ์ˆ˜๋ฅผ ์‚ฌ์šฉ

fn callback(data: &mut State) -> UpdateScreen {
     fn callback_inner(data: &mut State) -> Option<()> {
         let file_contents = fs::read_to_string(data.path).ok()?;
         data.loaded_file = Some(file_contents);
         Some(())
     }

    callback_inner(data).into()
}

์ฝœ๋ฐฑ์ด ํ•จ์ˆ˜ ํฌ์ธํ„ฐ๋กœ ์‚ฌ์šฉ๋˜๊ธฐ ๋•Œ๋ฌธ์— -> impl Into<UpdateScreen> ์‚ฌ์šฉํ•  ์ˆ˜ ์—†์Šต๋‹ˆ๋‹ค (์–ด๋–ค ์ด์œ ๋กœ impl ๋ฐ˜ํ™˜ํ•˜๋Š” ๊ฒƒ์€ ํ˜„์žฌ ํ•จ์ˆ˜ ํฌ์ธํ„ฐ์— ๋Œ€ํ•ด ํ—ˆ์šฉ๋˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค). ๊ทธ๋ž˜์„œ ์ œ๊ฐ€ Try ์—ฐ์‚ฐ์ž๋ฅผ ์‚ฌ์šฉํ•˜๋Š” ์œ ์ผํ•œ ๋ฐฉ๋ฒ•์€ ๋‚ด๋ถ€ ํ•จ์ˆ˜ ํŠธ๋ฆญ์„ ์ˆ˜ํ–‰ํ•˜๋Š” ๊ฒƒ์ž…๋‹ˆ๋‹ค. ๋‹ค์Œ๊ณผ ๊ฐ™์ด ๊ฐ„๋‹จํžˆ ํ•  ์ˆ˜ ์žˆ๋‹ค๋ฉด ์ข‹์„ ๊ฒƒ์ž…๋‹ˆ๋‹ค.

impl<T> Try<Result<T>> for UpdateScreen {
    fn try(original: Result<T>) -> Try<T, UpdateScreen> {
        match original {
             Ok(o) => Try::DontReturn(o),
             Err(_) => Try::Return(UpdateScreen::DontRedraw),
        }
    }
}

fn callback(data: &mut State) -> UpdateScreen {
     // On any Result::Err, convert to an UpdateScreeen::DontRedraw and return
     let file_contents = fs::read_to_string(data.path)?;
     data.loaded_file = Some(file_contents);
     UpdateScreen::Redraw
}

ํ˜„์žฌ ์ œ์•ˆ์—์„œ ์ด๊ฒƒ์ด ๊ฐ€๋Šฅํ• ์ง€ ํ™•์‹คํ•˜์ง€ ์•Š์œผ๋ฉฐ ๊ณ ๋ คํ•  ์‚ฌ์šฉ ์‚ฌ๋ก€๋ฅผ ์ถ”๊ฐ€ํ•˜๊ณ  ์‹ถ์—ˆ์Šต๋‹ˆ๋‹ค. ์ปค์Šคํ…€ Try ์—ฐ์‚ฐ์ž๊ฐ€ ์ด์™€ ๊ฐ™์€ ๊ฒƒ์„ ์ง€์›ํ•  ์ˆ˜ ์žˆ๋‹ค๋ฉด ์ข‹์„ ๊ฒƒ์ž…๋‹ˆ๋‹ค.

ํŽธ์ง‘ํ•˜๋‹ค:
์ œ๊ฐ€ ์‹ค์ˆ˜๋ฅผ.


์ด ๊ฒŒ์‹œ๋ฌผ ๋ฌด์‹œ


์œ ํ˜• ์ถ”๋ก ์œผ๋กœ ๋” ์ž˜ ์ž‘๋™ ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๊นŒ? ๊ฐ„๋‹จํ•œ ๊ฒฝ์šฐ์—๋„ ์‹คํŒจํ•ฉ๋‹ˆ๋‹ค.

fn test_try(a: u32, b: u32) {
    let div = if b != 0 {
        Some(a / b)
    } else {
        None
    };

    let x // : Option<_> // why is this type annotation necessary
    = try { div? + 1 };

    println!("{:?}", x);
}

try ๋ธ”๋ก ๋Œ€์‹  ํด๋กœ์ €๋ฅผ ์‚ฌ์šฉํ•˜๋„๋ก ๋‹ค์‹œ ์ž‘์„ฑํ•˜๋ฉด (๊ทธ๋ฆฌ๊ณ ์ด ๊ณผ์ •์—์„œ ๋Š์Šจํ•œ ์ž๋™ ๋ž˜ํ•‘),

fn test_closure(a: u32, b: u32) {
    let div = if b != 0 {
        Some(a / b)
    } else {
        None
    };

    let x =  (|| (div? + 1).into())();

    println!("{:?}", x);
}

์œ ํ˜• ์–ด๋…ธํ…Œ์ด์…˜์ด ํ•„์š”ํ•˜์ง€ ์•Š์ง€๋งŒ ๊ฒฐ๊ณผ๋ฅผ ๋ž˜ํ•‘ํ•ด์•ผํ•ฉ๋‹ˆ๋‹ค.

์šด๋™์žฅ

@KrishnaSannasi ํด๋กœ์ € ๊ธฐ๋ฐ˜ ์˜ˆ์ œ์—๋Š” Into ๊ฐ€ ์ถœ๋ ฅ์„ ์ œํ•œํ•˜์ง€ ์•Š๊ณ  ๋‚˜์ค‘์— ์ˆ˜ํ–‰ํ•˜๋Š” ๊ณณ์—์„œ๋Š” ์‚ฌ์šฉํ•˜์ง€ ์•Š๊ธฐ ๋•Œ๋ฌธ์— ์œ ํ˜• ์ถ”๋ก  ์‹คํŒจ ( playground )๋„ ์žˆ์Šต๋‹ˆ๋‹ค.

์ด๊ฒƒ์€ try ๋ธ”๋ก์ด ์•„๋‹Œ Try ํŠธ๋ ˆ์ด ํŠธ์˜ ๋ฌธ์ œ์ธ ๊ฒƒ ๊ฐ™์Šต๋‹ˆ๋‹ค. Into ์™€ ์œ ์‚ฌํ•˜๊ฒŒ ์ž…๋ ฅ์—์„œ ์ถœ๋ ฅ์œผ๋กœ ์–ด๋–ค ์œ ํ˜• ์ •๋ณด๋„ ์ „ํŒŒํ•˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค. ์ถœ๋ ฅ ์œ ํ˜•์€ ๋‚˜์ค‘์— ์‚ฌ์šฉํ•˜์—ฌ ๊ฒฐ์ •ํ•  ์ˆ˜ ์žˆ์–ด์•ผํ•ฉ๋‹ˆ๋‹ค. https://github.com/rust-lang/rust/issues/42327 ์— ํŠน์„ฑ์— ๋Œ€ํ•œ _ ๋งŽ์€ _์˜ ํ† ๋ก ์ด ์žˆ์Šต๋‹ˆ๋‹ค. ์•„์ง ์ฝ์ง€ ์•Š์•˜๊ธฐ ๋•Œ๋ฌธ์—์ด ๋ฌธ์ œ๋ฅผ ํ•ด๊ฒฐํ•  ์ˆ˜์žˆ๋Š” ์ œ์•ˆ์ด ์žˆ๋Š”์ง€ ํ™•์‹คํ•˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค.

ํ—‰ํ—‰

์˜ˆ, ์ฝ”๋“œ๋ฅผ ์‚ฌ์šฉํ•˜๊ธฐ ์œ„ํ•ด ๋งˆ์ง€๋ง‰ ์ˆœ๊ฐ„์— ์ฝ”๋“œ๋ฅผ ๋ณ€๊ฒฝํ–ˆ์ง€๋งŒ ํ…Œ์ŠคํŠธํ•˜์ง€ ์•Š์•˜์Šต๋‹ˆ๋‹ค. ๋‚ด ์ž˜๋ชป์ด์•ผ.

try ๋ธ”๋ก ์•ˆ์ •ํ™”์—์„œ ์–ผ๋งˆ๋‚˜ ๋ฉ€๋ฆฌ ๋–จ์–ด์ ธ ์žˆ์Šต๋‹ˆ๊นŒ? ๊ทธ๊ฒƒ์€ ๋‚ด๊ฐ€ ์•ผ๊ฐ„์—์„œ ํ•„์š”ํ•œ ์œ ์ผํ•œ ๊ธฐ๋Šฅ์ž…๋‹ˆ๋‹ค : D

์•„ ๋ฆฌ๊ทธ ๋‹ˆ๋ฅด

์ผ๋‹จ ์ด๊ฒƒ์ด ๋๋‚˜๋ฉด ์•ˆ์ • ๋  ์ˆ˜ ์žˆ๋‹ค๊ณ  ๋ฏฟ์Šต๋‹ˆ๋‹ค.

๋ธ”๋ก try {} catch (๋˜๋Š” ๊ธฐํƒ€ ํ›„์† ID)๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ ๋ฏธ๋ž˜๋ฅผ ์œ„ํ•ด ๋””์ž์ธ ๊ณต๊ฐ„์„ ์—ด์–ด๋‘๊ณ  ๋Œ€์‹  ๋งค์น˜๋กœ ์›ํ•˜๋Š” ์ž‘์—…์„ ์ˆ˜ํ–‰ํ•˜๋Š” ๋ฐฉ๋ฒ•์„ ์•Œ๋ ค์ค๋‹ˆ๋‹ค.

ํ˜„์žฌ ๊ธฐ๋Šฅ์„ ํ—ˆ์šฉํ•˜๋ฉด์„œ ๋ฏธ๋ž˜๋ฅผ ์œ„ํ•ด ๋””์ž์ธ ๊ณต๊ฐ„์„ ์—ด์–ด ๋‘˜ ์ˆ˜์žˆ๋Š” ๊ฐ€๋Šฅ์„ฑ์„ ํ—ˆ์šฉํ•˜๋Š” ์ค‘๊ฐ„ ๋””์ž์ธ์ด ์—†์Šต๋‹ˆ๊นŒ (๋”ฐ๋ผ์„œ ๊ฒฐ๊ตญ catch ๋ธ”๋ก)?

๋‚ด๊ฐ€ ๋งŒ๋“  PR์€ ์–ด์จŒ๋“  ๊ทธ ์ƒ์ž๋ฅผ ์ฒดํฌํ•ด์•ผํ•ฉ๋‹ˆ๋‹ค. CC @nikomatsakis

๋‚˜๋Š” ์–ด์ œ ์ฒ˜์Œ์œผ๋กœ ์ด๊ฒƒ์„ ์‚ฌ์šฉํ•ด ๋ณด์•˜๊ณ  ์ด๊ฒƒ์ด ์กฐ๊ธˆ ๋†€๋ž์Šต๋‹ˆ๋‹ค.

#![feature(try_blocks)]
fn main() -> Result<(), ()> {
    let x: () = try {
        Err(())?
    }?;
    Ok(x)
}

๋•Œ๋ฌธ์— ์ปดํŒŒ์ผ๋˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค

error[E0284]: type annotations required: cannot resolve `<_ as std::ops::Try>::Ok == _`

์ฐจ๋ผ๋ฆฌ ๋‚˜๋Š”ํ•ด์•ผํ–ˆ๋‹ค

#![feature(try_blocks)]
fn main() -> Result<(), ()> {
    let x: Result<(), ()> = try {
        Err(())?
    };
    let x = x?;
    Ok(x)
}

๋Œ€์‹ .

์ฒ˜์Œ์—๋Š” ํ˜ผ๋ž€ ์Šค๋Ÿฌ์› ์œผ๋ฏ€๋กœ ์˜ค๋ฅ˜ ๋ฉ”์‹œ์ง€๋ฅผ ๋ณ€๊ฒฝํ•˜๊ฑฐ๋‚˜ --explain ?

์ฒซ ๋ฒˆ์งธ ์˜ˆ์—์„œ ๋ฌผ์Œํ‘œ๋ฅผ ์•ฝ๊ฐ„ ์•„๋ž˜๋กœ ์ด๋™ํ•˜๋ฉด

#![feature(try_blocks)]
fn main() -> Result<(), ()> {
    let x: () = try {
        Err(())?
    };
    Ok(x?)
}

๋” ๋‚˜์€ ์˜ค๋ฅ˜ ๋ฉ”์‹œ์ง€๊ฐ€ ํ‘œ์‹œ๋ฉ๋‹ˆ๋‹ค. ์ด ์˜ค๋ฅ˜๋Š” Rust๊ฐ€ try { ... } ๋ฅผ ํ•ด๊ฒฐํ•  ์œ ํ˜•์„ ๊ฒฐ์ •ํ•  ์ˆ˜ ์—†๊ธฐ ๋•Œ๋ฌธ์— ๋ฐœ์ƒํ•ฉ๋‹ˆ๋‹ค. ์ด ์œ ํ˜•์„ ํ•ด๊ฒฐํ•  ์ˆ˜ ์—†๊ธฐ ๋•Œ๋ฌธ์— <_ as Try>::Ok ์œ ํ˜•์ด ๋ฌด์—‡์ธ์ง€ ์•Œ ์ˆ˜ ์—†์œผ๋ฏ€๋กœ ์˜ค๋ฅ˜๊ฐ€ ๋ฐœ์ƒํ–ˆ์Šต๋‹ˆ๋‹ค. (๋•Œ๋ฌธ์— ? ์˜คํผ๋ ˆ์ดํ„ฐ๊ฐ€ ์–ธ๋žฉ Try ์œ ํ˜•๊ณผ ๋ฐฐ๋ฉด ์ œ๊ณต Try::Ok ์œ ํ˜•). Rust๋Š” ์ž์ฒด์ ์œผ๋กœ Try::Ok ์œ ํ˜•์œผ๋กœ ์ž‘๋™ ํ•  ์ˆ˜ ์—†์Šต๋‹ˆ๋‹ค. Try ํŠน์„ฑ๊ณผ ํ•ด๋‹น ํŠน์„ฑ์„ ๊ตฌํ˜„ํ•˜๋Š” ์œ ํ˜•์„ ํ†ตํ•ด ํ•ด๊ฒฐ๋˜์–ด์•ผํ•ฉ๋‹ˆ๋‹ค. (ํ˜„์žฌ ์œ ํ˜• ๊ฒ€์‚ฌ๊ฐ€ ์ž‘๋™ํ•˜๋Š” ๋ฐฉ์‹์˜ ์ œํ•œ ์‚ฌํ•ญ)

์ด ๊ธฐ๋Šฅ์— ๋Œ€ํ•œ ๋ชจ๋“  ๊ฒƒ์ด ๊ตฌํ˜„๋˜์—ˆ์Šต๋‹ˆ๋‹ค. ๋งž์Šต๋‹ˆ๊นŒ? ๋งŒ์•ฝ ๊ทธ๋ ‡๋‹ค๋ฉด, ์•ˆ์ •๋˜๊ธฐ ์ „์— ์–ผ๋งˆ๋‚˜ ์˜ค๋ž˜ ์•‰์•„๋ณด์•„์•ผํ• ๊นŒ์š”?

๋‚˜๋Š” ์ด๊ฒƒ์ด ์šฐ๋ฆฌ๊ฐ€ ์ด๊ฒƒ์„ ์›ํ•˜๋Š”์ง€ ์—ฌ๋ถ€์— ๋Œ€ํ•œ ์—ด๋ฆฐ ์งˆ๋ฌธ์ด๋ผ๊ณ  ์ƒ๊ฐํ–ˆ์Šต๋‹ˆ๋‹ค. ํŠนํžˆ ์—ฌ๊ธฐ์„œ ์˜ˆ์™ธ ์–ธ์–ด (try, catch)๋ฅผ ์‚ฌ์šฉํ•  ๊ฒƒ์ธ์ง€์— ๋Œ€ํ•œ ๋…ผ์˜๊ฐ€์žˆ์—ˆ์Šต๋‹ˆ๋‹ค.

๊ฐœ์ธ์ ์œผ๋กœ ์ €๋Š” Rust๊ฐ€ ์˜ˆ์™ธ์™€ ๊ฐ™์€ ๊ฒƒ์„ ๊ฐ€์ง€๊ณ  ์žˆ๋‹ค๋Š” ์ธ์ƒ์„ ์ฃผ๋ ค๋Š” ์‹œ๋„๋ฅผ ๊ฐ•๋ ฅํžˆ ๋ฐ˜๋Œ€ํ•ฉ๋‹ˆ๋‹ค. ํŠนํžˆ catch ๋ผ๋Š” ๋‹จ์–ด์˜ ์‚ฌ์šฉ์€ ์˜ˆ์™ธ๊ฐ€์žˆ๋Š” ์–ธ์–ด์—์„œ ์˜จ ๋ชจ๋“  ์‚ฌ๋žŒ์ด ์ด๊ฒƒ์ด ํ’€๋ฆฐ๋‹ค ๊ณ  ๊ฐ€์ • ํ•  ๊ฒƒ์ด๊ธฐ ๋•Œ๋ฌธ์— ๋‚˜์œ ์ƒ๊ฐ์ด๋ผ๊ณ  ์ƒ๊ฐํ•ฉ๋‹ˆ๋‹ค. ๊ฐ€๋ฅด์น˜๋Š” ๊ฒƒ์ด ํ˜ผ๋ž€์Šค๋Ÿฝ๊ณ  ๊ณ ํ†ต ์Šค๋Ÿฌ์šธ ๊ฒƒ์œผ๋กœ ์˜ˆ์ƒํ•ฉ๋‹ˆ๋‹ค.

ํŠนํžˆ ์—ฌ๊ธฐ์„œ ์˜ˆ์™ธ ์–ธ์–ด (try, catch)๋ฅผ ์‚ฌ์šฉํ•  ๊ฒƒ์ธ์ง€์— ๋Œ€ํ•œ ๋…ผ์˜๊ฐ€์žˆ์—ˆ์Šต๋‹ˆ๋‹ค.

๋‚˜๋Š” https://github.com/rust-lang/rfcs/pull/2388์ด try ์ด๋ฆ„์ด ํ—ˆ์šฉ๋˜๋Š”์ง€ ์—ฌ๋ถ€๋ฅผ ํ™•์‹คํžˆ ๊ฒฐ์ •ํ–ˆ๋‹ค๊ณ  ์ƒ๊ฐํ•ฉ๋‹ˆ๋‹ค. ์ด๊ฒƒ์€ ๊ณต๊ฐœ ๋œ ์งˆ๋ฌธ์ด ์•„๋‹™๋‹ˆ๋‹ค. ๊ทธ๋Ÿฌ๋‚˜ Try ํŠน์„ฑ๊ณผ Ok -wrapping์˜ ์ •์˜๊ฐ€์žˆ๋Š” ๊ฒƒ ๊ฐ™์Šต๋‹ˆ๋‹ค.

Ok ๋ž˜ํ•‘์€ ์›๋ž˜ RFC์—์„œ ์ด๋ฏธ ๊ฒฐ์ •๋œ ํ›„ ๊ตฌํ˜„ ์ค‘์— ์ œ๊ฑฐ๋˜๊ณ  ๋‚˜์ค‘์— ๋‹ค์‹œ ์ถ”๊ฐ€๋˜์—ˆ์Šต๋‹ˆ๋‹ค. ๋‚˜๋Š” ๊ทธ๊ฒƒ์ด ์–ด๋–ป๊ฒŒ ์—ด๋ฆฐ ์งˆ๋ฌธ์ธ์ง€ ๋ชจ๋ฅด๊ฒ ์Šต๋‹ˆ๋‹ค.

@rpjohnst ๊ธ€์Ž„์š”, ์›๋ž˜ RFC์˜ ๊ฒฐ์ •์— ๋™์˜ํ•˜์ง€ ์•Š๋Š” Josh์˜ ๋•ํƒ์ž…๋‹ˆ๋‹ค ... :) ๊ทธ๊ฒƒ์€ ์ €์—๊ฒŒ ํ•ด๊ฒฐ ๋œ ๋ฌธ์ œ https://github.com/rust-lang/rust/issues/31436#issuecomment -427096703, https://github.com/rust-lang/rust/issues/31436#issuecomment -427252202 ๋ฐ https : //๋ฅผ ์ฐธ์กฐ ํ•˜์„ธ์š” . github.com/rust-lang/rust/issues/31436#issuecomment -437129491. ์–ด์จŒ๋“  ... ๋‚ด ์˜๊ฒฌ์˜ ์š”์ ์€ "์˜ˆ์™ธ ์–ธ์–ด"๋กœ์„œ try ๊ฐ€ ํ•ด๊ฒฐ ๋œ ๋ฌธ์ œ๋ผ๋Š” ๊ฒƒ์ž…๋‹ˆ๋‹ค.

์™€์šฐ, ์–ธ์ œ ์ด๋Ÿฐ ์ผ์ด ์žˆ์—ˆ๋‚˜์š”? ๋งˆ์ง€๋ง‰์œผ๋กœ ๊ธฐ์–ต ๋‚˜๋Š” ๊ฒƒ์€ ๋‚ด๋ถ€์— ๋Œ€ํ•œ ํ† ๋ก ์ด์—ˆ์Šต๋‹ˆ๋‹ค. ๋‚˜๋Š” Ok-wrapping์— ๋งค์šฐ ๋ฐ˜๋Œ€ํ•ฉ๋‹ˆ๋‹ค.

์œผ์œผ. ์ด๋Ÿฐ ์ผ์ด ์ผ์–ด๋‚ฌ๋‹ค๋Š” ๊ฒƒ์„ ๋ฏฟ์„ ์ˆ˜ ์—†์Šต๋‹ˆ๋‹ค. Ok ๋žฉํ•‘์€ ๋„ˆ๋ฌด ๋”์ฐํ•ฉ๋‹ˆ๋‹ค (ํ•จ์ˆ˜์˜ ๋ชจ๋“  ๋ฐ˜ํ™˜ ํ‘œํ˜„์‹์ด ํ•จ์ˆ˜์˜ ๋ฐ˜ํ™˜ ์œ ํ˜•์ด์–ด์•ผํ•œ๋‹ค๋Š” ๋งค์šฐ ํ˜„๋ช…ํ•œ ์ง๊ด€์„ ๊นจ๋œจ๋ฆฝ๋‹ˆ๋‹ค). ๋„ค, ํ™•์‹คํžˆ @ mark-im๊ณผ ํ•จ๊ป˜ํ•ฉ๋‹ˆ๋‹ค. Josh์˜ ์˜๊ฒฌ ๋ถˆ์ผ์น˜๊ฐ€์ด ๋ฌธ์ œ๋ฅผ ๊ณต๊ฐœ ๋œ ๋ฌธ์ œ๋กœ ์œ ์ง€ํ•˜๊ณ  ๋” ๋งŽ์€ ํ† ๋ก ์„ ํ•  ์ˆ˜์žˆ์„๋งŒํผ ์ถฉ๋ถ„ํ•œ๊ฐ€์š”? ํŒ€์›์ด ์•„๋‹ˆ๋ผ๋Š” ์˜๋ฏธ๊ฐ€ ์•„๋‹ˆ๋ผ์ด ๋ฌธ์ œ๋ฅผ ํ•ด๊ฒฐํ•˜๋Š” ๋ฐ ๋„์›€์„ ๋“œ๋ฆฌ๊ณ  ์‹ถ์Šต๋‹ˆ๋‹ค.

Ok RFC 243์— ์ ‘์ˆ˜๋กœ -wrapping (๋ฌธ์ž๋กœ ์ •์˜ ๋œ ? ์ด ์–ธ์ œ ์ผ์–ด ๋‚ฌ๋Š”์ง€ ๊ถ๊ธˆํ•ด ๊ฒฝ์šฐ, ์šด์ „์ž๊ฐ€) ํ•จ์ˆ˜ ๋ฐ˜ํ™˜ ์‹ '์œ ํ˜•์— ๋Œ€ํ•œ๋˜์ง€ ๋ณ€๊ฒฝ ์•„๋ฌด๊ฒƒ๋„ ์•Š์Šต๋‹ˆ๋‹ค. ์ด๊ฒƒ์ด RFC 243์ด ์ •์˜ํ•œ ๋ฐฉ๋ฒ•์ž…๋‹ˆ๋‹ค : https://github.com/rust-lang/rfcs/blob/master/text/0243-trait-based-exception-handling.md#catch -expressions

์ด RFC๋Š” ? ์—ฐ์‚ฐ์ž๋ฅผ "๋ฒ”์œ„ ์ง€์ •"ํ•˜๋Š” ๋ฐ ์‚ฌ์šฉ๋˜๋Š” catch {..} ํ‘œํ˜„์‹ ์–‘์‹๋„ ๋„์ž…ํ•ฉ๋‹ˆ๋‹ค. catch ์—ฐ์‚ฐ์ž๋Š” ๊ด€๋ จ ๋ธ”๋ก์„ ์‹คํ–‰ํ•ฉ๋‹ˆ๋‹ค. ์˜ˆ์™ธ๊ฐ€ ๋ฐœ์ƒํ•˜์ง€ ์•Š์œผ๋ฉด ๊ฒฐ๊ณผ๋Š” Ok(v) ์ด๋ฉฐ ์—ฌ๊ธฐ์„œ v ๋Š” ๋ธ”๋ก์˜ ๊ฐ’์ž…๋‹ˆ๋‹ค. ๊ทธ๋ ‡์ง€ ์•Š๊ณ  ์˜ˆ์™ธ๊ฐ€ ๋ฐœ์ƒํ•˜๋ฉด ๊ฒฐ๊ณผ๋Š” Err(e) ์ž…๋‹ˆ๋‹ค.

catch { foo()? } ๋Š” ๋ณธ์งˆ์ ์œผ๋กœ foo() ์™€ ๋™์ผํ•ฉ๋‹ˆ๋‹ค.

์ฆ‰, T ์œ ํ˜•์˜ ๋ธ”๋ก์„ ๊ฐ€์ ธ์™€ ๋ฌด์กฐ๊ฑด ๋ž˜ํ•‘ํ•˜์—ฌ Result<T, _> ์œ ํ˜•์˜ ๊ฐ’์„ ์ƒ์„ฑํ•ฉ๋‹ˆ๋‹ค. ๋ธ”๋ก์—์žˆ๋Š” return ๋ฌธ์€ ์™„์ „ํžˆ ์˜ํ–ฅ์„๋ฐ›์ง€ ์•Š์Šต๋‹ˆ๋‹ค. ๋ธ”๋ก์ด ํ•จ์ˆ˜์˜ ๊ผฌ๋ฆฌ ํ‘œํ˜„์‹ ์ธ ๊ฒฝ์šฐ ํ•จ์ˆ˜๋Š” Result<T, _> ๋ฐ˜ํ™˜ํ•ด์•ผํ•ฉ๋‹ˆ๋‹ค.

์—ฐ๋ น๋Œ€์— ๋”ฐ๋ผ ์•ผ๊ฐ„์— ์ด๋Ÿฌํ•œ ๋ฐฉ์‹์œผ๋กœ ๊ตฌํ˜„๋˜์—ˆ์Šต๋‹ˆ๋‹ค : https://play.rust-lang.org/?version=nightly&mode=debug&edition=2018&gist=88379a1607d952d4eae1d06394b50959. ์ด๊ฒƒ์€ lang ํŒ€์ด์ด ์Šค๋ ˆ๋“œ์—์„œ ๋งŽ์€ ํ† ๋ก ์„ ํ•œ ํ›„ ์ˆ˜ํ–‰๋˜์—ˆ์œผ๋ฉฐ ๋‹ค์Œ ์Šค๋ ˆ๋“œ์—์„œ ์—ฐ๊ฒฐ๋˜์—ˆ์Šต๋‹ˆ๋‹ค. rust-lang / rust # 41414 (์ด ๋ฌธ์ œ์˜ ์ƒ๋‹จ์—๋„ ๋งํฌ๋˜์–ด ์žˆ์Šต๋‹ˆ๋‹ค).

2019 ๋…„ 5 ์›” 28 ์ผ ์˜คํ›„ 5:48:27 PDT์— Alexander Regueiro [email protected]์ด ์ž‘์„ฑํ–ˆ์Šต๋‹ˆ๋‹ค.

์œผ์œผ. ์ด๋Ÿฐ ์ผ์ด ์ผ์–ด๋‚ฌ๋‹ค๋Š” ๊ฒƒ์„ ๋ฏฟ์„ ์ˆ˜ ์—†์Šต๋‹ˆ๋‹ค. Ok ํฌ์žฅ์ด ๋„ˆ๋ฌด ๋”์ฐํ•ฉ๋‹ˆ๋‹ค.
๋ชจ๋“  ํ‘œํ˜„์„ ๋ฐ˜ํ™˜ํ•˜๋Š” ๋งค์šฐ ํ˜„๋ช…ํ•œ ์ง๊ด€์„ ๊นจ๋œจ๋ฆฝ๋‹ˆ๋‹ค.
ํ•จ์ˆ˜๋Š” ํ•จ์ˆ˜์˜ ๋ฐ˜ํ™˜ ์œ ํ˜•์ด์–ด์•ผํ•ฉ๋‹ˆ๋‹ค). ๊ทธ๋ž˜, ํ™•์‹คํžˆ
@ mark-im๊ณผ ํ•จ๊ป˜. ์กฐ์‰ฌ์˜ ์˜๊ฒฌ ์ฐจ์ด๊ฐ€
๋ฌธ์ œ๋ฅผ ์—ด๊ณ  ๊ทธ๊ฒƒ์— ๋Œ€ํ•ด ๋” ๋งŽ์€ ํ† ๋ก ์„ ์–ป์Šต๋‹ˆ๊นŒ? ๊ธฐ๊บผ์ด ๊ทธ๋ฅผ ์ง€์›ํ•˜๊ฒ ์Šต๋‹ˆ๋‹ค
์ด ์‹ธ์›€์—์„œ ํŒ€์›์ด ์•„๋‹ˆ๋ผ๋Š” ์˜๋ฏธ๊ฐ€ ์•„๋‹™๋‹ˆ๋‹ค.

๊ฐ์‚ฌํ•ฉ๋‹ˆ๋‹ค. ๋‚˜๋Š” ๋‚˜ ์ž์‹ ์„ ์œ„ํ•ด์„œ๋งŒ ์ด๊ฒƒ์— ๋™์˜ํ•˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค. ๋‚˜๋Š” ๋˜ํ•œ ๋‚ด๊ฐ€ ๋ณธ ๊ฒƒ๊ณผ ๊ฐ™์€ ์ž…์žฅ์„ ํ‘œํ˜„ํ•œ ์ˆ˜๋งŽ์€ ์‚ฌ๋žŒ๋“ค์„ ๋Œ€ํ‘œํ•˜๊ณ ์žˆ๋‹ค.

ํŠธ์œ— ๋‹ด์•„ ๊ฐ€๊ธฐ

Ok ๋žฉํ•‘์ด ๊ทธ๋ ‡๊ฒŒ ๋™์˜ํ•˜์ง€ ์•Š๋Š” ์ด์œ ๋ฅผ ์„ค๋ช…ํ•˜๊ฑฐ๋‚˜ ์ด์ „์— ์„ค๋ช… ๋œ ๋งํฌ๋ฅผ ์ œ๊ณต ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๊นŒ? ๋‚˜๋Š” ๋ณด๋Ÿฌ ๊ฐ”์ง€๋งŒ ํ”ผ์ƒ์ ์œผ๋กœ๋ณด๊ธฐ์—๋Š” ์•„๋ฌด๊ฒƒ๋„ ๋ณด์ง€ ๋ชปํ–ˆ๋‹ค. ๋‚˜๋Š” ์ด๊ฒƒ์— ๋ง์ด ์—†์Šต๋‹ˆ๋‹ค (๋‚˜๋Š” ๋ชจ๋“  ์ƒ์ž ์ฒดํฌ๋ฅผ ๋ณด์•˜๊ณ  ํ•œ ๋‹ฌ ๋™์•ˆ ํ† ๋ก ์ด ์—†์—ˆ๊ธฐ ๋•Œ๋ฌธ์— ์ด๊ฒƒ์— ๋Œ€ํ•ด ๋ง ๊ทธ๋Œ€๋กœ ์–ธ๊ธ‰ํ–ˆ์Šต๋‹ˆ๋‹ค). ๊ทธ๋Ÿฌ๋‚˜ ์ด์ œ์ด ๋ง๋ฒŒ์˜ ๋‘ฅ์ง€๋ฅผ ๊ฑท์–ด ์ฐผ์œผ๋ฏ€๋กœ ๋‚˜๋Š” ๋…ผ์Ÿ์„ ๋” ์ž˜ ์ดํ•ดํ•˜๊ณ  ์‹ถ์Šต๋‹ˆ๋‹ค.

2019 ๋…„ 5 ์›” 28 ์ผ ํ™”์š”์ผ ์˜คํ›„ 03:40:47 -0700 Russell Johnston์€ ๋‹ค์Œ๊ณผ ๊ฐ™์ด ์ผ์Šต๋‹ˆ๋‹ค.

Ok ๋ž˜ํ•‘์€ ์›๋ž˜ RFC์—์„œ ์ด๋ฏธ ๊ฒฐ์ •๋œ ํ›„ ๊ตฌํ˜„ ์ค‘์— ์ œ๊ฑฐ๋˜๊ณ  ๋‚˜์ค‘์— ๋‹ค์‹œ ์ถ”๊ฐ€๋˜์—ˆ์Šต๋‹ˆ๋‹ค. ๋‚˜๋Š” ๊ทธ๊ฒƒ์ด ์–ด๋–ป๊ฒŒ ์—ด๋ฆฐ ์งˆ๋ฌธ์ธ์ง€ ๋ชจ๋ฅด๊ฒ ์Šต๋‹ˆ๋‹ค.

๋‚˜๋Š” ๋‹น์‹ ์ด ๋‹น์‹  ์ž์‹ ์˜ ์งˆ๋ฌธ์— ๋ถ€๋ถ„์ ์œผ๋กœ ๋Œ€๋‹ตํ–ˆ๋‹ค๊ณ  ์ƒ๊ฐํ•ฉ๋‹ˆ๋‹ค. ๋‚˜๋Š” ๋ชจ๋‘๋ฅผ ์ƒ๊ฐํ•˜์ง€ ์•Š๋Š”๋‹ค
์›๋ž˜ RFC ํ† ๋ก ์— ์ฐธ์—ฌํ•œ ๋‚ด์šฉ์€ ๊ฐ™์€ ํŽ˜์ด์ง€์—์žˆ์—ˆ์Šต๋‹ˆ๋‹ค. try
์ ˆ๋Œ€์ ์œผ๋กœ ๋งŽ์€ ์‚ฌ๋žŒ๋“ค์ด ์›ํ–ˆ์ง€๋งŒ ํ•ฉ์˜๊ฐ€ ์—†์—ˆ์Šต๋‹ˆ๋‹ค.
Ok-wrapping์„ ์œ„ํ•ด.

2019 ๋…„ 5 ์›” 28 ์ผ ํ™”์š”์ผ 03:44:46 PM -0700์— Mazdak Farrokhzad๋Š” ๋‹ค์Œ๊ณผ ๊ฐ™์ด ์ผ์Šต๋‹ˆ๋‹ค.

์–ด์จŒ๋“  ... ๋‚ด ์˜๊ฒฌ์˜ ์š”์ ์€ "์˜ˆ์™ธ ์–ธ์–ด"๋กœ์„œ try ๊ฐ€ ํ•ด๊ฒฐ ๋œ ๋ฌธ์ œ๋ผ๋Š” ๊ฒƒ์ž…๋‹ˆ๋‹ค.

์„ค๋ช…ํ•˜์ž๋ฉด "์˜ˆ์™ธ"๋ผ๋Š” ์€์œ ๊ฐ€ ๋งค๋ ฅ์ ์ด๋ผ๊ณ  โ€‹โ€‹์ƒ๊ฐํ•˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค.
try-fn ๋ฐ Ok-wrapping๊ณผ ๊ฐ™์€ ๋งŽ์€ ์‹œ๋„๋Š”
์˜ˆ์™ธ์™€ ๊ฐ™์€ ๋ฉ”์ปค๋‹ˆ์ฆ˜์„ ๊ฐ€์ง„ ๊ฐ€์งœ ์–ธ์–ด๋ฅผ ๋งŒ๋“ค๋ ค๊ณ ํ•ฉ๋‹ˆ๋‹ค.
ํ•˜์ง€๋งŒ try ์ž์ฒด๋Š” ๋‹ค๋ฅธ ๊ณณ์—์„œ ? ๋ฅผ ์žก๋Š” ์ˆ˜๋‹จ์œผ๋กœ
ํ•จ์ˆ˜ ๊ฒฝ๊ณ„๋Š” ์ œ์–ด ํ๋ฆ„ ๊ตฌ์กฐ๋กœ ์ดํ•ด๋ฉ๋‹ˆ๋‹ค.

2019 ๋…„ 5 ์›” 28 ์ผ ํ™”์š”์ผ ์˜คํ›„ 11:37:33 -0700์— Gabriel Smith๋Š” ๋‹ค์Œ๊ณผ ๊ฐ™์ด ์ผ์Šต๋‹ˆ๋‹ค.

Ok ํฌ์žฅ์ด ๊ทธ๋ ‡๊ฒŒ ๋งˆ์Œ์— ๋“ค์ง€ ์•Š๋Š” ์ด์œ ๋ฅผ ์„ค๋ช…ํ•ด ์ฃผ์‹œ๊ฒ ์Šต๋‹ˆ๊นŒ?

๋ช‡ ๊ฐ€์ง€ ์ด์œ  ์ค‘ ํ•˜๋‚˜ :

2019 ๋…„ 5 ์›” 28 ์ผ ํ™”์š”์ผ ์˜คํ›„ 05:48:27 -0700 Alexander Regueiro๋Š” ๋‹ค์Œ๊ณผ ๊ฐ™์ด ์ผ์Šต๋‹ˆ๋‹ค.

ํ•จ์ˆ˜์˜ ๋ชจ๋“  ๋ฐ˜ํ™˜ ํ‘œํ˜„์‹์ด ํ•จ์ˆ˜์˜ ๋ฐ˜ํ™˜ ์œ ํ˜•์ด์–ด์•ผํ•œ๋‹ค๋Š” ๋งค์šฐ ํ˜„๋ช…ํ•œ ์ง๊ด€์„ ๊นจ๋œจ๋ฆฝ๋‹ˆ๋‹ค.

์ด๊ฒƒ์€ ์‚ฌ๋žŒ๋“ค์ด ์œ ํ˜• ์ง€ํ–ฅ ์ถ”๋ก ์— ์‚ฌ์šฉํ•˜๋Š” ๋‹ค์–‘ํ•œ ์ ‘๊ทผ ๋ฐฉ์‹์„ ๊นจ๋œจ๋ฆฝ๋‹ˆ๋‹ค.
๊ธฐ๋Šฅ ๋ฐ ์ฝ”๋“œ ๊ตฌ์กฐ์— ๋Œ€ํ•ด.

๋‚˜๋Š” ํ™•์‹คํžˆ ์—ฌ๊ธฐ์— ๋‚ด ์ƒ๊ฐ์ด ์žˆ์ง€๋งŒ ์ง€๊ธˆ ๋‹น์žฅ์ด ์ฃผ์ œ๋ฅผ ๋‹ค์‹œ ์—ด์ง€ ์•Š๊ฒ ์Šต๋‹ˆ๊นŒ? ๊ตฌ๋ฌธ์— ๋Œ€ํ•ด 500 ๊ฐœ ์ด์ƒ์˜ ๊ฒŒ์‹œ๋ฌผ์— ๋Œ€ํ•œ ๋…ผ์Ÿ์ด ์žˆ์—ˆ๊ธฐ ๋•Œ๋ฌธ์— ์ž ์‹œ ๋™์•ˆ ์ง€๋ขฐ๋ฅผ ํ”ผํ•˜๊ณ  ์‹ถ์Šต๋‹ˆ๋‹ค.

์ด ๋ฌธ์ œ๋ฅผ ๋…ผ์˜ํ•˜๋Š” lang ํŒ€์—์„œ ์ฐจ๋‹จ ๋œ ๊ฒฝ์šฐ "catch ๋ธ”๋ก์ด ๊ฒฐ๊ณผ ๊ฐ’์„"๋ž˜ํ•‘ "ํ•ด์•ผํ•˜๋Š”์ง€ ํ™•์ธ (# 41414)"ํ™•์ธ๋ž€์„ ๋‹ค์‹œ ์„ ํƒ ์ทจ์†Œํ•ด์•ผํ•ฉ๋‹ˆ๋‹ค (์–ธ์–ด ํŒ€์—์„œ ์ฐจ๋‹จ๋˜์—ˆ๋‹ค๋Š” ์ฃผ์„๊ณผ ํ•จ๊ป˜). ์ด ์ถ”์  ๋ฌธ์ œ๊ฐ€ ์ƒํƒœ๋ฅผ ์•Œ๊ณ  ์žˆ์Šต๋‹ˆ๊นŒ?

์ฃ„์†กํ•ฉ๋‹ˆ๋‹ค. ์ €๋Š” ์•„๋ฌด๊ฒƒ๋„ ๋‹ค์‹œ ์—ด์ง€ ์•Š์Šต๋‹ˆ๋‹ค. ์ถ”์  ๋ฌธ์ œ์—์„œ ๊ฒฐ์ •๋œ ๊ฒƒ์œผ๋กœ ํ‘œ์‹œ๋œ ๋‚ด์šฉ๊ณผ ๊ทธ ๋ฐœ์ƒ์‹œ๊ธฐ + ์–ด๋–ป๊ฒŒ ๋ฐœ์ƒํ–ˆ๋Š”์ง€ ๋‹ค์‹œ ์„ค๋ช…ํ•ฉ๋‹ˆ๋‹ค.

@rpjohnst ์ •๋ณด ์ฃผ์…”์„œ ๊ฐ์‚ฌํ•ฉ๋‹ˆ๋‹ค!

@yodaldevoid Josh๋Š” ๋‚ด ์ƒ๊ฐ์„ ๊ฑฐ์˜ ์š”์•ฝํ–ˆ์Šต๋‹ˆ๋‹ค.

๋‚˜๋Š” ๋ธ”๋ก์— ๊ตญํ•œ๋œ ok-wrapping (ํ•จ์ˆ˜ ์œ ํ˜•์— ์˜ํ–ฅ์„์ฃผ๋Š” ๊ฒƒ๊ณผ๋Š” ๋ฐ˜๋Œ€๋กœ)์— ๋Œ€ํ•ด ์•ฝ๊ฐ„ ๋œ ๋ฐ˜๋Œ€ํ•˜์ง€๋งŒ ์—ฌ์ „ํžˆ ๋‚˜์œ ์„ ๋ก€๋ฅผ ์„ค์ •ํ•œ๋‹ค๊ณ  ์ƒ๊ฐํ•ฉ๋‹ˆ๋‹ค. Josh๊ฐ€ ๋งํ•œ ๊ฒƒ์ฒ˜๋Ÿผ "์˜ˆ์™ธ์˜ ์€์œ ๊ฐ€ ๋งค๋ ฅ์ ์ด๋ผ๊ณ  โ€‹โ€‹์ƒ๊ฐํ•˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค."

@joshtriplett ์€ ๋ณธ์งˆ์ ์œผ๋กœ ๋‚ด ๊ฒฌํ•ด๋„ ์š”์•ฝํ–ˆ์Šต๋‹ˆ๋‹ค. ๋ฌธ์ œ๋Š” "์˜ˆ์™ธ"์€์œ  (๋ถ„๋ช…ํžˆ ํŒจ๋‹‰ + catch_unwind ๊ฐ€ ํ›จ์”ฌ ๋” ๋ถ„์„์ ์ž„)์™€ ์œ ํ˜• ๊ธฐ๋ฐ˜ ์ถ”๋ก ์˜ ์ ํ•ฉ์„ฑ์ž…๋‹ˆ๋‹ค. ๋ฒ”์œ„ ์ง€์ • ๋ฐ ์ œ์–ด ํ๋ฆ„ ๋ฉ”์ปค๋‹ˆ์ฆ˜์œผ๋กœ try ๋ธ”๋ก๋„ ๊ดœ์ฐฎ์ง€ ๋งŒ ๋” ๊ธ‰์ง„์  ์ธ ์š”์ ์€ ์•„๋‹™๋‹ˆ๋‹ค.

์ข‹์•„์š”, ์ถฉ๋ถ„ํžˆ ๊ณตํ‰ํ•ฉ๋‹ˆ๋‹ค. ์—ฌ๊ธฐ์„œ ์ „์ฒด ํ† ๋ก ์„ํ•˜์ง€ ์•Š๊ฒ ์Šต๋‹ˆ๋‹ค. ์ œ์•ˆ ๋œ๋Œ€๋กœ ์ƒ์ž๋ฅผ ์„ ํƒ ์ทจ์†Œํ•˜๊ณ ์ด ์Šค๋ ˆ๋“œ์— ์–ธ๊ธ‰ ๋œ ๋ช‡ ๊ฐ€์ง€ ๊ทผ๊ฑฐ๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ lang-team ํ† ๋ก ์— ๋‹ค์‹œ ๋„ฃ์œผ์‹œ๊ฒ ์Šต๋‹ˆ๊นŒ? ์•ˆ์ •ํ™”๊ฐ€ ์„œ๋‘๋ฅด์ง€ ์•Š๋Š” ํ•œ ๊ทธ๊ฒƒ์€ ํ•ฉ๋ฆฌ์ ์ด๋ผ๊ณ  ์ƒ๊ฐํ•ฉ๋‹ˆ๋‹ค.

์œ ํ˜• ์ฃผ์„์— ๋Œ€ํ•œ ๊ตฌ๋ฌธ์ด ํ•ฉ์˜ ๋˜์—ˆ์Šต๋‹ˆ๊นŒ? ๋‚˜๋Š” try { foo()?; bar()?; }.with_context(|_| failure::err_msg("foon' n' barn'")?; ๊ธฐ๋Œ€ํ•˜๊ณ  ์žˆ์—ˆ๋Š”๋ฐ, ์ด๋Š” ์ปดํŒŒ์ผ์— ์›๊ฒฉ์œผ๋กœ ๊ด€์‹ฌ์ด์—†๋Š” error[E0282]: type annotations needed .

https://play.rust-lang.org/?version=nightly&mode=debug&edition=2018&gist=4e60d44a8f960cf03307a809e1a3b5f2

๋‚˜๋Š” ์กฐ๊ธˆ ์ „์— ์ฃผ์„์„ ์ฝ์—ˆ์ง€๋งŒ (๊ทธ๋ฆฌ๊ณ  github์— 300 ๊ฐœ์˜ ์ฃผ์„์„ ๋‹ค์‹œ๋กœ๋“œํ•˜๋Š” ๊ฒƒ์€ ๋„ˆ๋ฌด ์ง€๋ฃจํ•ฉ๋‹ˆ๋‹ค), Try::Ok ๋žฉํ•‘์ด Ok ์‚ฌ์šฉํ•œ ๋…ผ์Ÿ์— ๊ด€ํ•œ ๋Œ€๋ถ€๋ถ„์˜ ์˜ˆ์ œ (๋ชจ๋‘๋Š” ์•„๋‹ˆ๋”๋ผ๋„)๋ฅผ ๊ธฐ์–ตํ•ฉ๋‹ˆ๋‹ค. ์˜ˆ์ œ์—์„œ Option Try ๋ฅผ ๊ตฌํ˜„ํ•˜๋Š” ๊ฒƒ์„ ๊ณ ๋ คํ•  ๋•Œ, ์ด๊ฒƒ์ด ํ† ๋ก ์˜ ์–ด๋Š ์ชฝ์—์„œ ํŒ€์˜ ์ž…์žฅ์— ์–ด๋–ค ์˜ํ–ฅ์„ ๋ฏธ์น˜๋Š”์ง€ ์•Œ๊ณ  ์‹ถ์Šต๋‹ˆ๋‹ค.

Rust๋ฅผ ์‚ฌ์šฉํ•  ๋•Œ๋งˆ๋‹ค "man, ๋‚˜๋Š” ์ •๋ง๋กœ ์—ฌ๊ธฐ์— try ๋ธ”๋ก์„ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ์œผ๋ฉด ์ข‹๊ฒ ๋‹ค"๋ผ๊ณ  ์ƒ๊ฐํ•˜์ง€๋งŒ, ๊ทธ ์‹œ๊ฐ„์˜ ์•ฝ 30 %๋Š” Option s์— try๋ฅผ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ๊ธฐ๋ฅผ ๋ฐ”๋ž๋‹ˆ๋‹ค. ์ €๋Š” Scala์—์„œ ์‚ฌ์šฉํ–ˆ๋Š”๋ฐ, ์ผ๋ฐ˜์ ์œผ๋กœ for ๊ตฌ๋ฌธ์„ ์‚ฌ์šฉํ•˜์—ฌ ๋ชจ๋‚˜๋“œ์— ์ ์šฉํ–ˆ์ง€๋งŒ ์—ฌ๊ธฐ์„œ๋Š” try ์™€ ๋งค์šฐ ์œ ์‚ฌํ•ฉ๋‹ˆ๋‹ค.

๋ฐ”๋กœ ์˜ค๋Š˜, ์ €๋Š” json ํฌ๋ ˆ์ดํŠธ๋ฅผ ์‚ฌ์šฉํ•˜๊ณ  ์žˆ์—ˆ๊ณ  ์˜ต์…˜์„ ๋ฐ˜ํ™˜ํ•˜๋Š” as_* ๋ฉ”์„œ๋“œ๋ฅผ ๋…ธ์ถœํ•ฉ๋‹ˆ๋‹ค.

๋‘ ๊ฐ€์ง€ ๊ตฌ๋ฌธ์„ ์‚ฌ์šฉํ•˜๋ฉด ๋‚ด ์˜ˆ๋Š” ๋‹ค์Œ๊ณผ ๊ฐ™์„ ๊ฒƒ์ž…๋‹ˆ๋‹ค.

match s {
  "^=" => |a, b| try { a.as_str()?.starts_with(b.as_str()?) }.unwrap_or(false),
  "$=" => |a, b| try { Some(a.as_str()?.ends_with(b.as_str()?)) }.unwrap_or(false),
  // original
  "$=" => |a, b| {
    a.as_str()
      .and_then(|a| b.as_str().map(|b| (a, b)))
      .map(|(a, b)| a.starts_with(b))
      .unwrap_or(false)
    },
}

๋ฌธ๋งฅ ์ƒ ๋ฐ˜ํ™˜ ์œ ํ˜•์ด Option ์ธ์ง€ Result ์ธ์ง€ ์—ฌ๋ถ€๋Š” ๋งค์šฐ ๋ช…ํ™•ํ•˜๊ณ  ์ฝ”๋“œ ์ดํ•ด๋ ฅ์ด์žˆ๋Š” ํ•œ ์‹ค์ œ๋กœ ์ค‘์š”ํ•˜์ง€ ์•Š๋‹ค๊ณ  ์ƒ๊ฐํ•ฉ๋‹ˆ๋‹ค. ํˆฌ๋ช…ํ•˜๊ฒŒ ์˜๋ฏธ๋Š” ๋ถ„๋ช…ํ•ฉ๋‹ˆ๋‹ค. "์ด ๋‘ ๊ฐ€์ง€๊ฐ€ ์œ ํšจํ•œ์ง€ ํ™•์ธํ•˜๊ณ  ์ž‘์—…์„ ์ˆ˜ํ–‰ํ•ด์•ผํ•ฉ๋‹ˆ๋‹ค." ์ด ํ•จ์ˆ˜ ์ค‘ ํ•˜๋‚˜๋ฅผ ์„ ํƒํ•ด์•ผํ•œ๋‹ค๋ฉด ์ฒซ ๋ฒˆ์งธ๋ฅผ ์„ ํƒํ•˜๊ฒ ์Šต๋‹ˆ๋‹ค. try ์ฒ˜๋Ÿผ์ด ํ•จ์ˆ˜๊ฐ€ ๋” ํฐ ์ปจํ…์ŠคํŠธ์— ํฌํ•จ๋˜์–ด ์žˆ๋‹ค๊ณ  ์ƒ๊ฐํ•  ๋•Œ ์ดํ•ด์˜ ์†์‹ค์ด ์—†๋‹ค๊ณ  ์ƒ๊ฐํ•˜๊ธฐ ๋•Œ๋ฌธ์ž…๋‹ˆ๋‹ค. ํ•ญ์ƒ.

๋‚ด๊ฐ€ ์ฒ˜์Œ์ด ๊ธ€์„๋ณด๊ธฐ ์‹œ์ž‘ํ–ˆ์„ ๋•Œ ๋‚˜๋Š” ๋ช…์‹œ์ ์ธ ๊ฒƒ์ด ๋” ๋‚ซ๊ฒ ๋‹ค๊ณ  ์ƒ๊ฐํ–ˆ๊ธฐ ๋•Œ๋ฌธ์— Ok ๋ž˜ํ•‘์— ๋ฐ˜๋Œ€ํ–ˆ์ง€๋งŒ ๊ทธ ์ดํ›„๋กœ "๋‚˜๋Š” ์—ฌ๊ธฐ์—์„œ try ๋ธ”๋ก์„ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. "๋ผ๋Š” ๊ฒฐ๋ก ์— ๋„๋‹ฌํ–ˆ์Šต๋‹ˆ๋‹ค. Ok -wrapping์ด ์ข‹์Šต๋‹ˆ๋‹ค.

๋‚˜๋Š” ์›๋ž˜ ๋งˆ์ง€๋ง‰ ๋ฌธ์žฅ์ด Try ์„ ๊ตฌํ˜„ํ•˜๋Š” ์œ ํ˜•์„ ๋ฐ˜ํ™˜ํ•˜๋Š” ํ•จ์ˆ˜ ์ธ ๊ฒฝ์šฐ Ok ๋ž˜ํ•‘์ด ๋” ๋‚ซ๋‹ค๊ณ  ์ƒ๊ฐํ–ˆ์ง€๋งŒ ๊ตฌ๋ฌธ์˜ ์ฐจ์ด๋Š” ๋‹ค์Œ๊ณผ ๊ฐ™์Šต๋‹ˆ๋‹ค.

try {
  fallible_fn()
}

try {
  fallible_fn()?
}

์ด ๊ฒฝ์šฐ ๋‹ค์‹œ Ok -wrapping์ด ๋” ๋‚ซ๋‹ค๊ณ  ์ƒ๊ฐํ•ฉ๋‹ˆ๋‹ค. fallible_fn ๊ฐ€ Try ๋ฐ˜ํ™˜ ํ•จ์ˆ˜๋ผ๋Š” ๊ฒƒ์„ ๋ถ„๋ช…ํžˆํ•˜๊ธฐ ๋•Œ๋ฌธ์— ์‹ค์ œ๋กœ๋Š” ๋” ๋ช…์‹œ ์ ์ž…๋‹ˆ๋‹ค.

๋‚˜๋Š” ์•ผ๋‹น์ด ์ด๊ฒƒ์— ๋Œ€ํ•ด ์–ด๋–ป๊ฒŒ ์ƒ๊ฐํ•˜๋Š”์ง€ ์•Œ๊ณ  ์‹ถ์Šต๋‹ˆ๋‹ค. ๊ทธ๋ฆฌ๊ณ ์ด ์Šค๋ ˆ๋“œ์—์„œ ๋งŽ์€ ๋‹ค๋ฅธ ์‚ฌ๋žŒ๋“ค์„ ๋ณผ ์ˆ˜ ์—†๊ธฐ ๋•Œ๋ฌธ์— @joshtriplett.

ํŽธ์ง‘ : ๋‚˜๋Š” ์ธ์ฒด ๊ณตํ•™ / ๋…ํ•ด ๊ด€์ ์—์„œ๋งŒ ์ด๊ฒƒ์„๋ณด๊ณ  ์žˆ๋‹ค๊ณ  ์–ธ๊ธ‰ํ•ด์•ผํ•ฉ๋‹ˆ๋‹ค. ๋” ์‰ฌ์šด ์ถ”๋ก ๊ณผ ๊ฐ™์€ ๊ตฌํ˜„ ์ธก๋ฉด์—์„œ ํ•˜๋‚˜๊ฐ€ ๋‹ค๋ฅธ ๊ฒƒ๋ณด๋‹ค ๊ธฐ์ˆ ์  ์žฅ์ ์ด ๋” ๋งŽ์€์ง€ ๋ชจ๋ฅด๊ฒ ์Šต๋‹ˆ๋‹ค.

์ค‘์ฒฉ ๋œ Option ๊ตฌ๋ฌธ ๋ถ„์„์—๋„ try ๊ธฐํšŒ๋ฅผ์ฃผ๊ณ  ์‹ถ์—ˆ์Šต๋‹ˆ๋‹ค.

#![feature(try_blocks)]

struct Config {
    log: Option<LogConfig>,
}

struct LogConfig {
    level: Option<String>,
}

fn example(config: &Config) {
    let x: &str = try { config.log?.level? }.unwrap_or("foo");
}

์ด๊ฒƒ์€ ์‹คํŒจํ•ฉ๋‹ˆ๋‹ค

error[E0282]: type annotations needed
  --> src/lib.rs:12:19
   |
12 |     let x: &str = try { config.log?.level? }.unwrap_or("foo");
   |                   ^^^^^^^^^^^^^^^^^^^^^^^^^^ cannot infer type
   |
   = note: type must be known at this point

๋‚ด๊ฐ€ ์–ป์€ ๊ฐ€์žฅ ๊ฐ€๊นŒ์šด ๊ฒƒ์€

fn example(config: &Config) {
    let x: Option<&str> = try { &**config.log.as_ref()?.level.as_ref()? };
    let x = x.unwrap_or("foo");
}

as_ref ์€ ๋งค์šฐ ์œ ๊ฐ์ž…๋‹ˆ๋‹ค. ๋‚˜๋Š” Option::deref ์ด ์—ฌ๊ธฐ์— ๋„์›€์ด ๋  ๊ฒƒ์ด๋ผ๋Š” ๊ฒƒ์„ ์•Œ๊ณ  ์žˆ์ง€๋งŒ ์ถฉ๋ถ„ํ•˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค. ์ด๊ฒƒ์€ ์–ด๋–ป๊ฒŒ ๋“  ์ธ๊ฐ„ ๊ณตํ•™ (๋˜๋Š” ๊ด€๋ จ ์•„์ด๋””์–ด)๊ณผ ์ผ์น˜ ํ•ด์•ผํ•˜๋Š” ๊ฒƒ์ฒ˜๋Ÿผ ๋Š๊ปด์ง‘๋‹ˆ๋‹ค.

์—ฌ๋Ÿฌ ์ค„๋„ ์•ˆํƒ€๊น์Šต๋‹ˆ๋‹ค.

try Result ๋Š” ์ •์ˆ˜ ๋ฆฌํ„ฐ๋Ÿด์ฒ˜๋Ÿผ @shepmaster ์˜ ์ฒซ ๋ฒˆ์งธ ์‹œ๋„๊ฐ€ Result<&str, NoneError> ์ถ”๋ก ํ•˜๋„๋ก ํ• ๊นŒ์š” ? ? s์— ๋Œ€ํ•ด ๋ณ€ํ™˜ ํ•  ๊ณตํ†ต ์˜ค๋ฅ˜ ์œ ํ˜•์„ ์ฐพ์„ ์ˆ˜์žˆ๋Š” ๋‚˜๋จธ์ง€ ๋ฌธ์ œ๋Š” ๋ฌด์—‡์ž…๋‹ˆ๊นŒ? (์–ด๋”˜๊ฐ€์— ๋Œ€ํ•œ ๋…ผ์˜๋ฅผ ๋†“์นœ ์ ์ด ์žˆ์Šต๋‹ˆ๊นŒ?)

@shepmaster ์œ ํ˜• ์ถ”๋ก ์— ๋™์˜ํ•ฉ๋‹ˆ๋‹ค. ์ถฉ๋ถ„ํžˆ ์žฌ๋ฏธ์žˆ๊ฒŒ, ๊ทธ๋Ÿฌ๋‚˜, ๋‚˜๋Š” ๋‹ค์†Œ ์ˆœ์ง„ํ•œ์œผ๋กœ ์ •ํ™•ํ•œ ์ฝ”๋“œ๋ฅผ ์‹œ๋„ try_ ๊ตฌํ˜„๊ณผ ์ž˜ ์ž‘๋™ : https://github.com/norcalli/koption_macros/blob/4362fba8fa9b6c62fdaef4df30060234381141e7/src/lib.rs#L23

    let x = try_! { config.log?.level? }.unwrap_or("foo".to_owned());
    assert_eq!(x, "debug");

์ž˜ ์ž‘๋™ํ•ฉ๋‹ˆ๋‹ค.

๋‹ค์†Œ ์ˆœ์ง„ํ•œ try_ ๊ตฌํ˜„

๋„ค,ํ•˜์ง€๋งŒ ๋งคํฌ๋กœ ํ˜ธ์ถœ์€ ๋ฐ˜ํ™˜ String ๊ฐ€ ์•„๋‹ˆ๋ผ &str , ํ•„์š” ์†Œ์œ ๊ถŒ์„. ์ฃผ๋ณ€ ์ฝ”๋“œ๋ฅผ ํ‘œ์‹œํ•˜์ง€ ์•Š์ง€๋งŒ Config ์†Œ์œ ๊ถŒ์ด ์—†๊ธฐ ๋•Œ๋ฌธ์— ์‹คํŒจํ•ฉ๋‹ˆ๋‹ค.

fn example(config: &Config) {
    let x = try_! { config.log?.level? }.unwrap_or_else(|| String::from("foo"));
}
error[E0507]: cannot move out of captured variable in an `Fn` closure
  --> src/lib.rs:20:21
   |
19 | fn example(config: &Config) {
   |            ------ captured outer variable
20 |     let x = try_! { config.log?.level? }.unwrap_or_else(|| String::from("foo"));
   |                     ^^^^^^^^^^ cannot move out of captured variable in an `Fn` closure

๋˜ํ•œ ๋ฌด์กฐ๊ฑด String ํ• ๋‹นํ•ฉ๋‹ˆ๋‹ค. ์ด ์˜ˆ์—์„œ๋Š” ๋น„ ํšจ์œจ์„ฑ์„ ํ”ผํ•˜๊ธฐ ์œ„ํ•ด unwrap_or_else ๋ฅผ ์‚ฌ์šฉํ–ˆ์Šต๋‹ˆ๋‹ค.

์ด ๊ธฐ๋Šฅ์ด async/await ๋ธ”๋ก ์ด์ „์— ์•ˆ์ •ํ™”๋˜์ง€ ์•Š์€ ๊ฒƒ์€ ์œ ๊ฐ์ž…๋‹ˆ๋‹ค. IMO๋Š” ๋” ์ผ๊ด€๋˜์—ˆ์„ ๊ฒƒ์ž…๋‹ˆ๋‹ค.

let fut = async try {
    fut1().await?;
    fut2().await?;
    Ok(())
};

try ์—†์ด ์ž‘๋™ํ•˜๋„๋ก ํ—ˆ์šฉํ•˜๋Š” ๋Œ€์‹ . ๊ทธ๋Ÿฌ๋‚˜ ๋‚˜๋Š” ๊ทธ ๋ฐฐ๊ฐ€ ํ•ญํ•ด ํ•œ ์ง€ ์˜ค๋ž˜๋˜์—ˆ๋‹ค๊ณ  ์ƒ๊ฐํ•ฉ๋‹ˆ๋‹ค.

Re : ์ž๋™ ๋ž˜ํ•‘, ์ง€๊ธˆ์€ async ๋ธ”๋ก๊ณผ ์ผ์น˜ํ•˜๋Š” ๊ฒƒ์ด ๊ฐ€๋Šฅํ•˜์ง€ ์•Š์„ ๊ฒƒ์ด๋ผ๊ณ  ์ƒ๊ฐํ•ฉ๋‹ˆ๋‹ค. async ๋ธ”๋ก์€ Future ๊ตฌํ˜„ํ•˜๋Š” ์ต๋ช… ์œ ํ˜•์œผ๋กœ ์ผ์ข…์˜ "์ž๋™ ๋ž˜ํ•‘"์„ ์ˆ˜ํ–‰ํ•ฉ๋‹ˆ๋‹ค. ๊ทธ๋Ÿฌ๋‚˜ ์ด๊ฒƒ์€ try ๋ธ”๋ก์œผ๋กœ๋Š” ๋ถˆ๊ฐ€๋Šฅํ•œ ์กฐ๊ธฐ ์ˆ˜์ต์—์„œ๋„ ๋งˆ์ฐฌ๊ฐ€์ง€์ž…๋‹ˆ๋‹ค.

๊ฐ€์ƒ์˜ async try ๋ธ”๋ก์ด ์žˆ๋‹ค๋ฉด ๋‘ ๋ฐฐ๋กœ ํ˜ผ๋ž€์Šค๋Ÿฌ์›Œ ์งˆ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ๊ฒฐ๊ณผ ๋ฅผ ์ž๋™ ๋ž˜ํ•‘ํ•ด์•ผํ•ฉ๋‹ˆ๊นŒ?

๋‚˜๋Š” ์šฐ๋ฆฌ๊ฐ€ ์ž๋™ ํฌ์žฅ ์˜๋ฏธ์—์„œ ์ผ๊ด€์„ฑ์— ๋Œ€ํ•œ ๊ธฐํšŒ๋ฅผ ์žƒ์ง€ ์•Š์•˜๋‹ค๊ณ  ์ƒ๊ฐํ•ฉ๋‹ˆ๋‹ค. ๋ชจ๋‘ async ๋ธ”๋ก ๊ธฐ๋Šฅ์„ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค ? , ๋ชจ๋‘ ์ž์‹ ์˜ ์„ค๋ช…์„œ๋ฅผ ์ˆ˜ํ–‰ํ•ด์•ผํ•ฉ๋‹ˆ๋‹ค Ok -wrapping, ๋ชจ๋‘ ์ดˆ๊ธฐ ๋ฐ ์ตœ์ข… ์ˆ˜์ต์„.

๋ฐ˜๋ฉด์— try ๋ธ”๋ก์€ ์ž๋™ Ok ๋žฉํ•‘๊ณผ ํ•จ๊ป˜ ? ๋ฅผ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ์˜ˆ ๋ฅผ ๋“ค์–ด ์กฐ๊ธฐ ๋ฐ˜ํ™˜ ๊ธฐ๋Šฅ (์•„๋งˆ๋„ ๋ ˆ์ด๋ธ” ์ค‘๋‹จ)์„ ๊ฐ€์ • ํ•˜๋Š” "์กฐ๊ธฐ ๋ฐ˜ํ™˜"์„ ํฌํ•จ ํ•ฉ๋‹ˆ๋‹ค. value . ๊ฐ€์ƒ์˜ try ํ•จ์ˆ˜ ๋Š” ์ดˆ๊ธฐ ๋ฐ ์ตœ์ข… ์ˆ˜์ต ๋ชจ๋‘์—์„œ ์ž๋™ Ok ๋žฉํ•‘์„ ์‰ฝ๊ฒŒ ์ˆ˜ํ–‰ ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

๊ฐ€์ƒ์˜ async try ๋ธ”๋ก์€ ๋‹จ์ˆœํžˆ ๋‘ ๊ฐœ์˜ auto- Ok -wrap๊ณผ auto- Future -wrap์˜ ๊ธฐ๋Šฅ์„ ๊ฒฐํ•ฉ ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. (๋‹ค๋ฅธ ๋ฐฉ๋ฒ•์€ ๊ตฌํ˜„์ด ๋ถˆ๊ฐ€๋Šฅํ•˜๋ฉฐ ์–ด์จŒ๋“  try async ๋กœ ์ž‘์„ฑ๋ฉ๋‹ˆ๋‹ค.)

๋‚ด๊ฐ€ ๋ณด๋Š” ๋ถˆ์ผ์น˜๋Š” async ๋ธ”๋ก์„ ํ•จ์ˆ˜๋กœ ๋ณ‘ํ•ฉํ–ˆ๋‹ค๋Š” ๊ฒƒ์ž…๋‹ˆ๋‹ค. (์ด๊ฒƒ์€ ๋” ์ ์€์˜ RFC์— ๋งˆ์ง€๋ง‰ ์ˆœ๊ฐ„ ๋ฐ˜๋Œ€์—์„œ ์ผ์–ด๋‚˜์ง€ ์•Š์•˜๋‹ค.)์ด ์˜๋ฏธ๊ฐ€ ์žˆ๋‹ค๋Š” ๊ฒƒ์ž…๋‹ˆ๋‹ค ๋ฌด์—‡ return ์—์„œ async ๋ธ”๋ก, ๋ธ”๋ก์„ ์ข…๋ฃŒํ•˜๋Š” ๋™์•ˆ return ์—์„œ try ๋ธ”๋ก์€ ํฌํ•จ ํ•จ์ˆ˜๋ฅผ ์ข…๋ฃŒํ•ฉ๋‹ˆ๋‹ค. ๊ทธ๋Ÿฌ๋‚˜ ์ด๊ฒƒ๋“ค์€ ์ ์–ด๋„ ๋ถ„๋ฆฌ ๋œ ์ƒํƒœ์—์„œ ์˜๋ฏธ๊ฐ€ ์žˆ์œผ๋ฉฐ, ์กฐ๊ธฐ ๋ฐ˜ํ™˜ ๋˜๋Š” ๋ ˆ์ด๋ธ” ์ค‘๋‹จ ๊ฐ’์ด์—†๋Š” async ๋ธ”๋ก์€ ์‚ฌ์šฉํ•˜๊ธฐ ํ›จ์”ฌ ๋” ์–ด๋ ค์šธ ๊ฒƒ์ž…๋‹ˆ๋‹ค.

์ด๊ฒƒ์˜ ์•ˆ์ •ํ™”๋ฅผ ๋ฉˆ์ถ”๋Š” ๊ฒƒ์ด ์žˆ์Šต๋‹ˆ๊นŒ? ์•„๋‹ˆ๋ฉด ์•„์ง ์•„๋ฌด๋„ ์‹œ๊ฐ„์„ ํ• ์• ํ•˜์ง€ ์•Š์•˜์Šต๋‹ˆ๊นŒ? ๊ทธ๋ ‡์ง€ ์•Š์œผ๋ฉด ํ•„์š”ํ•œ PR์„ ๋งŒ๋“œ๋Š” ๋ฐ ๊ด€์‹ฌ์ด ์žˆ์Šต๋‹ˆ๋‹ค ๐Ÿ™‚

2019 ๋…„ 11 ์›” 18 ์ผ ์˜ค์ „ 2:03:36 PST์— Kampfkarren [email protected]์ด ์ž‘์„ฑํ–ˆ์Šต๋‹ˆ๋‹ค.

์ด๊ฒƒ์˜ ์•ˆ์ •ํ™”๋ฅผ ๋ฉˆ์ถ”๊ฑฐ๋‚˜ ์•„๋ฌด๋„
์•„์ง ํ•  ์‹œ๊ฐ„์ด์•ผ? ํ•„์š”ํ•œ PR์„ ๋งŒ๋“œ๋Š” ๋ฐ ๊ด€์‹ฌ์ด ์žˆ์Šต๋‹ˆ๋‹ค.
๊ทธ๋ ‡์ง€ ์•Š์œผ๋ฉด ๐Ÿ™‚>
>
->
๋‹น์‹ ์ด ๋ฉ˜์…˜ ๋˜์—ˆ๊ธฐ ๋•Œ๋ฌธ์—๋ฐ›์€ ๊ฒƒ์ž…๋‹ˆ๋‹ค.>
์ด ์ด๋ฉ”์ผ์— ์ง์ ‘ ๋‹ต์žฅํ•˜๊ฑฐ๋‚˜ GitHub์—์„œ ํ™•์ธํ•˜์„ธ์š”.>
https://github.com/rust-lang/rust/issues/31436#issuecomment -554944079

์˜ˆ, ์•ˆ์ •ํ™” ์ฐจ๋‹จ์ œ๋Š” Ok-wrapping ๊ฒฐ์ •์„ ํ†ตํ•ด ์ž‘๋™ํ•ฉ๋‹ˆ๋‹ค. ์–ด๋–ป๊ฒŒ ์ž‘๋™ํ•ด์•ผํ•˜๋Š”์ง€์— ๋Œ€ํ•œ ํ•ฉ์˜๊ฐ€์žˆ์„ ๋•Œ๊นŒ์ง€ ์•ˆ์ •ํ™”๋˜์–ด์„œ๋Š” ์•ˆ๋ฉ๋‹ˆ๋‹ค.

๊ฐœ์ธ์ ์œผ๋กœ Ok-wrapping์— ๋ฐ˜๋Œ€ํ•˜์ง€๋งŒ ์‚ฌํ›„์— ์ถ”๊ฐ€ํ•˜๋Š” ๊ฒƒ์ด ์–ผ๋งˆ๋‚˜ ์–ด๋ ค์šธ ์ง€ ๊ถ๊ธˆํ•ฉ๋‹ˆ๋‹ค. no-ok-wrapping forward๋Š” ok-wrapping๊ณผ ํ˜ธํ™˜๋ฉ๋‹ˆ๊นŒ?

Result<Result<T,E>> ์˜ ๋ชจํ˜ธํ•จ๊ณผ ๊ฐ™์€ ๊นŒ๋‹ค๋กœ์šด ๊ฒฝ์šฐ๋ฅผ ์ƒ์ƒํ•  ์ˆ˜ ์žˆ์ง€๋งŒ ์ด๋Ÿฌํ•œ ๋ชจํ˜ธํ•œ ๊ฒฝ์šฐ์—๋Š” ๋žฉํ•‘ ์—†์Œ์œผ๋กœ ๋Œ์•„๊ฐˆ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ์‚ฌ์šฉ์ž๋Š” ๋ช…ํ™•ํ•˜๊ฒŒ ํ™•์ธํ•˜๊ธฐ ์œ„ํ•ด ๋ช…์‹œ ์ ์œผ๋กœ Ok-wrap ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ๊ทธ๋ ‡๊ฒŒ ๋‚˜์˜์ง€ ์•Š์€ ๊ฒƒ ๊ฐ™์Šต๋‹ˆ๋‹ค. ์ด๋Ÿฐ ์ข…๋ฅ˜์˜ ๋ชจํ˜ธํ•จ์ด ๋„ˆ๋ฌด ์ž์ฃผ ๋‚˜ํƒ€๋‚  ๊ฒƒ์œผ๋กœ ์˜ˆ์ƒํ•˜์ง€ ์•Š๊ธฐ ๋•Œ๋ฌธ์ž…๋‹ˆ๋‹ค ...

Ok ๊ฐ•์••์ด ์•„๋‹ˆ๋ผ Ok -wrapping์ด๊ธฐ ๋•Œ๋ฌธ์— ๋ชจํ˜ธํ•จ์ด ์ „ํ˜€ ์—†์–ด์•ผํ•ฉ๋‹ˆ๋‹ค. try { ...; x } ์–ป์„ ๊ฒƒ์ด๋‹ค Ok(x) ๋งŒํผ ๋ช…ํ™•ํ•˜๊ฒŒ ๊ฐ™์€ Ok({ ...; x }) .

@joshtriplett ๋ฏธํ•ด๊ฒฐ์ž…๋‹ˆ๊นŒ? ์ถ”์  ๋ฌธ์ œ์—๋Š” https://github.com/rust-lang/rust/issues/41414๋ฅผ ์ธ์šฉํ•˜์—ฌ resolve whether catch blocks should "wrap" result value ์ด ์„ ํƒ๋˜์–ด ์žˆ์Šต๋‹ˆ๋‹ค.

@rpjohnst ์ฃ„์†กํ•ฉ๋‹ˆ๋‹ค. ๋” ๋ช…ํ™•ํ•ด์•ผํ–ˆ์Šต๋‹ˆ๋‹ค. ๋‚ด ๋ง์€ Ok-wrapping์—†์ด ์ง€๊ธˆ try ์•ˆ์ •ํ™”ํ–ˆ๋‹ค๋ฉด ๋‚˜์ค‘์— ์—ญ ํ˜ธํ™˜ ์ ์œผ๋กœ ์ถ”๊ฐ€ ๋  ์ˆ˜ ์žˆ๋‹ค๊ณ  ๋ฏฟ์Šต๋‹ˆ๋‹ค.

์ฆ‰, ๋Œ€๋ถ€๋ถ„์˜ ์‚ฌ๋žŒ๋“ค์€ ์šฐ๋ฆฌ๊ฐ€ try ๋ธ”๋ก์„ ๊ฐ€์ ธ์•ผํ•œ๋‹ค๋Š” ๋ฐ ๋™์˜ํ•˜์ง€๋งŒ ๋ชจ๋“  ์‚ฌ๋žŒ์ด catch ๋˜๋Š” ok-wrapping์— ๋™์˜ํ•˜๋Š” ๊ฒƒ์€ ์•„๋‹™๋‹ˆ๋‹ค. ํ•˜์ง€๋งŒ ๋‚˜๋Š” ๊ทธ๋Ÿฌํ•œ ํ† ๋ก ์ด try ๋ฅผ ์ฐจ๋‹จํ•  ํ•„์š”๊ฐ€ ์—†๋‹ค๊ณ  ์ƒ๊ฐํ•ฉ๋‹ˆ๋‹ค ...

@Kampfkarren ๋„ค. ์œ„์˜ ๋Œ€ํ™”๋Š”์ด ๋ฌธ์ œ์˜ ์ง„ํ–‰ ์ƒํ™ฉ์„ ์ž์„ธํžˆ ์„ค๋ช…ํ•ฉ๋‹ˆ๋‹ค. ๋ชจ๋“  ์‚ฌ๋žŒ์—๊ฒŒ ์™„์ „ํžˆ์ƒ์˜ํ•˜์ง€ ์•Š๊ณ  ์กฐ๊ธฐ์— ํ™•์ธ๋˜์—ˆ์Šต๋‹ˆ๋‹ค. ํŠนํžˆ @joshtriplett ์€ ๋‹ค๋ฅธ ์‚ฌ๋žŒ๋“ค (๋‚˜ ์ž์‹ ์„ ํฌํ•จ)์ด ๊ณต์œ  ํ•œ ์šฐ๋ ค๋ฅผ ๊ฐ€์ง€๊ณ ์žˆ์—ˆ์Šต๋‹ˆ๋‹ค.

@ mark-im ์•ž์œผ๋กœ Ok-wrapping์ด ์ถ”๊ฐ€๋˜๋Š” ๊ฒƒ์„ ์ •ํ™•ํžˆ ์–ด๋–ป๊ฒŒ ๋ณด์‹ญ๋‹ˆ๊นŒ? ๋‚˜๋Š” ๊ทธ๊ฒƒ์ด ์–ด๋–ป๊ฒŒ ๋  ์ˆ˜ ์žˆ๋Š”์ง€ ์•Œ์•„ ๋‚ด๋ ค๊ณ  ๋…ธ๋ ฅํ•˜๊ณ  ์žˆ์ง€๋งŒ ๊ทธ๊ฒƒ์„ ์ž˜ ๋ณผ ์ˆ˜ ์—†์Šต๋‹ˆ๋‹ค.

๊ทธ๋ž˜์„œ ๋‚˜๋Š” ๊ทธ๊ฒƒ์ด ์ข‹์€ ์ƒ๊ฐ์ธ์ง€ ์•„๋‹Œ์ง€ ๋ชจ๋ฅด๊ฒ ๋‹ค ๊ณ  ๋งํ•˜๋ฉด์„œ ์ด๊ฒƒ์„ ์„œ๋‘์— ๋‘˜ ๊ฒƒ์ž…๋‹ˆ๋‹ค.

์šฐ๋ฆฌ๋Š” ok-wrapping์—†์ด try ๋ธ”๋ก์„ ์•ˆ์ •ํ™”์‹œํ‚ฌ ๊ฒƒ์ž…๋‹ˆ๋‹ค. ์˜ˆ๋ฅผ ๋“ค๋ฉด :

let x: Result<usize, E> = try { 3 }; // Error: expected Result, found usize
let x: Result<usize, E> = try { Ok(3) }; // Ok (no pun intended)

๋‚˜์ค‘์— Ok-wrapping์ด ์žˆ์–ด์•ผํ•œ๋‹ค๋Š” ํ•ฉ์˜์— ๋„๋‹ฌํ–ˆ๋‹ค๊ณ  ๊ฐ€์ •ํ•˜๋ฉด ์ด์ „์—๋Š” ์ž‘๋™ํ•˜์ง€ ์•Š์•˜๋˜ ์ผ๋ถ€ ์‚ฌ๋ก€๋ฅผ ํ—ˆ์šฉ ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

let x: Result<usize, E> = try { 3 }; // Ok
let x: Result<usize, E> = try { Ok(3) }; // Also Ok for backwards compat
let x: Result<Result<usize, E1>, E2> = try { Ok(3) }; // Ok(Ok(3))
let x: Result<Result<usize, E1>, E2> = try { Ok(Ok(3)) }; // Ok(Ok(3))

๋ฌธ์ œ๋Š” ์ด๊ฒƒ์ด ์ด์ „์— ์—†์—ˆ๋˜ ๋ฌด์–ธ๊ฐ€๋ฅผ ๋ชจํ˜ธํ•˜๊ฒŒ ๋งŒ๋“ค ์ˆ˜ ์žˆ๋Š”์ง€ ์—ฌ๋ถ€์ž…๋‹ˆ๋‹ค. ์˜ˆ๋ฅผ ๋“ค๋ฉด :

let x = try { Err(3) }; // If x: Result<Result<T1, usize>, usize>, then it is not clear if user meant Ok(Err(3)) or Err(3)...

๊ทธ๋ž˜๋„ Ok-wrapping์ด ์ด๋ฏธ์ด ๋ฌธ์ œ๋ฅผ ํ•ด๊ฒฐํ•ด์•ผํ• ๊นŒ์š”?

์–ด์จŒ๋“  ๋‚ด ์ง๊ฐ์€ ๊ทธ๋Ÿฐ ์ด์ƒํ•œ ์‚ฌ๊ฑด์ด ๊ทธ๋ ‡๊ฒŒ ์ž์ฃผ ๋‚˜์˜ค์ง€ ์•Š๊ธฐ ๋•Œ๋ฌธ์— ๊ทธ๋‹ค์ง€ ์ค‘์š”ํ•˜์ง€ ์•Š์„ ์ˆ˜๋„ ์žˆ๋‹ค๋Š” ๊ฒƒ์ž…๋‹ˆ๋‹ค.

๋ฐ˜ํ™˜ ๋œ ์œ ํ˜•์ด Result ๋˜๋Š” Option ๊ฒฝ์šฐ๋ฅผ ์ œ์™ธํ•˜๊ณ  Ok-wrapping์„ ์‚ฌ์šฉํ•˜๋Š” ๊ฒƒ์€ ์–ด๋–ป์Šต๋‹ˆ๊นŒ? ๋Œ€๋ถ€๋ถ„์˜ ๊ฒฝ์šฐ ๋” ๊ฐ„๋‹จํ•œ ์ฝ”๋“œ๋ฅผ ํ—ˆ์šฉํ•˜์ง€๋งŒ ํ•„์š”ํ•œ ๊ฒฝ์šฐ ์ •ํ™•ํ•œ ๊ฐ’์„ ์ง€์ •ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

// Ok-wrapped
let v: Result<i32, _> = try { 1 };

// not Ok-wrapped since the returned type is Result
let v: Result<i32, _> = try { Ok(1) };

// not Ok-wrapped since the returned type is Result
let v: Result<i32, _> = try { Err("error") };

// Ok-wrapped
let v: Option<i32> = try { 1 };

// not Ok-wrapped since the returned type is Option
let v: Option<i32> = try { Some(1) };

// not Ok-wrapped since the returned type is Option
let v: Option<i32> = try { None };

Ok -coercion ๋˜๋Š” ์–ด๋–ค ์ข…๋ฅ˜์˜ ๊ตฌ๋ฌธ ์ข…์† Ok -wrapping (์•ˆ์ •ํ™”๋ฅผ ์ง€์›ํ•˜๊ณ  ๋‚˜์ค‘์— ๋„์ž…ํ•ด์•ผํ•˜๋Š” ์ž‘์—…)์„ ์ถ”๊ฐ€ํ•˜๋Š” ๊ฒƒ์€ ๊ฐ€๋…์„ฑ์— ๋งค์šฐ ์ข‹์ง€ ์•Š์Šต๋‹ˆ๋‹ค. i.rl.o (์ผ๋ฐ˜์ ์œผ๋กœ ๊ตฌํ˜„ ๋œ ๊ฐ„๋‹จํ•œ Ok -wrapping์„ ์˜คํ•ดํ•˜๋Š” ์‚ฌ๋žŒ๋“ค์— ์˜ํ•ด)์— ๋Œ€ํ•ด ์—ฌ๋Ÿฌ ๋ฒˆ ๋ฐ˜๋Œ€ํ•˜๋Š” ์ฃผ์žฅ์ด ๊ด‘๋ฒ”์œ„ํ•˜๊ฒŒ ์ œ๊ธฐ๋˜์—ˆ์Šต๋‹ˆ๋‹ค.

๋‚˜๋Š” ๊ฐœ์ธ์ ์œผ๋กœ ๊ตฌํ˜„ ๋œ๋Œ€๋กœ Ok -wrapping์„ ๊ฐ•๋ ฅํžˆ ์„ ํ˜ธํ•˜์ง€๋งŒ, ๋žฉํ•‘์ด ์–ด๋ ค์šด ์ƒํ™ฉ์„ ์ดํ•ดํ•˜๊ฒŒ ๋งŒ๋“œ๋Š” ์–ด๋–ค ํ˜•ํƒœ์˜ ๊ฐ•์••์ด๋‚˜ ๊ตฌ๋ฌธ ์˜์กด์„ฑ์— ๋ฐ˜๋Œ€ ํ•  ๊ฒƒ์ž…๋‹ˆ๋‹ค. Ok(...) ์€ (๋Š”) ๊ฐ•์••์ ์ธ์ง€ ์•„๋‹Œ์ง€๋ฅผ ์•Œ์•„ ๋‚ด์•ผํ•˜๋Š” ๋ชจ๋“  ๊ณณ์—์„œ ๋ฐœ์ƒํ•ฉ๋‹ˆ๋‹ค.

let x = try { Err(3) }; // If x: Result<Result<T1, usize>, usize>, then it is not clear if user meant Ok(Err(3)) or Err(3)...

๊ทธ๋ž˜๋„ Ok-wrapping์ด ์ด๋ฏธ์ด ๋ฌธ์ œ๋ฅผ ํ•ด๊ฒฐํ•ด์•ผํ• ๊นŒ์š”?

์•„๋‹ˆ, ๊ทธ๊ฒƒ์€ ๋ถ„๋ช… Ok(Err(3)) , Ok -wrapping์€ ๊ตฌ๋ฌธ์ด๋‚˜ ์œ ํ˜•์— ๋…๋ฆฝ์ ์ด๋ฉฐ, ๋ธ”๋ก์˜ ์ถœ๋ ฅ์ด Try::Ok ๋ณ€ํ˜•์—์žˆ๋Š” ๋ชจ๋“  ๊ฒƒ์„ ๋ž˜ํ•‘ํ•ฉ๋‹ˆ๋‹ค.

@ mark-im ์•ˆ์ •ํ™” ํ›„ ํ•ฉ๋ฆฌ์ ์œผ๋กœ ์ด๋™ํ•  ์ˆ˜ ์žˆ๋‹ค๊ณ  ์ƒ๊ฐํ•˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค. ๋‚ด๊ฐ€ Ok-wrapping์ด๋ผ๊ณ  ์ƒ๊ฐํ•˜๋Š” ๊ฒƒ๋งŒ ํผ ๋‚˜์˜์ง€๋งŒ, ๋‹น์‹ ์ด ๊ทธ๊ฒƒ์„ ์›ํ•˜๋Š”์ง€ ์•„๋‹Œ์ง€ ์ถ”์ธกํ•˜๋ ค๊ณ  ์‹œ๋„ํ•˜๋Š” ์ผ๊ด€์„ฑ์—†๋Š” Ok-wrapping์€ ๋” ๋‚˜์  ๊ฒƒ์ž…๋‹ˆ๋‹ค.

๋‚ด ์ฝ”๋“œ๋ฒ ์ด์Šค์—์„œ ๋งŽ์€ ์„ ํƒ์  ๊ฐ’์„ ๋‹ค๋ฃจ๊ณ  ์žˆ์œผ๋ฏ€๋กœ ์˜ค๋ž˜ ์ „์— ๋งคํฌ๋กœ์™€ ๊ฐ™์€ ์ž์ฒด try ๋ธ”๋ก์„ ๋„์ž…ํ–ˆ์Šต๋‹ˆ๋‹ค. ๊ทธ๋ฆฌ๊ณ  ์ œ๊ฐ€ ์†Œ๊ฐœ ํ•  ๋•Œ Ok-wrapping์ด ์žˆ๊ฑฐ๋‚˜์—†๋Š” ๋‹ค์–‘ํ•œ ๋ณ€ํ˜•์ด ์žˆ์—ˆ๋Š”๋ฐ Ok-wrapping ๋ฒ„์ „์€ ํ›จ์”ฌ ๋” ์ธ์ฒด ๊ณตํ•™์ ์ธ ๊ฒƒ์œผ๋กœ ํŒ๋ช…๋˜์–ด ์ œ๊ฐ€ ์‚ฌ์šฉํ•˜๊ฒŒ ๋œ ์œ ์ผํ•œ ๋งคํฌ๋กœ์ž…๋‹ˆ๋‹ค.

์ž‘์—…ํ•ด์•ผ ํ•  ์„ ํƒ์  ๊ฐ’์ด ๋งŽ๊ณ  ๋Œ€๋ถ€๋ถ„ ์ˆซ์ž์ด๋ฏ€๋กœ ๋‹ค์Œ๊ณผ ๊ฐ™์€ ์ƒํ™ฉ์ด ๋งŽ์Šต๋‹ˆ๋‹ค.

let c = try { 2 * a? + b? };

Ok-wrapping์ด ์—†์œผ๋ฉด ์‹ค์ œ try ๋ธ”๋ก์„ ์‚ฌ์šฉํ•˜๋Š” ๊ฒƒ๋ณด๋‹ค ๋‚ด ์ž์‹ ์˜ ๋งคํฌ๋กœ์— ๋จธ๋ฌด๋ฅผ ์ˆ˜์žˆ์„ ์ •๋„๋กœ ์ธ์ฒด ๊ณตํ•™์ ์ด์ง€ ์•Š์Šต๋‹ˆ๋‹ค.

์ด ์ถ”์  ๋ฌธ์ œ์˜ ์œ ์„œ ๊นŠ์€ ์—ญ์‚ฌ, ? ์—ฐ์‚ฐ์ž์™€์˜ ์›๋ž˜์˜ ์œ ๊ฐ์Šค๋Ÿฌ์šด ์ถฉ๋Œ ๋ฐ Ok -wrapping ๋ฌธ์ œ์— ๋Œ€ํ•œ ์žฅ์• ๋ฌผ์„ ๊ฐ์•ˆํ•  ๋•Œ์ด ๋ฌธ์ œ๋ฅผ ์™„์ „ํžˆ ์ข…๋ฃŒํ•˜๊ณ  try ๋ณด๋‚ด๋Š” ๊ฒƒ์ด ์ข‹์Šต๋‹ˆ๋‹ค.

Ok-wrapping์ด ์—†์œผ๋ฉด ์ธ์ฒด ๊ณตํ•™์ 

๊ทธ๊ฒƒ์ด ๋„์ž… ํ•  ์ •ํ™•ํžˆ ๋น„์ธ๊ฐ„ ๊ณตํ•™์  ์š”์†Œ์— ๋Œ€ํ•ด ์ž์„ธํžˆ ์„ค๋ช…ํ•ด ์ฃผ์‹œ๊ฒ ์Šต๋‹ˆ๊นŒ?

Ok-wrapping์ด ์—†์œผ๋ฉด ์˜ˆ์ œ๋Š” ๋‹ค์Œ๊ณผ ๊ฐ™์Šต๋‹ˆ๋‹ค.

let c = try { Ok(2 * a? + b?) };

์ œ ์ƒ๊ฐ์—๋Š” ๊ฝค ์ข‹์Šต๋‹ˆ๋‹ค.

๋‚ด ๋ง์€, ์ด๋Ÿฐ ์ž‘์€ ์˜ˆ์ œ๋กœ๋Š” ๊ณผ์ž‰์ฒ˜๋Ÿผ ๋ณด์ผ ์ˆ˜ ์žˆ์ง€๋งŒ, ๋” ๋งŽ์€ ์ฝ”๋“œ๊ฐ€ try ๋ธ”๋ก์ด ๋œ ๋ฏธ์น˜๋Š” ์˜ํ–ฅ์ด ํฌํ•จ Ok(...) ์›์ธ ๋ž˜ํผ.

@CreepySkeleton ์˜ ์˜๊ฒฌ์— try ๋ธ”๋ก์ด์ด๋ฅผ ์ˆ˜ํ–‰ํ•˜์ง€ ์•Š๋Š” ๊ฒฝ์šฐ Ok -wrapping์„ ์—๋ฎฌ๋ ˆ์ดํŠธํ•˜๋Š” ๋งคํฌ๋กœ๋ฅผ ๋งŒ๋“œ๋Š” ๊ฒƒ์ด ๋งค์šฐ ์‰ฝ์Šต๋‹ˆ๋‹ค (๊ทธ๋ฆฌ๊ณ  ๋ˆ„๊ตฐ๊ฐ€๋Š” ์ด ์ž‘์€ ๋งคํฌ๋กœ์˜ ํ‘œ์ค€ ์ƒ์ž), ๊ทธ ๋ฐ˜๋Œ€๋Š” ๊ทธ๋ ‡์ง€ ์•Š์Šต๋‹ˆ๋‹ค.

Try ํŠน์„ฑ์ด ๋ถˆ์•ˆ์ •ํ•œ ๋™์•ˆ์—๋Š” ํ•ด๋‹น ๋งคํฌ๋กœ๋ฅผ ์‚ฌ์šฉํ•  ์ˆ˜ ์—†์Šต๋‹ˆ๋‹ค.

์™œ? ์–ด์จŒ๋“  ๊ทธ๊ฒƒ์ด ์•ˆ์ •๋˜๋ฉด (๊ฐ€์„ค ์ ์œผ๋กœ ๋ฉ€์ง€ ์•Š์€ ๋ฏธ๋ž˜์—) ๋งค์šฐ ๊ฐ€๋Šฅํ•  ๊ฒƒ์ž…๋‹ˆ๋‹ค.

@ Nemo157 try ๋ธ”๋ก๋„ ํ˜„์žฌ ์•ผ๊ฐ„์—๋งŒ ์žˆ์œผ๋ฉฐ, Try ์ œ๊ฑฐํ•˜๊ธฐ๋กœ ๊ฒฐ์ •ํ•œ ๋“œ๋ฌธ ๊ฒฝ์šฐ์— ์•ˆ์ •ํ™”๋˜์ง€ ์•Š์„ ๊ฐ€๋Šฅ์„ฑ์ด ๋†’์Šต๋‹ˆ๋‹ค. ์ด๋Š” Try ์ „์— ์•ˆ์ •ํ™”๋˜์ง€ ์•Š์„ ๊ฐ€๋Šฅ์„ฑ์ด ์žˆ์Œ์„ ์˜๋ฏธํ•ฉ๋‹ˆ๋‹ค. ๋”ฐ๋ผ์„œ ๋งคํฌ๋กœ๊ฐ€ ๋ถˆ๊ฐ€๋Šฅํ•˜๋‹ค๊ณ  ๋งํ•˜๋Š” ๊ฒƒ์€ ์˜๋ฏธ๊ฐ€ ์—†์Šต๋‹ˆ๋‹ค.

@KrishnaSannasi ์™œ Try ์ด ์ฐข์–ด ์งˆ ์ˆ˜ ์žˆ๋Š”์ง€ ๊ถ๊ธˆํ•ฉ๋‹ˆ๋‹ค.

@ mark-im ๊ทธ๋Ÿด ๊ฒƒ์ด๋ผ๊ณ  ์ƒ๊ฐํ•˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค. ๋‚˜๋Š” ๋‹จ์ง€ Try ๊ฐ€ ๋ธ”๋ก์„ ์‹œ๋„ํ•˜๊ธฐ ์œ„ํ•ด ์•ผ๊ฐ„์— wrt์—์žˆ๋Š” ๊ฒƒ์— ๋Œ€ํ•ด ๊ฑฑ์ •ํ•˜๋Š” ๊ฒƒ์ด ํ˜„์‹ค์ ์ธ ๋ฌธ์ œ๊ฐ€ ์•„๋‹Œ ์ด์œ ๋ฅผ ์„ค๋ช…ํ•˜๊ณ  ์žˆ์Šต๋‹ˆ๋‹ค. ์•ˆ์ •์—์„œ Try ๋ฅผ ๊ธฐ๋Œ€ํ•˜๊ณ  ์žˆ์Šต๋‹ˆ๋‹ค.

? ๊ฐ€ ์ด๋ฏธ ์•ˆ์ •ํ™”๋˜์—ˆ๊ณ  try ๋ธ”๋ก์€ ? ์™€ ๊ฐ™์€ ๋ฐฉ์‹์œผ๋กœ Result ๋ฐ Option ๋ฅผ ๋ชจ๋‘ ํฌํ•จํ•˜๋Š” ๋ช…ํ™•ํ•œ ๋””์ž์ธ์„ ๊ฐ€์ง€๊ณ  ์žˆ์Šต๋‹ˆ๋‹ค ? ์•Š์Šต๋‹ˆ๋‹ค, Try ์•ˆ์ •ํ™”์— ๋Œ€ํ•œ ์•ˆ์ •ํ™”๋ฅผ ์ฐจ๋‹จํ•  ์ด์œ ๊ฐ€ ์—†์Šต๋‹ˆ๋‹ค. ๋‚˜๋Š” ๊ทธ๊ฒƒ์„ ๋ฉด๋ฐ€ํžˆ ์ฃผ์‹œํ•˜์ง€๋Š” ์•Š์•˜์ง€๋งŒ try ๋ธ”๋ก๋ณด๋‹ค Try ์˜ ๋””์ž์ธ์— ๋Œ€ํ•œ ํ•ฉ์˜๊ฐ€ ํ›จ์”ฌ ์ ์–ด try ๋ณผ ์ˆ˜์žˆ์—ˆ์Šต๋‹ˆ๋‹ค. Try ํŠธ๋ ˆ์ด ํŠธ ( ? ) ์ „์— ๋ช‡ ๋…„ ๋™์•ˆ ์•ˆ์ •ํ™”๋ฉ๋‹ˆ๋‹ค. ๊ทธ๋ฆฌ๊ณ  ๊ฒฝ์šฐ์—๋„ Try ๋‚˜๋Š” ์ฐจ๋‹จํ•ด์•ผ ํ•  ์ด์œ  ๋ณผ ํŠน์„ฑ ํฌ๊ธฐ try ๋ธ”๋ก์€ ๋‹จ์ง€ ์ž‘์—…์œผ๋กœ ์•ˆ์ •๋˜๊ณ  Result ๋ฐ Option ์™€ ๊ฐ™์€ ? ๊ทธ๋Ÿฌ๋ฉด

(_why_์˜ ๊ฒฝ์šฐ ์•ˆ์ •ํ™” ๋œ try ๋ธ”๋ก๊ณผ ๋ถˆ์•ˆ์ •ํ•œ Try ํŠน์„ฑ์ด ์ฃผ์–ด์ง€๋ฉด ๋งคํฌ๋กœ๋ฅผ ์ž‘์„ฑํ•  ์ˆ˜ ์—†์Šต๋‹ˆ๋‹ค. ๋งคํฌ๋กœ๋Š” try { Try::from_ok($expr) } ํ™•์žฅ๋ฉ๋‹ˆ๋‹ค. ์œ ํ˜•๋ณ„ ๋งคํฌ๋กœ๋ฅผ ๋งŒ๋“ค ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. Result ๋ฐ Option ์ด์ง€๋งŒ "[...] ์—๋ฎฌ๋ ˆ์ด์…˜ํ•˜๊ธฐ ๋งค์šฐ ์‰ฌ์šด"์ ์„ ์ถฉ์กฑํ•˜์ง€ ๋ชปํ•˜๋Š” IMO).

์„ ๊ฐ์•ˆํ•  ๋•Œ ? ํŠน์ˆ˜ ๋งก์•˜๋‹ค ์•ˆ์ •์—๋„ ์ด๋ฏธ Try ํŠน์„ฑ ์•ˆ์ •์ ์œผ๋กœ ์‚ฌ์šฉํ•  ์ˆ˜ ์—†์Šต๋‹ˆ๋‹ค, ๋‚ด๊ฐ€ ๋ณผ ์ˆ˜์—†๋Š” ์ด์œ ๋Š” Try ๊ฒƒ์„ ์‹œ๋„ ๋ธ”๋ก ์ธ ์ฐจ๋‹จํ•  ์ˆ˜ ๋ถˆ์•ˆ์ • ์™œ๋ƒํ•˜๋ฉด Try ํŠน์„ฑ์ด ์ œ๊ฑฐ ๋œ ๊ฒฝ์šฐ์—๋„ ์ธ์ฒด ๊ณตํ•™์—†์ด ์•ˆ์ •๋œ ์ƒํƒœ์—์„œ ? ๋ฅผ ์ง€์›ํ•˜๋Š” Option ๋ฐ Result๊ฐ€ ์žˆ๊ธฐ ๋•Œ๋ฌธ์ž…๋‹ˆ๋‹ค.

try catch semantic์— ๋Œ€ํ•œ ๋‹ค์Œ ๊ฐœ๋…์„ ์ œ์•ˆํ•ฉ๋‹ˆ๋‹ค.

๋‹ค์Œ ์ฝ”๋“œ๋ฅผ ๊ณ ๋ คํ•˜์‹ญ์‹œ์˜ค.

union SomeFunctionMultipleError {
    err0: Error1,
    err1: Error2,
}

struct SomeFunctionFnError {
    index: u32,
    errors: SomeFunctionMultipleError,
}

fn some_function() -> Result<i32, SomeFunctionFnError> {
    if 0 == 0 {
        Ok(2)
    } else {
        Err(SomeFunctionFnError{ index: 0, errors: SomeFunctionMultipleError {err1: Error2 {id0: 0, id1: 0, id3: 0}}})
    }
}

union OtherFunctionMultipleError {
    err0: Error1,
    err1: Error2,
    err2: Error3,
}

struct OtherFunctionFnError {
    id: u32,
    errors: OtherFunctionMultipleError,
}

fn other_function() -> Result<i32, OtherFunctionFnError> {
    if 0 == 0 {
        Ok(2)
    } else {
        Err(OtherFunctionFnError {id: 0, errors: OtherFunctionMultipleError {err0: Error1 {id0: 0, id1: 0}}})
    }
}

์ด๊ฒƒ์€ Rust์˜ Zero-Overhead ์˜ˆ์™ธ์— ์˜ํ•ด ์ƒ์„ฑ ๋  ์ˆ˜์žˆ๋Š” ์ฝ”๋“œ์ž…๋‹ˆ๋‹ค.

fn some_function() -> i32 throws Error1, Error2 {
    if 0 == 0 {
        2
    } else {
        Error2 {id0: 0, id1: 0, id3: 0}.throw
    }
}

fn other_function() -> i32 throws Error1, Error2, Error3 {
    if 0 == 0 {
        2
    } else {
        Error1{id0: 0, id1: 0}.throw
    }
}

๋˜๋Š” ์ด๋Ÿฌํ•œ ์˜ค๋ฅ˜์กฐ์ฐจ๋„ ์ปดํŒŒ์ผ๋Ÿฌ์— ์˜ํ•ด ์•”์‹œ ์ ์œผ๋กœ ์ถ”๋ก  ๋  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

fn some_function(i: i32) -> i32 throws { // Implicitly throws Error1, Error2
    if i == 0 {
        2
    } else if i == 1 {
        Error1 {id0: 0, id1: 0, id3: 0}.throw
    } else {
        Error2 {id0: 0, id1: 0, id3: 0}.throw
    }
}

fn other_function(i: i32) -> i32 throws { // Implicitly throws Error1
    if i == 0 {
        2
    } else {
        Error1{id0: 0, id1: 0}.throw
    }
}

์ด๊ฒƒ์€ ๋‹ค๋ฅธ ๊ตฌ๋ฌธ ์„คํƒ•! ํ–‰๋™์€ ๊ฐ™์Šต๋‹ˆ๋‹ค !!

์•ˆ๋…•ํ•˜์„ธ์š”,

์œ„์—์žˆ๋Š” ์ œ๋กœ ์˜ค๋ฒ„ ํ—ค๋“œ ์˜ˆ์™ธ์— ๋Œ€ํ•œ ์ œ ์ œ์•ˆ์„ ๋ณด๋Š” ์‚ฌ๋žŒ์ด ์žˆ์Šต๋‹ˆ๊นŒ?

@redradist try ๋ธ”๋ก์˜ ์ฃผ์š” ํฌ์ธํŠธ ์ค‘ ํ•˜๋‚˜๋Š” ๋ชจ๋“  ๋ธ”๋ก์— ๋Œ€ํ•ด ํ•จ์ˆ˜๋ฅผ ๋งŒ๋“ค ํ•„์š”์—†์ด ํ•จ์ˆ˜ ๋‚ด๋ถ€์—์„œ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ๋‹ค๋Š” ๊ฒƒ์ž…๋‹ˆ๋‹ค. ๋‹น์‹ ์˜ ์ œ์•ˆ์€ ๋‚ด๊ฐ€ ๋ณด๋Š” ํ•œ ์—ฌ๊ธฐ์—์„œ ์™„์ „ํžˆ ๊ด€๋ จ์ด ์—†์Šต๋‹ˆ๋‹ค.

๋ฐ”๋กœ ์˜ค๋Š˜ ์ €๋Š” try ๋ธ”๋ก์ด ํ•„์š”ํ•˜๋‹ค๊ณ  ๋Š๊ผˆ์Šต๋‹ˆ๋‹ค. ? ์ž‘์—…์ด ๋งŽ์€ ํฐ ๊ธฐ๋Šฅ์ด ์žˆ์Šต๋‹ˆ๋‹ค. ์˜ค๋ฅ˜์— ์ปจํ…์ŠคํŠธ๋ฅผ ์ถ”๊ฐ€ํ•˜๊ณ  ์‹ถ์—ˆ์ง€๋งŒ ? ๋งˆ๋‹ค ๊ทธ๋ ‡๊ฒŒํ•˜๋ ค๋ฉด ์—„์ฒญ๋‚œ ์–‘์˜ ์ƒ์šฉ๊ตฌ๊ฐ€ ํ•„์š”ํ–ˆ์Šต๋‹ˆ๋‹ค. try ์˜ค๋ฅ˜๋ฅผ ํฌ์ฐฉํ•˜๊ณ  ์ปจํ…์ŠคํŠธ๋ฅผ ํ•œ๊ณณ์— ์ถ”๊ฐ€ํ•˜๋ฉด์ด๋ฅผ ๋ฐฉ์ง€ ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

Btw. ์ด ๊ฒฝ์šฐ ๋‚ด๋ถ€ ํ•จ์ˆ˜๋กœ ์ž‘์—…์„ ๋ž˜ํ•‘ํ•˜๋Š” ๊ฒƒ์€ ์–ด๋ ค์› ์„ ๊ฒƒ์ž…๋‹ˆ๋‹ค. ์ปจํ…์ŠคํŠธ์—๋Š” ๋ช…ํ™•ํ•œ ์ˆ˜๋ช…์ด ์—†๊ธฐ ๋•Œ๋ฌธ์— ์—ฌ๋Ÿฌ ํ•จ์ˆ˜๋กœ ๋‚˜๋ˆ„๋ฉด NLL์ด ๊นจ์ง‘๋‹ˆ๋‹ค.

ํ˜„์žฌ ๊ตฌํ˜„์—์„œ try ๋ธ”๋ก์€ ํ‘œํ˜„์‹์ด ์•„๋‹ˆ๋ผ๋Š” ์ ์„ ์–ธ๊ธ‰ํ•˜๊ณ  ์‹ถ์Šต๋‹ˆ๋‹ค. ์ด๊ฒƒ์ด ๊ฐ๋…์ด๋ผ๊ณ  ์ƒ๊ฐํ•˜์‹ญ์‹œ์˜ค.

ํ˜„์žฌ ๊ตฌํ˜„์—์„œ try ๋ธ”๋ก์€ ํ‘œํ˜„์‹์ด ์•„๋‹ˆ๋ผ๋Š” ์ ์„ ์–ธ๊ธ‰ํ•˜๊ณ  ์‹ถ์Šต๋‹ˆ๋‹ค. ์ด๊ฒƒ์ด ๊ฐ๋…์ด๋ผ๊ณ  ์ƒ๊ฐํ•˜์‹ญ์‹œ์˜ค.

์ž‘๋™ํ•˜์ง€ ์•Š๋Š” ์ฝ”๋“œ๋ฅผ ๊ฒŒ์‹œ ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๊นŒ? ์—ฌ๊ธฐ ํ‘œํ˜„์‹ ์ปจํ…์ŠคํŠธ์—์„œ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ( Rust Playground )

#![feature(try_blocks)]

fn main() {
    let s: Result<(), ()> = try { () };
}

๋ฌผ๋ก  ์ž…๋‹ˆ๋‹ค .

๊ทธ๋ฆฌ๊ณ  ์ด๊ฒƒ์€ try ๋ธ”๋ก์— ๋Œ€ํ•œ ์œ ํ˜• ์ถ”๋ก ์ด ์•„์ง ์™„๋ฃŒ๋˜์ง€ ์•Š์•˜ ์Œ์„ ๋ณด์—ฌ์ฃผ๋Š” ๋˜ ๋‹ค๋ฅธ ๊ฒƒ ์ž…๋‹ˆ๋‹ค. if let ๋ธ”๋ก์—์„œ๋Š” ์œ ํ˜• ์ง€์ •์ด ์ง€์›๋˜์ง€ ์•Š๊ธฐ ๋•Œ๋ฌธ์— ํŠนํžˆ ์งœ์ฆ์ด๋‚ฉ๋‹ˆ๋‹ค.

@ Nokel81 ์ด์ „ ์˜ˆ์ œ์˜ ๋ฌธ์ œ๋Š” if let $pat = $expr ํ‘œํ˜„์‹์ด ์ •๊ทœ ํ‘œํ˜„์‹ ์ปจํ…์ŠคํŠธ๊ฐ€ ์•„๋‹ˆ๋ผ ํŠน์ˆ˜ํ•œ "๋Œ€๊ด„ํ˜ธ ํ‘œํ˜„์‹ ์—†์Œ"์ปจํ…์ŠคํŠธ๋ผ๋Š” ๊ฒƒ์ž…๋‹ˆ๋‹ค. ์ด๊ฒƒ์ด struct ํ‘œํ˜„์‹๊ณผ ์–ด๋–ป๊ฒŒ ์ž‘๋™ํ•˜๋Š”์ง€์— ๋Œ€ํ•œ ์˜ˆ๋Š” struct ํ‘œํ˜„์‹ ์ด ์žˆ๋‹ค๋Š” ๊ฒƒ์ด ๊ตฌ๋ฌธ ์ ์œผ๋กœ ๋ช…ํ™•ํ•œ ์ด ์˜ˆ์ œ ์™€ ๊ทธ๋ ‡์ง€ ์•Š์€ try ๊ฐ€ ํ‘œํ˜„์‹์ด ์•„๋‹ˆ๋ผ๋Š” ๊ฒƒ์ด ์•„๋‹ˆ๋ผ ์˜ค๋ฅ˜๊ฐ€ ์ž˜๋ชป๋˜์—ˆ์Šต๋‹ˆ๋‹ค. " try ํ‘œํ˜„์‹์€ ์—ฌ๊ธฐ์—์„œ ํ—ˆ์šฉ๋˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค. ๊ด„ํ˜ธ๋กœ ๋ฌถ์–ด๋ณด์‹ญ์‹œ์˜ค"(๊ทธ๋ฆฌ๊ณ  ๋ถˆํ•„์š”ํ•œ ๊ด„ํ˜ธ์— ๋Œ€ํ•œ ์ž˜๋ชป๋œ ๊ฒฝ๊ณ ๊ฐ€ ํ‘œ์‹œ๋˜์ง€ ์•Š์Œ).

ํ›„์ž์˜ ์˜ˆ๋Š” ์‹ค์ œ๋กœ ์œ ํ˜• ์ถ”๋ก ์— ๋Œ€ํ•ด ๋ชจํ˜ธํ•ฉ๋‹ˆ๋‹ค. ์ด ๊ฒฝ์šฐ e ์˜ ์œ ํ˜•์€ _: From<usize> ์ด๋ฉฐ ๊ตฌ์ฒด์ ์ธ ์œ ํ˜•์„ ์ œ๊ณตํ•˜๊ธฐ์— ์ถฉ๋ถ„ํ•œ ์ •๋ณด๊ฐ€ ์•„๋‹™๋‹ˆ๋‹ค. ์œ ํ˜• ์ถ”๋ก ์ด ์„ฑ๊ณตํ•  ์ˆ˜ ์žˆ๋„๋ก ๊ตฌ์ฒด์ ์ธ ์œ ํ˜• ์„ try ์—๋งŒ ํ•ด๋‹น๋˜๋Š” ๋ฌธ์ œ๊ฐ€ ์•„๋‹™๋‹ˆ๋‹ค. ์ด๊ฒƒ์ด Rust์—์„œ ํƒ€์ž… ์ถ”๋ก ์ด ์ž‘๋™ํ•˜๋Š” ๋ฐฉ์‹์ž…๋‹ˆ๋‹ค.

์ด์ œ ์ฆ‰์‹œ Ok ๋กœ ์ผ์น˜์‹œํ‚ค๊ณ  Err case๋ฅผ ์‚ญ์ œํ•˜๋ ค๊ณ  ํ•˜๋ฉด ๋ฌธ์ œ๋ฅผ ํ•ด๊ฒฐํ•˜๋Š” ์‹ค์ œ ์žˆ์Šต๋‹ˆ๋‹ค .

์•„ ๊นŠ์ด ์„ค๋ช… ํ•ด์ฃผ์…”์„œ ๊ฐ์‚ฌํ•ฉ๋‹ˆ๋‹ค. ์™œ ๋‚˜์ค‘์— ์œ ํ˜• ์ถ”๋ก ์ด ๋ชจํ˜ธํ•œ ์ง€ ํ˜ผ๋ž€ ์Šค๋Ÿฝ์Šต๋‹ˆ๋‹ค. ์‹์˜ ์œ ํ˜•์ด Result<isize, usize> ์•„๋‹Œ ์ด์œ ๋Š” ๋ฌด์—‡์ž…๋‹ˆ๊นŒ?

? ์—ฐ์‚ฐ์ž๋Š” From ํŠธ๋ ˆ์ด ํŠธ๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ ์„œ๋กœ ๋‹ค๋ฅธ ์˜ค๋ฅ˜ ์œ ํ˜•๊ฐ„์— ์œ ํ˜• ๋ณ€ํ™˜์„ ์ˆ˜ํ–‰ ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ๋Œ€๋žต ๋‹ค์Œ๊ณผ ๊ฐ™์€ rust ์ฝ”๋“œ๋กœ ํ™•์žฅ๋ฉ๋‹ˆ๋‹ค ( Try ํŠธ๋ ˆ์ด ํŠธ ๋ฌด์‹œ) :

match expr {
    Ok(v) => v,
    Err(e) => return From::from(e),
}

From ํ˜ธ์ถœ์€ ์ตœ์ข… ๋ฐ˜ํ™˜ ๋œ ์‹์˜ ์œ ํ˜•์„ ์‚ฌ์šฉํ•˜์—ฌ ์ˆ˜ํ–‰ ํ•  ์˜ค๋ฅ˜ ์œ ํ˜• ๋ณ€ํ™˜์„ ๊ฒฐ์ •ํ•˜๋ฉฐ, ๊ธฐ๋ณธ์ ์œผ๋กœ ์ „๋‹ฌ ๋œ ๊ฐ’์˜ ์œ ํ˜•์œผ๋กœ ์ž๋™ ์„ค์ •๋˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค.

์ด ๋ฌธ์ œ๊ฐ€ ์ด๋ฏธ ํ•ด๊ฒฐ ๋œ ๊ฒฝ์šฐ ์‚ฌ๊ณผํ•˜์ง€๋งŒ ๋‹ค์Œ๊ณผ ๊ฐ™์€ ๊ฒƒ์ด ์ด์ƒํ•˜๊ฒŒ ๋ณด์ž…๋‹ˆ๋‹ค.

#![feature(try_blocks)]

fn main() -> Result<(), ()> {
    let result = try { // no type annotation
        Err(())?;
    };
    result.map_err(|err| err)
}

๋‹ค์Œ์œผ๋กœ ์ปดํŒŒ์ผํ•˜์ง€ ๋ชปํ–ˆ์Šต๋‹ˆ๋‹ค.

error[E0282]: type annotations needed

๊ทธ๋Ÿฌ๋‚˜:

#![feature(try_blocks)]

fn main() -> Result<(), ()> {
    let result : Result<_, _> = try { // partial type annotation
        Err(())?;
    };
    result.map_err(|err| err)
}

๊ดœ์ฐฎ๋‹ค.

Result ์˜ ํƒ€์ž… ์ธ์ž๋ฅผ ์ถ”๋ก  ํ•  ์ˆ˜ ์—†์–ด์„œ ๋ฌธ์ œ๊ฐ€๋œ๋‹ค๋ฉด ์ดํ•ดํ•  ์ˆ˜ ์žˆ๊ฒ ์ง€๋งŒ, ์œ„์™€ ๊ฐ™์ด ๊ทธ ๊ฒฐ๊ณผ๋Š” ์•„๋‹ˆ๊ณ  rustc๋Š” ์ถ”๋ก ์„ ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. try ํ‘œํ˜„์‹์€ ์ผ์ข…์˜ Result ์ด๋ฉฐ, core::ops::Try::into_result ์—์„œ ์ถ”๋ก  ํ•  ์ˆ˜ ์žˆ์–ด์•ผํ•ฉ๋‹ˆ๋‹ค.

์ƒ๊ฐ?

@nwsharp ๋Š” try / ? ์ด Try ์œ ํ˜•๋ณด๋‹ค ์ผ๋ฐ˜์ ์ด๊ธฐ ๋•Œ๋ฌธ์ž…๋‹ˆ๋‹ค. impl Try<Ok=_, Error=()> ์ธ ๋‹ค๋ฅธ ์œ ํ˜•์ด์žˆ๋Š” ๊ฒฝ์šฐ try ๋ธ”๋ก์€ Result ๋ฟ๋งŒ ์•„๋‹ˆ๋ผ ํ•ด๋‹น ์œ ํ˜•์œผ๋กœ ํ‰๊ฐ€ ๋  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. Desugared, ๊ท€ํ•˜์˜ ์˜ˆ๋Š” ๋Œ€๋žต

#![feature(try_trait, label_break_value)]

use std::ops::Try;

fn main() -> Result<(), ()> {
    let result /*: Result<_, _>*/ = 'block: {
        match Try::into_result(Err(())) {
            Ok(ok) => Try::from_ok(ok),
            Err(err) => {
                break 'block Try::from_error(From::from(err));
            }
        }
    };
    result.map_err(|err| err)
}

@ CAD97 ์„ค๋ช…ํ•ด ์ฃผ์…”์„œ ๊ฐ์‚ฌํ•ฉ๋‹ˆ๋‹ค.

์ฆ‰, try ๊ฐ€ ๋‹ค๋ฅธ Try impls๊ฐ„์— ์ผ์ข…์˜ ๋ณ€ํ™˜์„ ํšจ๊ณผ์ ์œผ๋กœ ์œ ๋ฐœํ•  ์ˆ˜์žˆ์„ ๊ฒƒ์ด๋ผ๊ณ ๋Š” ์ƒ๊ฐํ•˜์ง€ ๋ชปํ–ˆ์Šต๋‹ˆ๋‹ค.

into_result , from_ok ๋ฐ from_error ๋Œ€ํ•ด ๋™์ผํ•œ Try impl์ด ์„ ํƒ๋œ ๊ฒฝ์šฐ ํƒˆ ์ˆ˜์ˆ ์„ ๊ธฐ๋Œ€ ํ•ฉ๋‹ˆ๋‹ค.

์ œ ์ƒ๊ฐ์—๋Š” ์œ ํ˜• ์ถ”๋ก ์„ ์ˆ˜ํ–‰ ํ•  ์ˆ˜์—†๋Š” ์ธ์ฒด ๊ณตํ•™์  ์†์‹ค (ํŠนํžˆ ๋Œ€์ฒด impl Try ๋„ ์กด์žฌํ•˜์ง€ ์•Š๋Š”๋‹ค๋Š” ์ ์„ ๊ณ ๋ ค)์ด์ด ๋ณ€ํ™˜์„ ํ—ˆ์šฉํ•˜๋Š” ์ด์ ๋ณด๋‹ค ํฌ์ง€ ์•Š์Šต๋‹ˆ๋‹ค.

๋ชจํ˜ธํ•จ์„ ์ œ๊ฑฐํ•˜์—ฌ ์ถ”๋ก ์„ ํ—ˆ์šฉ ํ•˜๊ณ  ๋‹ค์Œ๊ณผ ๊ฐ™์€ ๋ฐฉ๋ฒ•์„ ํ†ตํ•ด ์ „ํ™˜์— ๋Œ€ํ•œ ์˜ตํŠธ ์ธ ๊ธฐ๋Šฅ์„ ์œ ์ง€ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

try { ... }.into()

ํ•ด๋‹นํ•˜๋Š” ๋‹ด์š” impl :

impl<T: Try, E: Into<T::Err>> From<Result<T::Ok, E>> for T {
    fn from(result: Result<T::Ok, E>) -> Self {
        match result {
            Ok(ok) => T::from_ok(ok),
            Err(err) => T::from_err(err.into()),
        }
    }
}

(์†”์งํžˆ ๋‚ด๊ฐ€ ์—ฌ๊ธฐ์— ์˜ค๋ฅ˜ ์œ ํ˜•์˜ ์ž๋™ ๋ณ€ํ™˜์„ ์˜์‹ฌ ๊ฐœ์ธ์  ์•Š์Šต๋‹ˆ๋‹คํ•˜์ง€๋งŒ ์ฐจ์ข…์— ๊ด€๊ณ„์—†์ด ๊ฐ€์ง„ ์˜๋ฏธํ•œ๋‹ค๊ณ  ๊ฐ€์ •ํ•œ๋‹ค.์ด ์›ํ–ˆ๋˜ ๊ฒฝ์šฐ, ์‚ฌ์šฉ์žํ•ด์•ผ .map_err() ์˜จ Result .)

์ผ๋ฐ˜์ ์œผ๋กœ์ด ํƒˆ๋‹น์€ "๋„ˆ๋ฌด ์˜๋ฆฌํ•˜๋‹ค"๊ณ  ์ƒ๊ฐํ•ฉ๋‹ˆ๋‹ค. ๋„ˆ๋ฌด ๋งŽ์ด ์ˆจ๊ธฐ๊ณ  ํ˜„์žฌ์˜ ์˜๋ฏธ๋Š” ์‚ฌ๋žŒ๋“ค์„ ํ˜ผ๋ž€์Šค๋Ÿฝ๊ฒŒ ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. (ํŠนํžˆ ํ˜„์žฌ ๊ตฌํ˜„์—์„œ ์ง์ ‘ ์ง€์›ํ•˜์ง€ ์•Š๋Š” ์œ ํ˜• ์ฃผ์„์„ ์š”์ฒญํ•œ๋‹ค๋Š” ์ ์„ ๊ณ ๋ คํ•˜์„ธ์š”!)

๋˜๋Š” ๋‹ด์š” impl๋กœ ๋” ๋‚˜์•„๊ฐ€๋Š” ๊ฒƒ ๊ฐ™์Šต๋‹ˆ๋‹ค.

impl <T: Try, U: Try> From<U> for T 
    where U::Ok : Into<T::Ok>, U::Err : Into<T::Err>
{
    fn from(other: U) -> Self {
        match other.into_result() {
            Ok(ok) => Self::from_ok(ok.into()),
            Err(err) => Self::from_err(err.into()),
        }
    }
}

๋˜๋Š” ๋ฌด์—‡์ด๋“ ...

์ฆ‰, try๊ฐ€ ๋‹ค๋ฅธ Try impls๊ฐ„์— ์ผ์ข…์˜ ๋ณ€ํ™˜์„ ํšจ๊ณผ์ ์œผ๋กœ ์œ ๋ฐœํ•  ์ˆ˜์žˆ์„ ๊ฒƒ์ด๋ผ๊ณ ๋Š” ์ƒ๊ฐํ•˜์ง€ ๋ชปํ–ˆ์Šต๋‹ˆ๋‹ค.

into_result , from_ok ๋ฐ from_error ๋Œ€ํ•ด ๋™์ผํ•œ Try impl์ด ์„ ํƒ๋œ ๊ฒฝ์šฐ ํƒˆ ์ˆ˜์ˆ ์„ ๊ธฐ๋Œ€ํ•ฉ๋‹ˆ๋‹ค.

์ œ ์ƒ๊ฐ์—๋Š” ์œ ํ˜• ์ถ”๋ก ์„ ์ˆ˜ํ–‰ ํ•  ์ˆ˜์—†๋Š” ์ธ์ฒด ๊ณตํ•™์  ์†์‹ค (ํŠนํžˆ ๋Œ€์ฒด impl Try ๋„ ์กด์žฌํ•˜์ง€ ์•Š๋Š”๋‹ค๋Š” ์ ์„ ๊ณ ๋ ค)์ด์ด ๋ณ€ํ™˜์„ ํ—ˆ์šฉํ•˜๋Š” ์ด์ ๋ณด๋‹ค ํฌ์ง€ ์•Š์Šต๋‹ˆ๋‹ค.

Option<T> , Result<T, E> , Poll<Result<T, E>> ๋ฐ Poll<Option<Result<T, E>> ๋„ค ๊ฐ€์ง€ ์•ˆ์ •์ ์ธ Try ์œ ํ˜•์ด ์žˆ์Šต๋‹ˆ๋‹ค.

NoneError ์€ (๋Š”) ๋ถˆ์•ˆ์ •ํ•˜๋ฏ€๋กœ Option<T> ์€ (๋Š”) Option<T> ๋ฉˆ์ถฐ ์žˆ์ง€๋งŒ NoneError ๋Š” ๋ถˆ์•ˆ์ •ํ•ฉ๋‹ˆ๋‹ค. (๋ฌธ์„œ๋Š” ๋ช…์‹œ ์ ์œผ๋กœ From<NoneError> ๋ฅผ "์˜ค๋ฅ˜ ์œ ํ˜•์— ๋Œ€ํ•ด option? ํ™œ์„ฑํ™”"๋กœ ๋ช…์‹œํ•ฉ๋‹ˆ๋‹ค.)

๊ทธ๋Ÿฌ๋‚˜ Poll impls๋Š” ์˜ค๋ฅ˜ ์œ ํ˜•์„ E ํ•ฉ๋‹ˆ๋‹ค. ์ด ๋•Œ๋ฌธ์—,์˜ "๋ชจํ•‘ ์ž…๋ ฅ" Try ์•ˆ์ •, ๋‹น์‹ ์ด ํ•  ์ˆ˜ ์žˆ๊ธฐ ๋•Œ๋ฌธ์— ? Poll<Result<T, E>> A์˜ -> Result<_, E> ์–ป์„ ์ˆ˜์žˆ๋Š” Poll<T> ๋ฐ E ์ผ€์ด์Šค๋ฅผ ์กฐ๊ธฐ์— ๋ฐ˜ํ™˜ํ•ฉ๋‹ˆ๋‹ค.

์‚ฌ์‹ค, ์ด๊ฒƒ์€ "๊ท€์—ฌ์šด"์ž‘์€ ๋„์šฐ๋ฏธ ์—๊ฒŒ ํž˜์„์ค๋‹ˆ๋‹ค.

fn lift_err<T, E>(x: Poll<Result<T, E>>) -> Result<Poll<T>, E> { Ok(x?) }

@ CAD97 ์œ ๋จธ๋Ÿฌ์Šค ํ•ด ์ฃผ์…”์„œ ๊ฐ์‚ฌํ•ฉ๋‹ˆ๋‹ค. ์ด๊ฒƒ์€ ์ดˆ๋ณด์ž์—๊ฒŒ ๊ฐ€๋ฅด์น˜๊ธฐ ๊นŒ๋‹ค๋กœ์šด ์ผ์ด๋ฉฐ ์˜ค๋ฅ˜ ๋ฉ”์‹œ์ง€ ์ธก๋ฉด์—์„œ ์ƒ๋‹นํ•œ ์‚ฌ๋ž‘์ด ํ•„์š”ํ•ฉ๋‹ˆ๋‹ค.

์—ฌ๊ธฐ์„œ ์›ํ•˜๋Š” impl Try ์˜ ์‚ฌ์–‘์ด ์ง๊ด€์ ์ด์ง€ ์•Š์€ ๋™์ž‘์„ ๋ณด์žฅ ํ•  ์ˆ˜ ์žˆ๋‹ค๊ณ  ์ƒ๊ฐ ํ–ˆ์Šต๋‹ˆ๊นŒ?

์˜ˆ๋ฅผ ๋“ค์–ด, try<T> { ... } ์•ฝ๊ฐ„์˜ ์ž์ „๊ฑฐ ํ˜๋ฆผ. ์•„๋‹ˆ๋ฉด ๊ทธ์™€ ํ•จ๊ป˜ ํ•  ์ผ์ด ๋˜ ์žˆ์Šต๋‹ˆ๊นŒ?

์—ฌ๊ธฐ์— ์•ฝ๊ฐ„ ๋” ๋งŽ์€ ์ƒ‰์ƒ์„ ์ถ”๊ฐ€ํ•˜๋ ค๋ฉด Result ๋ฌถ์Œ์— try { } ๊ฐ€ "๋‹จ์ง€" Result ์ƒ์„ฑํ•˜์ง€ ์•Š๋Š”๋‹ค๋Š” ์‚ฌ์‹ค์€ ์˜ˆ์ƒ์น˜ ๋ชปํ•œ ์ผ ์ด๋ฉฐ ๋‚˜๋ฅผ ์Šฌํ”„๊ฒŒํ•ฉ๋‹ˆ๋‹ค. . ์ด์œ  ๋Š” ์ดํ•ดํ•˜์ง€๋งŒ ๋งˆ์Œ์— ๋“ค์ง€ ์•Š์Šต๋‹ˆ๋‹ค.

์˜ˆ, "์ผ๋ฐ˜ํ™” ๋œ ์œ ํ˜• ์ง€์ •"(๊ฒ€์ƒ‰ ํ•  ์šฉ์–ด๊ฐ€ ์žˆ์Œ) ๋ฐ try ์˜ ์กฐํ•ฉ์— ๋Œ€ํ•œ ๋…ผ์˜๊ฐ€์žˆ์—ˆ์Šต๋‹ˆ๋‹ค. ๋งˆ์ง€๋ง‰์œผ๋กœ ๋“ค์—ˆ์„ ๋•Œ try: Result<_, _> { .. } ๋Š” ๊ฒฐ๊ตญ ์ž‘๋™ ํ•  ๊ณ„ํš์ด์—ˆ์Šต๋‹ˆ๋‹ค.

ํ•˜์ง€๋งŒ ๋™์˜ํ•ฉ๋‹ˆ๋‹ค : try ๋ธ”๋ก์€ ์ถœ๋ ฅ ์œ ํ˜•์ด ์ง€์ •๋˜์—ˆ๋Š”์ง€ ํ™•์ธํ•˜๊ธฐ์œ„ํ•œ ๋ช‡ ๊ฐ€์ง€ ๋Œ€์ƒ ์ง„๋‹จ์„๋ฐ›์„ ์ž๊ฒฉ์ด ์žˆ์Šต๋‹ˆ๋‹ค.

Ok -wrapping ๋ฌธ์ œ์— ๋Œ€ํ•œ ์–ธ์–ด ํŒ€์˜ ํ•ฉ์˜๋ฅผ ํ•ด๊ฒฐํ•˜๊ธฐ ์œ„ํ•ด ํŠน์ • ์ข์€ ์งˆ๋ฌธ์— ๋Œ€ํ•ด์„œ๋Š” ์ด ๋ณ„๋„์˜ ๋ฌธ์ œ ๋ฅผ ์ฐธ์กฐํ•˜์‹ญ์‹œ์˜ค.

๋Œ“๊ธ€์„ ๋‹ฌ๊ธฐ ์ „์— ํ•ด๋‹น ์Šค๋ ˆ๋“œ์˜ ์‹œ์ž‘ ๋Œ“๊ธ€์„ ์ฝ์–ด ์ฃผ์‹œ๊ธฐ ๋ฐ”๋ž๋‹ˆ๋‹ค. ํŠนํžˆ ์Šค๋ ˆ๋“œ๋Š” ํ•ด๋‹น ์งˆ๋ฌธ์— ๋Œ€ํ•œ ๊ฒƒ์ด๋ฉฐ try ๋˜๋Š” ? ๋˜๋Š” Try ์™€ ๊ด€๋ จ๋œ ๋‹ค๋ฅธ ๋ฌธ์ œ๊ฐ€ ์•„๋‹™๋‹ˆ๋‹ค.

try ๋ธ”๋ก์ด ํ•„์š”ํ•œ ์ด์œ ๋ฅผ ๋ชจ๋ฅด๊ฒ ์Šต๋‹ˆ๋‹ค. ์ด ๊ตฌ๋ฌธ

fn main() -> Result<(), ()> {
    try {
        if foo() {
            Err(())?
        }
        ()
    }
}

๋‹ค์Œ์œผ๋กœ ๋Œ€์ฒด ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

fn main() -> Result<(), ()> {
    Ok({
        if foo() {
            Err(())?
        }
        ()
    })
}

๋‘˜ ๋‹ค ๋™์ผํ•œ ์ˆ˜์˜ ๋ฌธ์ž๋ฅผ ์‚ฌ์šฉํ•˜์ง€๋งŒ ๋‘ ๋ฒˆ์งธ ๋ฌธ์ž๋Š” ์ด๋ฏธ ์•ˆ์ •์ ์ž…๋‹ˆ๋‹ค.

๊ฒฐ๊ณผ๋ฅผ ๋ณ€์ˆ˜์— ํ• ๋‹น ํ•  ๋•Œ ๊ฒฐ๊ณผ๋ฅผ ๋ฐ˜ํ™˜ํ•˜๊ธฐ ์œ„ํ•ด ๋„์šฐ๋ฏธ ํ•จ์ˆ˜๋ฅผ ๋งŒ๋“ค์–ด์•ผ ํ•จ์„ ๋‚˜ํƒ€๋‚ผ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ๊ฐ€๋Šฅํ•˜์ง€ ์•Š์€ ๊ฒฝ์šฐ ๋Œ€์‹  ํด๋กœ์ €๋ฅผ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

@dylni try ๋ธ”๋ก์€ ํ•จ์ˆ˜์˜ ์ „์ฒด ๋ณธ๋ฌธ์„ ํฌํ•จํ•˜์ง€ ์•Š์„ ๋•Œ ํŠนํžˆ ์œ ์šฉํ•ฉ๋‹ˆ๋‹ค. ์˜ค๋ฅ˜์‹œ ? ์—ฐ์‚ฐ์ž๋Š” ํ•จ์ˆ˜์—์„œ ๋ฐ˜ํ™˜ํ•˜์ง€ ์•Š๊ณ  ํ๋ฆ„ ์ œ์–ด๋ฅผ ๊ฐ€์žฅ ์•ˆ์ชฝ์˜ try ๋ธ”๋ก ๋์œผ๋กœ ์ด๋™ํ•ฉ๋‹ˆ๋‹ค.

```๋…น
fn main () / * ์—ฌ๊ธฐ์— ๊ฒฐ๊ณผ ์—†์Œ * / {
let result = try {
foo () ?. bar () ?. baz ()?
};
๊ฒฝ๊ธฐ ๊ฒฐ๊ณผ {
//โ€ฆ
}
}

@SimonSapin ๊ทธ๋ ‡๊ฒŒ ์ž์ฃผ

fn main() /* no result here */ {
    let result  = foo()
        .and_then(|x| x.bar())
        .and_then(|x| x.baz());
    match result {
        // โ€ฆ
    }
}

๋” ์žฅํ™ฉํ•˜์ง€๋งŒ ๋” ๊ฐ„๋‹จํ•œ ์†”๋ฃจ์…˜์€ ๋ฉ”์„œ๋“œ ํด๋กœ์ € ๊ตฌ๋ฌธ์ด ๋  ๊ฒƒ์ด๋ผ๊ณ  ์ƒ๊ฐํ•ฉ๋‹ˆ๋‹ค.

fn main() /* no result here */ {
    let result  = foo()
        .and_then(::bar)
        .and_then(::baz);
    match result {
        // โ€ฆ
    }
}

์œ ํ˜•์€ try ๋Œ€ํ•œ ์œ ํ˜• ์ฃผ์„์ด ํ•„์š”ํ•œ and_then ์˜ฌ๋ฐ”๋ฅด๊ฒŒ ์ถ”๋ก ๋ฉ๋‹ˆ๋‹ค. ๋‚˜๋Š” ๊ฐ„๊ฒฐํ•œ ๊ตฌ๋ฌธ์ด ๊ฐ€๋…์„ฑ์— ํ•ด๋ฅผ ๋ผ์น  ๊ฐ€์น˜๊ฐ€ ์žˆ๋‹ค๊ณ  ์ƒ๊ฐํ•˜์ง€ ์•Š์„ ์ •๋„๋กœ ๋“œ๋ฌผ๊ฒŒ ๋ฐœ์ƒํ–ˆ์Šต๋‹ˆ๋‹ค.

ํ—ˆ์šฉ ๋œ RFC์—๋Š” ๋ช‡ ๊ฐ€์ง€ ์ถ”๋ก ์ด ์žˆ์Šต๋‹ˆ๋‹ค. https://rust-lang.github.io/rfcs/0243-trait-based-exception-handling.html

์–ด์จŒ๋“  and_then ์™€ ๊ฐ™์€ ์—ฐ๊ฒฐ ๋ฉ”์„œ๋“œ๋ณด๋‹ค ? (๋ฐ .await ) ์—ฐ์‚ฐ์ž๋ฅผ ์‚ฌ์šฉํ•˜๋Š” ์ œ์–ด ํ๋ฆ„์— ๋Œ€ํ•œ ์–ธ์–ด ๊ตฌ์กฐ๋ฅผ ์„ ํ˜ธํ•˜๋Š” ์ธ์ˆ˜๋Š” ์ด๋ฏธ ๊ด‘๋ฒ”์œ„ํ•˜๊ฒŒ ๋…ผ์˜๋˜์—ˆ์Šต๋‹ˆ๋‹ค.

์–ด์จŒ๋“  and_then ์™€ ๊ฐ™์€ ์—ฐ๊ฒฐ ๋ฉ”์„œ๋“œ๋ณด๋‹ค ? (๋ฐ .await ) ์—ฐ์‚ฐ์ž๋ฅผ ์‚ฌ์šฉํ•˜๋Š” ์ œ์–ด ํ๋ฆ„์— ๋Œ€ํ•œ ์–ธ์–ด ๊ตฌ์กฐ๋ฅผ ์„ ํ˜ธํ•˜๋Š” ์ธ์ˆ˜๋Š” ์ด๋ฏธ ๊ด‘๋ฒ”์œ„ํ•˜๊ฒŒ ๋…ผ์˜๋˜์—ˆ์Šต๋‹ˆ๋‹ค.

@SimonSapin ๊ฐ์‚ฌํ•ฉ๋‹ˆ๋‹ค. ์ด๊ฒƒ๊ณผ RFC๋ฅผ ๋‹ค์‹œ ์ฝ์Œ์œผ๋กœ์จ ์ด๊ฒƒ์ด ์œ ์šฉ ํ•  ์ˆ˜ ์žˆ๋‹ค๊ณ  ํ™•์‹ ํ–ˆ์Šต๋‹ˆ๋‹ค.

์˜ค๋ฅ˜์— ์ปจํ…์ŠคํŠธ๋ฅผ ์‰ฝ๊ฒŒ ์ถ”๊ฐ€ํ•˜๊ธฐ ์œ„ํ•ด try ๋ธ”๋ก์„ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ๋‹ค๊ณ  ์ƒ๊ฐํ–ˆ์ง€๋งŒ ์ง€๊ธˆ๊นŒ์ง€๋Š” ์šด์ด ์—†์—ˆ์Šต๋‹ˆ๋‹ค.

์ž˜ ์ž‘๋™ํ•˜๋Š” ์ž‘์€ ํ•จ์ˆ˜๋ฅผ ์ž‘์„ฑํ–ˆ์Šต๋‹ˆ๋‹ค. File::open()? ๋Š” std::io::Error ์‹คํŒจํ•˜๊ณ  ๋‹ค์Œ ์ค„์€ anyhow::Error ์‹คํŒจํ•ฉ๋‹ˆ๋‹ค. ์œ ํ˜•์ด ๋‹ค๋ฅด์ง€๋งŒ ์ปดํŒŒ์ผ๋Ÿฌ๋Š” ๋‘˜ ๋‹ค Result<_, anyhow::Error> ๋กœ ๋ณ€ํ™˜ํ•˜๋Š” ๋ฐฉ๋ฒ•์„ ์•Œ์•„๋ƒ…๋‹ˆ๋‹ค.

fn tls_add_cert(config: &ClientConfig, path: impl AsRef<Path>) -> Result<(usize, usize), anyhow::Error> {
    let path = path.as_ref();
    let mut file = BufReader::new(File::open(path)?);
    Ok(config.root_store.add_pem_file(&mut file)
        .map_err(|_| anyhow!("Bad PEM file"))?)
}

์˜ค๋ฅ˜ ์ปจํ…์ŠคํŠธ๋ฅผ ์ถ”๊ฐ€ํ•˜๊ณ  ์‹ถ์—ˆ์œผ๋ฏ€๋กœ try-block์„ ์‚ฌ์šฉํ•˜๋ ค๊ณ  ์‹œ๋„ํ–ˆ์ง€๋งŒ with_context() :

fn tls_add_cert(config: &ClientConfig, path: impl AsRef<Path>) -> anyhow::Result<(usize, usize)> {
    let path = path.as_ref();
    try {
        let mut file = BufReader::new(File::open(path)?);
        Ok(config.root_store.add_pem_file(&mut file)
            .map_err(|_| anyhow!("Bad PEM file"))?)
    }
    .with_context(|| format!("Error adding certificate {}", path.display()))
}

๊ทธ๋Ÿฌ๋‚˜ ์ด์ œ ์œ ํ˜• ์ถ”๋ก ์ด ์‹คํŒจํ•ฉ๋‹ˆ๋‹ค.

error[E0282]: type annotations needed
  --> src/net.rs:29:5
   |
29 | /     try {
30 | |         let mut file = BufReader::new(File::open(path)?);
31 | |         Ok(config.root_store.add_pem_file(&mut file)
32 | |             .map_err(|_| anyhow!("Bad PEM file"))?)
33 | |     }
   | |_____^ cannot infer type
   |
   = note: type must be known at this point
   ```

I don't understand why a type annotation is needed here but not in the first case. Nor do I see any easy way to add one, as opposed to using an [IIFE](https://en.wikipedia.org/wiki/Immediately_invoked_function_expression) which does let me add an annotation:

```rust
(|| -> Result<_, anyhow::Error> {
    let domain = DNSNameRef::try_from_ascii_str(host)?;
    let tcp = TcpStream::connect(&(host, port)).await?;

    Ok(tls.connect(domain, tcp).await?)
})()
.with_context(|| format!("Error connecting to {}:{}", host, port))

๋ฟก ๋นต๋€จ

๋‹ค์‹œ,

์ด๋Š” try / ? ์ด Try ์œ ํ˜•๋ณด๋‹ค ์ผ๋ฐ˜์ ์ด๊ธฐ ๋•Œ๋ฌธ์ž…๋‹ˆ๋‹ค. [ impl Try<Ok=_, Error=anyhow::Error> ] ์ธ ๋‹ค๋ฅธ ์œ ํ˜•์ด์žˆ๋Š” ๊ฒฝ์šฐ try ๋ธ”๋ก์€ Result ๋ฟ๋งŒ ์•„๋‹ˆ๋ผ ํ•ด๋‹น ์œ ํ˜•์œผ๋กœ ํ‰๊ฐ€ ๋  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

(๋˜ํ•œ try ๋ธ”๋ก (# 70941)์—์„œ ํ›„ํ–‰ ํ‘œํ˜„์‹์„ Ok ํ•  ํ•„์š”๊ฐ€ ์—†์Šต๋‹ˆ๋‹ค.)

์ด๊ฒƒ์ด ๊ณ„์†ํ•ด์„œ ๋‚˜ํƒ€๋‚œ๋‹ค๋Š” ๊ฒƒ์€

  • ์•ˆ์ •ํ™”ํ•˜๊ธฐ ์ „์— try ๋Š” ์œ ํ˜• ์ง€์ • ( try: Result<_,_> { ๋˜๋Š” ๊ธฐํƒ€)์„ ์ง€์›ํ•˜๊ฑฐ๋‚˜์ด ๋ฌธ์ œ๋ฅผ ์™„ํ™”ํ•ด์•ผํ•ฉ๋‹ˆ๋‹ค.
  • ์ด๊ฒƒ์€ try ๋ธ”๋ก์˜ ์œ ํ˜• ์ถ”๋ก ์ด ์‹คํŒจ ํ•  ๋•Œ๋ฅผ์œ„ํ•œ ํ‘œ์  ์ง„๋‹จ์ด ํ™•์‹คํžˆ ํ•„์š”ํ•ฉ๋‹ˆ๋‹ค.
  • ๋‹ฌ๋ฆฌ ์ œํ•œ๋˜์ง€ ์•Š์€ ๊ฒฝ์šฐ try ์œ ํ˜•์„ Result<_,_> ๋Œ€์ฒดํ•˜๋Š” ๊ฒƒ์„ ๊ฐ•๋ ฅํ•˜๊ฒŒ ๊ณ ๋ คํ•ด์•ผํ•ฉ๋‹ˆ๋‹ค. ์˜ˆ, ์–ด๋ ต๊ณ  ์ง€์ •๋˜์ง€ ์•Š์•˜์œผ๋ฉฐ ์ž ์žฌ์ ์œผ๋กœ ๋ฌธ์ œ๊ฐ€์žˆ์„ ์ˆ˜ ์žˆ์ง€๋งŒ $12: Try<Ok=$5, Error=$8> ๊ฐ€ ์ถฉ๋ถ„ํžˆ ๊ตฌ์ฒด์ ์ด์ง€ ์•Š๊ธฐ ๋•Œ๋ฌธ์— ์œ ํ˜• ์ฃผ์„์ด ํ•„์š”ํ•œ try ๋ธ”๋ก์˜ 80 % ๊ฒฝ์šฐ๋ฅผ _ ํ•ด๊ฒฐํ•ฉ๋‹ˆ๋‹ค.

๋˜ํ•œ, # 70941์ด "์˜ˆ, ์šฐ๋ฆฌ๋Š” (์ผ๋ถ€ ํ˜•ํƒœ์˜) ' Try::from_ok ๋ž˜ํ•‘'์„ ์›ํ•ฉ๋‹ˆ๋‹ค" "๋กœ ํ•ด๊ฒฐํ•˜๋Š” ๊ฒƒ์ฒ˜๋Ÿผ ๋ณด์ด๋ฉฐ, try ์˜ ๊ผฌ๋ฆฌ ํ‘œํ˜„์ด์žˆ์„ ๋•Œ _also_ ํ‘œ์  ์ง„๋‹จ์„ ์›ํ•  ๊ฒƒ์ž…๋‹ˆ๋‹ค x ๊ฐ€ ์ž‘๋™ ํ•  ๋•Œ Ok(x) ๋ฐ˜ํ™˜ํ•ฉ๋‹ˆ๋‹ค.

์‹œ๋„์— ๋Œ€ํ•œ ์˜ฌ๋ฐ”๋ฅธ ํ–‰๋™์€

  • try: Result<_, _> { .. } , try as Result<> ๋“ฑ๊ณผ ๊ฐ™์€ ์ˆ˜๋™ ์ง€์ •์„ ํ—ˆ์šฉํ•˜๋„๋ก ๊ตฌ๋ฌธ์„ ํ™•์žฅํ•ฉ๋‹ˆ๋‹ค ( try: Result ๊ฐ€ ์•„๋งˆ๋„ ๊ดœ์ฐฎ๋‹ค๊ณ  ์ƒ๊ฐํ•ฉ๋‹ˆ๊นŒ? ์„ ํ˜ธํ•˜๋Š” ๊ตฌ๋ฌธ ์ธ ๊ฒƒ ๊ฐ™์Šต๋‹ˆ๋‹ค)
  • ์ปจํ…์ŠคํŠธ์—์„œ ์˜ค๋Š” "์˜ˆ์ƒ ์œ ํ˜•"์„ ๊ฒ€ํ† ํ•˜์‹ญ์‹œ์˜ค. ์กด์žฌํ•˜๋Š” ๊ฒฝ์šฐ try ์˜ ๊ฒฐ๊ณผ ์œ ํ˜•์œผ๋กœ ์„ ํ˜ธํ•˜์‹ญ์‹œ์˜ค.
  • ๊ทธ๋ ‡์ง€ ์•Š์œผ๋ฉด ๊ธฐ๋ณธ๊ฐ’์€ Result<_, _> . ์ด๊ฒƒ์€ i32 ์™€ ๊ฐ™์€ ์œ ํ˜• ์ถ”๋ก  ํด ๋ฐฑ์ด ์•„๋‹ˆ๋ฉฐ ๋” ์ผ์ฐ ๋ฐœ์ƒํ•˜์ง€๋งŒ try { }.with_context(...) ์ปดํŒŒ์ผ๊ณผ ๊ฐ™์€ ์ž‘์—…์„ ์˜๋ฏธํ•ฉ๋‹ˆ๋‹ค.

๊ทธ๋Ÿฌ๋‚˜ ์ ์–ด๋„ ์˜ค๋ฅ˜ ์œ ํ˜•์ด ์ง€์ •๋˜์ง€ ์•Š์€ ํ•œ ? ๋ฐ into ๊ฐ•์ œ ๋ณ€ํ™˜์—์„œ ์˜ค๋ฅ˜๊ฐ€ ๋ฐœ์ƒํ•  ์ˆ˜ ์žˆ๋‹ค๋Š” ์ ์ด ์šฐ๋ ค๋ฉ๋‹ˆ๋‹ค. ํŠนํžˆ try ๋ธ”๋ก์˜ ๊ฒฐ๊ณผ๋ฅผ ? ์œ„์น˜์— ์ž‘์„ฑํ•˜๋Š” ๊ฒฝ์šฐ ๋‹ค์Œ๊ณผ ๊ฐ™์Šต๋‹ˆ๋‹ค.

#![feature(try_blocks)]

use std::error::Error;
fn foo() -> Result<(), Box<dyn Error>> {
    let x: Result<_, _> = try {
        std::fs::File::open("foo")?;
    };

    x?;

    Ok(())
}

fn main() { 
}

"into"๊ฐ•์ œ๊ฐ€ ํŠธ๋ฆฌ๊ฑฐ๋˜์–ด์•ผํ•˜๋Š” ? ๋Œ€ํ•ด ๋ช…ํ™•ํ•˜์ง€ ์•Š๊ธฐ ๋•Œ๋ฌธ์— ์—ฌ์ „ํžˆ ์˜ค๋ฅ˜ ( playground )๊ฐ€ ๋ฐœ์ƒํ•ฉ๋‹ˆ๋‹ค.

์—ฌ๊ธฐ์—์„œ ๊ฐ€์žฅ ์ข‹์€ ํ•ด๊ฒฐ์ฑ…์ด ๋ฌด์—‡์ธ์ง€ ์ž˜ ๋ชจ๋ฅด๊ฒ ์ง€๋งŒ ์•„๋งˆ๋„ ์ €๋ฅผ ๊ธด์žฅํ•˜๊ฒŒ ๋งŒ๋“ค ์œ ํ˜• ์ถ”๋ก  ํด ๋ฐฑ๊ณผ ๊ด€๋ จ์ด์žˆ์„ ๊ฒƒ์ž…๋‹ˆ๋‹ค.

๋‚˜๋ฅผ ๊ธด์žฅํ•˜๊ฒŒ ๋งŒ๋“œ๋Š” ์œ ํ˜• ์ถ”๋ก  ํด ๋ฐฑ์ด ํฌํ•จ๋˜์–ด์žˆ์„ ๊ฒƒ์ž…๋‹ˆ๋‹ค.

๊ฐ€์žฅ ๊ฐ„๋‹จํ•œ ๋ฐฉ๋ฒ• : ์ฃผ์–ด์ง„ Try ๋ธ”๋ก์—์„œ ? ์˜ ๋ชจ๋“  ์‚ฌ์šฉ์— ๋™์ผํ•œ Try::Error ์œ ํ˜•์ด ํฌํ•จ ๋œ ๊ฒฝ์šฐ ํฌํ•จํ•˜๋Š” try ๋ธ”๋ก์— ํ•ด๋‹น ์˜ค๋ฅ˜ ์œ ํ˜•์„ ์‚ฌ์šฉํ•ฉ๋‹ˆ๋‹ค ( ๊ทธ๋ ‡์ง€ ์•Š์œผ๋ฉด ๋ฐ”์šด๋“œ).

"(๋‹ฌ๋ฆฌ ๋ฌถ์ด์ง€ ์•Š๋Š” ํ•œ)"๋Š” ๋ฌผ๋ก  ๋ฏธ๋ฌ˜ํ•œ ๋ฌด์„œ์šด ๋ถ€๋ถ„์ž…๋‹ˆ๋‹ค.

์ด ๊ฒŒ์‹œ๋ฌผ์— ๋„ˆ๋ฌด ๋น„ ๊ตฌ์กฐ์ ์ด์ง€ ์•Š๊ธฐ๋ฅผ ๋ฐ”๋ž๋‹ˆ๋‹ค. ๊ทธ๋Ÿฌ๋‚˜ @nikomatsakis ์˜ˆ์ œ๋ฅผ ? ๊ฐ€ ๊ฐ•์ œ ๋ณ€ํ™˜์„ ์ˆ˜ํ–‰ํ•˜์ง€ ์•Š๊ณ  try ๋ธ”๋ก ๊ฒฐ๊ณผ์˜ ์ž๋™ ๋ž˜ํ•‘์ด์—†๋Š” ๋ณ‘๋ ฌ ์„ธ๊ณ„์˜ ์˜ˆ์ œ์™€ ๋Œ€์กฐํ•˜๊ณ  ์‹ถ์—ˆ์Šต๋‹ˆ๋‹ค.

use std::error::Error;
fn foo() -> Result<(), Box<dyn Error>> {
    let x = try {
        std::fs::File::open("foo").err_convert()?;
        Ok(())
    };

    x?;

    Ok(())
}

์ด ์„ธ์ƒ์—์„œ:

  • try ๋ฒ”์œ„์™€ fn ์ž์ฒด๊ฐ€ ๊ฐ’์—†์ด ์„ฑ๊ณตํ•œ๋‹ค๋Š” ๊ฒƒ์„ ์‰ฝ๊ฒŒ ์•Œ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. Result ๋ฅผ ์ƒ์„ฑํ•˜๋ ค๊ณ  ์‹œ๋„ํ•˜์ง€ ์•Š๊ณ ๋„ ์‰ฝ๊ฒŒ ๋ณผ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.
  • ์˜ค๋ฅ˜ ๋ณ€ํ™˜์ด ๋ฐœ์ƒํ•˜๋Š” ๊ณณ์€ ๋ถ„๋ช…ํ•ฉ๋‹ˆ๋‹ค.
  • ์˜ค๋ฅ˜ ๋ณ€ํ™˜์„ x? ์‹์œผ๋กœ ์ด๋™ํ•˜์—ฌ try ๋ฒ”์œ„๋ฅผ std::fs::File ์ž‘์—…์— ๋งž๊ฒŒ ์ง€์ •ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.
  • ๋ชจ๋“  ์œ ํ˜• ํžŒํŠธ๋Š” ์œ ํ˜• ์„œ๋ช…์—์„œ ์œ ์ฐฝํ•˜๊ฒŒ ์—ฐ๊ฒฐ๋ฉ๋‹ˆ๋‹ค. ๊ธฐ๊ณ„์™€ ์ธ๊ฐ„ ๋ชจ๋‘๋ฅผ์œ„ํ•œ ๊ฒƒ์ž…๋‹ˆ๋‹ค.
  • ์‚ฌ์šฉ์ž์˜ ์œ ํ˜• ํžŒํŠธ๋Š” ์‹ค์ œ๋กœ ์˜ค๋ฅ˜๋ฅผ ๋‹ค๋ฅธ ๋…๋ฆฝ์  ์ธ ์˜ค๋ฅ˜๋กœ ์ ‘ ์œผ๋ ค๋Š” ๊ฒฝ์šฐ์—๋งŒ ํ•„์š”ํ•ฉ๋‹ˆ๋‹ค.

๋‚˜๋Š” ๊ทธ ํ‰ํ–‰ ์šฐ์ฃผ์—์„œ ๋งค์šฐ ํ–‰๋ณต ํ•  ๊ฒƒ์ž…๋‹ˆ๋‹ค.

๋‚˜๋Š” ๋‹น์‹ ์ด ๊ทธ ์˜๊ฒฌ์„ ์“ด์ฃผ์˜ ๊ธธ์„ ๊ฐ์‚ฌ ๋“œ๋ฆฌ๋ฉฐ, ๋‚œ ๋‘๋ ค์›Œ @phaylon ์˜คํžˆ๋ ค unconstructive์ž…๋‹ˆ๋‹ค. ์˜ค๋ฅ˜ ๋ณ€ํ™˜์€ ? ์ผ๋ถ€์ด๋ฉฐ ๋ณ€๊ฒฝ๋˜์ง€ ์•Š์„ ๊ฒƒ์ž…๋‹ˆ๋‹ค. ๊ทธ๋Ÿฐ ์ ์—์„œ ok-wrapping์€ ๊ธฐ๋ณธ์ ์œผ๋กœ์ด ํ† ๋ก ์˜ ๋‚˜๋จธ์ง€ ๋ถ€๋ถ„๊ณผ ์ง๊ตํ•ฉ๋‹ˆ๋‹ค.

try ํ•จ์ˆ˜ (return ๋ฐ throw ์œ ํ˜• ํฌํ•จ)๋ฅผ ๊ณ ๋ คํ•  ๊ฒฝ์šฐ try ๋ธ”๋ก์„ ์œ ์‚ฌํ•œ ๊ฒƒ์œผ๋กœ ์ง€์ •ํ•˜๋Š” ๊ตฌ๋ฌธ๋„ ๊ณ ๋ คํ•  ๊ฐ€์น˜๊ฐ€ ์žˆ์Šต๋‹ˆ๋‹ค.

์˜ˆ

try fn foo() -> u32 throw String {
  let result = try: u32 throw String {
    123
  };
  result?
}

์ด๊ฒƒ์ด ๋…ผ์˜ ๋˜์—ˆ๋‹ค๋ฉด ์ฃ„์†กํ•˜์ง€๋งŒ ์‚ฌ์šฉ์˜ ์žฅ์ ์€ ๋ฌด์—‡์ž…๋‹ˆ๊นŒ

try fn foo() -> u32 throw String { ... }

๋˜๋Š” ์ด์™€ ๋ฐ˜๋Œ€๋กœ

fn foo() -> Result<u32, String> { ... }

?
์ค‘๋ณต ๊ตฌ๋ฌธ์ฒ˜๋Ÿผ ๋ณด์ž…๋‹ˆ๋‹ค.

@gorilskij ๋‚ด๊ฐ€ ์ดํ•ดํ–ˆ๋“ฏ์ด ์ฃผ๋œ ์ด์ ์€ Ok -wrapping ์„ ์–ป๋Š” ๊ฒƒ์ž…๋‹ˆ๋‹ค. ๊ทธ๋ ‡์ง€ ์•Š์œผ๋ฉด ๋‹ค์Œ๊ณผ ๊ฐ™์ด ์ž‘์„ฑํ•ด์•ผํ•ฉ๋‹ˆ๋‹ค.

fn foo() -> Result<u32, String> {
    try {
        // function body
    }
}

์–ด๋–ค ์‚ฌ๋žŒ๋“ค์€ ์˜ˆ์™ธ ์šฉ์–ด๊ฐ€ ๊ด€๋ จ์ด ์žˆ๋‹ค๊ณ  ์ƒ๊ฐํ•˜๊ธฐ ๋•Œ๋ฌธ์— throws ์„ ์„ ํ˜ธํ•ฉ๋‹ˆ๋‹ค.

๊ฐœ์ธ์ ์œผ๋กœ ์˜ˆ์™ธ์˜ ์ถœํ˜„์—์„œ ์ตœ๋Œ€ํ•œ ๋ฉ€๋ฆฌ ๋จธ๋ฌผ๊ณ  ์‹ถ์Šต๋‹ˆ๋‹ค.

์ด๊ฒƒ์€ try fn ๋ฅผ ๋…ผ์˜ ํ•  ์Šค๋ ˆ๋“œ๊ฐ€ ์•„๋‹ˆ๋ฏ€๋กœ์ด ํƒ„์  ํŠธ๋ฅผ ๋” ์ด์ƒ ๋‹ค๋ฃจ์ง€ ๋งˆ์‹ญ์‹œ์˜ค. ์ด ์Šค๋ ˆ๋“œ๋Š” try ๋ธ”๋ก์˜ ํ—ˆ์šฉ ๋œ ๊ธฐ๋Šฅ์„์œ„ํ•œ ๊ฒƒ์ด๋ฉฐ, ์ž ์žฌ์  (๊ทธ๋ฆฌ๊ณ  ์•„์ง RFCd๊ฐ€ ์•„๋‹Œ) ๊ธฐ๋Šฅ try fn ์•„๋‹™๋‹ˆ๋‹ค.

๋ฐฉ๊ธˆ ? ๋Œ€ํ•œ ์›๋ž˜ RFC๊ฐ€ Into ๊ฐ€ ์•„๋‹Œ From Into ์‚ฌ์šฉํ•˜์—ฌ ์ œ์•ˆ๋˜์—ˆ์Œ์„ ํ™•์ธํ–ˆ์Šต๋‹ˆ๋‹ค. ๋‹ค์Œ๊ณผ ๊ฐ™์ด ์„ค๋ช…ํ•ฉ๋‹ˆ๋‹ค.

ํ˜„์žฌ RFC๋Š”์ด ๋ชฉ์ ์„ ์œ„ํ•ด std::convert::Into ํŠน์„ฑ์„ ์‚ฌ์šฉํ•ฉ๋‹ˆ๋‹ค ( From ์—์„œ ํฌ์›Œ๋”ฉํ•˜๋Š” ํฌ๊ด„์  ์ธ impl์ด ์žˆ์Œ).

์ •ํ™•ํ•œ upcasting ๋ฐฉ๋ฒ•์€ ํ•ด๊ฒฐ๋˜์ง€ ์•Š์€ ์งˆ๋ฌธ ์œผ๋กœ ๋‚จ๊ฒจ ๋‘ก๋‹ˆ๋‹ค. Into ๋Š” From ์˜ ์ง€์นจ์— ๋”ฐ๋ผ (์•„๋งˆ๋„) ์„ ํ˜ธ๋˜์—ˆ์Šต๋‹ˆ๋‹ค.

์ œ๋„ค๋ฆญ ํ•จ์ˆ˜์— ํŠน์„ฑ ๊ฒฝ๊ณ„๋ฅผ ์ง€์ •ํ•  ๋•Œ From ์‚ฌ์šฉ๋ณด๋‹ค Into ์‚ฌ์šฉ์„ ์„ ํ˜ธํ•ฉ๋‹ˆ๋‹ค. ์ด๋ ‡๊ฒŒํ•˜๋ฉด Into ๋ฅผ ์ง์ ‘ ๊ตฌํ˜„ํ•˜๋Š” ์œ ํ˜•๋„ ์ธ์ˆ˜๋กœ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

๊ทธ๋Ÿฌ๋‚˜ Try ํŠธ๋ ˆ์ด ํŠธ RFC ์—์„œ Into ๋Š” ๋” ์ด์ƒ ์–ธ๊ธ‰๋˜์ง€ ์•Š์œผ๋ฉฐ ๋Œ€์‹  From ๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ ๋ณ€ํ™˜์ด ์ˆ˜ํ–‰๋ฉ๋‹ˆ๋‹ค. ์ด๊ฒƒ์€ ? ์—์„œ๋„ ์ฝ”๋“œ๊ฐ€ ํ˜„์žฌ ์‚ฌ์šฉํ•˜๋Š” ๊ฒƒ์ž…๋‹ˆ๋‹ค.
https://github.com/rust-lang/rust/blob/b613c989594f1cbf0d4af1a7a153786cca7792c8/src/librustc_ast_lowering/expr.rs#L1232

Into ์—์„œ From ๊ฐ€๋Š” ํฌ๊ด„์  ์ธ ๊ตฌํ˜„์ด ์—†๊ธฐ ๋•Œ๋ฌธ์— ์ด๊ฒƒ์€ ๋ถˆํ–‰ํ•œ ๊ฒƒ ๊ฐ™์Šต๋‹ˆ๋‹ค. ์ฆ‰, Into ( From ๊ณผ๋Š” ๋ฐ˜๋Œ€๋กœ)๋ฅผ ๊ตฌํ˜„ํ•˜๋Š” ์˜ค๋ฅ˜๋Š” ๋ ˆ๊ฑฐ์‹œ ์ด์œ ๋กœ ์˜ค๋ฅ˜๊ฐ€ ์žˆ๊ฑฐ๋‚˜ ๋‹ค๋ฅธ ํ•„์š”๋กœ ์ธํ•ด ? (๋˜๋Š” Try ). ๋˜ํ•œ ํ‘œ์ค€ ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ์˜ ๊ถŒ์žฅ ์‚ฌํ•ญ์„ ๋”ฐ๋ฅด๋Š” ๋ชจ๋“  ๊ตฌํ˜„์—์„œ Into in bounds๋ฅผ ์‚ฌ์šฉํ•  ์ˆ˜ ์—†์Œ์„ ์˜๋ฏธํ•ฉ๋‹ˆ๋‹ค. ? . ์˜ˆ๋ฅผ ๋“ค์–ด ํ‘œ์ค€ ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ๋Š” ๋‹ค์Œ๊ณผ ๊ฐ™์ด ์ž‘์„ฑํ•˜๋„๋ก ๊ถŒ์žฅํ•ฉ๋‹ˆ๋‹ค.

fn with_user_err<E>(op: impl Fn() -> Result<(), E>) -> Result<(), MyError>
where E: Into<MyError>

ํ•˜์ง€๋งŒ ๊ทธ๋ ‡๊ฒŒํ•˜๋ฉด ํ•จ์ˆ˜ ๋ณธ๋ฌธ์— ? ๋ฅผ ์‚ฌ์šฉํ•  ์ˆ˜ ์—†์Šต๋‹ˆ๋‹ค. ๊ทธ๋ ‡๊ฒŒํ•˜๋ ค๋ฉด ๊ธ€์„ ์จ์•ผํ•ฉ๋‹ˆ๋‹ค

fn with_user_err<E>(op: impl Fn() -> Result<(), E>) -> Result<(), MyError>
where MyError: From<E>

ํ•˜์ง€๋งŒ ๊ทธ๋ ‡๊ฒŒํ•˜๋ฉด From ๋Œ€์‹  Into ๋ฅผ ๊ตฌํ˜„ํ•˜๋Š” ์˜ค๋ฅ˜ ์œ ํ˜•์„ ๊ฐ€์ง„ ์‚ฌ์šฉ์ž๋Š”์ด ํ•จ์ˆ˜๋ฅผ ์‚ฌ์šฉํ•  ์ˆ˜ ์—†์Šต๋‹ˆ๋‹ค. ์—ญ ์ธํ•ด์˜ ๋‹ด์š” IMPL์—, ์‚ฌ์‹ค์ด ์•„๋‹ˆ๋‹ค๋Š” ๊ฒƒ์„ ์ฃผ Into ์— ๋”ฐ๋ผ From .

์ง€๊ธˆ ? ๋ฅผ ๊ณ ์น˜๊ธฐ์—๋Š” (?) ๋„ˆ๋ฌด ๋Šฆ์—ˆ์„ ๊ฒƒ์ž…๋‹ˆ๋‹ค (์•„๋งˆ๋„ _ ๋งค์šฐ _ ์•ˆํƒ€๊น๊ฒŒ๋„ โ€“ ์•„๋งˆ๋„ ๋‹ค์Œ ๋ฒ„์ „์—์„œ?).ํ•˜์ง€๋งŒ ์ ์–ด๋„ Try ์—์„œ ๊ทธ ๊ฒฝ๋กœ๋ฅผ ๋” ๊นŠ์ด ํŒŒํ—ค ์น˜์ง€ ์•Š๋„๋กํ•ด์•ผํ•ฉ๋‹ˆ๋‹ค.

๋ฐœ desugaring ๋ฐ”๊พธ๋ ค๊ณ  @cuviper @jonhoo From ์— Into ์˜ # 60796์„ # 38751์„ ํ™•์ธ ์ •ํ™•ํžˆ ์ธํ•ด์˜ ์ถ”๋ก  ํŒŒ์† ๋‹ค๋Ÿ‰ ์ดˆ๋ž˜ํ•˜๋Š” From -> Into ๋‹ด์š” impl๋กœ ์ธํ•ด rustc๊ฐ€ ์ผ๋ฐ˜์ ์ธ ์‹ ์› ๋ณ€ํ™˜ ์‚ฌ๋ก€๋ฅผ ์ฒ˜๋ฆฌํ•˜๊ธฐ๊ฐ€ ๋” ์–ด๋ ค์›Œ์กŒ์Šต๋‹ˆ๋‹ค. ์ถ”๋ก  ๋น„์šฉ์„ ๊นŽ์„๋งŒํ•œ ๊ฐ€์น˜๊ฐ€ ์—†๋‹ค๊ณ  ๊ฒฐ์ •๋˜์—ˆ์Šต๋‹ˆ๋‹ค.

@jonhoo ๋‹น์‹ ์€ ๋˜ํ•œ niko์˜ ์œ ์ตํ•œ ์ฝ”๋ฉ˜ํŠธ๋ฅผ ์ฐพ์„ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค :

ํŠน์„ฑ ์‹œ์Šคํ…œ์—๋Š” ํ•˜๋“œ ์ฝ”๋”ฉ ๋œ ์ œํ•œ๋„ ์žˆ์Šต๋‹ˆ๋‹ค. ?X: Into<ReturnType> ์™€ ๊ฐ™์€ ๋ชฉํ‘œ๋ฅผ ํ•ด๊ฒฐํ•ด์•ผํ•˜๋Š” ๊ฒฝ์šฐ์—๋Š” ํ•ด๊ฒฐํ•˜์ง€ ๋ชปํ•˜์ง€๋งŒ ReturnType: From<?X> ์™€ ๊ฐ™์€ ๋ชฉํ‘œ๋ฅผ ํ•ด๊ฒฐํ•ด์•ผํ•˜๋Š” ๊ฒฝ์šฐ ์ž ์žฌ์ ์œผ๋กœ ์„ฑ๊ณตํ•˜๊ณ  ?X ์˜ ๊ฐ’์„ ์ถ”๋ก ํ•ฉ๋‹ˆ๋‹ค.

ํŽธ์ง‘ : ์—ฌ๊ธฐ์„œ ?X ๋Š” ์•Œ๋ ค์ง€์ง€ ์•Š์€ ์ถ”๋ก  ๋ณ€์ˆ˜๋ฅผ ๋‚˜ํƒ€๋ƒ…๋‹ˆ๋‹ค. ์˜ค๋Š˜๋‚ ์˜ ํŠธ๋ ˆ์ด ํŠธ ์‹œ์Šคํ…œ์—์„œ ํ•˜๋“œ ์ฝ”๋”ฉ ๋œ ํ•œ๊ณ„๋Š” Self ์œ ํ˜•์ด ์šฐ๋ฆฌ๊ฐ€ ํ•ด๋‹น ์˜ต์…˜์„ ํƒ์ƒ‰ํ•˜๊ธฐ ์œ„ํ•ด ์ ์–ด๋„ ๋ถ€๋ถ„์ ์œผ๋กœ ์œ ์ถ”๋˜์–ด์•ผํ•œ๋‹ค๋Š” ๊ฒƒ์ž…๋‹ˆ๋‹ค.

TL; DR์€ Into ๋กœ ์ถ”๋ก ํ•˜๋Š” ๊ฒƒ์ด ๋” ์–ด๋ ต๊ณ  ํŠน์„ฑ ์†”๋ฒ„๊ฐ€ ์ž‘๋™ํ•˜๋Š” ๋ฐฉ์‹์— ๋‚ด์žฌ์  ์ธ ๋ฐฉ์‹์œผ๋กœ ์ ์šฉ๋œ๋‹ค๋Š” ๊ฒƒ์ž…๋‹ˆ๋‹ค.

@KrishnaSannasi @ CAD97 ๊ฐ์‚ฌํ•ฉ๋‹ˆ๋‹ค, ๋„์›€์ด๋˜์—ˆ์Šต๋‹ˆ๋‹ค! Into ์˜ ๊ตฌํ˜„์ž๋ฅผ ์˜๊ตฌ์ ์œผ๋กœ ๋‚จ๊ฒจ๋‘๊ธฐ ๋•Œ๋ฌธ์— From ๊ธฐ๋ฐ˜์œผ๋กœํ•˜๋Š” ๋„ˆ๋ฌด ๋งŽ์€ ์•ˆ์ •ํ™”์— ๋Œ€ํ•ด ์—ฌ์ „ํžˆ ๊ฑฑ์ •ํ•ฉ๋‹ˆ๋‹ค. ์—ฌ๊ธฐ์„œ ์ถ”๋ก ์ด ๊ฒฐ๊ตญ ๋” ๋‚˜์•„์งˆ ๊ฒƒ์ด๋ผ๋Š” ๊ธฐ๋Œ€๊ฐ€ ์žˆ์Šต๋‹ˆ๊นŒ? Into ์ธ๋ฐ”์šด๋“œ๋ฅผ ์„ ํ˜ธํ•˜๋Š” ์ง€์นจ์„ ๋ณ€๊ฒฝํ•ด์•ผํ•ฉ๋‹ˆ๊นŒ? 1.41์˜ ์ƒˆ๋กœ์šด ํŠน์„ฑ ์ผ๊ด€์„ฑ ๊ทœ์น™ (๋‚ด ์ƒ๊ฐ ์—”)์ด ๋” ์ด์ƒ Into ๋งŒ ๊ตฌํ˜„ํ•  ์ด์œ ๊ฐ€ ์—†์œผ๋ฉฐ ๋ชจ๋“  impls ๋ฒ„๊ทธ๋ฅผ ๊ณ ๋ คํ•  ๊ฒƒ์ด๋ผ๊ณ  ์˜ˆ์ƒํ•˜๊ณ  ์žˆ์Šต๋‹ˆ๊นŒ?

์ถ”๋ก ์ด ์ถฉ๋ถ„ํ•˜๋‹ค๋ฉด ๋‚˜์ค‘์— Into ๋กœ ๋ณ€๊ฒฝํ•˜๊ธฐ ์œ„ํ•ด ์ˆœ๋ฐฉํ–ฅ ํ˜ธํ™˜์ด ๊ฐ€๋Šฅํ•ด์•ผํ•ฉ๋‹ˆ๋‹ค. From Into ์˜๋ฏธํ•œ๋‹ค๋Š” ์ ์„ ๊ฐ์•ˆํ•  ๋•Œ ์šฐ๋ฆฌ๊ฐ€ ๊นจ๋œจ๋ฆด ์ˆ˜์žˆ๋Š” ์ตœ์•…์˜ ์ƒํ™ฉ์€ ์ถ”๋ก ์ž…๋‹ˆ๋‹ค.

์ด ( Try ํŠธ๋ ˆ์ด ํŠธ) ? ํŠธ๋ ˆ์ด ํŠธ์™€ Into / From ํŠธ๋ ˆ์ด ํŠธ๋ฅผ Try ๋ฅผ ๊ตฌํ˜„ํ•˜๋Š” ์œ ํ˜•์— ๋Œ€ํ•œ ์ผ๋ฐ˜ ๊ฒฝ๊ณ„์™€ ํ•จ๊ป˜ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ๋„๋ก ํ—ˆ์šฉํ•ฉ๋‹ˆ๊นŒ? Result ์ž์ฒด)?

์ฆ‰, ? ํ์‡„ ๋˜๋Š” ํ•จ์ˆ˜์—์žˆ๋Š” ๋ฐ˜ํ™˜ ์˜ˆ๋ฅผ ๋“ค์–ด impl Into<Result>

(์ €๋…์— ํ•ด๋ณด๋ฉด ์•ˆ๋˜๋Š” ๊ฒƒ ๊ฐ™๋‚˜์š”?)

๋‚˜๋Š” ์ด๊ฒƒ์ด ์•ˆ์ •ํ™”๋˜๋Š” ๊ฒƒ์„๋ณด๊ณ  ์‹ถ๋‹ค. ์ด ์Šค๋ ˆ๋“œ์™€ # 70941์„ ์ฝ์€ ํ›„ ์š”์•ฝ์ด ๋‹ค์Œ๊ณผ ๊ฐ™์ด ์—…๋ฐ์ดํŠธ๋˜์–ด์•ผํ•œ๋‹ค๊ณ  ์ƒ๊ฐํ•ฉ๋‹ˆ๋‹ค.

  1. ๋žฉ "๊ฒฐ๊ณผ ๊ฐ’"์œผ๋กœ ์ณค๋‹คํ•ด์•ผํ•œ๋‹ค "catch ๋ธ”๋ก์„ํ• ์ง€ ์—ฌ๋ถ€๋ฅผ ๊ฒฐ์˜๋Š”" "์˜ˆ๋กœ ํ•ด๊ฒฐ"

  2. ์ด๋Ÿฌํ•œ ์ถ”๋ก  ๋ฌธ์ œ์— ๋Œ€ํ•œ ์ƒˆ๋กœ์šด ์šฐ๋ ค๊ฐ€ ์ถ”๊ฐ€๋˜์—ˆ์Šต๋‹ˆ๋‹ค. ์•„๋งˆ๋„ ๋‹ค์Œ๊ณผ ๊ฐ™์Šต๋‹ˆ๋‹ค.

    • [] ์œ ํ˜• ์ถ”๋ก  ๋ฌธ์ œ๋กœ ์ธํ•œ ์ธ์ฒด ๊ณตํ•™์  ์–ด๋ ค์›€.

ISTM์€ ๋‹ค์Œ๊ณผ ๊ฐ™์€ ๋ฐฉ๋ฒ•์œผ๋กœ์ด ๋งˆ์ง€๋ง‰ ๋ฌธ์ œ๋ฅผ ํ•ด๊ฒฐํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

  • ์•ˆ์ •ํ™” ์ „์— try ๋งž์ถคํ˜• ์œ ํ˜• ์•”ํ˜ธํ™” ๊ตฌ๋ฌธ์„ ์ถ”๊ฐ€ํ•ฉ๋‹ˆ๋‹ค.
  • https://github.com/rust-lang/rfcs/pull/803 # 23416 (Type ascription)์ด์ด ๋ฌธ์ œ๋ฅผ ํ•ด๊ฒฐํ•˜๊ณ  ๋จผ์ € ์•ˆ์ •ํ™”๋˜์–ด์•ผํ•œ๋‹ค๊ณ  ๊ฒฐ์ •ํ•ฉ๋‹ˆ๋‹ค.
  • ์ผ์ข…์˜ ์ž๋™ ํด๋ฐฑ์„ ์ถ”๊ฐ€ํ•ฉ๋‹ˆ๋‹ค (์˜ˆ : https://github.com/rust-lang/rust/issues/31436#issuecomment -614735806์— ์ œ์•ˆ ๋œ๋Œ€๋กœ Result ์— ์ถ”๊ฐ€)
  • try ๊ทธ๋Œ€๋กœ ์•ˆ์ •ํ™”ํ•˜๊ธฐ๋กœ ๊ฒฐ์ •ํ•˜๊ณ  ํ–ฅํ›„ ๊ฐœ์„ ์„์œ„ํ•œ ๊ตฌ๋ฌธ / ์˜๋ฏธ ์  ๊ณต๊ฐ„์„ ๋‚จ๊ฒจ ๋‘ก๋‹ˆ๋‹ค.

(์ด๋Ÿฌํ•œ ์˜ต์…˜ ์ค‘ ์ผ๋ถ€๋Š” ์ƒํ˜ธ ๋ฐฐํƒ€์ ์ด์ง€ ์•Š์Šต๋‹ˆ๋‹ค.)

๊ด€์‹ฌ์„ ๊ฐ€์ ธ ์ฃผ์…”์„œ ๊ฐ์‚ฌ ๋“œ๋ฆฌ๋ฉฐ์ด ๋ฉ”์‹œ์ง€๊ฐ€ ๋„์›€์ด ๋˜์—ˆ๊ธฐ๋ฅผ ๋ฐ”๋ž๋‹ˆ๋‹ค.

Type ascription์—๋Š” ๋งŽ์€ ๋ฌธ์ œ (๊ตฌ๋ฌธ ๋ฐ ๊ธฐํƒ€)๊ฐ€ ์žˆ์œผ๋ฉฐ ์•ˆ์ •ํ™”๋Š” ๋งํ•  ๊ฒƒ๋„์—†๊ณ  ๊ณง ๊ตฌํ˜„ ๋  ๊ฒƒ ๊ฐ™์ง€ ์•Š์Šต๋‹ˆ๋‹ค. ์œ ํ˜• ์ง€์ • ๊ตฌ๋ฌธ์—์„œ try ๋ธ”๋ก์„ ์ฐจ๋‹จํ•˜๋Š” ๊ฒƒ์€ ์ ์ ˆํ•˜์ง€ ์•Š์€ ๊ฒƒ ๊ฐ™์Šต๋‹ˆ๋‹ค.

Result ๋กœ์˜ ํด๋ฐฑ์€ ๋„์›€์ด ๋  ์ˆ˜ ์žˆ์ง€๋งŒ ์˜ค๋ฅ˜ ์œ ํ˜•์˜ ์œ ํ˜• ์œ ์ถ” ๋ฌธ์ œ๋ฅผ ํ•ด๊ฒฐํ•˜์ง€ ๋ชปํ•ฉ๋‹ˆ๋‹ค. try { expr? }? (๋˜๋Š” ์‹ค์ œ๋กœ ๋” ๋ณต์žกํ•œ ๋“ฑ๊ฐ€๋ฌผ)์—๋Š” .into() ๋‘ ๋ฒˆ์˜ ํ˜ธ์ถœ์ด ์žˆ์Šต๋‹ˆ๋‹ค. , ์ปดํŒŒ์ผ๋Ÿฌ๊ฐ€ ์ค‘๊ฐ„ ์œ ํ˜•์— ๋„ˆ๋ฌด ๋งŽ์€ ์œ ์—ฐ์„ฑ์„ ์ œ๊ณตํ•ฉ๋‹ˆ๋‹ค.

@ijackson ์€ ์ฃผ๋„๊ถŒ์„ ๊ฐ€์ง€๊ณ  ํ˜„์žฌ ์ƒํƒœ๋ฅผ ์š”์•ฝ

๊ทธ๋Ÿฌ๋‚˜ ์œ ํ˜• ์ง€์ •๊ณผ ๊ด€๋ จํ•˜์—ฌ ๊ตฌํ˜„ ๋ฌธ์ œ๊ฐ€ ๊ทธ๋ ‡๊ฒŒ ์–ด๋ ต์ง€ ์•Š์€ ๊ฒƒ ๊ฐ™์Šต๋‹ˆ๋‹ค. ๊ทธ๊ฒƒ์€ ์•ฝ๊ฐ„์˜ ๊ด€์‹ฌ์„ ๊ธฐ์šธ์ด๊ณ  ๊ฒฐ์Šน์„ ๊นŒ์ง€ ๋ฐ€์–ด ๋ถ™์ด๋Š” ์ข‹์€ ํ›„๋ณด๊ฐ€ ๋  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ๊ตฌ๋ฌธ์ด๋‚˜ ์ด์™€ ์œ ์‚ฌํ•œ ๊ฒƒ์— ๋Œ€ํ•ด ๋งŽ์€ ๋…ผ๋ž€์ด ์žˆ์—ˆ๋Š”์ง€ ๊ธฐ์–ต์ด ๋‚˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค.

2020 ๋…„ 8 ์›” 5 ์ผ ์ˆ˜์š”์ผ 02:29:06 PM -0700์— Niko Matsakis๋Š” ๋‹ค์Œ๊ณผ ๊ฐ™์ด ์ผ์Šต๋‹ˆ๋‹ค.

๊ทธ๋Ÿฌ๋‚˜ ์œ ํ˜• ์ง€์ •๊ณผ ๊ด€๋ จํ•˜์—ฌ ๊ตฌํ˜„ ๋ฌธ์ œ๊ฐ€ ๊ทธ๋ ‡๊ฒŒ ์–ด๋ ต์ง€ ์•Š์€ ๊ฒƒ ๊ฐ™์Šต๋‹ˆ๋‹ค. ๊ทธ๊ฒƒ์€ ์•ฝ๊ฐ„์˜ ๊ด€์‹ฌ์„ ๊ธฐ์šธ์ด๊ณ  ๊ฒฐ์Šน์„ ๊นŒ์ง€ ๋ฐ€์–ด ๋ถ™์ด๋Š” ์ข‹์€ ํ›„๋ณด๊ฐ€ ๋  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ๊ตฌ๋ฌธ์ด๋‚˜ ์ด์™€ ์œ ์‚ฌํ•œ ๊ฒƒ์— ๋Œ€ํ•ด ๋งŽ์€ ๋…ผ๋ž€์ด ์žˆ์—ˆ๋Š”์ง€ ๊ธฐ์–ต์ด ๋‚˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค.

์ œ๊ฐ€ ํšŒ์ƒํ–ˆ๋“ฏ์ด ์ฃผ๋œ ๊ด€์‹ฌ์‚ฌ๋Š” ์œ ํ˜• ์ง€์ •์„ ํ—ˆ์šฉํ•˜๋Š” ๊ฒƒ์ด ์—ˆ์Šต๋‹ˆ๋‹ค.
๋ชจ๋“  ๊ณณ์—์„œ ์ƒ๋‹นํ•œ ๋ฌธ๋ฒ• ๋ณ€ํ™”๊ฐ€ ๋ฐœ์ƒํ•˜๊ณ  ์ž ์žฌ์ ์œผ๋กœ
ํ•˜๋‚˜๋ฅผ ์ œํ•œํ•ฉ๋‹ˆ๋‹ค. ์ž์„ธํ•œ ๋‚ด์šฉ์€ ๊ธฐ์–ต ๋‚˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค.
๋†’์ธ.

๊ฐœ์ธ์ ์œผ๋กœ ์ €๋Š” ์ธ์ฒด ๊ณตํ•™์  ๋ฌธ์ œ๊ฐ€ ๊ทธ๋ ‡๊ฒŒ ๋‚˜์˜์ง€ ์•Š์•„์„œ ์ง€๊ธˆ์ด ๊ธฐ๋Šฅ์„ ์•ˆ์ •ํ™” ํ•  ๊ฐ€์น˜๊ฐ€ ์—†๋‹ค๊ณ  ์ƒ๊ฐํ•ฉ๋‹ˆ๋‹ค. ํ‘œํ˜„์‹ ์œ ํ˜• ๋น„๋ฌธ์ด ์—†๋”๋ผ๋„ let ๋ฐ”์ธ๋”ฉ์„ ๋„์ž…ํ•˜๋Š” ๊ฒƒ์€ ๊ทธ๋ ‡๊ฒŒ ์ถ”ํ•œ ํ•ด๊ฒฐ ๋ฐฉ๋ฒ•์ด ์•„๋‹™๋‹ˆ๋‹ค.

๋˜ํ•œ try ๋ธ”๋ก์€ ๋งคํฌ๋กœ์—์„œ ์œ ์šฉ ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ํŠนํžˆ @withoutboats ์šฐ์ˆ˜ํ•œ fehler ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ๊ฐ€ try ์— procs ๋ณธ๋ฌธ์„ ๋ž˜ํ•‘ ํ•  ์ˆ˜ ์žˆ๋‹ค๋ฉด ๋งคํฌ๋กœ ์‹œ์Šคํ…œ์˜ ๊ฒฐํ•จ์œผ๋กœ ์ธํ•œ ๋ฌธ์ œ๊ฐ€ ๋” ์ ์„ ์ง€ ๊ถ๊ธˆํ•ฉ๋‹ˆ๋‹ค.

try ๋ธ”๋ก์„ ๋งŽ์ด ์‚ฌ์šฉํ•˜๊ณ  ์‹ถ์€ ๊ณณ์ด ์žˆ์Šต๋‹ˆ๋‹ค. ์„ ์„ ๋„˜์œผ๋ฉด ์ข‹์„ ๊ฒƒ์ž…๋‹ˆ๋‹ค. ๊ฐœ์ธ์ ์œผ๋กœ ๋‚˜๋Š” ๋ผ์ธ์„ ํ†ตํ•ด try ๋ธ”๋ก์„ ์–ป๋Š” ๊ฒƒ์ด ํ•„์š”ํ•˜๋‹ค๋ฉด ์ ˆ๋Œ€์ ์œผ๋กœ 100 % ํฌ์ƒ ์œ ํ˜•์„ ํฌ์ƒ ํ•  ๊ฒƒ์ž…๋‹ˆ๋‹ค. ๋‚˜๋Š” ์•„์ง "์—ฌ๊ธฐ์— ํƒ€์ž… ์–ด ์Šคํฌ๋ฆฝ ์…˜์ด ์žˆ์œผ๋ฉด ์ข‹๊ฒ ๋‹ค"๊ณ  ๋งํ•œ ์ƒํ™ฉ์— ์ฒ˜ํ•ด ์žˆ์ง€๋Š” ์•Š์ง€๋งŒ ๊ฒฐ๊ตญ ์‹œ๋„ ๋ธ”๋ก์„ ๋งŽ์ด ์‹œ๋ฎฌ๋ ˆ์ด์…˜ํ•˜๊ธฐ ์œ„ํ•ด IIFE๋ฅผ ์ˆ˜ํ–‰ํ•˜๊ฒŒ๋ฉ๋‹ˆ๋‹ค. ๋‹ค๋ฅธ ์žฅ๊ธฐ์ ์ด๊ณ  ๋ถˆ์•ˆ์ •ํ•œ ๊ธฐ๋Šฅ๊ณผ ์ถฉ๋Œํ•˜๊ธฐ ๋•Œ๋ฌธ์— ์žฅ๊ธฐ์ ์ด๊ณ  ์œ ์šฉํ•œ ๊ธฐ๋Šฅ์„ ๋ถˆ์•ˆ์ •ํ•˜๊ฒŒ ๋‘๋Š” ๊ฒƒ์€ ์ •๋ง ๋ถˆํ–‰ํ•œ ์ƒํ™ฉ์ž…๋‹ˆ๋‹ค.

์ข€ ๋” ๊ตฌ์ฒด์ ์œผ๋กœ ๋งํ•˜๋ฉด Result๋ฅผ ๋ฐ˜ํ™˜ํ•˜๋Š” ํ•จ์ˆ˜ ๋‚ด๋ถ€์—์žˆ์„ ๋•Œ์ด ์ž‘์—…์„ ์ˆ˜ํ–‰ํ•˜์ง€๋งŒ Option์„ ๋ฐ˜ํ™˜ํ•˜๋Š” ์ž‘์—…์— ๋Œ€ํ•ด ์ผ์ข…์˜ ์ฒ˜๋ฆฌ๋ฅผํ•˜๊ณ  ์‹ถ์Šต๋‹ˆ๋‹ค. ์ฆ‰, ์ผ๋ฐ˜์ ์œผ๋กœ Try๊ฐ€ ์•ˆ์ •์ ์ด๋ผ๋ฉด try ๋ธ”๋ก์„ ์„ ํ˜ธ ํ•  ๊ฒƒ์ž…๋‹ˆ๋‹ค. ์‹ค์ œ๋กœ ๊ทธ๋ ‡๊ฒŒํ•˜๊ธฐ ์œ„ํ•ด ์ฃผ ํ•จ์ˆ˜์—์„œ ๋ฐ˜ํ™˜ํ•˜๊ณ  ์‹ถ์ง€๋Š” ์•Š์ง€๋งŒ ๋Œ€์‹  ์ฒด์ธ์—์žˆ๋Š” ๊ฒƒ์ด ์žˆ์œผ๋ฉด ์ผ์ข…์˜ ๊ธฐ๋ณธ๊ฐ’์„ ์ œ๊ณตํ•ฉ๋‹ˆ๋‹ค. ์—†์Œ. ์ด๊ฒƒ์€ ์ง๋ ฌํ™” ์Šคํƒ€์ผ ์ฝ”๋“œ์—์„œ ๋‚˜์—๊ฒŒ ๋ฐœ์ƒํ•˜๋Š” ๊ฒฝํ–ฅ์ด ์žˆ์Šต๋‹ˆ๋‹ค.

๊ฐœ์ธ์ ์œผ๋กœ ๋‚˜๋Š” try ๋ธ”๋ก๋ณด๋‹ค ํ›จ์”ฌ ๋” ์ž์ฃผ ํƒ€์ž… ์–ด ์Šคํฌ๋ฆฝ ์…˜์„ ์›ํ–ˆ์Šต๋‹ˆ๋‹ค (๋•Œ๋กœ๋Š” ๋‘˜ ๋‹ค ์›ํ–ˆ์ง€๋งŒ). ํŠนํžˆ, ๋‚˜๋Š” ์ปดํŒŒ์ผ๋Ÿฌ๊ฐ€ ๋‚ด๊ฐ€ ์˜ˆ์ƒํ–ˆ๋˜ ๊ฒƒ๊ณผ ๋‹ค๋ฅธ ์œ ํ˜•์„ ์ถ”๋ก ํ•˜๋Š” "์œ ํ˜• ๋””๋ฒ„๊น…"์œผ๋กœ ์ข…์ข… ์–ด๋ ค์›€์„ ๊ฒช์—ˆ์Šต๋‹ˆ๋‹ค. ์ผ๋ฐ˜์ ์œผ๋กœ ์–ด๋”˜๊ฐ€์— ์ƒˆ๋กœ์šด let ๋ฐ”์ธ๋”ฉ์„ ์ถ”๊ฐ€ํ•ด์•ผํ•ฉ๋‹ˆ๋‹ค. ์ด๋Š” ์ •๋ง๋กœ ๋ฐฉํ•ด๊ฐ€๋˜๋ฉฐ rustfmt๊ฐ€ ์‹คํ–‰ ์ทจ์†Œ ๊ธฐ๋ก์„ ๊นจ๋œจ๋ฆฌ๋Š” ์›์ธ์ด๋ฉ๋‹ˆ๋‹ค. ๋”์šฑ์ด, ํƒ€์ž… ์–ด ์Šคํฌ๋ฆฝ ์…˜์ด ์—ฌ๋ถ„์˜ ํ„ฐ๋ณด ํ”ผ์‰ฌ๋ฅผ ํ”ผํ•  ์ˆ˜์žˆ๋Š” ๊ณณ์ด ๋งŽ์ด ์žˆ์Šต๋‹ˆ๋‹ค.

constrast์—์„œ๋Š” and_then ๋˜๋Š” ๋‹ค๋ฅธ ๊ฒฐํ•ฉ์ž๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ ์ข…๋ฃŒํ•˜์ง€ ์•Š๊ณ  ์กฐ๊ธฐ์— ์ข…๋ฃŒ ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ์•„๋งˆ๋„ ๊นจ๋—ํ•œ aa try ๋ธ”๋ก์€ ์•„๋‹ˆ์ง€๋งŒ ๊ทธ๋ ‡๊ฒŒ ๋‚˜์˜์ง€๋Š” ์•Š์Šต๋‹ˆ๋‹ค.

@steveklabnik @ mark-im Try ๋ธ”๋ก๊ณผ ์œ ํ˜• ์ง€์ •์€ ์–ด๋–ค ๋ฐฉ์‹์œผ๋กœ๋„ ์ถฉ๋Œํ•˜์ง€ ์•Š์œผ๋ฉฐ ํ•œ ๊ธฐ๋Šฅ ๋˜๋Š” ๋‹ค๋ฅธ ๊ธฐ๋Šฅ์˜ ๋ฌธ์ œ๊ฐ€ ์•„๋‹™๋‹ˆ๋‹ค. ๋‹จ์ง€ try ๋ธ”๋ก์— ๋น„์ธ๊ฐ„์  ์ธ ์œ ํ˜• ์ถ”๋ก  ์˜ค๋ฅ˜๊ฐ€ ์žˆ์œผ๋ฉฐ ์ผ๋ฐ˜ํ™” ๋œ ์œ ํ˜• ์ง€์ •์€ ํ•ด๋‹น ๋ฌธ์ œ๋ฅผ ํ•ด๊ฒฐํ•˜๋Š” ๋ฐฉ๋ฒ•์ด ๋  ์ˆ˜ ์žˆ์ง€๋งŒ ์ผ๋ฐ˜ํ™” ๋œ ์œ ํ˜• ์ง€์ •์€ ๋‹จ๊ธฐ์  ๊ธฐ๋Šฅ์ด๋‚˜ ํ™•์‹คํ•œ ๊ฒƒ์ด ์•„๋‹ˆ๊ธฐ ๋•Œ๋ฌธ์—

์ด๊ฒƒ์€ ์šฐ๋ฆฌ๊ฐ€ ์ผ๋ฐ˜ํ™” ๋œ ์œ ํ˜• ์ง€์ •์„ ๋ฌธ์ œ์— ๋Œ€ํ•œ ํ•ด๊ฒฐ์ฑ…์œผ๋กœ ๋งŒ๋“ค์ง€ ์•Š์„ ๊ฒƒ์ž„์„ ์˜๋ฏธํ•˜์ง€๋„ ์•Š์Šต๋‹ˆ๋‹ค. ์กฐ์‚ฌ ํ•  ๊ฐ€์น˜๊ฐ€์žˆ๋Š” ํ•œ ๊ฐ€์ง€ ์˜ต์…˜์€ "์–ธ์  ๊ฐ€ ์ผ๋ฐ˜ํ™” ๋œ ์œ ํ˜• ์ง€์ •์ด ํ•ด๋‹น ๋ฌธ์ œ๋ฅผ ํ•ด๊ฒฐํ•  ๊ฒƒ์œผ๋กœ ์˜ˆ์ƒํ•˜๋Š” ๊ทธ๋Œ€๋กœ ์‹œ๋„๋ฅผ ์•ˆ์ •ํ™”"ํ•˜๋Š” ๊ฒƒ์ž…๋‹ˆ๋‹ค. ์–ธ๊ธ‰ ๋œ ๋ชจ๋“  ๊ฒƒ์€ ์œ ํ˜• ์ง€์ •์— ๋Œ€ํ•œ ์•ˆ์ •ํ™”๋ฅผ ์ฐจ๋‹จํ•˜์ง€ ์•Š๋Š”๋‹ค๋Š” ๊ฒƒ์ž…๋‹ˆ๋‹ค.


@ rust-lang / lang GitHub ๋ฐ ์—ฌ๊ธฐ์—์„œ ๋…ผ์˜๋˜๋Š” ๋งŽ์€ ๋‹ค๋ฅธ ์ฃผ์ œ์˜ ํ•œ๊ณ„๋กœ ์ธํ•ด์ด ์Šค๋ ˆ๋“œ์—์„œ ์œ ํ˜• ์ถ”๋ก  ์‹คํŒจ์˜ ๋‰˜์•™์Šค๋ฅผ ์ดํ•ดํ•˜๊ธฐ๊ฐ€ ์กฐ๊ธˆ ์–ด๋ ต๋‹ค๋Š” ๊ฒƒ์„ ์ธ์ •ํ•ด์•ผํ•ฉ๋‹ˆ๋‹ค. ์ถ”๋ก  ์‹คํŒจ๋ฅผ ์ฒ˜๋ฆฌํ•˜๋Š” ๋ฐฉ๋ฒ•์— ๋Œ€ํ•œ ๊ฒฐ์ •์— ๋„๋‹ฌํ•˜๋Š” ๊ฒƒ์ด try ๋ธ”๋ก์ด ์•ˆ์ •ํ™”๋˜๋Š” ๊ฒƒ์„ ๋ง‰๋Š” ์œ ์ผํ•œ ๋ฐฉ๋ฒ•์ด๊ธฐ ๋•Œ๋ฌธ์—์ด๋ฅผ ๋…ผ์˜ํ•˜๊ธฐ ์œ„ํ•ด ํšŒ์˜๋ฅผ ๊ฐ–๊ณ  ๋ˆ„๊ตฐ๊ฐ€ ์ถ”๋ก  ๋ฌธ์ œ์— ๋Œ€ํ•ด ๊นŠ์ด ์ดํ•ดํ•˜๋Š” ๋ฐ ๋„์›€์ด ๋  ๊ฒƒ์ด๋ผ๊ณ  ์ƒ๊ฐํ•ฉ๋‹ˆ๋‹ค. .

์ €์—๊ฒŒ ํ•œ ๊ฐ€์ง€ ์งˆ๋ฌธ์ด ์žˆ์Šต๋‹ˆ๋‹ค. ์˜ˆ๋ฅผ ๋“ค์–ด,์ด ์ถ”๋ก  ๋ฌธ์ œ๋Š” ํŠนํžˆ Try ์—์„œ ํ—ˆ์šฉ ํ•œ ๋ณ€ํ™˜ ์œ ์—ฐ์„ฑ ๋•Œ๋ฌธ์— ๋ฐœ์ƒํ•ฉ๋‹ˆ๊นŒ? ๋‚˜๋Š” ๊ฒฐ์ •์ด ์ฃฝ์„ ๋•Œ๊นŒ์ง€ ๋…ผ์˜๋˜์—ˆ๋‹ค๋Š” ๊ฒƒ์„ ์•Œ๊ณ  ์žˆ์ง€๋งŒ, ๋งŒ์•ฝ ๊ทธ๋ ‡๋‹ค๋ฉด ์ด๊ฒƒ์€ Try ํŠน์„ฑ์˜ ์ •์˜๋ฅผ ๋ณ€๊ฒฝํ•˜๋Š” ๊ฒƒ์„ ์ •๋‹นํ™” ํ•  ์ˆ˜์žˆ๋Š” ์ ์ ˆํ•œ ์ƒˆ๋กœ์šด ์ •๋ณด์ฒ˜๋Ÿผ ๋ณด์ž…๋‹ˆ๋‹ค.

@withoutboats ๋‚˜๋Š” Try ๋ณ€๊ฒฝ ์‚ฌํ•ญ์ด ์ด์ „ ๋ฒ„์ „๊ณผ์˜ ํ˜ธํ™˜์„ฑ ๋•Œ๋ฌธ์— ์–ด๋ ค์šธ ์ˆ˜ ์žˆ์Œ์ด ๋ถ„๋ช…ํ•ด ์กŒ๋‹ค๊ณ  ์ƒ๊ฐํ•ฉ๋‹ˆ๋‹ค. @cramertj ๋Š” ํŠน์ • Pin impls, IIRC๋ฅผ ์–ธ๊ธ‰ํ–ˆ์Šต๋‹ˆ๋‹ค.

์ด ํŽ˜์ด์ง€๊ฐ€ ๋„์›€์ด ๋˜์—ˆ๋‚˜์š”?
0 / 5 - 0 ๋“ฑ๊ธ‰