Rust: RFC 1937์— ๋Œ€ํ•œ ์ถ”์  ๋ฌธ์ œ: `main`์˜ `?`

์— ๋งŒ๋“  2017๋…„ 07์›” 18์ผ  ยท  183์ฝ”๋ฉ˜ํŠธ  ยท  ์ถœ์ฒ˜: rust-lang/rust

์ด๊ฒƒ์€ RFC " ? in main "(rust-lang/rfcs#1937)์— ๋Œ€ํ•œ ์ถ”์  ๋ฌธ์ œ์ž…๋‹ˆ๋‹ค.

๋‹จ๊ณ„:

์•ˆ์ •ํ™”:

  • [x] ๋น„() ๋ฐ˜ํ™˜ ์œ ํ˜•์œผ๋กœ main ์•ˆ์ •ํ™”(https://github.com/rust-lang/rust/issues/48453) https://github.com/rust-lang/ ์— ๋ณ‘ํ•ฉ๋จ
  • [x] ๋น„() ๋ฐ˜ํ™˜ ์œ ํ˜•์œผ๋กœ ๋‹จ์œ„ ํ…Œ์ŠคํŠธ ์•ˆ์ •ํ™”(https://github.com/rust-lang/rust/issues/48854)

๊ด€๋ จ ๋ฌธ์ œ:

  • [x] ๋‹จ์œ„ ํ…Œ์ŠคํŠธ์— ๋Œ€ํ•œ ์˜ค๋ฅ˜ ๋ฉ”์‹œ์ง€๊ฐ€ ์ข‹์ง€ ์•Š์Šต๋‹ˆ๋‹ค(https://github.com/rust-lang/rust/issues/50291).

ํ•ด๊ฒฐ๋˜์ง€ ์•Š์€ ์งˆ๋ฌธ:

  • [ ] ๋„์ž…๋˜๋Š” ํŠน์„ฑ์˜ ์ด๋ฆ„
  • [x] ์ •ํ™•ํ•œ ์ดˆ๊ธฐ ๊ตฌํ˜„

    • ์ด๊ฒƒ์€ #48453์— ์˜ํ•ด ์•ˆ์ •ํ™”๋ฉ๋‹ˆ๋‹ค.

  • [x] ์ข…๋ฃŒ ์ฝ”๋“œ( ํ† ๋ก  ) ๋ณ„๋„์˜ ์ถ”์  ๋ฌธ์ œ๋กœ ์ด๋™ํ–ˆ์Šต๋‹ˆ๋‹ค. https://github.com/rust-lang/rust/issues/48711

    • ์ด๊ฒƒ์€ https://github.com/rust-lang/rust/pull/48497 ์ดํ›„ ๋” ์ด์ƒ ์‚ฌ์‹ค์ด ์•„๋‹Œ #48453์— ์˜ํ•ด ์•ˆ์ •ํ™”๋ฉ๋‹ˆ๋‹ค.

B-RFC-approved C-tracking-issue E-mentor T-compiler T-lang WG-compiler-middle

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

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

TL;DR - ์˜ค๋ฅ˜์˜ Debug ๋ฉ”์‹œ์ง€๋ฅผ ํ‘œ์‹œํ•˜๋Š” ๊ฒƒ์€ ์‹ค์ˆ˜๋ผ๊ณ  ์ƒ๊ฐํ•˜๋ฉฐ ๋” ๋‚˜์€ ์„ ํƒ์€ ์˜ค๋ฅ˜์˜ Display ๋ฉ”์‹œ์ง€๋ฅผ ์‚ฌ์šฉํ•˜๋Š” ๊ฒƒ์ž…๋‹ˆ๋‹ค.

๋‚ด ๋ฏฟ์Œ์˜ ํ•ต์‹ฌ์€ _์ผ์ƒ์ ์œผ๋กœ Rust์—์„œ CLI ํ”„๋กœ๊ทธ๋žจ์„ ๋นŒ๋“œํ•˜๋Š”_ ์‚ฌ๋žŒ์œผ๋กœ์„œ Error ์˜ Debug ๋ฉ”์‹œ์ง€๊ฐ€ ๋ฌด์—‡์ธ์ง€์— ๋Œ€ํ•ด ๋ณ„๋กœ ์‹ ๊ฒฝ์„ ์“ด ๊ธฐ์–ต์ด ์—†๋‹ค๋Š” ๊ฒƒ์ž…๋‹ˆ๋‹ค. ์ฆ‰, Debug ์˜ค๋ฅ˜๋Š” ์˜๋„์ ์œผ๋กœ ์ตœ์ข… ์‚ฌ์šฉ์ž๊ฐ€ ์•„๋‹Œ ๊ฐœ๋ฐœ์ž๋ฅผ ์œ„ํ•œ ๊ฒƒ์ž…๋‹ˆ๋‹ค. CLI ํ”„๋กœ๊ทธ๋žจ์„ ๋นŒ๋“œํ•  ๋•Œ ํ•ด๋‹น ์ธํ„ฐํŽ˜์ด์Šค๋Š” ๊ธฐ๋ณธ์ ์œผ๋กœ ์ตœ์ข… ์‚ฌ์šฉ์ž๊ฐ€ ์ฝ์„ ์ˆ˜ ์žˆ๋„๋ก ๋˜์–ด ์žˆ์œผ๋ฏ€๋กœ Debug ๋ฉ”์‹œ์ง€๋Š” ์—ฌ๊ธฐ์—์„œ ๊ฑฐ์˜ ์œ ์šฉํ•˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค. ์ฆ‰, ๋‚ด๊ฐ€ ์ตœ์ข… ์‚ฌ์šฉ์ž์—๊ฒŒ ์ œ๊ณตํ•œ CLI ํ”„๋กœ๊ทธ๋žจ์ด ์ •์ƒ์ ์ธ ์ž‘๋™์—์„œ Rust ๊ฐ’์˜ ๋””๋ฒ„๊ทธ ํ‘œํ˜„์„ ๋ณด์—ฌ์ฃผ์—ˆ๋‹ค๋ฉด ๋ฒ„๊ทธ๊ฐ€ ์ˆ˜์ •๋œ ๊ฒƒ์œผ๋กœ ๊ฐ„์ฃผํ•  ๊ฒƒ์ž…๋‹ˆ๋‹ค. ํ•ฉ๋ฆฌ์ ์ธ ์‚ฌ๋žŒ๋“ค์ด ๋™์˜ํ•˜์ง€ ์•Š์„ ์ˆ˜ ์žˆ๋‹ค๋Š” ์ ์„ ์ดํ•ดํ•˜์ง€๋งŒ ์ผ๋ฐ˜์ ์œผ๋กœ ์ด๊ฒƒ์ด Rust๋กœ ์ž‘์„ฑ๋œ ๋ชจ๋“  CLI ํ”„๋กœ๊ทธ๋žจ์— ํ•ด๋‹น๋˜์–ด์•ผ ํ•œ๋‹ค๊ณ  ์ƒ๊ฐํ•ฉ๋‹ˆ๋‹ค. ๊ทธ๋ ‡๊ธด ํ•˜์ง€๋งŒ, ์ œ ์ƒ๊ฐ์— ๋‹ค์†Œ ๋†€๋ผ์šด ์˜๋ฏธ๋Š” ๊ธฐ๋ณธ ์ž‘๋™ ๋ชจ๋“œ๊ฐ€ ์ˆ˜์ •๋˜์–ด์•ผ ํ•˜๋Š” ๋ฒ„๊ทธ(IMO)๋กœ ์‹œ์ž‘ํ•˜๋Š” ๊ธฐ๋Šฅ์„ ํšจ๊ณผ์ ์œผ๋กœ ์•ˆ์ •ํ™”ํ–ˆ๋‹ค๋Š” ๊ฒƒ์ž…๋‹ˆ๋‹ค.

๊ธฐ๋ณธ์ ์œผ๋กœ ์˜ค๋ฅ˜์˜ Debug ํ‘œ์‹œ๋ฅผ ํ‘œ์‹œํ•จ์œผ๋กœ์จ ์ž˜๋ชป๋œ ๊ด€ํ–‰์„ ๊ถŒ์žฅํ•œ๋‹ค๊ณ  ์ƒ๊ฐํ•ฉ๋‹ˆ๋‹ค. ํŠนํžˆ, Rust CLI ํ”„๋กœ๊ทธ๋žจ์„ ์ž‘์„ฑํ•˜๋Š” ๊ณผ์ •์—์„œ ์˜ค๋ฅ˜์˜ Display impl์กฐ์ฐจ๋„ ์ตœ์ข… ์‚ฌ์šฉ์ž๊ฐ€ ์†Œ๋น„ํ•˜๊ธฐ์— ์ถฉ๋ถ„ํ•˜์ง€ ์•Š์œผ๋ฉฐ ์‹ค์ œ ์ž‘์—…์„ ์ˆ˜ํ–‰ํ•ด์•ผ ํ•œ๋‹ค๋Š” ๊ฒƒ์„ ๊ด€์ฐฐํ•˜๋Š” ๊ฒƒ์€ ๋งค์šฐ ์ผ๋ฐ˜์ ์ž…๋‹ˆ๋‹ค. ๊ทธ๊ฒƒ์„ ๊ณ ์นœ๋‹ค. ์ด์— ๋Œ€ํ•œ ๊ตฌ์ฒด์ ์ธ ์˜ˆ๋Š” io::Error ์ž…๋‹ˆ๋‹ค. ํ•ด๋‹น ํŒŒ์ผ ๊ฒฝ๋กœ ์—†์ด io::Error ํ‘œ์‹œ(ํŒŒ์ผ ์ฝ๊ธฐ/์“ฐ๊ธฐ/์—ด๊ธฐ/์ƒ์„ฑ์—์„œ ์˜จ ๊ฒƒ์œผ๋กœ ๊ฐ€์ •)๋Š” ๊ธฐ๋ณธ์ ์œผ๋กœ ๋ฒ„๊ทธ์ž…๋‹ˆ๋‹ค. ์™œ๋ƒํ•˜๋ฉด ์ตœ์ข… ์‚ฌ์šฉ์ž๊ฐ€ ์ด๊ฒƒ์œผ๋กœ ์•„๋ฌด๊ฒƒ๋„ ํ•˜๊ธฐ ์–ด๋ ต๊ธฐ ๋•Œ๋ฌธ์ž…๋‹ˆ๋‹ค. ๊ธฐ๋ณธ์ ์œผ๋กœ Debug ์˜ค๋ฅ˜ ํ‘œ์‹œ๋ฅผ ํ‘œ์‹œํ•˜๋„๋ก ์„ ํƒํ•˜์—ฌ CLI ํ”„๋กœ๊ทธ๋žจ์„ ๋งŒ๋“œ๋Š” ์‚ฌ๋žŒ๋“ค์ด ์ด๋Ÿฌํ•œ ์ข…๋ฅ˜์˜ ๋ฒ„๊ทธ๋ฅผ ๋ฐœ๊ฒฌํ•˜๋Š” ๊ฒƒ์„ ๋” ์–ด๋ ต๊ฒŒ ๋งŒ๋“ค์—ˆ์Šต๋‹ˆ๋‹ค. (๊ฒŒ๋‹ค๊ฐ€ io::Error ์˜ Debug ์€ Display ๋ณด๋‹ค ํ›จ์”ฌ ๋œ ์œ ์šฉํ•˜์ง€๋งŒ ๊ทธ ์ž์ฒด๋กœ๋Š” ์ œ ๊ฒฝํ—˜์ƒ ํฐ ๋ฌธ์ œ๊ฐ€ ๋˜์ง€๋Š” ์•Š์Šต๋‹ˆ๋‹ค. )

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

use std::error::Error;
use std::process;

fn try_main() -> Result<(), Box<Error>> {
    // do stuff with `?`
}

fn main() {
    if let Err(err) = try_main() {
        eprintln!("{}", err);
        process::exit(1);
    }
}

๊ฒ‰๋ณด๊ธฐ์—๋Š” ์ด๊ฒƒ์„ ?-in-main ๋กœ ๋ฐ”๊พธ๋Š” ๊ฒƒ์ด _์‚ฌ๋ž‘์Šค๋Ÿฌ์šด_ ์ผ์ด์ง€๋งŒ Display ์˜ค๋ฅ˜๊ฐ€ ํ‘œ์‹œ๋˜์ง€ ์•Š๊ธฐ ๋•Œ๋ฌธ์— ๊ทธ๋ ‡๊ฒŒ ํ•  ์ˆ˜ ์—†์Šต๋‹ˆ๋‹ค. ์ฆ‰, ์‹ค์ œ CLI ํ”„๋กœ๊ทธ๋žจ์„ ์ž‘์„ฑํ•  ๋•Œ ์‹ค์ œ๋กœ ์œ„์˜ ๋ฐฉ์‹์„ ์‚ฌ์šฉํ•˜๊ฒŒ ๋˜๋ฏ€๋กœ ๋‚ด ์˜ˆ์ œ๊ฐ€ ํ˜„์‹ค์„ ๋ฐ˜์˜ํ•˜๊ณ  ์‹ถ๋‹ค๋ฉด ์ง€๋ฆ„๊ธธ์„ ์ทจํ•˜์ง€ ์•Š๊ณ  ์‹ค์ œ ํ”„๋กœ๊ทธ๋žจ์—์„œ ์ˆ˜ํ–‰ํ•˜๋Š” ์ž‘์—…์„ ๋ณด์—ฌ์•ผ ํ•œ๋‹ค๊ณ  ์ƒ๊ฐํ•ฉ๋‹ˆ๋‹ค(ํ•ฉ๋ฆฌ์ ์ธ ๋ฒ”์œ„ ๋‚ด์—์„œ ). ์ €๋Š” ์‹ค์ œ๋กœ ์ด๋Ÿฐ ์ข…๋ฅ˜์˜ ๊ฒƒ์ด ์ •๋ง ์ค‘์š”ํ•˜๋‹ค๊ณ  ์ƒ๊ฐํ•ฉ๋‹ˆ๋‹ค. ์—ญ์‚ฌ์ ์œผ๋กœ ์ด๊ฒƒ์˜ ํ•œ ๊ฐ€์ง€ ๋ถ€์ž‘์šฉ์€ unwrap ์–ด๋””์—๋‚˜ ๋ฟŒ๋ฆฌ์ง€ ์•Š๊ณ  ๊ด€์šฉ์ ์ธ Rust ์ฝ”๋“œ๋ฅผ ์ž‘์„ฑํ•˜๋Š” ๋ฐฉ๋ฒ•์„ ์‚ฌ๋žŒ๋“ค์—๊ฒŒ ๋ณด์—ฌ์ฃผ์—ˆ๋‹ค๋Š” ๊ฒƒ์ž…๋‹ˆ๋‹ค. ๊ทธ๋Ÿฌ๋‚˜ ์˜ˆ์ œ์—์„œ ?-in-main ๋ฅผ ์‚ฌ์šฉํ•˜๋Š” ๊ฒƒ์œผ๋กœ ๋˜๋Œ์•„๊ฐ€๋ฉด ๋ชฉํ‘œ๋ฅผ ์–ด๊ธด ๊ฒƒ์ž…๋‹ˆ๋‹ค. ์ด์ œ ๊ธฐ๋ณธ์ ์œผ๋กœ ๋งค์šฐ ์ž˜ ๋ฐฉ์ถœํ•˜๋Š” ํ”„๋กœ๊ทธ๋žจ์„ ์ž‘์„ฑํ•˜๋„๋ก ๋” ์ž˜ ๋ชจ๋ฅด๋Š” ์‚ฌ๋žŒ๋“ค์„ ์„ค์ •ํ•˜๊ณ  ์žˆ์Šต๋‹ˆ๋‹ค. ๋„์›€์ด ๋˜์ง€ ์•Š๋Š” ์˜ค๋ฅ˜ ๋ฉ”์‹œ์ง€.

"์˜ค๋ฅ˜ ๋ฉ”์‹œ์ง€๋ฅผ ๋‚ด๋ณด๋‚ด๊ณ  ์ ์ ˆํ•œ ์˜ค๋ฅ˜ ์ฝ”๋“œ๋กœ ์ข…๋ฃŒ" ํŒจํ„ด์€ ์‹ค์ œ๋กœ ์„ธ๋ จ๋œ ํ”„๋กœ๊ทธ๋žจ์—์„œ ์‚ฌ์šฉ๋ฉ๋‹ˆ๋‹ค. ์˜ˆ๋ฅผ ๋“ค์–ด ?-in-main ๊ฐ€ Display ๋ฅผ ์‚ฌ์šฉํ–ˆ๋‹ค๋ฉด ์˜ค๋Š˜ ripgrep์—์„œ main ๋ฐ run ํ•จ์ˆ˜๋ฅผ ๋ณ‘ํ•ฉํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

https://github.com/BurntSushi/ripgrep/blob/64317bda9f497d66bbeffa71ae6328601167a5bd/src/main.rs#L56 -L86

๋ฌผ๋ก  ์•ˆ์ •ํ™”๋˜๋ฉด Termination ํŠธ๋ ˆ์ž‡์— ๋Œ€ํ•œ ๊ณ ์œ ํ•œ impl์„ ์ œ๊ณตํ•˜์—ฌ ๋ฏธ๋ž˜์— ?-in-main ๋ฅผ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ์ง€๋งŒ main ๋งŒ ์“ธ ์ˆ˜ ์žˆ๋‹ค๋ฉด ์™œ ๊ทธ๋ ‡๊ฒŒ ํ•˜๋Š” ๊ฒƒ์ด ๊ท€์ฐฎ์„๊นŒ์š”? impl ๋ฅผ ์˜ˆ์ œ์— ํฌํ•จํ•ด์•ผ ํ•˜๋ฉฐ, ๊ทธ ์‹œ์ ์—์„œ ์ €๋Š” ์˜ค๋Š˜ ๊ฐ€์ง€๊ณ  ์žˆ๋Š” ์˜ˆ์ œ๋ฅผ ๊ณ ์ˆ˜ํ•  ์ˆ˜๋„ ์žˆ์Šต๋‹ˆ๋‹ค( main ๋ฐ try_main ).

๋ณด๊ธฐ์—๋Š” ์ด ๋ฌธ์ œ๋ฅผ ์ˆ˜์ •ํ•˜๋Š” ๊ฒƒ์ด ํฐ ๋ณ€ํ™”๊ฐ€ ๋  ๊ฒƒ ๊ฐ™์Šต๋‹ˆ๋‹ค . ์ฆ‰, ์ด ์ฝ”๋“œ๋Š” ์˜ค๋Š˜๋‚  Rust stable์—์„œ ์ปดํŒŒ์ผ๋ฉ๋‹ˆ๋‹ค.

#[derive(Debug)]
struct OnlyDebug;

fn main() -> Result<(), OnlyDebug> {
    Err(OnlyDebug)
}

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

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

์ข…๋ฃŒ ์ƒํƒœ๋Š” ์–ด๋–ป๊ฒŒ ์ฒ˜๋ฆฌ๋ฉ๋‹ˆ๊นŒ?

@Screwtapello์˜ ์ด ๋Œ“๊ธ€ ์€ FCP์— ๋Œ€ํ•œ ์‘๋‹ต์œผ๋กœ RFC๋ฅผ ๋ณ€๊ฒฝํ•˜๊ธฐ์—๋Š” FCP์˜ ๋ ๋ถ€๋ถ„์— ๋„ˆ๋ฌด ๊ฐ€๊น๊ฒŒ ์ž‘์„ฑ๋œ ๊ฒƒ ๊ฐ™์Šต๋‹ˆ๋‹ค.

์š”์ปจ๋Œ€: RFC๋Š” ๊ทผ๊ฑฐ๋Š” ์žˆ์ง€๋งŒ ๋ถˆ๋ถ„๋ช…ํ•˜๊ณ  ์•ฝ๊ฐ„ ๋น„์ •์ƒ์ ์ธ ๊ฒฐ๊ณผ๋ฅผ ์ƒ์„ฑํ•˜๋Š” ๊ทผ๊ฑฐ ๋กœ ์‹คํŒจ ์‹œ 2๋ฅผ ๋ฐ˜ํ™˜ํ•  ๊ฒƒ์„ ์ œ์•ˆํ•ฉ๋‹ˆ๋‹ค . ๊ฐ€์žฅ ๋†€๋ผ์šด ๊ฒƒ์€ ํ”„๋กœ๊ทธ๋žจ์ด ์„ฑ๊ณต ๋˜๋Š” ์‹คํŒจ๋ณด๋‹ค ๋” ์ž์„ธํ•œ ์ •๋ณด๋ฅผ ์›ํ•œ๋‹ค๋Š” ํ‘œ์‹œ๊ฐ€ ์—†์„ ๋•Œ 1์„ ๋ฐ˜ํ™˜ํ•˜๋Š” ๊ฒƒ์ž…๋‹ˆ๋‹ค. ์ด๊ฒƒ์ด ์šฐ๋ฆฌ๊ฐ€ RFC ํ”„๋กœ์„ธ์Šค๋ฅผ ์™œ๊ณกํ•˜๊ณ  ์žˆ๋‹ค๋Š” ๋Š๋‚Œ ์—†์ด ๋…ผ์˜ํ•  ์ˆ˜ ์žˆ์„ ๋งŒํผ ์ถฉ๋ถ„ํžˆ ์ž์ „๊ฑฐ ํƒ€๊ธฐ์ž…๋‹ˆ๊นŒ? ์•„๋‹ˆ๋ฉด ์ด์ œ ์ด ํŠน์ • ๊ตฌํ˜„ ์„ธ๋ถ€ ์‚ฌํ•ญ์— ์ž ๊ฒจ ์žˆ์Šต๋‹ˆ๊นŒ?

๊ตฌํ˜„ ์„ธ๋ถ€ ์‚ฌํ•ญ์€ ์•„๋‹™๋‹ˆ๋‹ค. ๊ทธ๋ ‡์ฃ ?

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

์ด๊ฒƒ์€ ํŠนํžˆ ํ•˜์œ„ ํ”„๋กœ์„ธ์Šค(Rust์—์„œ ๊ตฌํ˜„๋œ)๊ฐ€ ๋ฐ”์ด๋„ˆ๋ฆฌ "๋ชจ๋“  ๊ฒƒ์ด ์ •์ƒ"/"๋ญ”๊ฐ€ ์ž˜๋ชป๋˜์—ˆ์Šต๋‹ˆ๋‹ค" ์™ธ์— ์ œ๊ณตํ•  ์ •๋ณด๊ฐ€ ์—†๋Š” ๊ฒฝ์šฐ์— ๊ด€ํ•œ ๊ฒƒ์ž…๋‹ˆ๋‹ค.

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

๊ทธ ๋™์ž‘์€ 0์ด ์•„๋‹Œ ๊ฒƒ์€ ์‹คํŒจ๋ฅผ ์˜๋ฏธํ•œ๋‹ค๋Š” ์ ์—์„œ _except_ ํ˜ธ์ถœ๋˜๋Š” ํ”„๋กœ๊ทธ๋žจ์— ํ•ญ์ƒ ํฌ๊ฒŒ ์˜์กดํ•ฉ๋‹ˆ๋‹ค. ์ฃผ ๊ธฐ๋Šฅ ๋ž˜ํผ์™€ ์กฐํšŒ ํ…Œ์ด๋ธ”์ด ์žˆ๋Š” std::process::exit ๊ฐ€ ๋ฌด์—‡์„ ํ•˜๋“  ๋” ๋ช…ํ™•ํ•œ ์ข…๋ฃŒ ์ƒํƒœ๋ฅผ ์›ํ•˜๋Š” ์‚ฌ๋žŒ๋“ค์—๊ฒŒ ์ตœ์ƒ์˜ ์˜ต์…˜์œผ๋กœ ๋‚จ์„ ๊ฒƒ์ด๋ผ๋Š” ์ ์„ ๊ฐ์•ˆํ•  ๋•Œ ์ด๊ฒƒ์€ ๊ฑฐ์˜ ์ค‘์š”ํ•˜์ง€ ์•Š์€ ์„ธ๋ถ€ ์‚ฌํ•ญ์ฒ˜๋Ÿผ ๋ณด์ž…๋‹ˆ๋‹ค.

SemVer์—๋Š” "๋Œ€๋ถ€๋ถ„ ์ค‘์š”ํ•˜์ง€ ์•Š์€ ์„ธ๋ถ€ ์‚ฌํ•ญ"์˜ˆ์™ธ๊ฐ€ ์žˆ๋‹ค๊ณ  ์ƒ๊ฐํ•˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค.

ํ•ด๊ฒฐ๋˜์ง€ ์•Š์€ ์งˆ๋ฌธ ๋ชฉ๋ก์— ์ข…๋ฃŒ ์ฝ”๋“œ๋ฅผ ์ถ”๊ฐ€ํ•ด์•ผ ํ•œ๋‹ค๊ณ  ์ƒ๊ฐํ•ฉ๋‹ˆ๋‹ค. @zackw ๋Š” ๊ด€๋ จ ๋‚ด๋ถ€ ์Šค๋ ˆ๋“œ ๋„ ์—ด์—ˆ์Šต๋‹ˆ๋‹ค.

๋งŽ์€ ์‚ฌ๋žŒ๋“ค์€ ์‹คํŒจ ์‹œ ์ข…๋ฃŒ ์ฝ”๋“œ๊ฐ€ 1 ์—ฌ์•ผ ํ•œ๋‹ค๋Š” ๋ฐ ๋™์˜ํ•ฉ๋‹ˆ๋‹ค( 2 ๋Œ€์‹ ).
https://www.reddit.com/r/rust/comments/6nxg6t/the_rfc_using_in_main_just_got_merged/

@arielb1 ์ด RFC๋ฅผ ๊ตฌํ˜„ํ•˜์‹œ๊ฒ ์Šต๋‹ˆ๊นŒ?

@bkchr

์•„๋‹ˆ, ๋‹จ์ง€ ๊ทธ๊ฒƒ์„ ๋ฉ˜ํ† ๋งํ•˜๊ธฐ ์œ„ํ•ด. ๋ฉ˜ํ† ๋ง ๋…ธํŠธ๋ฅผ ์ž‘์„ฑํ•˜๋Š” ๊ฒƒ์„ ์žŠ์ง€ ์•Š๊ธฐ ์œ„ํ•ด ํ• ๋‹นํ–ˆ์Šต๋‹ˆ๋‹ค.

์•„, ์ข‹์•„์š”, ๊ด€์‹ฌ์„ ๊ฐ€์ง€๊ณ  ํ•ด๋ณด๊ณ  ์‹ถ์–ด์š” :)
ํ•˜์ง€๋งŒ ์–ด๋””์„œ๋ถ€ํ„ฐ ์‹œ์ž‘ํ•ด์•ผ ํ• ์ง€ ๋ชจ๋ฅด๊ฒ ์Šต๋‹ˆ๋‹ค. :D

@bkchr

๊ทธ๋ž˜์„œ ๋‚ด๊ฐ€ ์—ฌ๊ธฐ์— ์žˆ์Šต๋‹ˆ๋‹ค :-). ์กฐ๋งŒ๊ฐ„ ๋ฉ˜ํ† ๋ง ์ง€์นจ์„ ์ž‘์„ฑํ•ด์•ผํ•ฉ๋‹ˆ๋‹ค.

์ข‹์•„์š”, ๊ทธ๋Ÿผ ์ €๋Š” ๋‹น์‹ ์˜ ์ง€์‹œ๋ฅผ ๊ธฐ๋‹ค๋ฆฌ๊ณ  ์žˆ์Šต๋‹ˆ๋‹ค.

๋ฉ˜ํ† ๋ง ์ง€์นจ

[WG-์ปดํŒŒ์ผ๋Ÿฌ-์ค‘๊ฐ„] ๋ฌธ์ œ์ž…๋‹ˆ๋‹ค. ๋„์›€์ด ํ•„์š”ํ•˜์‹œ๋ฉด irc.mozilla.org(์ €๋Š” arielby์ž…๋‹ˆ๋‹ค) ๋˜๋Š” https://gitter.im/rust-impl-period/WG-compiler-middle (์ €๋Š” @arielb1 ์ž…๋‹ˆ๋‹ค)์—์„œ #rustc์— ๊ฐ€์ž…ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ๊ฑฐ๊ธฐ).

WIP ์ปดํŒŒ์ผ๋Ÿฌ readme๋Š” #44505์— ์žˆ์Šต๋‹ˆ๋‹ค. ์ปดํŒŒ์ผ๋Ÿฌ์˜ ๋ช‡ ๊ฐ€์ง€ ์‚ฌํ•ญ์„ ์„ค๋ช…ํ•ฉ๋‹ˆ๋‹ค.

์ด RFC์— ๋Œ€ํ•œ ์ž‘์—… ๊ณ„ํš:

  • [ ] - Termination lang-item์„ libcore์— ์ถ”๊ฐ€
  • [ ] - main Termination ์‚ฌ์šฉ ํ—ˆ์šฉ
  • [ ] - doctest์—์„œ Termination ์‚ฌ์šฉ ํ—ˆ์šฉ
  • [ ] - #[test] Termination ์‚ฌ์šฉ ํ—ˆ์šฉ

Termination lang-item์„ libcore์— ์ถ”๊ฐ€

๋จผ์ € Termination ํŠน์„ฑ์„ libcore/ops/termination.rs ์— ๋ช‡ ๊ฐ€์ง€ ๋ฌธ์„œ์™€ ํ•จ๊ป˜ ์ถ”๊ฐ€ํ•ด์•ผ ํ•ฉ๋‹ˆ๋‹ค. ๋˜ํ•œ #[unstable(feature = "termination_trait", issue = "0")] ์†์„ฑ์„ ์‚ฌ์šฉํ•˜์—ฌ ๋ถˆ์•ˆ์ •ํ•œ ๊ฒƒ์œผ๋กœ ํ‘œ์‹œํ•ด์•ผ ํ•ฉ๋‹ˆ๋‹ค. ์ด๋ ‡๊ฒŒ ํ•˜๋ฉด ์•ˆ์ •ํ™”๋˜๊ธฐ ์ „์— ์‚ฌ๋žŒ๋“ค์ด ์‚ฌ์šฉํ•˜์ง€ ๋ชปํ•˜๊ฒŒ ๋ฉ๋‹ˆ๋‹ค.

๊ทธ๋Ÿฐ ๋‹ค์Œ src/librustc/middle/lang_items.rs ์— lang-item ์œผ๋กœ ํ‘œ์‹œํ•ด์•ผ ํ•ฉ๋‹ˆ๋‹ค. ์ด๊ฒƒ์€ ์ปดํŒŒ์ผ๋Ÿฌ๊ฐ€ main ์œ ํ˜•์„ ๊ฒ€์‚ฌํ•  ๋•Œ ์ด๋ฅผ ์ฐพ์„ ์ˆ˜ ์žˆ์Œ์„ ์˜๋ฏธํ•ฉ๋‹ˆ๋‹ค(์˜ˆ: 0c3ac648f85cca1e8dd89dfff727a422bc1897a6 ์ฐธ์กฐ).
๊ทธ๊ฒƒ์˜ ์˜๋ฏธ๋Š”:

  1. lang-items ๋ชฉ๋ก์— ์ถ”๊ฐ€ํ•˜๊ธฐ ( in librustc/middle/lang_items.rs )
  2. Termination ํŠธ๋ ˆ์ž‡์— #[cfg_attr(not(stage0), lang = "termination")] ์ถ”๊ฐ€. #[lang = "termination"] ์†์„ฑ์„ ์ถ”๊ฐ€ํ•  ์ˆ˜ ์—†๋Š” ์ด์œ ๋Š” "stage0" ์ปดํŒŒ์ผ๋Ÿฌ(๋ถ€ํŠธ์ŠคํŠธ๋ž˜ํ•‘ ์ค‘)๊ฐ€ termination ๊ฐ€ ์กด์žฌํ•œ๋‹ค๋Š” ์‚ฌ์‹ค์„ ์•Œ์ง€ ๋ชปํ•˜๊ธฐ ๋•Œ๋ฌธ์— libstd๋ฅผ ์ปดํŒŒ์ผํ•ฉ๋‹ˆ๋‹ค. stage0 ์ปดํŒŒ์ผ๋Ÿฌ๋ฅผ ์—…๋ฐ์ดํŠธํ•  ๋•Œ cfg_attr ๋ฅผ ์ˆ˜๋™์œผ๋กœ ์ œ๊ฑฐํ•ฉ๋‹ˆ๋‹ค.
    ์ž์„ธํ•œ ๋‚ด์šฉ์€ XXX์—์„œ ๋ถ€ํŠธ์ŠคํŠธ๋žฉ ๋ฌธ์„œ๋ฅผ ์ฐธ์กฐํ•˜์„ธ์š”.

๋ฉ”์ธ์—์„œ Termination ์‚ฌ์šฉ ํ—ˆ์šฉ

์ด๊ฒƒ์€ ๋‚ด๊ฐ€ ์ฒ˜๋ฆฌํ•˜๋Š” ๋ฐฉ๋ฒ•์„ ์•Œ๊ณ  ์žˆ๋Š” ํฅ๋ฏธ๋กœ์šด ๋ถ€๋ถ„์ž…๋‹ˆ๋‹ค. ์ด๊ฒƒ์€ $ () main ๋ฅผ ๋งŒ๋“œ๋Š” ๊ฒƒ์„ ์˜๋ฏธํ•ฉ๋‹ˆ๋‹ค(ํ˜„์žฌ main function has wrong type ์˜ค๋ฅ˜๊ฐ€ ๋ฐœ์ƒํ•จ) ๋ฐ ์ž‘๋™ํ•ฉ๋‹ˆ๋‹ค.

์œ ํ˜• ๊ฒ€์‚ฌ๋ฅผ ํ•˜๋ ค๋ฉด ๋จผ์ € ๋‹ค์Œ์—์„œ ๊ธฐ์กด ์˜ค๋ฅ˜๋ฅผ ์ œ๊ฑฐํ•ด์•ผ ํ•ฉ๋‹ˆ๋‹ค.
https://github.com/rust-lang/rust/blob/9a00f3cc306f2f79bfbd54f1986d8ca7a74f6661/src/librustc_typeck/lib.rs#L171 -L218

๊ทธ๋Ÿฐ ๋‹ค์Œ ๋ฐ˜ํ™˜ ์œ ํ˜•์ด Termination ํŠธ๋ ˆ์ž‡์„ ๊ตฌํ˜„ํ•˜๋Š”์ง€ ํ™•์ธ์„ ์ถ”๊ฐ€ํ•ด์•ผ ํ•ฉ๋‹ˆ๋‹ค( register_predicate_obligation ๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ ํŠธ๋ ˆ์ž‡ ์˜๋ฌด๋ฅผ ์ถ”๊ฐ€ - ํ•ด๋‹น ์šฉ๋„ ๊ฒ€์ƒ‰). ์—ฌ๊ธฐ์—์„œ ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.
https://github.com/rust-lang/rust/blob/9a00f3cc306f2f79bfbd54f1986d8ca7a74f6661/src/librustc_typeck/check/mod.rs#L1100 -L1108

๋‹ค๋ฅธ ๋ถ€๋ถ„์€ ๊ทธ๊ฒƒ์„ ์ž‘๋™์‹œํ‚ค๋Š” ๊ฒƒ์ž…๋‹ˆ๋‹ค. ๊ทธ๊ฒƒ์€ ์˜คํžˆ๋ ค ์‰ฌ์›Œ์•ผํ•ฉ๋‹ˆ๋‹ค. RFC์—์„œ ๋งํ–ˆ๋“ฏ์ด lang_start ๋ฅผ ๋ฐ˜ํ™˜ ์œ ํ˜•์— ๋Œ€ํ•ด ์ผ๋ฐ˜ํ™”ํ•˜๋ ค๊ณ  ํ•ฉ๋‹ˆ๋‹ค.

lang_start ๋Š” ํ˜„์žฌ ์—ฌ๊ธฐ์— ์ •์˜๋˜์–ด ์žˆ์Šต๋‹ˆ๋‹ค.
https://github.com/rust-lang/rust/blob/9a00f3cc306f2f79bfbd54f1986d8ca7a74f6661/src/libstd/rt.rs#L32

๋”ฐ๋ผ์„œ ์ผ๋ฐ˜์œผ๋กœ ๋ณ€๊ฒฝํ•˜๊ณ  RFC์™€ ์ผ์น˜ํ•ด์•ผ ํ•ฉ๋‹ˆ๋‹ค.

#[lang = "start"]
fn lang_start<T: Termination>
    (main: fn() -> T, argc: isize, argv: *const *const u8) -> !
{
    use panic;
    use sys;
    use sys_common;
    use sys_common::thread_info;
    use thread::Thread;

    sys::init();

    sys::process::exit(unsafe {
        let main_guard = sys::thread::guard::init();
        sys::stack_overflow::init();

        // Next, set up the current Thread with the guard information we just
        // created. Note that this isn't necessary in general for new threads,
        // but we just do this to name the main thread and to give it correct
        // info about the stack bounds.
        let thread = Thread::new(Some("main".to_owned()));
        thread_info::set(main_guard, thread);

        // Store our args if necessary in a squirreled away location
        sys::args::init(argc, argv);

        // Let's run some code!
        let exitcode = panic::catch_unwind(|| main().report())
            .unwrap_or(101);

        sys_common::cleanup();
        exitcode
    });
}

๊ทธ๋Ÿฐ ๋‹ค์Œ create_entry_fn ์—์„œ ํ˜ธ์ถœํ•ด์•ผ ํ•ฉ๋‹ˆ๋‹ค. ํ˜„์žฌ lang_start Instance::mono ๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ ๋‹จํ˜• lang_start ์„ ์ธ์Šคํ„ด์Šคํ™”ํ•˜๊ณ  ์˜ฌ๋ฐ”๋ฅธ ๋ถ€๋ถ„๊ณผ ํ•จ๊ป˜ monomorphize::resolve ๋ฅผ ์‚ฌ์šฉํ•˜๋„๋ก ๋ณ€๊ฒฝํ•ด์•ผ ํ•ฉ๋‹ˆ๋‹ค.

https://github.com/rust-lang/rust/blob/9a00f3cc306f2f79bfbd54f1986d8ca7a74f6661/src/librustc_trans/base.rs#L697

doctest์—์„œ Termination ์‚ฌ์šฉ ํ—ˆ์šฉ

๋‚˜๋Š” doctest๊ฐ€ ์–ด๋–ป๊ฒŒ ์ž‘๋™ํ•˜๋Š”์ง€ ์ •๋ง๋กœ ์ดํ•ดํ•˜์ง€ ๋ชปํ•œ๋‹ค. @alexcrichton ์—๊ฒŒ ๋ฌผ์–ด๋ด๋„ ๋ ๊นŒ์š”?

#[test] Termination ์‚ฌ์šฉ ํ—ˆ์šฉ

๋‚˜๋Š” libtest๊ฐ€ ์–ด๋–ป๊ฒŒ ์ž‘๋™ํ•˜๋Š”์ง€ ์ •๋ง๋กœ ์ดํ•ดํ•˜์ง€ ๋ชปํ•ฉ๋‹ˆ๋‹ค. @alexcrichton ์—๊ฒŒ ๋ฌผ์–ด๋ด๋„ ๋ ๊นŒ์š”? ๋‹จ์œ„ ํ…Œ์ŠคํŠธ๋Š” ๊ธฐ๋ณธ์ ์œผ๋กœ ๋งคํฌ๋กœ์— ์˜ํ•ด ์ƒ์„ฑ๋˜๋ฏ€๋กœ () ๊ฐ€ ์•„๋‹Œ ๋ฐ˜ํ™˜ ์œ ํ˜•์„ ์ฒ˜๋ฆฌํ•˜๋ ค๋ฉด ํ•ด๋‹น ๋งคํฌ๋กœ ๋˜๋Š” ํ˜ธ์ถœ์ž๋ฅผ ๋ณ€๊ฒฝํ•ด์•ผ ํ•ฉ๋‹ˆ๋‹ค.

@bkchr

์ตœ์†Œํ•œ IRC/gitter์— ๊ฐ€์ž…ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๊นŒ?

@bkchr ๋ฐฉ๊ธˆ ์ฒดํฌ์ธ -- ๋‹น์‹ ๊ณผ @arielb1 ์ด ์–ผ๋งˆ ์ „์— gitter์— ๋Œ€ํ•ด ๋Œ€ํ™”ํ•˜๋Š” ๊ฒƒ์„ ๋ณด์•˜๋Š”๋ฐ, ์ง„์ „์ด ์žˆ์—ˆ์Šต๋‹ˆ๊นŒ? ์–ด๋”˜๊ฐ€์— ๋นจ๋ ค?

์ฃ„์†กํ•ฉ๋‹ˆ๋‹ค. ํ˜„์žฌ๊นŒ์ง€ ์ง„ํ–‰ ์ƒํ™ฉ์ด ์—†์Šต๋‹ˆ๋‹ค. ํ˜„์žฌ ํ•  ์ผ์ด ๋งŽ์ง€๋งŒ ์ด๋ฒˆ ์ฃผ์— ์‹œ๊ฐ„์„ ๋‚ด์„œ ์‹œ์ž‘ํ•  ์ˆ˜ ์žˆ๊ธฐ๋ฅผ ๋ฐ”๋ž๋‹ˆ๋‹ค.

@bkchr ๋„์›€์ด ํ•„์š”ํ•˜์‹œ๋ฉด ์•Œ๋ ค์ฃผ์„ธ์š”!

๋‚˜๋Š” ํ˜„์žฌ ์•ฝ๊ฐ„ ๋ถ™์–ด ์žˆ์Šต๋‹ˆ๋‹ค. ์˜๋ฌด๋ฅผ ๋งŒ๋“ค๊ณ  ์‹ถ์Šต๋‹ˆ๋‹ค. ์˜๋ฌด๋ฅผ ์ƒ์„ฑํ•˜๋ ค๋ฉด TraifRef๊ฐ€ ํ•„์š”ํ•˜๊ณ  TraitRef์˜ ๊ฒฝ์šฐ DefId๊ฐ€ ํ•„์š”ํ•ฉ๋‹ˆ๋‹ค. ๋ˆ„๊ตฐ๊ฐ€๊ฐ€ Termination Trait์—์„œ DefId๋ฅผ ์ƒ์„ฑํ•˜๋Š” ๋ฐฉ๋ฒ•์— ๋Œ€ํ•œ ์ฝ”๋“œ๋ฅผ ์•Œ๋ ค์ค„ ์ˆ˜ ์žˆ์Šต๋‹ˆ๊นŒ?

@bkchr ํŠน์„ฑ์€ lang ํ•ญ๋ชฉ ๋ชฉ๋ก์— ์ถ”๊ฐ€๋˜์–ด์•ผ ํ•ฉ๋‹ˆ๋‹ค. ์˜ˆ: https://github.com/rust-lang/rust/blob/ade0b01ebf18550e41d24c6e36f91afaccd7f389/src/librustc/middle/lang_items.rs#L312
#[termination_trait] ๋กœ ํ‘œ์‹œ๋ฉ๋‹ˆ๋‹ค. ์˜ˆ: https://github.com/rust-lang/rust/blob/ade0b01ebf18550e41d24c6e36f91afaccd7f389/src/libcore/fmt/mod.rs#L525 -L526

๋„ค, ๊ทธ๊ฒŒ ๋ฌธ์ œ๊ฐ€ ์•„๋‹™๋‹ˆ๋‹ค. ์ด๋ฏธ ๊ทธ๋ ‡๊ฒŒ ํ–ˆ์Šต๋‹ˆ๋‹ค. check_fn ํ•จ์ˆ˜์—์„œ ์ข…๋ฃŒ ํŠน์„ฑ์„ ํ™•์ธํ•ด์•ผ ํ•ฉ๋‹ˆ๋‹ค. ๋‚˜๋Š” register_predicate_obligation์„ ์‚ฌ์šฉํ•˜๊ณ  ์‹ถ๊ณ  ์ด๋ฅผ ์œ„ํ•ด์„œ๋Š” ์ข…๋ฃŒ ํŠน์„ฑ์˜ ์ •์˜๊ฐ€ ํ•„์š”ํ•ฉ๋‹ˆ๋‹ค.

์˜ค, ๊ทธ๋Ÿฌ๋ฉด tcx.require_lang_item(TerminationTraitLangItem) ์žˆ์œผ๋ฉด ๋ฉ๋‹ˆ๋‹ค.

@bkchr ์–ด๋•Œ์š” ? ๋‹ค์‹œ ์ฒดํฌ์ธ๋งŒ ํ•˜๋ฉด ๋ฉ๋‹ˆ๋‹ค. =) ๋ฐ”์˜๋”๋ผ๋„ ๊ฑฑ์ •ํ•˜์ง€ ๋งˆ์„ธ์š”. ํ•„์š”ํ•œ ๋ชจ๋“  ๋„์›€์„ ๋ฐ›๊ณ  ์žˆ๋Š”์ง€ ํ™•์ธํ•˜๊ณ  ์‹ถ์„ ๋ฟ์ž…๋‹ˆ๋‹ค.

์ฃ„์†กํ•ฉ๋‹ˆ๋‹ค, ์ง€๊ธˆ์€ ๋ฐ”์˜๋„ค์š” :/ ์ง€๊ธˆ๊นŒ์ง€ ํ•„์š”ํ•œ ๋ชจ๋“  ๋„์›€์„ ๋ฐ›์•˜์Šต๋‹ˆ๋‹ค :)

์ด๊ฒƒ์€ TerminationTrait๋ฅผ ํ™•์ธํ•˜๋Š” ์ฝ”๋“œ์ž…๋‹ˆ๋‹ค. https://github.com/bkchr/rust/blob/f185e355d8970c3350269ddbc6dfe3b8f678dc44/src/librustc_typeck/check/mod.rs#L1108

ํ•จ์ˆ˜์˜ ๋ฐ˜ํ™˜ ์œ ํ˜•์„ ํ™•์ธํ•˜์ง€ ์•Š๋Š” ๊ฒƒ ๊ฐ™์•„์š”? ๋‹ค์Œ ์˜ค๋ฅ˜๊ฐ€ ๋ฐœ์ƒํ•ฉ๋‹ˆ๋‹ค.

error[E0277]: the trait bound `Self: std::ops::Termination` is not satisfied
  --> src/rustc/rustc.rs:15:11
   |
15 | fn main() { rustc_driver::main() }
   |           ^^^^^^^^^^^^^^^^^^^^^^^^ the trait `std::ops::Termination` is not implemented for `Self`
   |
   = help: consider adding a `where Self: std::ops::Termination` bound

ํ•จ์ˆ˜์˜ ๋ฐ˜ํ™˜ ์œ ํ˜•์„ ํ™•์ธํ•˜๋ ค๋ฉด ๋ฌด์—‡์„ ๋ณ€๊ฒฝํ•ด์•ผ ํ•ฉ๋‹ˆ๊นŒ?

@bkchr ํ”ผ๋“œ๋ฐฑ์„ ์œ„ํ•ด https://gitter.im/rust-impl-period/WG-compiler-middle์—์„œ ์ปดํŒŒ์ผ๋Ÿฌ ์ค‘๊ฐ„ ์ž‘์—… ๊ทธ๋ฃน gitter์— ์ฐธ์—ฌํ•˜๊ณ  https์—์„œ #rust-internals IRC ์ฑ„๋„์„ ์‹œ๋„ํ•˜๋Š” ๊ฒƒ์ด ์ข‹์Šต๋‹ˆ๋‹ค. //chat.mibbit.com/?server=irc.mozilla.org%3A%2B6697&channel=%23rust-internals . :)

@bstrie ์˜ˆ ๊ฐ์‚ฌํ•ฉ๋‹ˆ๋‹ค. ์ €๋Š” ์ด๋ฏธ gitter ์ฑ„ํŒ…์— ์ฐธ์—ฌํ–ˆ์œผ๋ฉฐ ๋ฌธ์ œ๋ฅผ ํ•ด๊ฒฐํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. :)

@bkchr ๊ท€ํ•˜์˜ ๋ฌธ์ œ๋Š” ์ด ์ค„์— ์žˆ์Šต๋‹ˆ๋‹ค. ๋นŒ๋“œํ•˜๋ ค๋Š” ํŠธ๋ ˆ์ž‡ ์ฐธ์กฐ๋Š” R: Termination ์™€ ๊ฐ™์€ ๊ฒƒ์ž…๋‹ˆ๋‹ค. ์—ฌ๊ธฐ์„œ R ๋Š” ํ•จ์ˆ˜์˜ ๋ฐ˜ํ™˜ ์œ ํ˜•์ž…๋‹ˆ๋‹ค. ์ด๊ฒƒ์€ ํŠน์„ฑ์˜ ์œ ํ˜• ๋งค๊ฐœ๋ณ€์ˆ˜(์ด ๊ฒฝ์šฐ Self )๋ฅผ ๋Œ€์ฒดํ•  ๊ฐ’ ์„ธํŠธ์ธ ์ ์ ˆํ•œ "substs"๋ฅผ ๊ตฌ์ถ•ํ•˜์—ฌ ์ง€์ •๋ฉ๋‹ˆ๋‹ค.

๊ทธ๋Ÿฌ๋‚˜ ํŠธ๋ ˆ์ดํŠธ์—์„œ Substs::identity_for_item ๋ฉ”์„œ๋“œ๋ฅผ ํ˜ธ์ถœํ•˜๊ณ  ์žˆ์Šต๋‹ˆ๋‹ค. ์ด๋ ‡๊ฒŒ ํ•˜๋ฉด ํŠน์„ฑ ์ •์˜ ์ž์ฒด ๋‚ด์—์„œ ์‚ฌ์šฉํ•  ๋Œ€์ฒด ํ•ญ๋ชฉ์„ ๋‹ค์‹œ ์–ป์„ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ์ฆ‰, ์ด ๊ฒฝ์šฐ Termination ํŠธ๋ ˆ์ž‡์— ์„ ์–ธ๋œ Self ๋งค๊ฐœ๋ณ€์ˆ˜๋ฅผ Self ์— ๋งคํ•‘ํ•ฉ๋‹ˆ๋‹ค. Terminator ํŠธ๋ ˆ์ž‡ ๋‚ด์—์„œ ์ผ๋ถ€ ํ•จ์ˆ˜์˜ ์ •์˜๋ฅผ ํ™•์ธํ•˜๋Š” ๊ฒฝ์šฐ์—๋Š” ์ ์ ˆํ•˜์ง€๋งŒ ์—ฌ๊ธฐ์„œ๋Š” ๊ทธ๋‹ค์ง€ ๋งŽ์ง€ ์•Š์Šต๋‹ˆ๋‹ค.

๋Œ€์‹  ์›ํ•˜๋Š” ๊ฒƒ์€ ์ž…๋ ฅ ํ•จ์ˆ˜์˜ ๋ฐ˜ํ™˜ ์œ ํ˜•์„ ์–ป๋Š” ๊ฒƒ์ž…๋‹ˆ๋‹ค. ์ด๊ฒƒ์€ ret_ty ๋˜๋Š” actual_ret_ty ๋ณ€์ˆ˜ ์ค‘ ํ•˜๋‚˜์ผ ๋ฟ์ž…๋‹ˆ๋‹ค. ์–ด๋Š ์ชฝ์ด๋“  ๊ดœ์ฐฎ์ง€๋งŒ ret_ty ๊ฐ€ ๋” ๋‚˜์€ ๊ฒƒ ๊ฐ™์Šต๋‹ˆ๋‹ค. ์ด๋Š” ์‚ฌ์šฉ์ž ๊ฐ€ ์„ ์–ธ ํ•œ ๋ฐ˜ํ™˜ ์œ ํ˜•์— ํ•ด๋‹นํ•ฉ๋‹ˆ๋‹ค(๋ฐ˜๋ฉด actual_ret_ty ๋Š” ์‹ค์ œ ์ฝ”๋“œ ๋ฐ˜ํ™˜ ์œ ํ˜•).

tcx์—์„œ mk_substs() ๋ฉ”์†Œ๋“œ๋ฅผ ํ˜ธ์ถœํ•˜๊ธฐ๋งŒ ํ•˜๋ฉด ์›ํ•˜๋Š” ์„œ๋ธŒ์ŠคํŠธ๋ฅผ ๋งŒ๋“ค ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ์ด ๊ฒฝ์šฐ์—๋Š” type์ด๋ผ๋Š” ๋งค๊ฐœ๋ณ€์ˆ˜๊ฐ€ ํ•˜๋‚˜๋งŒ ์žˆ์œผ๋ฏ€๋กœ let substs = fcx.tcx.mk_substs(&[ret_ty]); ์™€ ๊ฐ™์€ ๊ฒƒ์ด ์ž‘๋™ํ•  ๊ฒƒ์ด๋ผ๊ณ  ์ƒ๊ฐํ•ฉ๋‹ˆ๋‹ค.

๋‚˜๋Š” ์‚ฌ์šฉํ•  ๊ฒƒ์ด tcx.mk_substs_trait(ret_ty, &[]) ๋ผ๊ณ  ์ƒ๊ฐํ•ฉ๋‹ˆ๋‹ค.

@bkchr ๋ฐฉ๊ธˆ ์ฒดํฌ์ธ -- ๊ทธ ์กฐ์–ธ์„ ์‚ฌ์šฉํ•  ๊ธฐํšŒ๊ฐ€ ์žˆ์—ˆ๋‚˜์š”? (๋˜ํ•œ ๋น ๋ฅธ ์‘๋‹ต ์„ ์œ„ํ•ด์„œ๋Š” gitter์— ๋ฌธ์˜ํ•˜๋Š” ๊ฒƒ์ด ํ˜„๋ช…ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.)

์˜ˆ, gitter๋กœ ๋ฌธ์ œ๋ฅผ ํ•ด๊ฒฐํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค :)

@bkchr ์–ด๋•Œ์š” ? ์ฒดํฌ์ธ๋งŒ ํ•˜๋ฉด ๋ฉ๋‹ˆ๋‹ค.

๊ดœ์ฐฎ์Šต๋‹ˆ๋‹ค. ์ด๋ฒˆ ์ฃผ์— ์ฝ”๋“œ๋ฅผ ์‚ดํŽด๋ณผ ์‹œ๊ฐ„์ด ์žˆ์„ ๊ฒƒ์ž…๋‹ˆ๋‹ค.

์ด ์ผ์„ ๋„์™€์ค„ ์‚ฌ๋žŒ์ด ํ•œ ๋ช… ๋” ์žˆ์Šต๋‹ˆ๊นŒ? ์ €๋Š” ์˜ฌํ•ด๊ฐ€ ๋๋‚˜๊ธฐ ์ „์— Rust ์ปค๋ฎค๋‹ˆํ‹ฐ์— ๊ธฐ์—ฌํ•˜๊ธฐ ์‹œ์ž‘ํ•˜๊ณ  ์ด ๊ธฐ๋Šฅ์„ ๋•๊ณ  ์‹ถ์Šต๋‹ˆ๋‹ค. ๋‘ ์‚ฌ๋žŒ์ด ํ•จ๊ป˜ ์ž‘์—…ํ•˜๋Š” ๊ฒƒ์ด ๋„ˆ๋ฌด ํ˜ผ๋ž€์Šค๋Ÿฝ์ง€ ์•Š๊ธฐ๋ฅผ ๋ฐ”๋ž๋‹ˆ๋‹ค.

@U007D

์ด๊ฒƒ์€ ์ž‘์€ ๊ธฐ๋Šฅ์ด๋ฉฐ @bkchr ์ด ๊ฑฐ์˜ ์™„๋ฃŒ๋˜์—ˆ์Šต๋‹ˆ๋‹ค.

์•„, ์•Œ๊ฒ ์Šต๋‹ˆ๋‹ค. ๊ฐ์‚ฌํ•ฉ๋‹ˆ๋‹ค. ๋‚ด๊ฐ€ ๋„์šธ ์ˆ˜ ์žˆ๋Š” ๋‹ค๋ฅธ ์ผ์„ ๊ณ„์† ์ฃผ์‹œํ•˜๊ฒ ์Šต๋‹ˆ๋‹ค.

@U007D https://www.rustaceans.org/findwork ๋ณด์…จ๋‚˜์š”?

@lnicola ๋„ค, ์žˆ์Šต๋‹ˆ๋‹ค! ๋‚˜๋Š” ์ผํ•  ์ˆ˜ ์žˆ๋‹ค๊ณ  ํ™•์‹ ํ•˜๋Š” ๊ฒƒ(์ฆ‰, ๊ธ์ •์ ์ธ ์‚ฌ๋žŒ์ด ๋˜๋Š” ๊ฒƒ)๊ณผ ์—ด์ •์ ์ธ ๊ฒƒ์˜ ๊ต์ฐจ์ ์—์„œ ๋ฌด์–ธ๊ฐ€๋ฅผ ์ฐพ์œผ๋ ค๊ณ  ๋…ธ๋ ฅํ•˜๊ณ  ์žˆ์Šต๋‹ˆ๋‹ค. ์†”์งํžˆ ๋งํ•ด์„œ Rust๋ฅผ ๋ฐฐ์šด ์ง€ 1๋…„ ์ •๋„ ๋์ง€๋งŒ, ์ž์›๋ด‰์‚ฌ๋ฅผ ํ•˜๊ธฐ ์œ„ํ•ด ๋‚˜์„œ๋Š” ๊ฒƒ์€ ์—ฌ์ „ํžˆ โ€‹โ€‹์กฐ๊ธˆ ๊ฒ์ด ๋‚ฉ๋‹ˆ๋‹ค. FWIW, ๊ทธ๊ฒƒ์€ ๊ฒฐ์ฝ” Rust ์ปค๋ฎค๋‹ˆํ‹ฐ์˜ ์ž˜๋ชป์ด ์•„๋‹™๋‹ˆ๋‹ค. Rust ์ปค๋ฎค๋‹ˆํ‹ฐ๋Š” ์ด๊ฒƒ์„ ๊ฐœ๋ฐฉ์ ์ด๊ณ  ํ™˜์˜ํ•˜๋ฉฐ ํฌ์šฉ์ ์ธ ๋ฌธํ™”๋กœ ๋งŒ๋“ค๊ธฐ ์œ„ํ•ด ๋’ค๋กœ ๊ตฌ๋ถ€๋ ธ์Šต๋‹ˆ๋‹ค. ๋‚ด๊ฐ€ ๊ฒฝํ—˜ํ•œ ์ตœ๊ณ ์˜ ์ฆ๊ฑฐ์›€์ž…๋‹ˆ๋‹ค. (๋‚˜๋Š” ํŒ€์ด ํ˜‘์—…๋ณด๋‹ค ๊ฒฝ์Ÿ์ ์ธ ๊ฒฝํ–ฅ์ด ์žˆ๋Š” ๊ธฐ์ˆ  ์‚ฐ์—…์—์„œ ์ˆ˜๋…„๊ฐ„์˜ ๊ฒฝํ—˜์—์„œ ๋น„๋กฏ๋œ ์˜ค๋ž˜๋œ ์ „ํˆฌ ํ‰ํ„ฐ์™€ ๋” ๊ด€๋ จ์ด ์žˆ๋‹ค๊ณ  ์ƒ๊ฐํ•ฉ๋‹ˆ๋‹ค.)

์–ด์จŒ๋“  ์˜ฌํ•ด๋Š” ๋ฌด์–ธ๊ฐ€๋ฅผ ๊ณจ๋ผ ์ ์–ด๋„ ๊ธ์ •์ ์ธ ๊ธฐ์—ฌ๋ฅผ ํ•˜๋Š” ๊ฒƒ์ด ์ œ ๋ชฉํ‘œ์ž…๋‹ˆ๋‹ค. ๋‚ด๊ฐ€ ์ฐธ์—ฌํ•  ์‹œ๊ฐ„์ด์•ผ! :)

์ œ์•ˆ ๊ฐ์‚ฌํ•ฉ๋‹ˆ๋‹ค, @lnicola. ์ข‹์€ ์ž๋ฃŒ์ž…๋‹ˆ๋‹ค.

@bkchr ์—…๋ฐ์ดํŠธ๊ฐ€ ์žˆ์Šต๋‹ˆ๊นŒ?

๋‚˜๋Š” ๊ทธ๊ฒƒ์— ์žˆ์Šต๋‹ˆ๋‹ค (https://github.com/rust-lang/rust/pull/46479). ์ด์ œ ํ’€ ๋ฆฌํ€˜์ŠคํŠธ์˜ ๋Œ“๊ธ€์—์„œ ์ž‘์—…ํ•  ํœด์ผ๊ณผ ์‹œ๊ฐ„์ด ์žˆ์Šต๋‹ˆ๋‹ค. ๋ชจ๋“  ์ง€์—ฐ์— ๋Œ€ํ•ด ์ฃ„์†กํ•ฉ๋‹ˆ๋‹ค :/

์˜ค, ์ฃ„์†กํ•ฉ๋‹ˆ๋‹ค. ํ’€ ๋ฆฌํ€˜์ŠคํŠธ๊ฐ€ ์žˆ๋‹ค๋Š” ๊ฒƒ์„ ๋ชฐ๋ž์Šต๋‹ˆ๋‹ค. ๊ต์ฐจ ์—ฐ๊ฒฐํ–ˆ์Šต๋‹ˆ๋‹ค.

์•ˆ๋…•ํ•˜์„ธ์š”, ์Œ. ๊ทธ๋ž˜์„œ ์ €๋Š” ์ œ ์ž ์žฌ์ ์ธ Rust ๊ธฐ์—ฌ์ž ๊ฒฝ๋ ฅ์„ ์ „ํ†ต๊ณผ ๋งˆ์ฐฌ๊ฐ€์ง€๋กœ ์ž์ „๊ฑฐ๋ฅผ ํƒˆ ๋•Œ ์‹œ์ž‘ํ•˜๊ฒ ๋‹ค๊ณ  ์ƒ๊ฐํ–ˆ์Šต๋‹ˆ๋‹ค. ๊ตฌ์ฒด์ ์œผ๋กœ, ์ด๊ฒƒ์— ๋Œ€ํ•ด:

  • [ ] ๋„์ž…๋˜๋Š” ํŠน์„ฑ์˜ ์ด๋ฆ„

Exit ๋Š” ์–ด๋–ป์Šต๋‹ˆ๊นŒ? ๊ธฐ์กด์˜ Rust ์–ดํœ˜์— ๋งž๋Š” ์งง๊ณ  ์š”์ ์ž…๋‹ˆ๋‹ค. ๋ช…์‚ฌ ์ถœ๊ตฌ๋Š” "๋‚ด๋ถ€์—์„œ" ํ”„๋กœ์„ธ์Šค๋ฅผ ํ†ต์ œ๋œ ๋ฐฉ์‹์œผ๋กœ ๋๋‚ด๋Š” ๋ฐ ์ต์ˆ™ํ•œ ๋™์‚ฌ์ธ exit as a ๋™์‚ฌ์˜ ์ž์—ฐ์Šค๋Ÿฌ์šด ๋Œ€์‘๋ฌผ์ž…๋‹ˆ๋‹ค.

ํŠนํžˆ C++ ํ”„๋กœ๊ทธ๋ž˜๋จธ์—๊ฒŒ "์ข…๋ฃŒ"๋Š” ๊ธฐ๋ณธ์ ์œผ๋กœ ๋น„์ •์ƒ์ ์ธ ์ข…๋ฃŒ( abort ํ˜ธ์ถœ)๋กœ ์„ค์ •๋˜๋Š” std::terminate ๋ฅผ ๋– ์˜ฌ๋ฆฌ๊ฒŒ ํ•˜๋ฉฐ ๊ธฐ๋ณธ์ ์œผ๋กœ C++๋Š” ํŒจ๋‹‰์— ํ•ด๋‹นํ•ฉ๋‹ˆ๋‹ค(๊ทธ๋Ÿฌ๋‚˜ ํŒจ๋‹‰๊ณผ ๋‹ฌ๋ฆฌ ์Šคํƒ).

์ž ๊น, ๊ทธ ์˜๊ฒฌ์„ ๋ฌด์‹œํ•˜์‹ญ์‹œ์˜ค. RFC๊ฐ€ ํ† ๋ก ์— ๋ช…์‹œ์ ์œผ๋กœ ์—ด๋ ค ์žˆ๋Š” ๊ฒƒ์ฒ˜๋Ÿผ ๋ณด์ž…๋‹ˆ๋‹ค.

๋‚˜๋Š” Exit ๋ฅผ ํŠน์„ฑ ์ด๋ฆ„์œผ๋กœ ์ข‹์•„ํ•ฉ๋‹ˆ๋‹ค.

Carrier ์—์„œ์™€ ๊ฐ™์ด ํŠน์„ฑ์ด ์•ˆ์ •ํ™”๋˜๊ธฐ ํ›จ์”ฌ ์ „์— ๊ธฐ๋Šฅ์ด ์•ˆ์ •ํ™”๋  ๊ฒƒ์ด๋ผ๊ณ  ์ƒ๊ฐํ•˜๊ณ  ์žˆ์Šต๋‹ˆ๋‹ค.

FWIW ์•ˆ์ •ํ™” ์ „์— ์ž„์‹œ ์ด๋ฆ„์ด ๋ณ€๊ฒฝ๋œ ๊ฒƒ์ด ์ •๋ง ๋‹คํ–‰์ธ ๋˜ ๋‹ค๋ฅธ ๊ฒฝ์šฐ์ž…๋‹ˆ๋‹ค :D

RFC์˜ ์ž‘์„ฑ์ž๋กœ์„œ ๋‚˜๋Š” ํŠน์„ฑ์˜ ์ด๋ฆ„์„ Exit ๋˜๋Š” ๋‹ค๋ฅธ ์–ด๋–ค ๊ฒƒ์œผ๋กœ ๋ณ€๊ฒฝํ•˜๋Š” ๋ฐ ์ด์˜๊ฐ€ ์—†์Šต๋‹ˆ๋‹ค. ๋‚˜๋Š” ํŠน๋ณ„ํžˆ ์ด๋ฆ„์„ ์ง“๋Š” ๊ฒƒ์„ ์ž˜ํ•˜์ง€ ๋ชปํ•˜๋ฉฐ ๋‹ค๋ฅธ ์‚ฌ๋žŒ์ด ๋” ๋‚˜์€ ์•„์ด๋””์–ด๋ฅผ ๊ฐ–๊ฒŒ ๋˜์–ด ๊ธฐ์ฉ๋‹ˆ๋‹ค.

https://github.com/rust-lang/rust/blob/5f7aeaf6e2b90e247a2d194d7bc0b642b287fc16/src/libstd/lib.rs#L507

ํŠน์„ฑ์ด๋ผ๊ณ  ํ•ด์•ผํ•˜๋‚˜

  1. libcore ๋Œ€์‹  libstd์— ๋ฐฐ์น˜ํ•˜๊ณ 
  2. std::ops::Termination ๊ฐ€ ์•„๋‹ˆ๋ผ std::Termination #$ ?

Result stderr ์ธ์‡„ํ•ด์•ผ ํ•˜๊ณ  libcore ์—์„œ ์ˆ˜ํ–‰ํ•  ์ˆ˜ ์—†๊ธฐ ๋•Œ๋ฌธ์— ํŠธ๋ ˆ์ดํŠธ๋ฅผ libcore ์— ๋ฐฐ์น˜ํ•  ์ˆ˜ ์—†์Šต๋‹ˆ๋‹ค.

@bkchr impl์ด libstd์— ์žˆ๋‹ค๋Š” ๊ฒƒ์ด ํŠน์„ฑ์ด libstd์—๋„ ์žˆ์–ด์•ผ ํ•œ๋‹ค๋Š” ์˜๋ฏธ๋Š” ์•„๋‹™๋‹ˆ๋‹ค.

@kennytm ์•Œ์ง€๋งŒ Result๋„ libcore์— ์ •์˜๋˜์–ด ์žˆ์œผ๋ฏ€๋กœ libstd์˜ Result์— ๋Œ€ํ•ด Termination์„ ๊ตฌํ˜„ํ•  ์ˆ˜ ์—†์Šต๋‹ˆ๋‹ค.

@zackw ํŠน์„ฑ ์ด๋ฆ„์œผ๋กœ Exit ์— ๋Œ€ํ•ด +1 ํˆฌํ‘œ

@U007D : ์ด๋Ÿฐ ๊ธ€ ๋Œ€์‹  ๋ฆฌ์•ก์…˜ ๋ฒ„ํŠผ(์˜ˆ: ๐Ÿ‘)์„ ๋ˆŒ๋Ÿฌ์ฃผ์‹ค ์ˆ˜ ์žˆ๋‚˜์š”? ๊ทธ๋ ‡๊ฒŒ ํ•˜๋ฉด ๋ถˆํ•„์š”ํ•˜๊ฒŒ ํ•‘์„ ๋ณด๋‚ด ์„ฑ๊ฐ€์‹  ๋ฌธ์ œ ๊ฐ€์ž…์ž๋ฅผ ํ”ผํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

language_feature ๊ฐ€ ํ™œ์„ฑํ™”๋œ ๊ฒฝ์šฐ libtest / libsyntax ๋ฅผ ์ฒดํฌ์ธํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๊นŒ(์ƒ์ž์—์„œ)? @arielb1 @nikomatsakis @alexcrichton

libsyntax ์˜ @bkchr์„ ์ „๋‹ฌํ•ด์•ผ ํ•  ์ˆ˜๋„ ์žˆ์ง€๋งŒ ์ด๋ก ์ ์œผ๋กœ๋Š” ๊ฐ€๋Šฅํ•˜์ง€๋งŒ ๋Ÿฐํƒ€์ž„์— libtest ์ž์ฒด์—์„œ๋Š” ํ™•์ธํ•  ์ˆ˜ ์žˆ๋‹ค๊ณ  ์ƒ๊ฐํ•˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค.

@bkchr ์—ฌ๊ธฐ ์–ด๋–ป๊ฒŒ ๊ฐ€๋‚˜์š”?

์•„์ง ์ž‘์—… ์ค‘์ด์ง€๋งŒ ํ˜„์žฌ ๋” ์ด์ƒ ์งˆ๋ฌธ์ด ์—†์Šต๋‹ˆ๋‹ค. :)

์ด impl์€ ๋„ˆ๋ฌด ์—„๊ฒฉํ•˜๋‹ค๊ณ  ์ƒ๊ฐํ•ฉ๋‹ˆ๋‹ค.

#[unstable(feature = "termination_trait", issue = "43301")]
impl<T: Termination, E: Error> Termination for Result<T, E> {
    fn report(self) -> i32 {
        match self {
            Ok(val) => val.report(),
            Err(err) => {
                print_error(err);
                exit::FAILURE
            }
        }
    }
}


#[unstable(feature = "termination_trait", issue = "43301")]
fn print_error<E: Error>(err: E) {
    eprintln!("Error: {}", err.description());

    if let Some(ref err) = err.cause() {
        eprintln!("Caused by: {}", err.description());
    }
}

Error , ๊ฐ€์žฅ ์ค‘์š”ํ•œ ๊ฒƒ์€ Box<::std::error::Error> ๋ฐ failure::Error ๋ฅผ ๊ตฌํ˜„ํ•˜์ง€ ์•Š๋Š” ๋ช‡ ๊ฐ€์ง€ ์ผ๋ฐ˜์ ์œผ๋กœ ์‚ฌ์šฉ๋˜๋Š” ์˜ค๋ฅ˜๊ฐ€ ์žˆ์Šต๋‹ˆ๋‹ค. ๋˜ํ•œ ์ด ์˜ค๋ฅ˜์˜ ํ‘œ์‹œ impl ๋Œ€์‹  description ๋ฉ”์„œ๋“œ๋ฅผ ์‚ฌ์šฉํ•˜๋Š” ๊ฒƒ๋„ ์‹ค์ˆ˜๋ผ๊ณ  ์ƒ๊ฐํ•ฉ๋‹ˆ๋‹ค.

์ด impl์„ ๋” ๋„“์€ impl๋กœ ๊ต์ฒดํ•  ๊ฒƒ์„ ์ œ์•ˆํ•ฉ๋‹ˆ๋‹ค.

#[unstable(feature = "termination_trait", issue = "43301")]
impl<T: Termination, E: Display> Termination for Result<T, E> {
    fn report(self) -> i32 {
        match self {
            Ok(val) => val.report(),
            Err(err) => {
                eprintln!("Error: {}", err)
                exit::FAILURE
            }
        }
    }
}

๊ทธ๊ฒƒ์€ ๋ถˆํ–‰ํ•œ ์›์ธ ์‚ฌ์Šฌ์„ ์žƒ์Šต๋‹ˆ๋‹ค.

์„ค๋ช…๋ณด๋‹ค ๋””์Šคํ”Œ๋ ˆ์ด ์•”์‹œ๋ฅผ ์‚ฌ์šฉํ•˜๋Š” ๊ฒƒ์ด ํ™•์‹คํžˆ ๋” ๋‚˜์€ ๋ฐฉ๋ฒ•์ž…๋‹ˆ๋‹ค.

์›์ธ ์‚ฌ์Šฌ์€ ํฅ๋ฏธ๋กœ์šด ๋ฌธ์ œ์ž…๋‹ˆ๋‹ค. ํŠนํžˆ ์ด ๊ตฌํ˜„์€ ์›์ธ ์‚ฌ์Šฌ์˜ ์ฒ˜์Œ ๋‘ ๊ตฌ์„ฑ์›๋งŒ ์ธ์‡„ํ•ฉ๋‹ˆ๋‹ค.

์‹คํŒจ๋Š” ์›์ธ ์‚ฌ์Šฌ์„ ์ฒ˜๋ฆฌํ•˜๋Š” ๋ฐฉ๋ฒ•์„ ๋‹ค๋ฃจ์–ด์•ผ ํ–ˆ๊ณ  ๊ธฐ๋ณธ์ ์œผ๋กœ ์ด ๋™์ž‘์„ ํ•ด๊ฒฐํ•ด์•ผ ํ–ˆ์Šต๋‹ˆ๋‹ค(์˜ˆ: .context ๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ ์˜ค๋ฅ˜๋ฅผ ๋นŒ๋“œํ•˜๋Š” ๊ฒฝ์šฐ:

  • {} ๋Š” ์ด ์˜ค๋ฅ˜๋งŒ ์ธ์‡„ํ•ฉ๋‹ˆ๋‹ค.
  • {:?} ๋Š” ์ด ์˜ค๋ฅ˜์™€ ๊ทธ ์›์ธ์„ ์ธ์‡„ํ•ฉ๋‹ˆ๋‹ค(์žฌ๊ท€์ ์œผ๋กœ).

์—ฌ๊ธฐ์„œ :? ๋ฅผ ์‚ฌ์šฉํ•˜๊ธฐ๋กœ ๊ฒฐ์ •ํ•˜๊ณ  Display ๋Œ€์‹  Debug๋ฅผ ๋ฐ”์ธ๋”ฉํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ๋ถˆ์•ˆ์ •ํ•œ.

์˜ˆ, ์ง€์›ํ•˜๋ ค๋ฉด impl์„ ๊ฐœ์„ ํ•ด์•ผ ํ•œ๋‹ค๋Š” ๊ฒƒ์„ ์ด๋ฏธ ์•Œ๊ณ  ์žˆ์Šต๋‹ˆ๋‹ค. ๋‚˜๋Š” ์šฐ๋ฆฌ๊ฐ€ ๋ฌด์—‡์„ ํ•  ์ˆ˜ ์žˆ๋Š”์ง€ ์—ด๋ ค ์žˆ์Šต๋‹ˆ๋‹ค. Debug ์— ๋ฐ”์ธ๋”ฉํ•˜๋Š” ๊ฒƒ์ด ์ข‹์Šต๋‹ˆ๋‹ค.

ํ , ์ด๊ฒƒ์€ ๊นŒ๋‹ค๋กœ์šด ๊ฒƒ์ž…๋‹ˆ๋‹ค. ์šฐ๋ฆฌ๊ฐ€ "์„ธ๋ จ๋œ" ํ”„๋กœ๊ทธ๋žจ์ด ์ด ํŠน์„ฑ impl์„ ์‚ฌ์šฉํ•  ๊ฒƒ์ด๋ผ๊ณ  ์ƒ๊ฐํ•˜๋Š”์ง€ ์—ฌ๋ถ€์— ๋‹ฌ๋ ค ์žˆ๋‹ค๊ณ  ์ƒ๊ฐํ•ฉ๋‹ˆ๋‹ค. ๋‚˜๋Š” "์•„๋‹ˆ์š”, ๊ทธ๋“ค์€ ๊ทธ๋ ‡์ง€ ์•Š์„ ๊ฒƒ์ž…๋‹ˆ๋‹ค"๋ผ๊ณ  ๋งํ•˜๋Š” ๊ฒƒ์ด ๊ดœ์ฐฎ๋‹ค๊ณ  ์ƒ๊ฐํ•˜๋Š” ๊ฒฝํ–ฅ์ด ์žˆ์Šต๋‹ˆ๋‹ค. ๊ธฐ๋ณธ์ ์œผ๋กœ ์„ธ๋ จ๋œ ํ”„๋กœ๊ทธ๋žจ์€ (a) ์ถœ๋ ฅ์„ ํฌ์ฐฉํ•˜์—ฌ ๋‹ค๋ฅธ ๋ฐฉ์‹์œผ๋กœ ์ฒ˜๋ฆฌํ•˜๊ฑฐ๋‚˜ (b) ์ผ๋ถ€ newtype ๋˜๋Š” ๋””๋ฒ„๊ทธ๋ฅผ ๊ตฌํ˜„ํ•˜๋Š” ๊ฒƒ์„ ์‚ฌ์šฉํ•ฉ๋‹ˆ๋‹ค. ์˜ณ์€ ๊ธธ. ์ด๊ฒƒ์€ ์œ ์šฉํ•œ ์ •๋ณด๋ฅผ ๋คํ•‘ํ•˜๊ธฐ ์œ„ํ•ด impl์„ ์ตœ์ ํ™”ํ•  ์ˆ˜ ์žˆ์ง€๋งŒ ๋ฐ˜๋“œ์‹œ ๊ฐ€์žฅ ์˜ˆ์œ ํ˜•ํƒœ( Debug ์˜ ์—ญํ• ์ฒ˜๋Ÿผ ๋ณด์ž„)๋กœ ์ตœ์ ํ™”ํ•  ์ˆ˜ ์žˆ์Œ์„ ์˜๋ฏธํ•ฉ๋‹ˆ๋‹ค.

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

@withoutboats ๋™์˜ํ•ฉ๋‹ˆ๋‹ค.

@nikomatsakis "๋ฐ˜๋“œ์‹œ ๊ฐ€์žฅ ์˜ˆ์œ ํ˜•ํƒœ๋Š” ์•„๋‹ˆ๋‹ค "๋ผ๊ณ  ๋ง์”€ํ•˜์‹  ๊ฒƒ ๊ฐ™์€๋ฐ์š”? ๊ทธ๋ ‡๋‹ค๋ฉด ์˜ˆ, ๋™์˜ํ•ฉ๋‹ˆ๋‹ค.

์—…๋ฐ์ดํŠธ: ๋ฉฐ์น  ๋™์•ˆ ์ด ์ž‘์—…์„ ์ˆ˜ํ–‰ํ•œ ํ›„ ์ „ํ™˜ํ–ˆ์Šต๋‹ˆ๋‹ค. ์•„๋ž˜๋ฅผ ์ฐธ์กฐํ•˜์‹ญ์‹œ์˜ค.

:+1: Debug , ์—ฌ๊ธฐ; ๋‚˜๋Š” https://github.com/rust-lang/rfcs/pull/1937#issuecomment -284509933์—์„œ @nikomatsakis ์˜ "์žกํžˆ์ง€ ์•Š์€ ์˜ˆ์™ธ์™€ ์œ ์‚ฌํ•œ ์ข…๋ฅ˜"๋ฅผ ์ข‹์•„ํ•ฉ๋‹ˆ๋‹ค. Debug ๋ฅผ ์ œ์•ˆํ•˜๋Š” Diggsey์˜ ์˜๊ฒฌ: https://github.com/rust-lang/rfcs/pull/1937#issuecomment -289248751

์ฐธ๊ณ ๋กœ ์ €๋Š” "๋” ์™„์„ฑ๋„ ๋†’์€" ๋Œ€ "๋” ์‚ฌ์šฉ์ž ์นœํ™”์ ์ธ" ๊ธฐ๋ณธ๊ฐ’(์˜ˆ: Debug ๋Œ€ Display ํŠน์„ฑ ๊ฒฝ๊ณ„) ๋ฌธ์ œ์— ๋Œ€ํ•ด ์„ค๋ช…ํ–ˆ์Šต๋‹ˆ๋‹ค.

TL;DR์€ ์ด์ œ ๊ฒฝ๊ณ„๋ฅผ Display ๋กœ ์„ค์ •ํ•˜์—ฌ '์•„๋ฌด๊ฒƒ๋„ ํ•˜์ง€ ์•Š๋Š”' ๊ฒฝ์šฐ์— ๋” ๊น”๋”ํ•˜๊ณ  ์š”์•ฝ ๋œ ์ถœ๋ ฅ์„ ์ œ๊ณตํ•ด์•ผ ํ•œ๋‹ค๊ณ  ์ƒ๊ฐํ•ฉ๋‹ˆ๋‹ค.

๋‚ด ๊ทผ๊ฑฐ๋Š” ๋‹ค์Œ๊ณผ ๊ฐ™์Šต๋‹ˆ๋‹ค.

termination ํŠธ๋ ˆ์ž‡์˜ RFC ๋ฌธ์ œ ์—์„œ @zackw ๋Š” Rust๊ฐ€ ์ด์ค‘ panic / Result ์‹œ์Šคํ…œ์„ ๊ฐ€์ง€๊ณ  ์žˆ๋‹ค๋Š” ์ ์„ ๊ฐ•์กฐํ•ฉ๋‹ˆ๋‹ค. ์™œ๋ƒํ•˜๋ฉด panic ๋Š” ๋ฒ„๊ทธ๋ฅผ ์œ„ํ•œ ๊ฒƒ์ด๊ณ  Result ์€

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

  • ์˜ค๋ฅ˜๋Š” ์ข…์ข… (๊ณ ์น  ์ˆ˜ ์žˆ๋Š”) ๋ฌธ์ œ(ํŒŒ์ผ์„ ์ฐพ์„ ์ˆ˜ ์—†์Œ ๋“ฑ)๊ฐ€ ์ž˜๋ชป๋˜์—ˆ์Œ์„ ์‚ฌ์šฉ์ž์—๊ฒŒ ์•Œ๋ฆฌ๊ธฐ ์œ„ํ•œ ๊ฒƒ์ด๋ผ๋Š” ์ ์—์„œ ์„ค๊ณ„์— ์˜ํ•ด ์ฒ˜๋ฆฌ๋˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค. ๋”ฐ๋ผ์„œ ์‚ฌ์šฉ ์‚ฌ๋ก€๊ฐ€ ์กด์žฌํ•˜๊ณ  ์‚ฌ์šฉ์ž๊ฐ€ ์˜๋„ํ•œ ์ฒญ์ค‘์ด๋ผ๋Š” ํ•ฉ๋ฆฌ์ ์œผ๋กœ ์ผ๋ฐ˜์ ์œผ๋กœ ๊ฐ„์ฃผ๋  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

  • @nikomatsakis ๊ฐ€ ์ง€์ ํ–ˆ๋“ฏ์ด ์šฐ๋ฆฌ๊ฐ€ ์„ ํƒํ•œ ๊ธฐ๋ณธ๊ฐ’์— ๊ด€๊ณ„์—†์ด ๋™์ž‘์„ ๋ณ€๊ฒฝํ•˜๋ ค๋Š” ๊ฐœ๋ฐœ์ž๋Š” newtype ํŒจํ„ด์„ ์‚ฌ์šฉํ•˜๊ฑฐ๋‚˜ main()์—์„œ ์‚ฌ์šฉ์ž ์ •์˜ ๊ตฌํ˜„์„ ๊ฐœ๋ฐœํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

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

$ foo
Error: Custom { kind: Other, error: StringError("returned Box<Error> from main()") }
$

๋Œ€

$ foo
Error: returned Box<Error> from main()
$

Dispay ํŠธ๋ ˆ์ž‡์€ (๋ฒ„๊ทธ์™€ ๋ฐ˜๋Œ€๋˜๋Š”) ์˜ค๋ฅ˜์— ๋Œ€ํ•œ ํ›จ์”ฌ ๋” ๋ฌธ๋ช…ํ™”๋œ ๊ธฐ๋ณธ๊ฐ’์ธ ๊ฒƒ ๊ฐ™์Šต๋‹ˆ๋‹ค. ๊ทธ๋ ‡์ง€ ์•Š์Šต๋‹ˆ๊นŒ?

@U007D ์ž ๊น, ์ด ๋‘ ๊ฐ€์ง€ ์ถœ๋ ฅ ์ค‘ ์–ด๋–ค ๊ฒƒ์„ ์„ ํ˜ธํ•˜์‹œ๋‚˜์š”?

(a) Error: Custom { kind: Other, error: StringError("returned Box<Error> from main()") }

๋˜๋Š”

(b) Error: returned Box<Error> from main()

๊ทธ๋Š” ์˜ต์…˜ (b)๋ฅผ ์„ ํ˜ธํ•ฉ๋‹ˆ๋‹ค.

@nikomatsakis ์›๋ž˜, ๋‚˜๋Š” a) Debug ๋ฅผ ๋‚ด ๋จธ๋ฆฌ ์†์˜ ๊ฐœ๋…์œผ๋กœ ๊ดœ์ฐฎ์•˜์ง€๋งŒ ์‹ค์ œ๋กœ ๋ฉฐ์น  ๋™์•ˆ ์ž‘์—…ํ•œ ํ›„์— ์‹ค์ œ๋กœ ์ถœ๋ ฅ์„ ๋ณด๊ณ  b) Display ๋ฅผ ์„ ํ˜ธํ–ˆ์Šต๋‹ˆ๋‹ค. ๊ธฐ๋ณธ๊ฐ’. ์—ฐ์‡„ ์˜ค๋ฅ˜๋ฅผ ๋ชจ๋ธ๋งํ•˜๋Š” ๊ฒฝ์šฐ b)์— ๋Œ€ํ•œ ์„ ํ˜ธ๋„๊ฐ€ ํ›จ์”ฌ ๋” ๋šœ๋ ทํ•ด์งˆ ๊ฒƒ์ด๋ผ๊ณ  ์ƒ๊ฐํ•ฉ๋‹ˆ๋‹ค.

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

๊ทธ๋Ÿฐ ๊ฒฝ์šฐ ๋‚˜์—๊ฒŒ "์ตœ์†Œํ•œ์˜ ๋†€๋ผ์›€"์€ unwrap ์™€ ๊ฐ™์€ ๊ฐœ๋ฐœ์ž ์ง€ํ–ฅ ์ถœ๋ ฅ์ž…๋‹ˆ๋‹ค.

๊ธด ์˜ค๋ฅ˜์— ๋Œ€ํ•œ ์šฐ๋ ค๊ฐ€ ์žˆ๋Š” ๊ฒฝ์šฐ ์—ฌ๊ธฐ์—์„œ {:#?} ์— ๋Œ€ํ•ด ๋…ผ์˜ํ•  ๊ฐ€์น˜๊ฐ€ ์žˆ์Šต๋‹ˆ๊นŒ?

์ตœ์ข… ์‚ฌ์šฉ์ž๋ฅผ ์œ„ํ•œ ์˜ค๋ฅ˜ ๋ณด๊ณ ๋Š” ๋ชจ๋“  ๋„๊ตฌ์™€ ๋ชจ๋“  ์‚ฌ์šฉ ์‚ฌ๋ก€์— ๋”ฐ๋ผ ๋‹ค๋ฅด์ง€๋งŒ ๊ฐœ๋ฐœ์ž๋ฅผ ์œ„ํ•œ ์˜ค๋ฅ˜ ๋ณด๊ณ ๋Š” Rust๊ฐ€ .unwrap() ์™€ ๊ฐ™์€ ๋‹ค๋ฅธ ์ƒํ™ฉ์—์„œ ํ•˜๋Š” ๊ฒƒ๊ณผ ์œ ์‚ฌํ•ด์•ผ ํ•ฉ๋‹ˆ๋‹ค. ๊ธฐ๋ณธ๊ฐ’์€ ํ•˜๋‚˜๋งŒ ์žˆ์„ ์ˆ˜ ์žˆ๊ณ  ์„ธ๋ จ๋œ ์†Œํ”„ํŠธ์›จ์–ด๋Š” ์–ด์จŒ๋“  ์ถœ๋ ฅ์„ ์žฌ์ •์˜ํ•ด์•ผ ํ•˜๋ฏ€๋กœ Debug ๊ฐ€ ์žˆ๋Š” ๊ฐœ๋ฐœ์ž ์ค‘์‹ฌ์˜ ๊ธฐ๋ณธ๊ฐ’์— ํˆฌํ‘œํ•ฉ๋‹ˆ๋‹ค.

์ด ํ† ๋ก ์˜ ํ•ต์‹ฌ์€ ์ •๋ง "๊ธฐ๋ณธ ๋ฉ”์‹œ์ง€์˜ ๋Œ€์ƒ ๋…์ž๋Š” ๋ˆ„๊ตฌ์ž…๋‹ˆ๊นŒ?"๋ผ๊ณ  ์ƒ๊ฐํ•ฉ๋‹ˆ๋‹ค.

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

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

์˜ˆ, ๋‘ ๊ทธ๋ฃน์— ๋Œ€ํ•œ ํ•ฉ๋ฆฌ์ ์ธ ์ธ์ˆ˜๋ฅผ ๊ธฐ๋ณธ ๋Œ€์ƒ์œผ๋กœ ํ™•์‹คํžˆ ๋ณผ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ๋‚ด ์ƒ๊ฐ์— ์–ด๋–ค ์ฒญ์ค‘์ด ๊ธฐ๋ณธ ๋Œ€์ƒ์ด์–ด์•ผ ํ•˜๋Š”์ง€์— ๋Œ€ํ•œ ๊ฐ•๋ ฅํ•œ ํ•ฉ์˜๊ฐ€ ์ด๋ฃจ์–ด์ง€๋ฉด ํŠน์„ฑ ๊ฒฝ๊ณ„์— ๋Œ€ํ•œ ์„ ํƒ์ด ๋ช…ํ™•ํ•ด์งˆ ๊ฒƒ์ž…๋‹ˆ๋‹ค(์–ด)... :)

(๋‚˜๋Š” ์ด ์ „์ฒด ์ฃผ์ œ์— ์ •ํ†ตํ•˜์ง€ ์•Š์ง€๋งŒ) Termination ๊ฐ€ ํฌํ•จ๋œ ๊ธฐ๋ณธ ์˜ค๋ฅ˜ ์ถœ๋ ฅ์ด ์‚ฌ์šฉ์ž๊ฐ€ ํ‘œ์‹œํ•  ์ˆ˜ ์žˆ๋Š” ํ˜•์‹์ด๋ผ๋ฉด ์™„๋ฒฝํ•˜๊ฒŒ ์ ์ ˆํ•œ ์ž‘์€ ์œ ํ‹ธ๋ฆฌํ‹ฐ๊ฐ€ ์žˆ์„ ์ˆ˜ ์žˆ๋‹ค๋Š” ๊ฒƒ์€ ์ƒ์ƒํ•  ์ˆ˜ ์—†์Šต๋‹ˆ๋‹ค. Display ์ฒ˜๋Ÿผ? ์ด ๊ฒฝ์šฐ ์ž‘์„ฑ์ž๊ฐ€ "๋งž์ถค ์ฒ˜๋ฆฌ"์— ๋„๋‹ฌํ•ด์•ผ ํ•˜๋Š” ์œ ์ผํ•œ ์ด์œ ๋Š” ์šฐ๋ฆฌ๊ฐ€ ๋งŒ๋“ค ์ˆ˜ ์žˆ๊ธฐ ๋•Œ๋ฌธ์ž…๋‹ˆ๋‹ค.

๋ˆ„๊ตฐ๊ฐ€ ๊ฐ ๊ฒฝ์šฐ์— ์ถœ๋ ฅ์ด ์–ด๋–ป๊ฒŒ ๋ณด์ด๋Š”์ง€์— ๋Œ€ํ•œ ์˜ˆ๋ฅผ ์ œ๊ณตํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๊นŒ(์‚ฌ์šฉ๋œ ํŠน์ • E ์œ ํ˜•์— ๋”ฐ๋ผ ๋‹ค๋ฅด๋‹ค๊ณ  ๊ฐ€์ •ํ•˜๊ณ  ์žˆ์Šต๋‹ˆ๊นŒ?), ๊ทธ๋ฆฌ๊ณ  ์ž‘์„ฑ์ž๊ฐ€ "์‚ฌ์šฉ์ž ์ •์˜ ์ฒ˜๋ฆฌ"๋ฅผ ์›ํ•  ๊ฒฝ์šฐ ์‹ค์ œ๋กœ ์ทจํ•ด์•ผ ํ•˜๋Š” ๋‹จ๊ณ„๋Š” ๋ฌด์—‡์ž…๋‹ˆ๊นŒ? ๋Œ€์‹ ์—? ๋‚˜๋Š” ๋‹จ์ง€ ์œ„์˜ ๊ฐ€์ •์„ ํ•  ๊ฒƒ์ž…๋‹ˆ๋‹ค.

(์ถœ๋ ฅ์ด ๋ฌธ์ž ๊ทธ๋Œ€๋กœ ์œ„์— @U007D๋ฅผ ๋ถ™์—ฌ๋„ฃ์€ ๊ฒƒ๊ณผ ๊ฐ™์Šต๋‹ˆ๊นŒ? "๋ฐ˜ํ™˜๋œ Box\"๊ฐ€ ์ธ์‡„๋˜๋Š” ์ด์œ ๋Š” ๋ฌด์—‡์ž…๋‹ˆ๊นŒ?์ƒ์ž<์˜ค๋ฅ˜>?)

์˜ค๋ฅ˜ ๋ฉ”์‹œ์ง€์˜ Display ๊ฐ€ ์–ผ๋งˆ๋‚˜ ์ž์ฃผ ์‚ฌ์šฉ์ž์—๊ฒŒ ์นœ์ˆ™ํ•ฉ๋‹ˆ๊นŒ? ์˜ˆ๋ฅผ ๋“ค์–ด ๋‹ค์Œ ํ”„๋กœ๊ทธ๋žจ:

fn main() {
    if let Err(e) = std::fs::File::open("foo") {
        println!("{}", e)
    }
}

๋‹ค์Œ ๋ฉ”์‹œ์ง€๋ฅผ ๋‚ด๋ณด๋ƒ…๋‹ˆ๋‹ค.

No such file or directory (os error 2)

ํŠนํžˆ ํŒŒ์ผ ์ด๋ฆ„์ด ์–ธ๊ธ‰๋˜์ง€ ์•Š์€ ๊ฒฝ์šฐ์—๋Š” ํ›Œ๋ฅญํ•œ UX๊ฐ€ ์•„๋‹™๋‹ˆ๋‹ค. ์ ์–ด๋„ ํ”„๋กœ๊ทธ๋žจ์ด ๋ฌธ์ž ๊ทธ๋Œ€๋กœ ๋‹จ์ผ ํŒŒ์ผ ์ด๋ฆ„์„ ์ž…๋ ฅ์œผ๋กœ ์‚ฌ์šฉํ•˜์ง€ ์•Š๋Š” ํ•œ ๊ทธ๋ ‡์ง€ ์•Š์Šต๋‹ˆ๋‹ค. ๋ฐ˜๋ฉด์— ์†Œ์Šค ํŒŒ์ผ/๋ผ์ธ ๋ฒˆํ˜ธ/์Šคํƒ ์ถ”์ ์ด ๋ˆ„๋ฝ๋˜์–ด ๊ฐœ๋ฐœ์ž ๊ฒฝํ—˜๋„ ์ข‹์ง€ ์•Š์Šต๋‹ˆ๋‹ค. Debug ์ถœ๋ ฅ์€ ๋ถ„๋ช…ํžˆ ํ›จ์”ฌ ๋” ๋‚˜์œ ์‚ฌ์šฉ์ž ๊ฒฝํ—˜์ด๋ฉฐ ๊ฐ์†๊ธฐ์—๊ฒŒ๋„ ์œ ์šฉํ•œ ์ •๋ณด๋ฅผ ์ถ”๊ฐ€ํ•˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค.

๊ทธ๋ž˜์„œ ๋‚ด๊ฐ€ ๋งํ•˜๋ ค๋Š” ๊ฒƒ์€ ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ ์˜ค๋ฅ˜ ์ž์ฒด์˜ ์ •๋ณด ๋‚ด์šฉ์„ ๊ฐœ์„ ํ•˜์ง€ ์•Š๊ณ ๋Š” Debug ๋„ Display ๋„ ์ข‹์ง€ ์•Š๋‹ค๋Š” ๊ฒƒ์ž…๋‹ˆ๋‹ค.

์ถœ๋ ฅ์ด ๋ฌธ์ž ๊ทธ๋Œ€๋กœ ์œ„์— @U007D๋ฅผ ๋ถ™์—ฌ๋„ฃ์€ ๊ฒƒ๊ณผ ๊ฐ™์Šต๋‹ˆ๊นŒ? ์™œ "returned Boxfrom main()" ๋Œ€์‹ ... ํ•ด๋‹น ์ƒ์ž์˜ ์‹ค์ œ ๋‚ด์šฉ?

@glaebhoerl ๋‹น์‹ ์ด ๋งž์Šต๋‹ˆ๋‹ค. ์ด ๊ฒฝ์šฐ " Box<Error> ์˜ ์‹ค์ œ ๋‚ด์šฉ"์€ termination_trait ๋ฅผ ํ…Œ์ŠคํŠธํ•˜๊ธฐ ์œ„ํ•ด ๋งŒ๋“  ์‚ฌ์šฉ์ž ์ •์˜ message ํ•„๋“œ ์˜€์Šต๋‹ˆ๋‹ค . . ๋Œ€์‹ ์— "foo bar baz" ๋˜๋Š” ๋‹ค๋ฅธ ๊ฒƒ์„ ์ž‘์„ฑํ•  ์ˆ˜ ์žˆ์—ˆ์Šต๋‹ˆ๋‹ค(๊ทธ๋Ÿฌ๋‚˜ ์ปดํŒŒ์ผ๋Ÿฌ ํ…Œ์ŠคํŠธ๋ฅผ ์‹คํ–‰ํ•˜๋Š” ์‚ฌ์šฉ์ž์—๊ฒŒ๋Š” ์œ ์šฉํ•˜์ง€ ์•Š์•˜์„ ์ˆ˜ ์žˆ์Œ).

@jdahlstrom ์˜ ์˜ˆ๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ ๋‹ค์Œ์€ Box ed ํ‘œ์ค€ ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ "file not found" Error ์— ๋Œ€ํ•œ ์‹ค์ œ ์ถœ๋ ฅ์ž…๋‹ˆ๋‹ค(์ฐธ๊ณ ๋กœ, ์˜ฌ๋ฐ”๋ฅด๊ฒŒ ์ง€์ ํ–ˆ๋“ฏ์ด ๊ถŒํˆฌ์— ๋Œ€ํ•œ ์–ธ๊ธ‰์€ ์–ด๋””์—๋„ ์—†์Œ).
Debug :

$ foo
Error { repr: Os { code: 2, message: "No such file or directory" } }
$

๋ฐ Display :

$ foo
No such file or directory (os error 2)
$

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

Display ๋ฅผ ๊ฐœ๋ฐœ์ž์—๊ฒŒ ์ œ๊ณตํ•˜๋Š” ๊ฒƒ์€ Debug ์˜ ๋ชจ๋“  ๋‹จ์  ๊ณผ ํ•จ๊ป˜ ํ‘œ์‹œ๋˜๋Š” ์˜ค๋ฅ˜ ์œ ํ˜•์˜ ํŠน์ •์„ฑ์„ ๋†“์น˜๋Š” ๊ฒƒ์ž…๋‹ˆ๋‹ค.

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

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

#[test] ? ์— ๋Œ€ํ•œ ์ง€์›์„ ๊ตฌํ˜„ํ•˜๋Š” ๋ฐ ๋„์›€์ด ํ•„์š”ํ•ฉ๋‹ˆ๋‹ค. ๋‚ด ํ˜„์žฌ ๊ตฌํ˜„์€ ์—ฌ๊ธฐ์—์„œ ์ฐพ์„ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค: https://github.com/rust-lang/rust/compare/master...bkchr :termination_trait_in_tests

๋‚ด ๋ณ€๊ฒฝ ์‚ฌํ•ญ์œผ๋กœ ํ…Œ์ŠคํŠธ๋ฅผ ์ปดํŒŒ์ผํ•˜๋ฉด ๋‹ค์Œ ์˜ค๋ฅ˜๊ฐ€ ๋ฐœ์ƒํ•ฉ๋‹ˆ๋‹ค.

error: use of unstable library feature 'test' (see issue #27812)
  |
  = help: add #![feature(test)] to the crate attributes to enable

@eddyb ๋Š” quote_item!/expr! ๊ฐ€ ๋ ˆ๊ฑฐ์‹œ์ด๊ธฐ ๋•Œ๋ฌธ์— ๋” ์ด์ƒ ์‚ฌ์šฉํ•˜์ง€ ๋ง์•„์•ผ ํ•œ๋‹ค๊ณ  ๋งํ–ˆ์Šต๋‹ˆ๋‹ค.
์ด์ œ ๋ฌด์—‡์„ ํ•ด์•ผ ํ•ฉ๋‹ˆ๊นŒ, ์ƒˆ๋กœ์šด quote! ๋งคํฌ๋กœ๋กœ ์ „ํ™˜ํ•˜๊ฑฐ๋‚˜ ๋ชจ๋“  ๊ฒƒ์„ ์ˆ˜๋™ ast ๊ฑด๋ฌผ๋กœ ์žฌ์ž‘์—…ํ•ด์•ผ ํ•ฉ๋‹ˆ๊นŒ?

๋‚˜๋Š” ์–ด๋–ค ๋„์›€์„ ์ฃผ์…”์„œ ๊ฐ์‚ฌํ•ฉ๋‹ˆ๋‹ค :)

libtest ์— ์ •์˜๋œ ์ผ๋ถ€ ๋งคํฌ๋กœ์— ๋Œ€ํ•œ ๋งคํฌ๋กœ ํ˜ธ์ถœ์„ ์ƒ์„ฑํ•˜๋Š” ๊ฒƒ์€ ๋งค์šฐ ์ž˜ ์ž‘๋™ํ•  ์ˆ˜ ์žˆ๋‹ค๊ณ  ์ƒ๊ฐํ•ฉ๋‹ˆ๋‹ค.

@eddyb ์—ฌ๊ธฐ์—์„œ ๊ท€ํ•˜์˜ ์ œ์•ˆ์„ ์ดํ•ดํ–ˆ๋Š”์ง€ ์ž˜ ๋ชจ๋ฅด๊ฒ ์Šต๋‹ˆ๋‹ค.

libtest์— ์ •์˜๋œ ์ผ๋ถ€ ๋งคํฌ๋กœ์— ๋Œ€ํ•œ ๋งคํฌ๋กœ ํ˜ธ์ถœ์„ ์ƒ์„ฑํ•˜๋Š” ๊ฒƒ์ด ๋งค์šฐ ์ž˜ ์ž‘๋™ํ•  ์ˆ˜ ์žˆ๋‹ค๊ณ  ์ƒ๊ฐํ•ฉ๋‹ˆ๋‹ค.

์˜ค, ์•„๋งˆ ํ•  ๊ฒƒ ๊ฐ™์•„์š”. libtest์—์„œ ๋งคํฌ๋กœ๋ฅผ ์ •์˜ํ•œ ๋‹ค์Œ ์ด๋ฅผ ํ˜ธ์ถœํ•˜๋Š” ์ฝ”๋“œ๋ฅผ ์ƒ์„ฑํ•œ๋‹ค๋Š” ๋ง์”€์ด์‹ ๊ฐ€์š”? ํฅ๋ฏธ๋กœ์šด ์•„์ด๋””์–ด์ž…๋‹ˆ๋‹ค. ๊ทธ ๋งคํฌ๋กœ ์ด๋ฆ„์ด ์ผ์ข…์˜ "๋ˆ„์ถœ"์ด ๋˜์ง€ ์•Š์Šต๋‹ˆ๊นŒ? (์ฆ‰, libtest์˜ ๊ณต์šฉ ์ธํ„ฐํŽ˜์ด์Šค์˜ ์ผ๋ถ€๊ฐ€ ๋ฉ๋‹ˆ๊นŒ?)


@bkchr

๋‚ด ๋ณ€๊ฒฝ ์‚ฌํ•ญ์œผ๋กœ ํ…Œ์ŠคํŠธ๋ฅผ ์ปดํŒŒ์ผํ•˜๋ฉด ๋‹ค์Œ ์˜ค๋ฅ˜๊ฐ€ ๋ฐœ์ƒํ•ฉ๋‹ˆ๋‹ค.

ํ•ด๋‹น ์˜ค๋ฅ˜๊ฐ€ ์ƒ์„ฑ๋˜๋Š” ์ด์œ ๋ฅผ ์•Œ๊ณ  ์žˆ์Šต๋‹ˆ๊นŒ? diff๋ฅผ ์ฝ๋Š” ๊ฒƒ๋งŒ์œผ๋กœ๋Š” ๊ทธ๋ ‡์ง€ ์•Š์ง€๋งŒ ๋กœ์ปฌ์—์„œ ๋นŒ๋“œํ•˜๊ณ  ์•Œ์•„๋‚ผ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

quote_item!/expr! ๋Š” ๋” ์ด์ƒ ์‚ฌ์šฉํ•˜๋ฉด ์•ˆ ๋ฉ๋‹ˆ๋‹ค. ๋ ˆ๊ฑฐ์‹œ์ด๊ธฐ ๋•Œ๋ฌธ์ž…๋‹ˆ๋‹ค.

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

์ˆ˜๋™ AST ๊ตฌ์ถ•์€ ํ™•์‹คํžˆ ๊ณ ํ†ต์Šค๋Ÿฝ์Šต๋‹ˆ๋‹ค. ํ•˜์ง€๋งŒ ์ด๋ฅผ ์œ„ํ•œ ๋„์šฐ๋ฏธ๊ฐ€ ์žˆ๋‹ค๊ณ  ์ƒ๊ฐํ•ฉ๋‹ˆ๋‹ค.

๋Œ€๋ถ€๋ถ„ ์•ฝ๊ฐ„๋งŒ ์ˆ˜์ •ํ•˜๋ฉด ๋ฉ๋‹ˆ๋‹ค. ๊ทธ๋ ‡์ฃ ? ์ฆ‰, ํ•จ์ˆ˜ ํ˜ธ์ถœ์—์„œ report() ๊ฒฐ๊ณผ ํ…Œ์ŠคํŠธ๋กœ ๋ณ€๊ฒฝ?

์ถ”์‹ , ์šฐ๋ฆฌ๋Š” Termination ํŠธ๋ ˆ์ž‡์ด ๋ฒ”์œ„์— ์žˆ๋Š” ๊ฒƒ์„ ํ”ผํ•˜๊ธฐ ์œ„ํ•ด .report() ํ‘œ๊ธฐ๋ฒ•์„ ์‚ฌ์šฉํ•˜๋Š” ๋Œ€์‹  Termination::report(...) ์™€ ๊ฐ™์€ ๊ฒƒ์„ ์ƒ์„ฑํ•˜๊ธฐ๋ฅผ ์›ํ•  ๊ฒƒ์ž…๋‹ˆ๋‹ค.

์•„๋‹ˆ์š”, ๊ทธ ์˜ค๋ฅ˜๊ฐ€ ์–ด๋””์—์„œ ์™”๋Š”์ง€ ์ „ํ˜€ ๋ชจ๋ฆ…๋‹ˆ๋‹ค :(

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

ํ , ํ…Œ์ŠคํŠธ๋Š” ์ด๋ฏธ ๋‹ค๋ฅธ ๊ฒƒ์„ ๊ฐ€์ ธ์˜ค๊ธฐ ๋•Œ๋ฌธ์— Termination ํŠธ๋ ˆ์ž‡์„ ๊ฐ€์ ธ์˜ค๋Š” ๊ฒƒ๋„ ๊ทธ๋ ‡๊ฒŒ ๋ณต์žกํ•˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค.

@alexcrichton ์ด ์˜ค๋ฅ˜์˜ ์ถœ์ฒ˜๊ฐ€ ์–ด๋””์ธ์ง€ ์•Œ๊ณ  ์žˆ์Šต๋‹ˆ๊นŒ?

@nikomatsakis libtest ๋ถˆ์•ˆ์ •ํ•˜๊ณ  ๋งคํฌ๋กœ๋„ ๋ถˆ์•ˆ์ •ํ•˜๋‹ค๊ณ  ํ‘œ์‹œํ•  ์ˆ˜ ์—†๋‚˜์š”?

@eddyb ์˜ค, ์ข‹์€ ์ง€์ ์ž…๋‹ˆ๋‹ค.

RFC๋Š” ์›๋ž˜ ํ…Œ์ŠคํŠธ ํ•จ์ˆ˜๋ฅผ ํ˜ธ์ถœํ•˜๋Š” ๋ž˜ํผ ํ•จ์ˆ˜๋ฅผ โ€‹โ€‹์ƒ์„ฑํ•˜๋„๋ก ์ œ์•ˆํ–ˆ์Šต๋‹ˆ๋‹ค. ๊ทธ๊ฒƒ์ด ํ˜„์žฌ ๋‚˜์˜ ๋ฐฉ๋ฒ•์ด๊ธฐ๋„ ํ•˜๋‹ค.

๋ž˜ํผ ๊ธฐ๋Šฅ์ด ๊ดœ์ฐฎ์€ ๊ฒƒ ๊ฐ™์Šต๋‹ˆ๋‹ค.

@eddyb ๋งคํฌ๋กœ๋ฅผ ์‚ฌ์šฉํ•˜๋ฉด libtest create_test ์™€ ๊ฐ™์€ ๊ฒƒ์„ ์˜๋ฏธํ•ฉ๋‹ˆ๊นŒ? ๊ทธ๋Ÿฌ๋‚˜ ๋‚ด๊ฐ€ ์ดํ•ดํ•˜์ง€ ๋ชปํ•˜๋Š” ๊ฒƒ์€ "๋งคํฌ๋กœ๋ฅผ ๋ถˆ์•ˆ์ •ํ•œ ๊ฒƒ์œผ๋กœ ํ‘œ์‹œ"์ž…๋‹ˆ๋‹ค. ๊ทธ๊ฑธ๋กœ ๋ญ˜ ํ•˜๋ ค๋Š” ๊ฒ๋‹ˆ๊นŒ? ์˜ˆ๋ฅผ ๋“ค์–ด์ฃผ์‹œ๊ฒ ์Šต๋‹ˆ๊นŒ?

@bkchr ๋งคํฌ๋กœ ์ •์˜์— #[unstable(...)] ์†์„ฑ ์ถ”๊ฐ€, ์˜ˆ: https://github.com/rust-lang/rust/blob/3a39b2aa5a68dd07aacab2106db3927f666a485a/src/libstd/thread/local.rs#L159

๋”ฐ๋ผ์„œ ์ด ์ฒซ ๋ฒˆ์งธ ํ™•์ธ๋ž€์„ ์„ ํƒํ•ด์•ผ ํ•ฉ๋‹ˆ๊นŒ?

RFC ๊ตฌํ˜„

...์—ฐ๊ฒฐ๋œ PR์ด ๋ณ‘ํ•ฉ๋˜์—ˆ๋Š”์ง€ ํ™•์ธํ•˜์‹œ๊ฒ ์Šต๋‹ˆ๊นŒ?

@ErichDonGubler ์™„๋ฃŒ :)

ํ , ํ˜„์žฌ ๋ณ‘ํ•ฉ๋œ pr๋กœ ๊ตฌํ˜„๋˜๋Š” ๊ฒƒ์€ ์ ˆ๋ฐ˜์˜ rfc๋ฟ์ž…๋‹ˆ๋‹ค ^^

3๊ฐœ์˜ ์ฒดํฌ๋ฐ•์Šค๋กœ ๊ตฌ๋ถ„๋ฉ๋‹ˆ๋‹ค :)

main ์—์„œ ์ด ๊ธฐ๋Šฅ์„ ์‚ฌ์šฉํ•˜๋ ค๊ณ  ์‹œ๋„ํ–ˆ์ง€๋งŒ ๊ฝค ์‹ค๋ง์Šค๋Ÿฌ์› ์Šต๋‹ˆ๋‹ค. ์ข…๋ฃŒ ํŠน์„ฑ์˜ ๊ธฐ์กด impls๋Š” ์—ฌ๋Ÿฌ ์ข…๋ฅ˜์˜ ์˜ค๋ฅ˜๋ฅผ ํŽธ๋ฆฌํ•˜๊ฒŒ "๋ˆ„์ "ํ•˜๋Š” ๊ฒƒ์„ ํ—ˆ์šฉํ•˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค. ์˜ˆ๋ฅผ ๋“ค์–ด Error ๋ฅผ ๊ตฌํ˜„ํ•˜์ง€ ์•Š๊ธฐ ๋•Œ๋ฌธ์— failure::Fail ๋ฅผ ์‚ฌ์šฉํ•  ์ˆ˜ ์—†์Šต๋‹ˆ๋‹ค. Error ; ๊ฐ™์€ ์ด์œ ๋กœ Box<Error> ์‚ฌ์šฉํ•  ์ˆ˜ ์—†์Šต๋‹ˆ๋‹ค. Debug ๋กœ ๋ณ€๊ฒฝํ•˜๋Š” ๊ฒƒ์„ ์šฐ์„ ์‹œํ•ด์•ผ ํ•œ๋‹ค๊ณ  ์ƒ๊ฐํ•ฉ๋‹ˆ๋‹ค. =)

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

termination_trait ๋ฅผ ์‚ฌ์šฉํ•˜๋ ค๊ณ  ํ•  ๋•Œ์™€ ๋˜‘๊ฐ™์€ ์ขŒ์ ˆ๊ฐ์„ ๋Š๊ผˆ์Šต๋‹ˆ๋‹ค.

๊ทธ๊ฒƒ์€ ์ปดํŒŒ์ผ๋Ÿฌ ํ•ดํ‚น์— ๋Œ€ํ•œ ๊ท€ํ•˜์˜ ๊ฒŒ์‹œ๋ฌผ๊ณผ ๊ฒฐํ•ฉํ•˜์—ฌ ์ด๋ฒˆ ๋‹ฌ ์ดˆ์— ์ด ๋ฌธ์ œ๋ฅผ ํ•ด๊ฒฐํ•˜๋„๋ก ์˜๊ฐ์„ ์ฃผ์—ˆ์Šต๋‹ˆ๋‹ค. https://github.com/rust-lang/rust/pull/47544 ์— ํ…Œ์ŠคํŠธ์™€ ํ•จ๊ป˜ Display (๋ฐ ์ด์ „ ์ปค๋ฐ‹์˜ Debug )์— ๋Œ€ํ•œ impl์„ ๊ฒŒ์‹œํ–ˆ์Šต๋‹ˆ๋‹ค. (์•„์ฃผ ์‚ฌ์†Œํ•˜์ง€๋งŒ ์—ฌ์ „ํžˆ ๋‚ด ์ฒซ ๋ฒˆ์งธ Rust ์ปดํŒŒ์ผ๋Ÿฌ PR์ž…๋‹ˆ๋‹ค! :tada:) :)

๋‚ด ์ดํ•ด๋Š” lang ํŒ€์ด ์–ด๋–ค ํŠน์„ฑ์„ ์‚ฌ์šฉํ•  ๊ฒƒ์ธ์ง€์— ๋Œ€ํ•ด ์ „ํ™”๋ฅผ ๊ฑธ ๊ฒƒ์ด์ง€๋งŒ ์–ด๋Š ์ชฝ์ด๋“  ๊ตฌํ˜„ ์ค€๋น„๊ฐ€ ๋˜์—ˆ๋‹ค๋Š” ๊ฒƒ์ž…๋‹ˆ๋‹ค.

์—ฌ์ „ํžˆ ๊ด€์‹ฌ์ด ์žˆ๋Š” ์งˆ๋ฌธ: ๊ธฐ๋ณธ ์˜ค๋ฅ˜ ๋ฉ”์‹œ์ง€ ์ถœ๋ ฅ( Debug ๋˜๋Š” Display )์— ์˜์กดํ•˜๊ณ  ์‹ถ์ง€ ์•Š๊ณ  ๋Œ€์‹  ์ž์‹ ๋งŒ์˜ ์˜ค๋ฅ˜ ๋ฉ”์‹œ์ง€๋ฅผ ์›ํ•œ๋‹ค๊ณ  ๊ฐ€์ •ํ•ด ๋ณด๊ฒ ์Šต๋‹ˆ๋‹ค. ์–ด๋–ป๊ฒŒ ํ•ฉ๋‹ˆ๊นŒ? ์ €๊ฒƒ? (์ด๋ฏธ ์–ด๋”˜๊ฐ€์— ์ ์–ด๋‘์–ด์„œ ๋†“์ณค๋‹ค๋ฉด ์ฃ„์†กํ•ฉ๋‹ˆ๋‹ค.) ? -in- main ์‚ฌ์šฉ์„ ์™„์ „ํžˆ ์ค‘๋‹จํ•  ํ•„์š”๋Š” ์—†๊ฒ ์ฃ ? ์ž์‹ ์˜ ๊ฒฐ๊ณผ ๋ฐ/๋˜๋Š” ์˜ค๋ฅ˜ ์œ ํ˜• ๋ฐ/๋˜๋Š” impl ๋ฅผ ์ž‘์„ฑํ•˜๋Š” ๊ฒƒ๊ณผ ๊ฐ™์Šต๋‹ˆ๋‹ค. ( ? -in- main ๊ฐ€ ์žฅ๋‚œ๊ฐ์— ๋ถˆ๊ณผ ํ•˜๊ณ  "์ง„์ง€ํ•˜๊ฒŒ" ํ•˜๊ณ  ์‹ถ๋‹ค๋ฉด ์ธ์ฒด๊ณตํ•™์ ์ด์ง€ ์•Š์€ ๋ฐฉ์‹์œผ๋กœ ๋Œ์•„๊ฐ€์•ผ ํ•œ๋‹ค๋Š” ๊ฒƒ์ด ๋‚˜์—๊ฒŒ๋Š” ๋ถˆํ–‰ํ•œ ์ผ์ธ ๊ฒƒ ๊ฐ™์Šต๋‹ˆ๋‹ค.)

@glaebhoerl ๋งค์šฐ ๊ฐ„๋‹จํ•ฉ๋‹ˆ๋‹ค.

  1. ์ƒˆ ์œ ํ˜•์„ ๋งŒ๋“ญ๋‹ˆ๋‹ค.
  2. From ์ด์ „ ์˜ค๋ฅ˜ ์œ ํ˜•์„ ๊ตฌํ˜„ํ•˜์‹ญ์‹œ์˜ค.
  3. Debug (๋˜๋Š” Display )๋ฅผ ๊ตฌํ˜„ํ•ฉ๋‹ˆ๋‹ค.
  4. main ์˜ ์„œ๋ช…์—์„œ ์œ ํ˜•์„ ๋ฐ”๊ฟ‰๋‹ˆ๋‹ค.

๊ฐ์‚ฌ ํ•ด์š”!

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

@glaebhoerl ์ด๊ฒƒ์ด Result impl์ด Debug Display ๋ฅผ ์‚ฌ์šฉํ•ด์•ผ ํ•˜๋Š” ์ด์œ ์ž…๋‹ˆ๋‹ค.

Termination ํŠธ๋ ˆ์ž‡์— message ๋˜๋Š” error_message ๋˜๋Š” ์ด์™€ ์œ ์‚ฌํ•œ ์ถ”๊ฐ€ ๋ฉ”์†Œ๋“œ๊ฐ€ ์žˆ์„ ์ˆ˜ ์—†์œผ๋ฉฐ Debug / Display ๋ฉ”์‹œ์ง€๋ฅผ ํ‘œ์‹œํ•˜์‹œ๊ฒ ์Šต๋‹ˆ๊นŒ? ๊ทธ๋Ÿฐ ๋‹ค์Œ ์ƒˆ ์œ ํ˜•์„ ๋งŒ๋“œ๋Š” ๋Œ€์‹  ๋‹จ์ผ ๋ฉ”์„œ๋“œ๋ฅผ ๊ตฌํ˜„ํ•˜๊ธฐ๋งŒ ํ•˜๋ฉด ๋ฉ๋‹ˆ๋‹ค.

@glaebhoerl @Thomasdezeeuw error_message ๋ฐฉ๋ฒ•๊ณผ ๊ฐ™์€ ๊ฒƒ์ด RFC์˜ ์›๋ž˜ ์ดˆ์•ˆ์— ์žˆ์—ˆ์ง€๋งŒ ํ•ฉ์˜๊ฐ€ ๋ถ€์กฑํ•˜์—ฌ ์‚ญ์ œ๋˜์—ˆ์Šต๋‹ˆ๋‹ค. ๋‹น์‹œ์˜ ๋‚ด ๋Š๋‚Œ์€ ๊ธฐ๋ณธ ๊ธฐ๋Šฅ์„ ํ™•๋ณดํ•˜๊ณ (๋ฐ˜๋“œ์‹œ ์•ˆ์ •ํ™”๋  ํ•„์š”๋Š” ์—†์Œ) ๋ฐ˜๋ณตํ•˜๋Š” ๊ฒƒ์ด ๊ฐ€์žฅ ์ข‹๋‹ค๋Š” ๊ฒƒ์ด์—ˆ์Šต๋‹ˆ๋‹ค.

@zackw ๋™์˜ํ•ฉ๋‹ˆ๋‹ค. ๊ฐœ์ธ์ ์œผ๋กœ ๋ฉ”์‹œ์ง€ ์—†์ด ์ˆซ์ž๋งŒ ์žˆ์œผ๋ฉด ๊ดœ์ฐฎ์Šต๋‹ˆ๋‹ค. ์˜ค๋ฅ˜ ์ฝ”๋“œ์— ๋Œ€ํ•ด 0 ๋ฐ 1 ๋ผ๊ณ  ํ•ฉ์‹œ๋‹ค. ๊ทธ๋Ÿฌ๋‚˜ ์ฒซ ๋ฒˆ์งธ ๋ฐ˜๋ณต์—์„œ ๋ฉ”์‹œ์ง€๋ฅผ ๋ฐ›๊ณ  ์‹ถ๋‹ค๋ฉด Debug ๋˜๋Š” Display Termination::message ๋ฅผ ๋” ์„ ํ˜ธํ•  ๊ฒƒ์ž…๋‹ˆ๋‹ค.

message ๋ฉ”์„œ๋“œ๊ฐ€ String ๋ฅผ ๋ฐ˜ํ™˜ํ• ๊นŒ์š”? Termination ๊ฐ€ libcore์— ์žˆ๋Š” ๊ฒƒ๊ณผ ํ˜ธํ™˜๋˜์ง€ ์•Š์Šต๋‹ˆ๊นŒ?

@SimonSapin Termination ๋Š” ํ˜„์žฌ libstd ์— ์ •์˜๋˜์–ด ์žˆ์Šต๋‹ˆ๋‹ค.

ํ , ํ•˜์ง€๋งŒ ํŠธ๋ ˆ์ž‡์— message ๋ฉ”์†Œ๋“œ๋ฅผ ์ถ”๊ฐ€ํ•˜๋Š” ๊ฒƒ์ด ์ตœ์„ ์˜ ๊ตฌํ˜„์ด ๋  ๊ฒƒ์ด๋ผ๊ณ ๋Š” ์ƒ๊ฐํ•˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค. i32 ์™€ ๊ฐ™์€ ์œ ํ˜•์— ๋Œ€ํ•ด ๋ฉ”์„œ๋“œ๋Š” ๋ฌด์—‡์„ ๋ฐ˜ํ™˜ํ•ฉ๋‹ˆ๊นŒ? ์ด ๋ฉ”์‹œ์ง€๋ฅผ ์ธ์‡„ํ•  ์‹œ๊ธฐ๋ฅผ ์–ด๋–ป๊ฒŒ ๊ฒฐ์ •ํ•ฉ๋‹ˆ๊นŒ? ํ˜„์žฌ Result Termination report ํ•จ์ˆ˜์— ์˜ค๋ฅ˜๋ฅผ ์ธ์‡„ํ•ฉ๋‹ˆ๋‹ค. Result ๊ฐ€ Err ์ž„์„ ์•Œ๊ธฐ ๋•Œ๋ฌธ์— ์ž‘๋™ํ•ฉ๋‹ˆ๋‹ค. report() != 0 ์ˆ˜ํ‘œ๋ฅผ ์–ด๋”˜๊ฐ€์— ํ†ตํ•ฉํ•œ ๋‹ค์Œ ์ธ์‡„ํ•  ์ˆ˜ ์žˆ์ง€๋งŒ ๊ทธ๊ฒƒ์€ ์˜ณ์ง€ ์•Š์Šต๋‹ˆ๋‹ค.
๋‹ค์Œ ๋ฌธ์ œ๋Š” Result ์— ๋Œ€ํ•œ ํ‘œ์ค€ ๊ตฌํ˜„์„ ์ œ๊ณตํ•˜๊ณ  ์‹ถ์ง€๋งŒ Error ์œ ํ˜•์ด ์ธ์‡„ํ•˜๊ธฐ ์œ„ํ•ด ๊ตฌํ˜„ํ•ด์•ผ ํ•˜๋Š” ๊ฒƒ์€ ๋ฌด์—‡์ž…๋‹ˆ๊นŒ? ์ด๋ ‡๊ฒŒ ํ•˜๋ฉด ํ˜„์žฌ ์งˆ๋ฌธ Debug ๋˜๋Š” Display ๋กœ ๋Œ์•„๊ฐ‘๋‹ˆ๋‹ค.

"์‹ฌ๊ฐํ•œ" ํ”„๋กœ๊ทธ๋žจ์˜ main์—์„œ ? ๋ฅผ ์‚ฌ์šฉํ•˜๋ ค๋Š” ๊ฒฝ์šฐ ๋ฐœ์ƒํ•˜๋Š” ๋˜ ๋‹ค๋ฅธ ๊ณจ์นซ๊ฑฐ๋ฆฌ๋Š” ์ผ๋ถ€ ์ƒํ™ฉ์—์„œ ๋ช…๋ น์ค„ ํ”„๋กœ๊ทธ๋žจ์ด 0์ด ์•„๋‹Œ ์ƒํƒœ๋กœ ์ข…๋ฃŒ๋˜๊ธฐ๋ฅผ ์›ํ•˜์ง€๋งŒ _์•„๋ฌด๊ฒƒ๋„_ ์ธ์‡„ํ•˜์ง€ ์•Š์œผ๋ ค๋Š” ๊ฒƒ์ž…๋‹ˆ๋‹ค( grep -q ๊ณ ๋ ค Error ๊ฐ€ _์•„๋‹Œ_ ์–ด๋–ค ๊ฒƒ์— ๋Œ€ํ•œ Termination impl ์ด ํ•„์š”ํ•ฉ๋‹ˆ๋‹ค. ์•„๋ฌด ๊ฒƒ๋„ ์ธ์‡„ํ•˜์ง€ ์•Š๊ณ  ์ข…๋ฃŒ ์ƒํƒœ๋ฅผ ์ œ์–ดํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ๋ช…๋ น์ค„ ์ธ์ˆ˜๋ฅผ ๊ตฌ๋ฌธ ๋ถ„์„ํ•œ _after_ ๊ทธ ๋ฌผ๊ฑด์„ ๋‹ค์‹œ ๋ฐ˜ํ™˜ํ•ฉ๋‹ˆ๋‹ค.

์ด๊ฒƒ์€ ๋‚ด๊ฐ€ ์ƒ๊ฐํ•˜๋Š” ๊ฒƒ์ž…๋‹ˆ๋‹ค :

Result<T, E> ๋ฅผ ๋ฐ˜ํ™˜ํ•˜๋Š” ๊ฒƒ์€ E์— ๋””๋ฒ„๊ทธ impl์„ ์‚ฌ์šฉํ•ด์•ผ ํ•ฉ๋‹ˆ๋‹ค. ์ด๊ฒƒ์€ ๊ฐ€์žฅ ํŽธ๋ฆฌํ•œ ํŠน์„ฑ์ž…๋‹ˆ๋‹ค. ์ด๊ฒƒ์€ ๋„๋ฆฌ ๊ตฌํ˜„๋˜๊ณ  "๋น ๋ฅด๊ณ  ๋”๋Ÿฌ์šด ์ถœ๋ ฅ" ์‚ฌ์šฉ ์‚ฌ๋ก€์™€ ๋‹จ์œ„ ํ…Œ์ŠคํŠธ ์‚ฌ์šฉ ์‚ฌ๋ก€๋ฅผ ์ถฉ์กฑํ•ฉ๋‹ˆ๋‹ค. ์ €๋Š” Display ๋ฅผ ์‚ฌ์šฉํ•˜์ง€ ์•Š๋Š” ๊ฒƒ์„ ์„ ํ˜ธํ•ฉ๋‹ˆ๋‹ค. ์™œ๋ƒํ•˜๋ฉด ๋œ ๋„๋ฆฌ ๊ตฌํ˜„ ๋˜๊ณ  ์ด๊ฒƒ์ด ์„ธ๋ จ๋œ ์ถœ๋ ฅ์ด๋ผ๋Š” ์ธ์ƒ์„ ์ฃผ๊ธฐ ๋•Œ๋ฌธ์ž…๋‹ˆ๋‹ค. ๊ทธ๋Ÿด ๊ฐ€๋Šฅ์„ฑ์€ ๊ฑฐ์˜ ์—†์Šต๋‹ˆ๋‹ค.

๊ทธ๋Ÿฌ๋‚˜ ์ „๋ฌธ์ ์ธ ๊ฒฐ๊ณผ๋ฌผ์„ ์–ป์„ ์ˆ˜ ์žˆ๋Š” ๋ฐฉ๋ฒ•๋„ ์žˆ์–ด์•ผ ํ•ฉ๋‹ˆ๋‹ค. ๋‹คํ–‰ํžˆ๋„ ์ด๋ฏธ ๋‘ ๊ฐ€์ง€ ๋ฐฉ๋ฒ•์ด ์žˆ์Šต๋‹ˆ๋‹ค. ์ฒซ์งธ, @withoutboats ๊ฐ€ ๋งํ–ˆ๋“ฏ์ด ์‚ฌ๋žŒ๋“ค์€ E: Display ๋ฅผ ์‚ฌ์šฉํ•˜๊ฑฐ๋‚˜ ์ „๋ฌธ์ ์ธ ์Šคํƒ€์ผ์˜ ์ถœ๋ ฅ์„ ์ œ๊ณตํ•˜๋ ค๋Š” ๊ฒฝ์šฐ "๋””๋ฒ„๊ทธ์—์„œ ํ‘œ์‹œ" ๋ธŒ๋ฆฌ์ง€๋ฅผ ๋งŒ๋“ค ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ๊ทธ๋Ÿฌ๋‚˜ ์ด๊ฒƒ์ด ๋„ˆ๋ฌด ํ•ดํ‚น๋œ ๊ฒƒ์ฒ˜๋Ÿผ ๋Š๊ปด์ง„๋‹ค๋ฉด ๊ฒฐ๊ณผ๋ฅผ ๋Œ€์ฒดํ•˜๊ธฐ ์œ„ํ•ด ๊ณ ์œ ํ•œ ์œ ํ˜•์„ ์ •์˜ํ•  ์ˆ˜๋„ ์žˆ์Šต๋‹ˆ๋‹ค. ์˜ˆ๋ฅผ ๋“ค์–ด ๋‹ค์Œ์„ ์ˆ˜ํ–‰ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

fn main() -> ProfessionalLookingResult {
    ...
}

๊ทธ๋Ÿฐ ๋‹ค์Œ ProfessionalLookingResult Try ๋ฅผ ๊ตฌํ˜„ํ•ฉ๋‹ˆ๋‹ค. ๊ทธ๋Ÿฐ ๋‹ค์Œ Terminate ๋„ ๊ตฌํ˜„ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

impl Terminate for ProfessionalLookingResult {
    fn report(self) -> i32 {
        ...
        eprintln!("Something very professional here.");
        return 1;
        ...
    }
}

Debug ์„ ์‚ฌ์šฉํ•ด์•ผ ํ•œ๋‹ค๋Š” @nikomatsakis ์˜ ์˜๊ฒฌ์— ๋™์˜ํ•ฉ๋‹ˆ๋‹ค.

๋˜ํ•œ ์„ธ๋ จ๋œ ์ถœ๋ ฅ์˜ ๊ฒฝ์šฐ main ์— ์ผ๋ถ€ ์ฝ”๋“œ๋ฅผ ์ž‘์„ฑํ•˜๋Š” ๊ฒƒ์ด Try ๋ฐ Terminate ๋ฅผ ๊ตฌํ˜„ํ•˜๋Š” ์ƒˆ ์œ ํ˜•์„ ๋งŒ๋“œ๋Š” ๊ฒƒ๋ณด๋‹ค ๋” ๋‚ซ๋‹ค๊ณ  ์ƒ๊ฐํ•ฉ๋‹ˆ๋‹ค. Terminate ์˜ ์š”์ ์€ ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ๊ฐ€ ์‰ฝ๊ฒŒ ์ข‹์€ ๊ธฐ๋ณธ๊ฐ’์„ ๋งŒ๋“ค ์ˆ˜ ์žˆ๋Š” ๊ฒƒ์ด๋ฏ€๋กœ ํ”„๋กœ๊ทธ๋žจ์ด ์ข…๋ฃŒ๋˜๋Š” ๋ฐฉ์‹์ด ์ตœ์ข… ์‚ฌ์šฉ์ž(์˜ˆ: ์ „๋ฌธ CLI)์—๊ฒŒ ์ค‘์š”ํ•œ ์ƒํ™ฉ์—์„œ๋Š” ๊ฒฐ์ฝ” ๊ทธ๋ ‡์ง€ ์•Š์Šต๋‹ˆ๋‹ค. .

๋ฌผ๋ก  ๋‹ค๋ฅธ ์‚ฌ๋žŒ๋“ค์€ ๋‹ค๋ฅธ ์˜๊ฒฌ์„ ๊ฐ€์งˆ ์ˆ˜ ์žˆ์œผ๋ฉฐ main ์— ์ง์ ‘ ์ž‘์„ฑํ•˜๋Š” ๋Œ€์‹  ์ฝ”๋“œ๋ฅผ ์‚ฝ์ž…ํ•˜๋Š” ๋ฐ ๊ด€๋ จ๋œ ํŠน์„ฑ์„ ์‚ฌ์šฉํ•˜๋Š” ์—ฌ๋Ÿฌ ๊ฐ€์ง€ ๋ฐฉ๋ฒ•์ด ์žˆ์Šต๋‹ˆ๋‹ค. ์ข‹์€ ์ ์€ ์šฐ๋ฆฌ๊ฐ€ ์—ฌ๋Ÿฌ ๊ฐ€์ง€ ์„ ํƒ์„ ํ•  ์ˆ˜ ์žˆ๊ณ  ํ•ญ์ƒ ์˜ค๋ฅ˜๋ฅผ ์ฒ˜๋ฆฌํ•˜๊ธฐ ์œ„ํ•ด ํ•˜๋‚˜์˜ ์ถ•๋ณต๋ฐ›์€ ๋ฐฉ๋ฒ•์„ ์ƒ๊ฐํ•ด๋‚ผ ํ•„์š”๊ฐ€ ์—†๋‹ค๋Š” ๊ฒƒ์ž…๋‹ˆ๋‹ค.

๋ช‡ ๊ฐ€์ง€ ๋ฌธ์ œ๊ฐ€ ์žˆ์ง€๋งŒ ๋ช‡ ๊ฐ€์ง€ ์ƒ๊ฐ์„ ์ ์–ด ๋ณด๊ฒ ์Šต๋‹ˆ๋‹ค.

๋‹ค์Œ์„ ๋ณด๊ณ  ์‹ถ์Šต๋‹ˆ๋‹ค.

fn main() -> i32 {
    1
}

๋” ์ผ๋ฐ˜์ ์œผ๋กœ ๋‹ค์Œ๊ณผ ๊ฐ™์ด ์ž‘์„ฑํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

fn main() -> impl Display {
    1
}

์ด ๋‘ ์ฃผ์š” ํ•จ์ˆ˜๋Š” ๋ชจ๋‘ 0 ์ข…๋ฃŒ ์ฝ”๋“œ์™€ println! ์˜ Display ๋ฅผ ๋ฐ˜ํ™˜ํ•ด์•ผ ํ•ฉ๋‹ˆ๋‹ค.

์ด๊ฒƒ์€ ๋‹ค์Œ๊ณผ ๊ฐ™์ด ๊ฐ„๋‹จํ•ด์•ผ ํ•ฉ๋‹ˆ๋‹ค(์ œ ์ƒ๊ฐ์—๋Š”).

impl<T> Termination for T where T: Display {
    fn report(self) -> i32 {
        println!("{}", self);
        EXIT_SUCCESS
    }
}

๊ทธ๋Ÿฐ ๋‹ค์Œ ์˜ค๋ฅ˜์— ๋Œ€ํ•ด ๋‹ค์Œ์„ ์ˆ˜ํ–‰ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

impl<T: Termination, E: Debug> Termination for Result<T, E> { ... }

์—ฌ๊ธฐ์„œ ๊ตฌํ˜„์€ "{:?}" ๋ฅผ ์‚ฌ์šฉํ•˜๋Š” RFC์™€ ๋™์ผํ•ฉ๋‹ˆ๋‹ค.
Debug ํ˜•์‹.

์•ž์—์„œ ์–ธ๊ธ‰ํ–ˆ๋“ฏ์ด ์ถœ๋ ฅ์„ ๋” ๋งŽ์ด ์ œ์–ดํ•ด์•ผ ํ•˜๋Š” ์‚ฌ๋žŒ๋“ค์€ ๊ฐ„๋‹จํžˆ
์“ฐ๋‹ค:

fn main() -> Result<i32, MyError> { ... }
impl Termination for Result<i32, MyError> { ... }

์ด๊ฒƒ์€ ํ˜„์žฌ ์ปดํŒŒ์ผ๋Ÿฌ๋กœ ๊ฒฐ์ •ํ•  ์ˆ˜ ์—†์ง€๋งŒ
์ถฉ๋Œํ•˜๋Š” ๊ตฌํ˜„์„ ๋ณด๊ฒŒ ๋  ๊ฒƒ์ž…๋‹ˆ๋‹ค ... ๊ทธ๋ž˜์„œ ์šฐ๋ฆฌ๋Š” @nikomatsakis ๊ฐ€ ์ œ์•ˆํ•œ ๊ฒƒ์„ ์ˆ˜ํ–‰ํ•ฉ๋‹ˆ๋‹ค
์“ฐ๊ธฐ:

fn main() -> MyResult { ... }
impl Termination for MyResult { ... }
or, if you want something more general.
impl<T, E> Termination for MyResult<T, E> { ... }

๋‚˜๋Š” ์ด๊ฒƒ์ด ๋ถ€๋ถ„์ ์œผ๋กœ ๋งํ•œ ๊ฒƒ์„ ๋‹ค์‹œ ๋งํ•˜๊ณ  ์žˆ๋‹ค๋Š” ๊ฒƒ์„ ์•Œ๊ณ  ์žˆ์ง€๋งŒ ๊ฒฐ๊ณผ๋ฟ๋งŒ ์•„๋‹ˆ๋ผ ๋ฐ˜ํ™˜ ๊ฐ’์„ ํ‘œ์‹œํ•˜๊ธฐ ์œ„ํ•œ ๋ณด๋‹ค ์ผ๋ฐ˜์ ์ธ ์†”๋ฃจ์…˜์„ ๋ณด์—ฌ์ฃผ๊ธฐ ์œ„ํ•ด ๋‚ด ๋น„์ „์„ ๋ชจ๋‘ ์ œ์‹œํ•  ๊ฒƒ์ด๋ผ๊ณ  ์ƒ๊ฐํ–ˆ์Šต๋‹ˆ๋‹ค. ์ด ์˜๊ฒฌ์˜ ๋งŽ์€ ๋ถ€๋ถ„์ด ๊ธฐ๋ณธ์ ์œผ๋กœ ์ œ๊ณต๋˜๋Š” Termination ๊ตฌํ˜„์— ๋Œ€ํ•ด ๋…ผ์Ÿํ•˜๋Š” ๊ฒƒ ๊ฐ™์Šต๋‹ˆ๋‹ค. ๋˜ํ•œ ์ด ์ฃผ์„์€ RFC์— ์„ค๋ช…๋œ ๋Œ€๋กœ impl Termination for bool ์™€ ๊ฐ™์€ ๊ตฌํ˜„๊ณผ ๋ชจ์ˆœ๋ฉ๋‹ˆ๋‹ค. ๊ฐœ์ธ์ ์œผ๋กœ 0์ด ์•„๋‹Œ ์ข…๋ฃŒ ์ฝ”๋“œ๋Š” Results ๋˜๋Š” Termination ๋ฅผ ๊ตฌํ˜„ํ•˜๋Š” ์‚ฌ์šฉ์ž ์ •์˜ ์œ ํ˜•์— ์˜ํ•ด ๋…์ ์ ์œผ๋กœ ์ฒ˜๋ฆฌ๋˜์–ด์•ผ ํ•œ๋‹ค๊ณ  ์ƒ๊ฐํ•ฉ๋‹ˆ๋‹ค.

Display ์— ๋Œ€ํ•œ ๊ตฌํ˜„์ด ์—†๊ธฐ ๋•Œ๋ฌธ์— main์˜ Option ์œ ํ˜•์—์„œ ? ๋ฅผ ์ฒ˜๋ฆฌํ•˜๋Š” ๋ฐฉ๋ฒ•์— ๋Œ€ํ•œ ํฅ๋ฏธ๋กœ์šด ์งˆ๋ฌธ์ž…๋‹ˆ๋‹ค.

TL;DR: Debug ๋Š” ๊ดœ์ฐฎ์Šต๋‹ˆ๋‹ค.

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

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

$ cd foo
bash: cd: foo: No such file or directory

์šฐ๋ฆฌ ๋Œ€๋ถ€๋ถ„์€ ์–ด๋–ค ์ข…๋ฅ˜์˜ ๋””๋ฒ„๊น… ์ง€์›๋„ ๊ธฐ๋Œ€ํ•˜์ง€ ์•Š๊ณ  ๋ฌด์—‡์ด ์ž˜๋ชป๋˜์—ˆ๋Š”์ง€์— ๋Œ€ํ•œ ๊ฐ„๊ฒฐํ•œ ํ‘œ์‹œ๊ธฐ๋งŒ ๊ธฐ๋Œ€ํ•ฉ๋‹ˆ๋‹ค. ๋‚˜๋Š” ์ด๊ฒƒ์„ ๊ธฐ๋ณธ ์ž…์žฅ์œผ๋กœ ์˜นํ˜ธํ•  ๋ฟ์ž…๋‹ˆ๋‹ค.

์ด์™€ ๊ฐ™์€ ๊ฐ„๋‹จํ•œ ์ถœ๋ ฅ์„ ์–ป๊ธฐ ์œ„ํ•ด Terminate impl์„ ์ž‘์„ฑํ•˜๋Š” ๊ฒƒ์„ ์ƒ๊ฐํ•  ๋•Œ ์ฃผ์š” ๊ธฐ๋Šฅ์˜ ? ๊ฐ€ ์˜ค๋Š˜๋‚ ์˜ ์•ˆ์ •์ ์ธ ๋…น๊ณผ ๋ณ„๋ฐ˜ ๋‹ค๋ฅด์ง€ ์•Š๋‹ค๋Š” ๊ฒƒ์„ ๊นจ๋‹ฌ์•˜์Šต๋‹ˆ๋‹ค(์ž‘์„ฑ๋œ ์ฝ”๋“œ์˜ ์–‘ ์ธก๋ฉด์—์„œ ), ์—ฌ๊ธฐ์„œ Result -aware "inner_main()" ์€ E ๋ฅผ ์ฒ˜๋ฆฌํ•˜๊ธฐ ์œ„ํ•ด ์ข…์ข… ์ƒ์„ฑ๋ฉ๋‹ˆ๋‹ค.

์ด ๊ฐ€์ •์„ ์—ผ๋‘์— ๋‘๊ณ , ์‚ฌ๊ณ  ์—ฐ์Šต์œผ๋กœ, ์˜ค๋Š˜๋‚  ์กด์žฌํ•˜๋Š” " inner_main() " ์Šคํƒ€์ผ ๊ตฌํ˜„์ด ๋” ์บ์ฃผ์–ผํ•œ Display ํ’๋ฏธ๋ฅผ ๊ฐ€์ง€๊ณ  ์žˆ๋‹ค๊ณ  ๊ฐ•ํ•˜๊ฒŒ ๋Š๊ผˆ๋Š”์ง€ ์—ฌ๋ถ€๋ฅผ ๊ฒฐ์ •ํ•˜๋ ค๊ณ  ํ–ˆ์Šต๋‹ˆ๋‹ค. (๋ณด๋‹ค ๊ธฐ์ˆ ์ ์ธ Debug ํ’๋ฏธ ์ด์ƒ). ๋‚ด ์ƒ๊ฐ์€ ์ด๊ฒƒ์ด ๊ธฐ๋Šฅ์ด ์‹ค์ œ๋กœ ์–ด๋–ป๊ฒŒ ์‚ฌ์šฉ๋  ๊ฐ€๋Šฅ์„ฑ์ด ์žˆ๋Š”์ง€๋ฅผ ๋‚˜ํƒ€๋‚ด๋Š” ๊ฒƒ์ด์—ˆ์Šต๋‹ˆ๋‹ค.

๋‚˜๋Š” ์ด๊ฒƒ์ด ์‚ฌ์‹ค์ธ์ง€ ํ™•์‹  ํ•  ์ˆ˜ ์—†์—ˆ๋‹ค . (์ฆ‰, ํ˜„์žฌ ๊ธฐ์กด ๊ตฌํ˜„์—์„œ Display ์— ๋Œ€ํ•œ ๊ฐ•ํ•œ ํŽธํ–ฅ์ด ์žˆ๋‹ค๊ณ  ์ƒ๊ฐํ•˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค.) ์‹ค์ œ๋กœ ์ง€๋‚œ 16๊ฐœ์›” ๋™์•ˆ ์ž‘์„ฑํ•œ ๋‚ด ์ €์žฅ์†Œ๋ฅผ ์‚ดํŽด๋ณด๋ฉด ๊ธฐ๋ณธ์ ์œผ๋กœ Display ๋ฅผ ๊ตฌํ˜„ํ•˜๋Š” ๊ฒƒ์ด ์ˆœ ์ ˆ๊ฐ์•ก์— ํ•ด๋‹นํ•œ๋‹ค๊ณ  ๋งํ•  ์ˆ˜ ์—†๋Š” ๋‘ ๊ฒฝ์šฐ ๋ชจ๋‘๋ฅผ ์ถฉ๋ถ„ํžˆ ์ฐพ์•˜์Šต๋‹ˆ๋‹ค.

"๊ธฐ๋ณธ ์ˆ˜ํ˜œ์ž๋Š” cli ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜"์ด๋ผ๋Š” ๊ฐ€์ •์„ ์œ ์ง€ํ•˜๋ฉด์„œ ๋„์›€๋ง ๋ฐ ์‚ฌ์šฉ ์ •๋ณด๋ฅผ ์ œ๊ณตํ•˜๋Š” ์ฝ˜์†” ์•ฑ์ด ๋งŽ์ด ์žˆ์Šต๋‹ˆ๋‹ค. ์˜ˆ๋ฅผ ๋“ค์–ด:

$ git foo
git: 'foo' is not a git command. See 'git --help'.

The most similar command is
    log

๊ทธ๋ž˜์„œ ์ฝ˜์†” ์•ฑ์—์„œ๋„ Debug ๋กœ '๋ถ€์ƒ ๊ทธ๋ฃน'์„ ์‹๋ณ„ํ•˜๊ธฐ๊ฐ€ ์–ด๋ ต์Šต๋‹ˆ๋‹ค.

๊ทธ๋ฆฌ๊ณ  ๋งˆ์ง€๋ง‰์œผ๋กœ 6๊ฐœ์›” ๋™์•ˆ ๊ธฐ๋Šฅ์„ ์œ ์ง€ํ•˜๋Š” ๊ฒƒ๋ณด๋‹ค Debug impl์„ ์‚ฌ์šฉํ•˜๋Š” ๊ฒƒ์ด ๋” ํ–‰๋ณตํ•  ๊ฒƒ์ž…๋‹ˆ๋‹ค.

๊ทธ๋ž˜์„œ ๋‚ด ์‚ฌ๊ณ  ๊ณผ์ •์ด ๊ณต๊ฐœ์ ์œผ๋กœ ๊ณต๊ฐœ๋ฉ๋‹ˆ๋‹ค. ์š”์•ฝํ•˜์ž๋ฉด Debug ๊ฐ€ Display ๋ณด๋‹ค ์ข‹์ง€๋„ ๋‚˜์˜์ง€๋„ ์•Š์„ ๊ฒƒ์ด๋ฉฐ ๊ธฐ๋ณธ ๊ตฌํ˜„์œผ๋กœ ๊ดœ์ฐฎ์„ ๊ฒƒ์ž…๋‹ˆ๋‹ค.

๋งŽ์€ ๋ถ„๋“ค์ด ๊ทธ๋Ÿฌํ•˜๋“ฏ์ด, TBH์—์„œ "์˜ˆ, ๊ทธ๋ ‡๊ตฐ์š”!!!"์™€ ๊ฐ™์ด ๋” ํฅ๋ถ„๋˜๋Š” ๊ตฌํ˜„์ด ์žˆ์—ˆ์œผ๋ฉด ํ•˜๋Š” ๋ฐ”๋žจ์ž…๋‹ˆ๋‹ค. ํ•˜์ง€๋งŒ ๊ทธ๊ฒƒ์€ ๋น„ํ˜„์‹ค์ ์ธ ๋‚ด ๊ธฐ๋Œ€์น˜์ผ ์ˆ˜๋„ ์žˆ์Šต๋‹ˆ๋‹ค... ์•„๋งˆ๋„ ์šฐ๋ฆฌ๊ฐ€ ํ”„๋กœ์ ํŠธ์—์„œ ์ƒ์šฉ๊ตฌ๋ฅผ ์ค„์ด๋Š” failure ์™€ ํ•จ๊ป˜ ์ž‘๋™ํ•˜๋Š” ์†”๋ฃจ์…˜์„ ๊ฐ–๊ฒŒ ๋œ๋‹ค๋ฉด ๊ทธ๊ฒƒ์€ ๋‚˜์—๊ฒŒ ๋” ์ปค์งˆ ๊ฒƒ์ž…๋‹ˆ๋‹ค. :)

์ฐธ๊ณ  ํ…Œ์ŠคํŠธ์—์„œ ์ข…๋ฃŒ ํŠน์„ฑ์„ ์ง€์›ํ•˜๊ธฐ ์œ„ํ•ด PR์„ ์—ด์—ˆ์Šต๋‹ˆ๋‹ค. #48143( @bkchr ์˜ ์ž‘์—…์„ ๊ธฐ๋ฐ˜์œผ๋กœ ํ•จ).

ํ…Œ์ŠคํŠธ ๊ฒฐ๊ณผ๋ฅผ ์ฒ˜๋ฆฌํ•˜๋Š” ๋ฉ”์†Œ๋“œ๋กœ Termination ํŠธ๋ ˆ์ž‡์„ ํ™•์žฅํ•˜๋Š” ์ž์œ ๋ฅผ ์–ป์—ˆ์Šต๋‹ˆ๋‹ค. ์ด๊ฒƒ์€ ๊ตฌํ˜„์„ ๋‹จ์ˆœํ™”ํ–ˆ์ง€๋งŒ ํ…Œ์ŠคํŠธ ์‹คํŒจ๋Š” ์‹คํ–‰ ์‹คํŒจ๋ณด๋‹ค ๋” ์ž์„ธํ•œ ์ถœ๋ ฅ์„ ์›ํ•  ์ˆ˜ ์žˆ๊ธฐ ๋•Œ๋ฌธ์— ์˜๋ฏธ๊ฐ€ ์žˆ์Šต๋‹ˆ๋‹ค.

Termination ๋Š” libstd์˜ ํŠน์„ฑ์— ๋Œ€ํ•œ ๋™์‚ฌ์— ๋Œ€ํ•œ ์ผ๋ฐ˜์ ์ธ ๊ธฐ๋ณธ ์„ค์ •์— ๋”ฐ๋ผ Terminate ๋กœ ์ด๋ฆ„์„ ๋ฐ”๊ฟ”์•ผ ํ•ฉ๋‹ˆ๋‹ค.

@withoutboats ์–ด๋Š ์‹œ์ ์—์„œ ๋™์‚ฌ ํŠน์„ฑ์€ ๋Œ€๋ถ€๋ถ„ ํŠน์„ฑ๊ณผ ์ด๋ฆ„์ด ๊ฐ™์€ ๋‹จ์ผ ๋ฉ”์„œ๋“œ๋ฅผ ๊ฐ–๋Š” ํŠน์„ฑ์ด๋ผ๋Š” ๋…ผ์˜๊ฐ€ ์žˆ์—ˆ๋˜ ๊ฒƒ ๊ฐ™์Šต๋‹ˆ๋‹ค. ์–ด์จŒ๋“ , ๋‚ด ์ž์‹ ์˜ ์ž์ „๊ฑฐ ๋ณด๊ด€์†Œ ์ œ์•ˆ Exit ์„ ๋‹ค์‹œ ๋„์šธ ์ˆ˜ ์žˆ์Šต๋‹ˆ๊นŒ?

๋ฌด์ƒ ์ž์ „๊ฑฐ ์…ฐ๋”ฉ: ์ด๊ฒƒ์€ ๋‹จ์ผ ๋ฐฉ๋ฒ• ํŠน์„ฑ์ž…๋‹ˆ๋‹ค. ๊ฐ™์€ ์ด๋ฆ„์„ ์ง€์ •ํ•˜๋ ค๋ฉด ToExitCode / to_exit_code ?

Result ๋ฐ˜ํ™˜ ์•ˆ์ •ํ™”๋Š” ํŠธ๋ ˆ์ž‡ ์•ˆ์ •ํ™”์™€ ๋ณ„๊ฐœ๋กœ ์ˆ˜ํ–‰ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

๋‚˜์—๊ฒŒ ์ด๊ฒƒ์€ ๋Œ€๋ถ€๋ถ„์˜ ๊ฐ€์น˜๊ฐ€ ์–ธ์–ด ๊ธฐ๋Šฅ์—์„œ ์˜ค๋Š” ? ์™€ ๋งค์šฐ ์œ ์‚ฌํ•˜๋ฉฐ ํŠน์„ฑ ํŒŒ์•…์„ ์ง€์—ฐํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. RFC ํ† ๋ก ์€ inner_main ์— ์ฝ”๋“œ๋ฅผ ๋„ฃ๋Š” ๊ฒƒ์ด ์ด๊ฒƒ์„ ์œ„ํ•œ ํŠน์„ฑ impl๋ณด๋‹ค ๋” ์‰ฌ์›Œ ๋ณด์˜€๊ธฐ ๋•Œ๋ฌธ์— _ever_ ํŠน์„ฑ์„ ์•ˆ์ •ํ™”ํ•ด์•ผ ํ•˜๋Š”์ง€์กฐ์ฐจ ๊ถ๊ธˆํ•˜๊ฒŒ ๋งŒ๋“ค์—ˆ์Šต๋‹ˆ๋‹ค...

์˜ˆ, ํŠน์„ฑ์„ ์•ˆ์ •ํ™”ํ•  ํ•„์š”๋Š” ์—†์Šต๋‹ˆ๋‹ค. ๊ทธ๋Ÿฌ๋‚˜ inner_main ์— ํฌ๊ฒŒ ์˜์กดํ•  ์ˆ˜ ์—†๋Š” ํ”„๋ ˆ์ž„์›Œํฌ์™€ ๊ฐ™์€ ์•ˆ์ •์ ์ธ ํ•ญ๋ชฉ์—์„œ๋Š” ์œ ์šฉํ•ฉ๋‹ˆ๋‹ค.

@SimonSapin To ๋Š” ์œ ํ˜• ๋ณ€ํ™˜์„ ์ฐธ์กฐํ•˜๋Š” ๊ฒƒ์œผ๋กœ ์ƒ๊ฐํ•˜์ง€๋งŒ ๊ทธ๋ ‡์ง€ ์•Š์Šต๋‹ˆ๋‹ค. ํ•˜์ง€๋งŒ ๋ฉ”์„œ๋“œ ์ด๋ฆ„์„ terminate Try ์ง€์ •ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

๋‚˜๋Š” T ๊ฐ€ ๋‹จ์œ„๊ฐ€ ์•„๋‹Œ fn main() -> T ๋ฅผ ์•ˆ์ •ํ™”ํ•˜์ž๊ณ  ์ œ์•ˆํ–ˆ์Šต๋‹ˆ๋‹ค. ์ด๋กœ ์ธํ•ด ๋งŽ์€ ์„ธ๋ถ€ ์‚ฌํ•ญ, ํŠนํžˆ ํŠน์„ฑ์˜ ์ด๋ฆ„/์œ„์น˜/์„ธ๋ถ€ ์‚ฌํ•ญ์ด ๋ถˆ์•ˆ์ •ํ•ด์กŒ์ง€๋งŒ ์ผ๋ถ€๋Š” ์ˆ˜์ •๋˜์—ˆ์Šต๋‹ˆ๋‹ค. ์„ธ๋ถ€ ์ •๋ณด:

https://github.com/rust-lang/rust/issues/48453

ํ”ผ๋“œ๋ฐฑ์„ ์ฃผ์„ธ์š”!

terminate ๊ฐ€ report ๋ณด๋‹ค ๋” ์„ค๋ช…์ ์ธ ๊ฒƒ ๊ฐ™์Šต๋‹ˆ๋‹ค. ์šฐ๋ฆฌ๋Š” ํ•ญ์ƒ terminate ํ•˜์ง€๋งŒ report ing์„ ์ƒ๋žตํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

๊ทธ๋Ÿฌ๋‚˜ ์˜ˆ๋ฅผ ๋“ค์–ด std::process::exit ์™€ ๋‹ฌ๋ฆฌ ์ด ๋ฉ”์„œ๋“œ๋Š” ์•„๋ฌด ๊ฒƒ๋„ ์ข…๋ฃŒํ•˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค. main() ์˜ ๋ฐ˜ํ™˜ ๊ฐ’๋งŒ ์ข…๋ฃŒ ์ฝ”๋“œ๋กœ ๋ณ€ํ™˜ํ•ฉ๋‹ˆ๋‹ค(์„ ํƒ์ ์œผ๋กœ Result::Err ๋ฅผ stderr๋กœ ์ธ์‡„ํ•œ ํ›„).

Exit ์— ๋Œ€ํ•œ ๋˜ ๋‹ค๋ฅธ ํˆฌํ‘œ์ž…๋‹ˆ๋‹ค. ๋‚˜๋Š” ๊ทธ๊ฒƒ์ด ๊ฐ„๋‹จํ•˜๊ณ  ๋งค์šฐ ์„ค๋ช…์ ์ด๊ณ  ์ข…๋ฃŒ ์ฝ”๋“œ/์ข…๋ฃŒ ์ƒํƒœ์— ๋Œ€ํ•œ ์ „ํ†ต์ ์ธ ๊ฐœ๋…๊ณผ ์ผ์น˜ํ•˜๋Š” ๊ฒƒ์„ ์ข‹์•„ํ•ฉ๋‹ˆ๋‹ค.

๋‚˜๋Š” ํ™•์‹คํžˆ Exit ๋ณด๋‹ค Terminate ๋ฅผ ๋” ์„ ํ˜ธํ•ฉ๋‹ˆ๋‹ค. ์™œ๋ƒํ•˜๋ฉด ๋ญ”๊ฐ€๊ฐ€ ์ •๋ง ์ž˜๋ชป๋˜์–ด์„œ ๊ฐ‘์ž๊ธฐ ํ•˜๋“œ ์ข…๋ฃŒํ•˜๋Š” ๊ฒƒ๋ณด๋‹ค main์—์„œ ๋Œ์•„์™€์„œ ์šฐ์•„ํ•˜๊ฒŒ ์ข…๋ฃŒํ•˜๊ธฐ ๋•Œ๋ฌธ์ž…๋‹ˆ๋‹ค.

๊ฒฐ๊ณผ๋ฅผ ๋ฐ˜ํ™˜ํ•˜๋Š” ์•ˆ์ •ํ™” ๋‹จ์œ„ ํ…Œ์ŠคํŠธ๋ฅผ ์ œ์•ˆํ•˜๊ธฐ ์œ„ํ•ด https://github.com/rust-lang/rust/issues/48854 ๋ฅผ ์ถ”๊ฐ€ํ–ˆ์Šต๋‹ˆ๋‹ค.

์˜ค, ์ด ์–˜๊ธฐ๋ฅผ ํ•˜๊ธฐ์— ์ ๋‹นํ•œ ๊ณณ์„ ์ฐพ์•˜์Šต๋‹ˆ๋‹ค.

doctest์—์„œ ? ์‚ฌ์šฉ

ํ˜„์žฌ doctest๊ฐ€ ์ž‘๋™ํ•˜๋Š” ๋ฐฉ์‹์€ ๋‹ค์Œ๊ณผ ๊ฐ™์Šต๋‹ˆ๋‹ค.

  • Rustdoc์€ fn main ๋ฅผ ์„ ์–ธํ•˜๋Š”์ง€ doctest๋ฅผ ์Šค์บ”ํ•ฉ๋‹ˆ๋‹ค.

    • (ํ˜„์žฌ๋Š” // ๋’ค์— ์žˆ์ง€ ์•Š์€ "fn main"์— ๋Œ€ํ•œ ์ค„ ๋‹จ์œ„ ํ…์ŠคํŠธ ๊ฒ€์ƒ‰์„ ์ˆ˜ํ–‰ํ•ฉ๋‹ˆ๋‹ค)

  • fn main ๊ฐ€ ๋ฐœ๊ฒฌ๋˜๋ฉด ์ด๋ฏธ ์žˆ๋Š” ๊ฒƒ์„ ๊ฑด๋“œ๋ฆฌ์ง€ ์•Š์Šต๋‹ˆ๋‹ค.
  • fn main ๊ฐ€ ๋ฐœ๊ฒฌ๋˜์ง€ ์•Š์œผ๋ฉด ๋Œ€๋ถ€๋ถ„์˜* doctest๋ฅผ ๊ธฐ๋ณธ fn main() { } ๋กœ ๋ž˜ํ•‘ํ•ฉ๋‹ˆ๋‹ค.

    • *์ •์‹ ๋ฒ„์ „: #![inner_attributes] ๋ฐ extern crate ์„ ์–ธ์„ ์ถ”์ถœํ•˜์—ฌ ์ƒ์„ฑ๋œ ๊ธฐ๋ณธ ํ•จ์ˆ˜ ์™ธ๋ถ€์— ๋ฐฐ์น˜ํ•˜์ง€๋งŒ ๋‚˜๋จธ์ง€๋Š” ๋ชจ๋‘ ๋‚ด๋ถ€์— ๋“ค์–ด๊ฐ‘๋‹ˆ๋‹ค.

  • doctest์— extern crate ๋ฌธ์ด ํฌํ•จ๋˜์–ด ์žˆ์ง€ ์•Š์œผ๋ฉด(๊ทธ๋ฆฌ๊ณ  ๋ฌธ์„œํ™”๋˜๋Š” crate๋Š” std ๋ผ๊ณ  ํ•˜์ง€ ์•Š์Œ) rustdoc์€ ์ƒ์„ฑ๋œ main ํ•จ์ˆ˜ ๋ฐ”๋กœ ์•ž์— extern crate my_crate; ๋ฌธ๋„ ์‚ฝ์ž…ํ•ฉ๋‹ˆ๋‹ค.
  • ๊ทธ๋Ÿฐ ๋‹ค์Œ Rustdoc์€ ํ…Œ์ŠคํŠธ ๋„๊ตฌ์˜ ์ผ๋ถ€๋กœ ์ตœ์ข… ๊ฒฐ๊ณผ๋ฅผ ๋…๋ฆฝ ์‹คํ–‰ํ˜• ๋ฐ”์ด๋„ˆ๋ฆฌ๋กœ ์ปดํŒŒ์ผํ•˜๊ณ  ์‹คํ–‰ํ•ฉ๋‹ˆ๋‹ค.

(๋ช‡ ๊ฐ€์ง€ ์„ธ๋ถ€ ์‚ฌํ•ญ์„ ๋‚จ๊ฒผ์ง€๋งŒ ํŽธ๋ฆฌํ•˜๊ฒŒ ์—ฌ๊ธฐ์— ์ „์ฒด๋ฅผ ์ž‘์„ฑํ–ˆ์Šต๋‹ˆ๋‹ค.)

๋”ฐ๋ผ์„œ ? ๋ฅผ doctest์—์„œ ์›ํ™œํ•˜๊ฒŒ ์‚ฌ์šฉํ•˜๋ ค๋ฉด fn main() { your_code_here(); } ๊ฐ€ ์ถ”๊ฐ€๋˜๋Š” ๋ถ€๋ถ„์„ ๋ณ€๊ฒฝํ•ด์•ผ ํ•ฉ๋‹ˆ๋‹ค. ์ž์‹ ์˜ fn main() -> Result<(), Error> $ ์„ ์–ธ์€ ์ตœ๋Œ€ํ•œ ๋นจ๋ฆฌ ์ž‘๋™ํ•ฉ๋‹ˆ๋‹ค. ์ผ๋ฐ˜ ์ฝ”๋“œ์—์„œ - Rustdoc์€ ๊ฑฐ๊ธฐ์—์„œ ์ˆ˜์ •ํ•  ํ•„์š”์กฐ์ฐจ ์—†์Šต๋‹ˆ๋‹ค. ๊ทธ๋Ÿฌ๋‚˜ main์„ ์ˆ˜๋™์œผ๋กœ ์„ ์–ธํ•˜์ง€ ์•Š๊ณ  ์ž‘๋™ํ•˜๊ฒŒ ํ•˜๋ ค๋ฉด ์•ฝ๊ฐ„์˜ ์กฐ์ •์ด ํ•„์š”ํ•ฉ๋‹ˆ๋‹ค. ์ด ๊ธฐ๋Šฅ์„ ์ž์„ธํžˆ ๋”ฐ๋ฅด์ง€ ์•Š์•˜๊ธฐ ๋•Œ๋ฌธ์— ๋งŒ๋Šฅ ์†”๋ฃจ์…˜์ด ์žˆ๋Š”์ง€ ํ™•์‹ ํ•  ์ˆ˜ ์—†์Šต๋‹ˆ๋‹ค. fn main() -> impl Termination ๊ฐ€๋Šฅํ•œ๊ฐ€์š”?

fn main() -> impl ์ข…๋ฃŒ๊ฐ€ ๊ฐ€๋Šฅํ•ฉ๋‹ˆ๊นŒ?

์–•์€ ์˜๋ฏธ์—์„œ ๊ทธ๋ ‡์Šต๋‹ˆ๋‹ค: https://play.rust-lang.org/?gist=8e353379f77a546d152c9113414a88f7&version=nightly

๋ถˆํ–‰ํžˆ๋„ -> impl Trait ๋Š” ๋‚ด์žฅ๋œ ์˜ค๋ฅ˜ ๋ณ€ํ™˜์œผ๋กœ ์ธํ•ด ? ์—์„œ ๊ทผ๋ณธ์ ์œผ๋กœ ๋ฒˆ๊ฑฐ๋กญ๋‹ค๊ณ  ์ƒ๊ฐํ•ฉ๋‹ˆ๋‹ค. ์ด ์˜ค๋ฅ˜ ๋ณ€ํ™˜์—๋Š” ์–ด๋–ค ์œ ํ˜•์„ ์‚ฌ์šฉํ• ์ง€ ์•Œ๋ ค์ฃผ๊ธฐ ์œ„ํ•ด ์ถ”๋ก  ์ปจํ…์ŠคํŠธ๊ฐ€ ํ•„์š”ํ•ฉ๋‹ˆ๋‹ค: https://play.rust- lang.org/?gist=23410fa4fa684710bc75e16f0714ec4b&version=nightly

๊ฐœ์ธ์ ์œผ๋กœ ๋‚˜๋Š” fn main() -> Result<(), Box<Debug>> catch { your_code_here(); } ( https://github.com/rust-lang/rfcs/pull/2107 )์™€ ๊ฐ™์€ ๊ฒƒ์„ ํ†ตํ•ด ์ž‘๋™ํ•˜๋Š” ? -in-doctests๋ฅผ fn main() -> Result<(), Box<Debug>> catch { your_code_here(); }๋กœ ์ƒ์ƒํ•˜๊ณ  ์žˆ์—ˆ์Šต๋‹ˆ๋‹ค. github.com/rust-lang/rust/issues/41414#issuecomment-373985777).

impl Trait ๋ฒ„์ „์€ ๋ฉ‹์ง€๊ณ , Rustc๊ฐ€ ? desugar์—์„œ ๋‚ด๋ถ€์ ์œผ๋กœ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ๋Š” "์ œ์•ฝ ์—†๋Š” ๊ฒฝ์šฐ ๋™์ผํ•œ ์œ ํ˜•์„ ์„ ํ˜ธ" ์ง€์›์ด ์žˆ๋Š” ๊ฒฝ์šฐ ์ž‘๋™ํ•  ์ˆ˜ ์žˆ์ง€๋งŒ ์ œ ๊ธฐ์–ต์€ ๋‹ค์Œ๊ณผ ๊ฐ™์Šต๋‹ˆ๋‹ค. ๊ทธ๋Ÿฐ ๊ธฐ๋Šฅ์— ๋Œ€ํ•œ ์•„์ด๋””์–ด๋Š” ์ž‘๋™ ๋ฐฉ์‹์„ ์ดํ•ดํ•˜๋Š” ์‚ฌ๋žŒ๋“ค์„ ๊ณตํฌ์— ๋–จ๊ฒŒ ๋งŒ๋“œ๋Š” ๊ฒฝํ–ฅ์ด ์žˆ์Šต๋‹ˆ๋‹ค. :sweat_smile: ํ•˜์ง€๋งŒ ์ถœ๋ ฅ์ด impl Trait ์ธ ๊ฒฝ์šฐ์—๋งŒ ์ ์šฉ๋˜๋Š” ๋‚ด๋ถ€ ๋ฌธ์ œ์ผ ์ˆ˜๋„ ์žˆ์Šต๋‹ˆ๋‹ค.

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

๋‚ด๊ฐ€ ๊ถ๊ธˆํ•œ ์œ ์ผํ•œ ๊ฒƒ์€ ๊ทธ๊ฒƒ์ด ์—๋””์…˜ ์ „ํ™˜์— ์˜ํ•ด ์–ด๋–ป๊ฒŒ ์˜ํ–ฅ์„ ๋ฐ›์„์ง€์ž…๋‹ˆ๋‹ค. catch ๊ตฌ๋ฌธ์ด 2018 ์‹œ๋Œ€์— ๋ณ€๊ฒฝ๋˜์ง€ ์•Š์Šต๋‹ˆ๊นŒ? Rustdoc์€ ์‹คํ–‰ ์ค‘์ธ ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ์™€ ๋™์ผํ•œ ์—๋””์…˜์—์„œ doctest๋ฅผ ์ปดํŒŒ์ผํ•˜๊ธฐ๋ฅผ ์›ํ•  ๊ฒƒ์ด๋ฏ€๋กœ ์ „๋‹ฌ๋œ epoch ํ”Œ๋ž˜๊ทธ๋ฅผ ๊ธฐ๋ฐ˜์œผ๋กœ ๊ตฌ๋ฌธ์„ ๊ตฌ๋ณ„ํ•ด์•ผ ํ•ฉ๋‹ˆ๋‹ค.

๋‚˜๋Š” ์ด๊ฒƒ์ด ์ด์ œ ์•ˆ์ •ํ™”๋˜์—ˆ์ง€๋งŒ ๋‹จ์ˆœํ•œ ๊ฒฝ์šฐ๋Š” ๋ถ„๋ช…ํžˆ ์—ฌ์ „ํžˆ ICE์— ๋Œ€ํ•ด ์šฐ๋ คํ•˜๊ณ  ์žˆ์Šต๋‹ˆ๋‹ค. https://github.com/rust-lang/rust/issues/48890#issuecomment -375952342

fn main() -> Result<(), &'static str> {
    Err("An error message for you")
}
assertion failed: !substs.has_erasable_regions(), librustc_trans_utils/symbol_names.rs:169:9

https://play.rust-lang.org/?gist=fe6ae28c67e7d3195a3731839d4aac84&version=nightly

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

@frewsxcv ์ด์ œ ๋ฌธ์ œ๊ฐ€ ํ•ด๊ฒฐ๋œ ๊ฒƒ ๊ฐ™์€๋ฐ์š”?

@nikomatsakis ๋‚ด๊ฐ€ https://github.com/rust-lang/rust/issues/48389 ์—์„œ ์ œ๊ธฐํ•œ ๋ฌธ์ œ๋Š” 1.26-๋ฒ ํƒ€์—์„œ ํ•ด๊ฒฐ๋˜์—ˆ์œผ๋ฏ€๋กœ ๋‚ด ๊ด€์ ์—์„œ ๊ทธ๋ ‡์Šต๋‹ˆ๋‹ค.

๋„ค, ๊ฑฑ์ •ํ–ˆ๋˜ ICE๊ฐ€ ์ด์ œ ํ•ด๊ฒฐ๋˜์—ˆ์Šต๋‹ˆ๋‹ค!

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

TL;DR - ์˜ค๋ฅ˜์˜ Debug ๋ฉ”์‹œ์ง€๋ฅผ ํ‘œ์‹œํ•˜๋Š” ๊ฒƒ์€ ์‹ค์ˆ˜๋ผ๊ณ  ์ƒ๊ฐํ•˜๋ฉฐ ๋” ๋‚˜์€ ์„ ํƒ์€ ์˜ค๋ฅ˜์˜ Display ๋ฉ”์‹œ์ง€๋ฅผ ์‚ฌ์šฉํ•˜๋Š” ๊ฒƒ์ž…๋‹ˆ๋‹ค.

๋‚ด ๋ฏฟ์Œ์˜ ํ•ต์‹ฌ์€ _์ผ์ƒ์ ์œผ๋กœ Rust์—์„œ CLI ํ”„๋กœ๊ทธ๋žจ์„ ๋นŒ๋“œํ•˜๋Š”_ ์‚ฌ๋žŒ์œผ๋กœ์„œ Error ์˜ Debug ๋ฉ”์‹œ์ง€๊ฐ€ ๋ฌด์—‡์ธ์ง€์— ๋Œ€ํ•ด ๋ณ„๋กœ ์‹ ๊ฒฝ์„ ์“ด ๊ธฐ์–ต์ด ์—†๋‹ค๋Š” ๊ฒƒ์ž…๋‹ˆ๋‹ค. ์ฆ‰, Debug ์˜ค๋ฅ˜๋Š” ์˜๋„์ ์œผ๋กœ ์ตœ์ข… ์‚ฌ์šฉ์ž๊ฐ€ ์•„๋‹Œ ๊ฐœ๋ฐœ์ž๋ฅผ ์œ„ํ•œ ๊ฒƒ์ž…๋‹ˆ๋‹ค. CLI ํ”„๋กœ๊ทธ๋žจ์„ ๋นŒ๋“œํ•  ๋•Œ ํ•ด๋‹น ์ธํ„ฐํŽ˜์ด์Šค๋Š” ๊ธฐ๋ณธ์ ์œผ๋กœ ์ตœ์ข… ์‚ฌ์šฉ์ž๊ฐ€ ์ฝ์„ ์ˆ˜ ์žˆ๋„๋ก ๋˜์–ด ์žˆ์œผ๋ฏ€๋กœ Debug ๋ฉ”์‹œ์ง€๋Š” ์—ฌ๊ธฐ์—์„œ ๊ฑฐ์˜ ์œ ์šฉํ•˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค. ์ฆ‰, ๋‚ด๊ฐ€ ์ตœ์ข… ์‚ฌ์šฉ์ž์—๊ฒŒ ์ œ๊ณตํ•œ CLI ํ”„๋กœ๊ทธ๋žจ์ด ์ •์ƒ์ ์ธ ์ž‘๋™์—์„œ Rust ๊ฐ’์˜ ๋””๋ฒ„๊ทธ ํ‘œํ˜„์„ ๋ณด์—ฌ์ฃผ์—ˆ๋‹ค๋ฉด ๋ฒ„๊ทธ๊ฐ€ ์ˆ˜์ •๋œ ๊ฒƒ์œผ๋กœ ๊ฐ„์ฃผํ•  ๊ฒƒ์ž…๋‹ˆ๋‹ค. ํ•ฉ๋ฆฌ์ ์ธ ์‚ฌ๋žŒ๋“ค์ด ๋™์˜ํ•˜์ง€ ์•Š์„ ์ˆ˜ ์žˆ๋‹ค๋Š” ์ ์„ ์ดํ•ดํ•˜์ง€๋งŒ ์ผ๋ฐ˜์ ์œผ๋กœ ์ด๊ฒƒ์ด Rust๋กœ ์ž‘์„ฑ๋œ ๋ชจ๋“  CLI ํ”„๋กœ๊ทธ๋žจ์— ํ•ด๋‹น๋˜์–ด์•ผ ํ•œ๋‹ค๊ณ  ์ƒ๊ฐํ•ฉ๋‹ˆ๋‹ค. ๊ทธ๋ ‡๊ธด ํ•˜์ง€๋งŒ, ์ œ ์ƒ๊ฐ์— ๋‹ค์†Œ ๋†€๋ผ์šด ์˜๋ฏธ๋Š” ๊ธฐ๋ณธ ์ž‘๋™ ๋ชจ๋“œ๊ฐ€ ์ˆ˜์ •๋˜์–ด์•ผ ํ•˜๋Š” ๋ฒ„๊ทธ(IMO)๋กœ ์‹œ์ž‘ํ•˜๋Š” ๊ธฐ๋Šฅ์„ ํšจ๊ณผ์ ์œผ๋กœ ์•ˆ์ •ํ™”ํ–ˆ๋‹ค๋Š” ๊ฒƒ์ž…๋‹ˆ๋‹ค.

๊ธฐ๋ณธ์ ์œผ๋กœ ์˜ค๋ฅ˜์˜ Debug ํ‘œ์‹œ๋ฅผ ํ‘œ์‹œํ•จ์œผ๋กœ์จ ์ž˜๋ชป๋œ ๊ด€ํ–‰์„ ๊ถŒ์žฅํ•œ๋‹ค๊ณ  ์ƒ๊ฐํ•ฉ๋‹ˆ๋‹ค. ํŠนํžˆ, Rust CLI ํ”„๋กœ๊ทธ๋žจ์„ ์ž‘์„ฑํ•˜๋Š” ๊ณผ์ •์—์„œ ์˜ค๋ฅ˜์˜ Display impl์กฐ์ฐจ๋„ ์ตœ์ข… ์‚ฌ์šฉ์ž๊ฐ€ ์†Œ๋น„ํ•˜๊ธฐ์— ์ถฉ๋ถ„ํ•˜์ง€ ์•Š์œผ๋ฉฐ ์‹ค์ œ ์ž‘์—…์„ ์ˆ˜ํ–‰ํ•ด์•ผ ํ•œ๋‹ค๋Š” ๊ฒƒ์„ ๊ด€์ฐฐํ•˜๋Š” ๊ฒƒ์€ ๋งค์šฐ ์ผ๋ฐ˜์ ์ž…๋‹ˆ๋‹ค. ๊ทธ๊ฒƒ์„ ๊ณ ์นœ๋‹ค. ์ด์— ๋Œ€ํ•œ ๊ตฌ์ฒด์ ์ธ ์˜ˆ๋Š” io::Error ์ž…๋‹ˆ๋‹ค. ํ•ด๋‹น ํŒŒ์ผ ๊ฒฝ๋กœ ์—†์ด io::Error ํ‘œ์‹œ(ํŒŒ์ผ ์ฝ๊ธฐ/์“ฐ๊ธฐ/์—ด๊ธฐ/์ƒ์„ฑ์—์„œ ์˜จ ๊ฒƒ์œผ๋กœ ๊ฐ€์ •)๋Š” ๊ธฐ๋ณธ์ ์œผ๋กœ ๋ฒ„๊ทธ์ž…๋‹ˆ๋‹ค. ์™œ๋ƒํ•˜๋ฉด ์ตœ์ข… ์‚ฌ์šฉ์ž๊ฐ€ ์ด๊ฒƒ์œผ๋กœ ์•„๋ฌด๊ฒƒ๋„ ํ•˜๊ธฐ ์–ด๋ ต๊ธฐ ๋•Œ๋ฌธ์ž…๋‹ˆ๋‹ค. ๊ธฐ๋ณธ์ ์œผ๋กœ Debug ์˜ค๋ฅ˜ ํ‘œ์‹œ๋ฅผ ํ‘œ์‹œํ•˜๋„๋ก ์„ ํƒํ•˜์—ฌ CLI ํ”„๋กœ๊ทธ๋žจ์„ ๋งŒ๋“œ๋Š” ์‚ฌ๋žŒ๋“ค์ด ์ด๋Ÿฌํ•œ ์ข…๋ฅ˜์˜ ๋ฒ„๊ทธ๋ฅผ ๋ฐœ๊ฒฌํ•˜๋Š” ๊ฒƒ์„ ๋” ์–ด๋ ต๊ฒŒ ๋งŒ๋“ค์—ˆ์Šต๋‹ˆ๋‹ค. (๊ฒŒ๋‹ค๊ฐ€ io::Error ์˜ Debug ์€ Display ๋ณด๋‹ค ํ›จ์”ฌ ๋œ ์œ ์šฉํ•˜์ง€๋งŒ ๊ทธ ์ž์ฒด๋กœ๋Š” ์ œ ๊ฒฝํ—˜์ƒ ํฐ ๋ฌธ์ œ๊ฐ€ ๋˜์ง€๋Š” ์•Š์Šต๋‹ˆ๋‹ค. )

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

use std::error::Error;
use std::process;

fn try_main() -> Result<(), Box<Error>> {
    // do stuff with `?`
}

fn main() {
    if let Err(err) = try_main() {
        eprintln!("{}", err);
        process::exit(1);
    }
}

๊ฒ‰๋ณด๊ธฐ์—๋Š” ์ด๊ฒƒ์„ ?-in-main ๋กœ ๋ฐ”๊พธ๋Š” ๊ฒƒ์ด _์‚ฌ๋ž‘์Šค๋Ÿฌ์šด_ ์ผ์ด์ง€๋งŒ Display ์˜ค๋ฅ˜๊ฐ€ ํ‘œ์‹œ๋˜์ง€ ์•Š๊ธฐ ๋•Œ๋ฌธ์— ๊ทธ๋ ‡๊ฒŒ ํ•  ์ˆ˜ ์—†์Šต๋‹ˆ๋‹ค. ์ฆ‰, ์‹ค์ œ CLI ํ”„๋กœ๊ทธ๋žจ์„ ์ž‘์„ฑํ•  ๋•Œ ์‹ค์ œ๋กœ ์œ„์˜ ๋ฐฉ์‹์„ ์‚ฌ์šฉํ•˜๊ฒŒ ๋˜๋ฏ€๋กœ ๋‚ด ์˜ˆ์ œ๊ฐ€ ํ˜„์‹ค์„ ๋ฐ˜์˜ํ•˜๊ณ  ์‹ถ๋‹ค๋ฉด ์ง€๋ฆ„๊ธธ์„ ์ทจํ•˜์ง€ ์•Š๊ณ  ์‹ค์ œ ํ”„๋กœ๊ทธ๋žจ์—์„œ ์ˆ˜ํ–‰ํ•˜๋Š” ์ž‘์—…์„ ๋ณด์—ฌ์•ผ ํ•œ๋‹ค๊ณ  ์ƒ๊ฐํ•ฉ๋‹ˆ๋‹ค(ํ•ฉ๋ฆฌ์ ์ธ ๋ฒ”์œ„ ๋‚ด์—์„œ ). ์ €๋Š” ์‹ค์ œ๋กœ ์ด๋Ÿฐ ์ข…๋ฅ˜์˜ ๊ฒƒ์ด ์ •๋ง ์ค‘์š”ํ•˜๋‹ค๊ณ  ์ƒ๊ฐํ•ฉ๋‹ˆ๋‹ค. ์—ญ์‚ฌ์ ์œผ๋กœ ์ด๊ฒƒ์˜ ํ•œ ๊ฐ€์ง€ ๋ถ€์ž‘์šฉ์€ unwrap ์–ด๋””์—๋‚˜ ๋ฟŒ๋ฆฌ์ง€ ์•Š๊ณ  ๊ด€์šฉ์ ์ธ Rust ์ฝ”๋“œ๋ฅผ ์ž‘์„ฑํ•˜๋Š” ๋ฐฉ๋ฒ•์„ ์‚ฌ๋žŒ๋“ค์—๊ฒŒ ๋ณด์—ฌ์ฃผ์—ˆ๋‹ค๋Š” ๊ฒƒ์ž…๋‹ˆ๋‹ค. ๊ทธ๋Ÿฌ๋‚˜ ์˜ˆ์ œ์—์„œ ?-in-main ๋ฅผ ์‚ฌ์šฉํ•˜๋Š” ๊ฒƒ์œผ๋กœ ๋˜๋Œ์•„๊ฐ€๋ฉด ๋ชฉํ‘œ๋ฅผ ์–ด๊ธด ๊ฒƒ์ž…๋‹ˆ๋‹ค. ์ด์ œ ๊ธฐ๋ณธ์ ์œผ๋กœ ๋งค์šฐ ์ž˜ ๋ฐฉ์ถœํ•˜๋Š” ํ”„๋กœ๊ทธ๋žจ์„ ์ž‘์„ฑํ•˜๋„๋ก ๋” ์ž˜ ๋ชจ๋ฅด๋Š” ์‚ฌ๋žŒ๋“ค์„ ์„ค์ •ํ•˜๊ณ  ์žˆ์Šต๋‹ˆ๋‹ค. ๋„์›€์ด ๋˜์ง€ ์•Š๋Š” ์˜ค๋ฅ˜ ๋ฉ”์‹œ์ง€.

"์˜ค๋ฅ˜ ๋ฉ”์‹œ์ง€๋ฅผ ๋‚ด๋ณด๋‚ด๊ณ  ์ ์ ˆํ•œ ์˜ค๋ฅ˜ ์ฝ”๋“œ๋กœ ์ข…๋ฃŒ" ํŒจํ„ด์€ ์‹ค์ œ๋กœ ์„ธ๋ จ๋œ ํ”„๋กœ๊ทธ๋žจ์—์„œ ์‚ฌ์šฉ๋ฉ๋‹ˆ๋‹ค. ์˜ˆ๋ฅผ ๋“ค์–ด ?-in-main ๊ฐ€ Display ๋ฅผ ์‚ฌ์šฉํ–ˆ๋‹ค๋ฉด ์˜ค๋Š˜ ripgrep์—์„œ main ๋ฐ run ํ•จ์ˆ˜๋ฅผ ๋ณ‘ํ•ฉํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

https://github.com/BurntSushi/ripgrep/blob/64317bda9f497d66bbeffa71ae6328601167a5bd/src/main.rs#L56 -L86

๋ฌผ๋ก  ์•ˆ์ •ํ™”๋˜๋ฉด Termination ํŠธ๋ ˆ์ž‡์— ๋Œ€ํ•œ ๊ณ ์œ ํ•œ impl์„ ์ œ๊ณตํ•˜์—ฌ ๋ฏธ๋ž˜์— ?-in-main ๋ฅผ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ์ง€๋งŒ main ๋งŒ ์“ธ ์ˆ˜ ์žˆ๋‹ค๋ฉด ์™œ ๊ทธ๋ ‡๊ฒŒ ํ•˜๋Š” ๊ฒƒ์ด ๊ท€์ฐฎ์„๊นŒ์š”? impl ๋ฅผ ์˜ˆ์ œ์— ํฌํ•จํ•ด์•ผ ํ•˜๋ฉฐ, ๊ทธ ์‹œ์ ์—์„œ ์ €๋Š” ์˜ค๋Š˜ ๊ฐ€์ง€๊ณ  ์žˆ๋Š” ์˜ˆ์ œ๋ฅผ ๊ณ ์ˆ˜ํ•  ์ˆ˜๋„ ์žˆ์Šต๋‹ˆ๋‹ค( main ๋ฐ try_main ).

๋ณด๊ธฐ์—๋Š” ์ด ๋ฌธ์ œ๋ฅผ ์ˆ˜์ •ํ•˜๋Š” ๊ฒƒ์ด ํฐ ๋ณ€ํ™”๊ฐ€ ๋  ๊ฒƒ ๊ฐ™์Šต๋‹ˆ๋‹ค . ์ฆ‰, ์ด ์ฝ”๋“œ๋Š” ์˜ค๋Š˜๋‚  Rust stable์—์„œ ์ปดํŒŒ์ผ๋ฉ๋‹ˆ๋‹ค.

#[derive(Debug)]
struct OnlyDebug;

fn main() -> Result<(), OnlyDebug> {
    Err(OnlyDebug)
}

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

Debug Display ๋ฅผ ํ‘œ์‹œํ•˜๋Š” ๊ฒƒ์ด CLI ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜์— ๋” ์ข‹๋‹ค๋Š” ๋ฐ ๋™์˜ํ•ฉ๋‹ˆ๋‹ค. Debug #$ ๋Œ€์‹  Display ์ด์–ด์•ผ ํ•œ๋‹ค๋Š” ๋ฐ ๋™์˜ํ•˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค. ์™œ๋ƒํ•˜๋ฉด ๊ทธ๊ฒƒ์ด ์‹ค์ œ๋กœ ? -ed๊ฐ€ ๋  ์ˆ˜ ์žˆ๋Š” ์˜ค๋ฅ˜๋ฅผ ํฌ๊ฒŒ ์ œํ•œํ•˜๊ณ  ?-in-main ์˜ ๋ชฉ์ ์„ ๋ฌดํšจํ™”ํ•˜๊ธฐ ๋•Œ๋ฌธ์ž…๋‹ˆ๋‹ค. Display ๋ฅผ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ์„ ๋•Œ ์‚ฌ์šฉํ•˜๊ณ  ๊ทธ๋ ‡์ง€ ์•Š์„ ๋•Œ Debug ๋กœ ๋Œ€์ฒดํ•˜๋Š” ๋น„์ค‘๋‹จ ๋ฐฉ๋ฒ•์„ ์ œ๊ณตํ•ฉ๋‹ˆ๋‹ค.

#[unstable(feature = "termination_trait_lib", issue = "43301")]
impl<E: fmt::Display> Termination for Result<!, E> {
    fn report(self) -> i32 {
        let Err(err) = self;
        eprintln!("Error: {}", err);
        ExitCode::FAILURE.report()
    }
}

๋งˆ์ง€๋ง‰์œผ๋กœ, ๋‚ด ์ฃผ์žฅ์„ ๋งˆ๋ฌด๋ฆฌํ•˜๊ธฐ ์œ„ํ•ด ์˜ˆ์ œ์—์„œ๋„ ?-in-main์„ ์‚ฌ์šฉํ•  ์ƒํ™ฉ์„ ์ƒ์ƒํ•˜๋Š” ๋ฐ ์–ด๋ ค์›€์ด ์žˆ์Šต๋‹ˆ๋‹ค.

์‹ค์ œ CLI ํ”„๋กœ๊ทธ๋žจ์˜ ๊ฒฝ์šฐ ์ผ๋ฐ˜์ ์œผ๋กœ @BurntSushi ์— ๋™์˜ํ•ด์•ผ ํ•˜์ง€๋งŒ ๋‚˜๋งŒ ์‚ฌ์šฉํ•  ๊ณ„ํš์ธ ์ž„์˜์˜ ์Šคํฌ๋ฆฝํŠธ ๋ฐ ๋‚ด๋ถ€ ๋„๊ตฌ์˜ ๊ฒฝ์šฐ ์ด๊ฒƒ์ด ์ •๋ง ํŽธ๋ฆฌํ•ฉ๋‹ˆ๋‹ค. ๋˜ํ•œ ํ”„๋กœํ† ํƒ€์ž…๊ณผ ์žฅ๋‚œ๊ฐ์— ์ •๋ง ํŽธ๋ฆฌํ•ฉ๋‹ˆ๋‹ค. ํ”„๋กœ๋•์…˜ ์ฝ”๋“œ์—์„œ ์‹ค์ œ๋กœ ์‚ฌ์šฉํ•˜๋Š” ๊ฒƒ์„ ํ•ญ์ƒ ๊ถŒ์žฅํ•˜์ง€ ์•Š์„ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ๊ทธ๋ ‡์ฃ ?

?-in-main์˜ ๋ชฉํ‘œ ์ค‘ ์ผ๋ถ€๋Š” ์ฝ”๋“œ ์˜ˆ์ œ์—์„œ ๋‹จ์ผ ๊ด€์šฉ์–ด ์ฝ”๋“œ, ์ฆ‰ unwraps๋ฅผ ํ”ผํ•˜๋Š” ๊ฒƒ์ž…๋‹ˆ๋‹ค. ๊ทธ๋Ÿฌ๋‚˜ ?-in-main ์ž์ฒด๊ฐ€ ๋‹จ์ผ ๊ด€์šฉ์–ด๊ฐ€ ๋˜๋ฉด ์ „์ฒด ๊ธฐ๋Šฅ์ด ์†์ƒ๋ฉ๋‹ˆ๋‹ค. ํ”„๋กœ๋•์…˜ ์ฝ”๋“œ์—์„œ ๋˜๋Š” ๊ธฐํƒ€ ๋ฐฉ์‹์œผ๋กœ ์‚ฌ์šฉ์„ ๊ถŒ์žฅํ•˜์ง€ ์•Š๋Š” ๊ฒฐ๊ณผ๋ฅผ ํ”ผํ•˜๊ณ  ์‹ถ์Šต๋‹ˆ๋‹ค.

๋‚˜๋Š” ์ด ๊ธฐ๋Šฅ์„ ๋ฉ”์ธ์—์„œ ์‚ฌ์šฉํ•˜๋ ค๊ณ  ๋…ธ๋ ฅํ–ˆ๋Š”๋ฐ ๊ฝค ์‹ค๋ง์Šค๋Ÿฌ์› ๋‹ค. ์ข…๋ฃŒ ํŠน์„ฑ์˜ ๊ธฐ์กด impls๋Š” ์—ฌ๋Ÿฌ ์ข…๋ฅ˜์˜ ์˜ค๋ฅ˜๋ฅผ ํŽธ๋ฆฌํ•˜๊ฒŒ "๋ˆ„์ "ํ•˜๋Š” ๊ฒƒ์„ ํ—ˆ์šฉํ•˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค. ์˜ˆ๋ฅผ ๋“ค์–ด, ์˜ค๋ฅ˜๋ฅผ ๊ตฌํ˜„ํ•˜์ง€ ์•Š๊ธฐ ๋•Œ๋ฌธ์— failure::Fail์„ ์‚ฌ์šฉํ•  ์ˆ˜ ์—†์Šต๋‹ˆ๋‹ค. ์ƒ์ž๋ฅผ ์‚ฌ์šฉํ•  ์ˆ˜ ์—†์Šต๋‹ˆ๋‹ค, ๊ฐ™์€ ์ด์œ . ๋””๋ฒ„๊ทธ๋กœ ๋ณ€๊ฒฝํ•˜๋Š” ๊ฒƒ์„ ์šฐ์„ ์‹œํ•ด์•ผ ํ•œ๋‹ค๊ณ  ์ƒ๊ฐํ•ฉ๋‹ˆ๋‹ค. =)

Display ๋ฅผ ์‚ฌ์šฉํ•˜๋ฉด $ MainError ์™€ ๊ฐ™์€ ๋น ๋ฅด๊ณ  ๋”๋Ÿฌ์šด ์œ ํ˜•์„ ๋„์ž…ํ•˜์—ฌ ์—ฌ๋Ÿฌ ์ข…๋ฅ˜์˜ ์˜ค๋ฅ˜๋ฅผ ๋ˆ„์ ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

pub struct MainError {
    s: String,
}

impl std::fmt::Display for MainError {
    fn fmt(&self, f: &mut std::fmt::Formatter) -> std::fmt::Result {
        self.s.fmt(f)
    }
}

impl<T> From<T> for MainError where T: std::error::Error {
    fn from(t: T) -> Self {
        MainError {
            s: t.to_string(),
        }
    }
}

์ด๊ฒƒ์€ Box<Error> ์™€ ์œ ์‚ฌํ•œ ์•„๋ž˜์™€ ๊ฐ™์€ ๊ฒƒ์„ ํ—ˆ์šฉํ•ฉ๋‹ˆ๋‹ค:

fn main() -> Result<(), MainError> {
    let _ = std::fs::File::open("foo")?;
    Ok(())
}

๋””์Šคํ”Œ๋ ˆ์ด ๋Œ€ ๋””๋ฒ„๊ทธ์— ๋Œ€ํ•œ ์ด์ „ ๋…ผ์˜๋Š” https://github.com/rust-lang/rust/issues/43301#issuecomment -362020946์—์„œ ์‹œ์ž‘ํ•˜๋Š” ์ˆจ๊ฒจ์ง„ ๋ถ€๋ถ„์— ์žˆ์Šต๋‹ˆ๋‹ค.

@BurntSushi ๋™์˜ํ•ฉ๋‹ˆ๋‹ค. ์ด ๋ฌธ์ œ๋ฅผ ํ•ด๊ฒฐํ•  ์ˆ˜ ์—†๋Š” ๊ฒฝ์šฐ ํ•ด๊ฒฐ ๋ฐฉ๋ฒ•์ด ์žˆ์„ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

use std::fmt;
struct DisplayAsDebug<T: fmt::Display>(pub T);

impl<T: fmt::Display> Debug for DisplayAsDebug {
    fn fmt(&self, f: &mut fmt::Formatter) -> fmt::Result {
        fmt::Display::fmt(&self.0, f)
    }
}

impl<T: fmt::Display> From<T> for DisplayAsDebug {
    fn from(val: T) -> Self {
        DisplayAsDebug(val)
    }
}

์ด๊ฒƒ์ด std::fmt ์— ์žˆ์œผ๋ฉด ๋‹ค์Œ๊ณผ ๊ฐ™์ด ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

use std::{fmt, io};

fn main() -> Result<(), fmt::DisplayAsDebug<io::Error>> {
    let mut file = File::open("/some/file")?;
    // do something with file
}

๋‚˜๋Š” ๊ฐ€๊นŒ์šด ์žฅ๋ž˜์— ์ด๊ฒƒ์— ๋” ์ด์ƒ ๊ธฐ์—ฌํ•  ์‹œ๊ฐ„์ด ์—†์ง€๋งŒ main์˜ ? ๋Š” ์‹ฌ๊ฐํ•œ CLI ํ”„๋กœ๊ทธ๋žจ์—์„œ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ์–ด์•ผ ํ•˜๋ฉฐ ์›๋ž˜ ์ดˆ์•ˆ์— ๊ธฐ๋Šฅ์ด ์žˆ๋‹ค๋Š” ๋ฐ ๋™์˜ํ•ฉ๋‹ˆ๋‹ค. ์ด๋ฅผ ์šฉ์ดํ•˜๊ฒŒ ํ•˜๊ธฐ ์œ„ํ•œ RFC. ๊ทธ๋“ค์€ ์ ์ฆ์ฃผ์˜์˜ ์ด๋ฆ„์œผ๋กœ ๋–จ์–ด์กŒ์ง€๋งŒ ์•„๋งˆ๋„ ๋‹ค์‹œ ๋ฐฉ๋ฌธํ•ด์•ผ ํ•  ๊ฒƒ์ž…๋‹ˆ๋‹ค.

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

Rust๋กœ ๋งŽ์€ CLI ํ”„๋กœ๊ทธ๋žจ์„ ์ž‘์„ฑํ•˜๊ณ  ์ง์žฅ์—์„œ Rust ์Šคํƒ€์ผ์„ ๋‹ด๋‹นํ•˜๋Š” ์‚ฌ๋žŒ์œผ๋กœ์„œ ์ €๋Š” ์—ฌ๊ธฐ์—์„œ @burntushi ์— ๊ฑฐ์˜ ๋™์˜ํ•ฉ๋‹ˆ๋‹ค. RFC์— ์ง€์ •๋œ ์ด ๊ธฐ๋Šฅ์˜ ๋ฒ„์ „์„ ๊ธฐ๊บผ์ด ์‚ฌ์šฉํ–ˆ์„ ๊ฒƒ์ž…๋‹ˆ๋‹ค.

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

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

Display ๋ฅผ ์‚ฌ์šฉํ•˜๋ฉด $ MainError ์™€ ๊ฐ™์€ ๋น ๋ฅด๊ณ  ๋”๋Ÿฌ์šด ์œ ํ˜•์„ ๋„์ž…ํ•˜์—ฌ ์—ฌ๋Ÿฌ ์ข…๋ฅ˜์˜ ์˜ค๋ฅ˜๋ฅผ ๋ˆ„์ ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

๊ฐœ์ธ์ ์œผ๋กœ ์ด๋Ÿฌํ•œ ์ข…๋ฅ˜์˜ ํ•ด๊ฒฐ ๋ฐฉ๋ฒ•์€ ? -in- main ์„ ์™„์ „ํžˆ ํ”ผํ•˜๋Š” ๊ฒƒ์ด ๋” ์‰ฌ์šธ ๋งŒํผ ์ถฉ๋ถ„ํžˆ ๋ณต์žกํ•ฉ๋‹ˆ๋‹ค.

@์•„๋ก ํŒŒ์›Œ :

๋‚ด๊ฐ€ ๋งํ•  ์ˆ˜์žˆ๋Š” ํ•œ (stdlib๋ฅผ ์ปดํŒŒ์ผ ํ•  ์‹œ๊ฐ„์ด์—†๊ณ  ์ „๋ฌธํ™”๊ฐ€ ์ด๊ฒƒ์„ ๋‹ค๋ฃจ๋Š”์ง€ ๋ชจ๋ฅด๊ธฐ ๋•Œ๋ฌธ์— ์™„์ „ํžˆ ํ‹€๋ฆด ์ˆ˜ ์žˆ์Œ) ๋‹ค์Œ impl์„ Termination์— ์ถ”๊ฐ€ํ•˜์ง€ ๋ชปํ•  ์ด์œ ๊ฐ€ ์—†์Šต๋‹ˆ๋‹ค. ์ด๋ ‡๊ฒŒ ํ•˜๋ฉด ๋””์Šคํ”Œ๋ ˆ์ด๋ฅผ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ๋Š” ๊ฒฝ์šฐ ์ค‘๋‹จํ•˜์ง€ ์•Š๊ณ  ์‚ฌ์šฉํ•˜๊ณ  ๊ทธ๋ ‡์ง€ ์•Š์€ ๊ฒฝ์šฐ ๋””๋ฒ„๊ทธ๋กœ ๋Œ€์ฒดํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

์ด๋ ‡๊ฒŒ ํ•˜๋ฉด fn main() -> Result<(), failure::Error> ๋ฅผ ์ž‘์„ฑํ•  ์ˆ˜ ์žˆ๊ณ  Display ๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ ์‚ฌ๋žŒ์ด ์ฝ์„ ์ˆ˜ ์žˆ๋Š” ๋ฉ‹์ง„ ์˜ค๋ฅ˜๊ฐ€ ๋ฐœ์ƒํ•˜๋ฉด ๋‚ด ์ฃผ์š” ๊ด€์‹ฌ์‚ฌ๋ฅผ ํ™•์‹คํžˆ ๋งŒ์กฑ์‹œํ‚ฌ ๊ฒƒ์ž…๋‹ˆ๋‹ค. ๊ทธ๋Ÿฌ๋‚˜ RUST_BACKTRACE=1 failure::Error ์— ์—ญ์ถ”์ ์„ ์„ ํƒ์ ์œผ๋กœ ํ‘œ์‹œํ•˜๋Š” ๋ฌธ์ œ๊ฐ€ ์—ฌ์ „ํžˆ ๋‚จ์•„ ์žˆ๋‹ค๊ณ  ์ƒ๊ฐํ•ฉ๋‹ˆ๋‹ค. failure ์ฒ˜๋ฆฌ๋ฉ๋‹ˆ๋‹ค.

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

์˜ˆ๋ฅผ ๋“ค์–ด, ์˜ค๋ฅ˜ ์œ ํ˜•์— ๋Œ€ํ•ด ๊ณ ์œ ํ•œ "๋ž˜ํผ"๋ฅผ ์ •์˜ํ•˜๊ณ  ์ด์— ๋Œ€ํ•ด From ๋ฅผ ๊ตฌํ˜„ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

struct PrettyPrintedError { ... }
impl<E: Display> From<E> for PrettyPrintedError { }

impl Debug { /* .. invoke Display .. */ }

์ด์ œ ๋‹ค์Œ๊ณผ ๊ฐ™์ด ์ž‘์„ฑํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ์ฆ‰, main ? ๋ฅผ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

fn main() -> Result<(), PrettyPrintedError> { ... }

์•„๋งˆ๋„ ๊ทธ๋Ÿฌํ•œ ์œ ํ˜•์€ quick cli ๋˜๋Š” ๋ฌด์–ธ๊ฐ€์˜ ์ผ๋ถ€์—ฌ์•ผ ํ•ฉ๋‹ˆ๊นŒ?

@nikomatsakis ๋„ค, ๊ทธ ํ•ด๊ฒฐ ๋ฐฉ๋ฒ•์„ ์™„์ „ํžˆ ์ดํ•ดํ•˜์ง€๋งŒ ?-in-main ์‚ฌ์šฉ์˜ ๊ฐ„๊ฒฐํ•จ์˜ ๋ชฉ์ ์„ ๋ฌดํšจํ™”ํ•œ๋‹ค๊ณ  ์ƒ๊ฐํ•ฉ๋‹ˆ๋‹ค. ๋ถˆํ–‰ํžˆ๋„ "์ด ํ•ด๊ฒฐ ๋ฐฉ๋ฒ•์„ ์‚ฌ์šฉํ•˜์—ฌ ?-in-main ๋ฅผ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค"๋ผ๊ณ  ์ƒ๊ฐํ•˜๋ฉด ๋ถˆํ–‰ํžˆ๋„ ?-in-main ์ž์ฒด๊ฐ€ ์†์ƒ๋ฉ๋‹ˆ๋‹ค. ์˜ˆ๋ฅผ ๋“ค์–ด, ๋‚˜๋Š” ๋‹น์‹ ์˜ ํ•ด๊ฒฐ ๋ฐฉ๋ฒ•์„ ๊ฐ„๊ฒฐํ•œ ์˜ˆ์ œ๋กœ ์ž‘์„ฑํ•˜์ง€ ์•Š์„ ๊ฒƒ์ด๋ฉฐ ๋‚ด๊ฐ€ ์ž‘์„ฑํ•˜๋Š” ๋ชจ๋“  ์˜ˆ์ œ์— ๋Œ€ํ•ด quicli ์— ๋Œ€ํ•œ ์ข…์†์„ฑ์„ ๋ถ€๊ณผํ•˜์ง€๋„ ์•Š์„ ๊ฒƒ์ž…๋‹ˆ๋‹ค. ๋‚˜๋Š” ๊ธฐ๋ณธ์ ์œผ๋กœ ๋‚ด๊ฐ€ ์ž‘์„ฑํ•˜๋Š” ๋ชจ๋“  CLI ํ”„๋กœ๊ทธ๋žจ์—์„œ ์˜ค๋ฅ˜์˜ Display ์ถœ๋ ฅ์„ ์›ํ•˜๊ธฐ ๋•Œ๋ฌธ์— ๋น ๋ฅธ ํ”„๋กœ๊ทธ๋žจ์—๋„ ์‚ฌ์šฉํ•˜์ง€ ์•Š์„ ๊ฒƒ์ž…๋‹ˆ๋‹ค. ๋‚ด ์ƒ๊ฐ์—๋Š” ์˜ค๋ฅ˜์˜ ๋””๋ฒ„๊ทธ ์ถœ๋ ฅ์ด ์‚ฌ์šฉ์ž ์•ž์— ๋‘๋Š” CLI ํ”„๋กœ๊ทธ๋žจ์˜ ๋ฒ„๊ทธ๋ผ๋Š” ๊ฒƒ์ž…๋‹ˆ๋‹ค.

?-in-main ์˜ ๋Œ€์•ˆ์€ ์ถ”๊ฐ€ ~4์ค„ ํ•จ์ˆ˜์ž…๋‹ˆ๋‹ค. ๋”ฐ๋ผ์„œ ?-in-main ๋ฅผ ์ˆ˜์ •ํ•˜์—ฌ Display $๋ฅผ ์‚ฌ์šฉํ•˜๋Š” ํ•ด๊ฒฐ ๋ฐฉ๋ฒ•์ด ๊ทธ ์ด์ƒ์ด๋ผ๋ฉด ๊ฐœ์ธ์ ์œผ๋กœ ์‚ฌ์šฉํ•  ์ด์œ ๊ฐ€ ๋ณ„๋กœ ์—†์Šต๋‹ˆ๋‹ค(๋ฌธ์„œ ํ…Œ์ŠคํŠธ ๋˜๋Š” ๋‹จ์œ„ ํ…Œ์ŠคํŠธ ์ œ์™ธ). ์œ„์— ์–ธ๊ธ‰ํ–ˆ๋“ฏ์ด).

์—๋””์…˜์—์„œ ๋ณ€๊ฒฝ๋  ์ˆ˜ ์žˆ๋Š” ํ•ญ๋ชฉ์ธ๊ฐ€์š”?

@BurntSushi std ์— ์žˆ๋Š” ํ•ด๊ฒฐ ๋ฐฉ๋ฒ•์— ๋Œ€ํ•ด ์–ด๋–ป๊ฒŒ ์ƒ๊ฐํ•˜์‹œ๋‚˜์š”? main() ์— ๋Œ€ํ•ด ์ข€ ๋” ๊ธด ๋ฐ˜ํ™˜ ์œ ํ˜• ์„ ์–ธ๋งŒ ์ž‘์„ฑํ•˜๋ฉด ๋ฉ๋‹ˆ๊นŒ?

@Kixunil ์ฒซ ๋Š๋‚Œ์€ ์•„๋งˆ๋„ ๋ง›์žˆ์„ ๊ฒƒ ๊ฐ™๋‹ค. ๊ทธ๋ž˜๋„ ๋„ˆ๋ฌด ๋งŽ์ด ์ƒ๊ฐํ•˜์ง€ ์•Š์•˜์Šต๋‹ˆ๋‹ค.

@BurntSushi

?-in-main ์— ๋Œ€ํ•œ ๋Œ€์•ˆ์€ ์ถ”๊ฐ€ ~4์ค„ ํ•จ์ˆ˜์ž…๋‹ˆ๋‹ค.

๊ถ๊ทน์ ์œผ๋กœ ๋™์ž‘์€ ์•ˆ์ •์ ์ด๋ฉฐ ํ˜„ ์‹œ์ ์—์„œ ํ˜„์‹ค์ ์œผ๋กœ ๋ณ€๊ฒฝํ•  ์ˆ˜ ์—†๋‹ค๊ณ  ์ƒ๊ฐํ•ฉ๋‹ˆ๋‹ค. (๊ฑด์ „์„ฑ ์œ„๋ฐ˜์ด ์•„๋‹ˆ๋ผ๋Š” ๋œป์ž…๋‹ˆ๋‹ค.)

์ฆ‰, ๋‚˜๋Š” ์—ฌ์ „ํžˆ ํ˜„์žฌ ์„ค์ •์ด Display ๋ณด๋‹ค ํ›จ์”ฌ ์ข‹๊ณ  ์„ ํ˜ธ๋œ๋‹ค๊ณ  ์ƒ๊ฐํ•˜์ง€๋งŒ "๊ธฐ๋ณธ๊ฐ’"์ด ๋ฌด์—‡์ธ์ง€์— ๊ด€ํ•œ ๋ฌธ์ œ๋ผ๊ณ  ์ƒ๊ฐํ•ฉ๋‹ˆ๋‹ค. ๊ธฐํƒ€ ๋‹ค์–‘ํ•œ newtypes๋ฅผ ํ†ตํ•ด. ๋”ฐ๋ผ์„œ ์šฐ๋ฆฌ๋Š” ๊ธฐ๋ณธ์ ์œผ๋กœ Debug ๋˜๋Š” ์„ธ๋ จ๋œ ์ตœ์ข… ์ œํ’ˆ์„ ์›ํ•˜๋Š” "๋น ๋ฅธ-์•ค-๋”ํ‹ฐ" ์Šคํฌ๋ฆฝํŠธ๋ฅผ ์„ ํ˜ธํ•ฉ๋‹ˆ๋‹ค. ๋‚˜๋Š” ์„ธ๋ จ๋œ ์ตœ์ข… ์ œํ’ˆ์ด ์ถ”๊ฐ€ ์ˆ˜์ž…์„ ์ถฉ๋ถ„ํžˆ ์‰ฝ๊ฒŒ ๊ฐ๋‹นํ•  ์ˆ˜ ์žˆ๋Š” ๊ณณ์ด๋ฉฐ ๋˜ํ•œ ๋‹ค์–‘ํ•œ ๊ฐ€๋Šฅํ•œ ํ˜•์‹ ์ค‘์—์„œ ์„ ํƒํ•˜๊ณ  ์‹ถ์€ ๊ณณ์ด๋ผ๊ณ  ์ƒ๊ฐํ•˜๋Š” ๊ฒฝํ–ฅ์ด ์žˆ์Šต๋‹ˆ๋‹ค(์˜ˆ: ์˜ค๋ฅ˜๋งŒ ์›ํ•˜๋Š”์ง€ ์•„๋‹ˆ๋ฉด argv๋ฅผ ํฌํ•จํ•˜๊ณ  ์‹ถ์€์ง€ [0] ๋“ฑ).

์ข€ ๋” ๊ตฌ์ฒด์ ์œผ๋กœ ๋งํ•˜๋ฉด ๋‹ค์Œ๊ณผ ๊ฐ™์„ ๊ฒƒ์ด๋ผ๊ณ  ์ƒ๊ฐํ•ฉ๋‹ˆ๋‹ค.

use failure::format::JustError;

fn main() -> Result<(), JustError> { .. }

๋˜๋Š” ๋‹ค๋ฅธ ํ˜•์‹์„ ์–ป์œผ๋ ค๋ฉด ๋‹ค์Œ์„ ์ˆ˜ํ–‰ํ•ฉ๋‹ˆ๋‹ค.

use failure::format::ProgramNameAndError;

fn main() -> Result<(), ProgramNameAndError> { .. }

์ด ๋‘ ๊ฐ€์ง€ ๋ชจ๋‘ ์ด์ „์— ์ž‘์„ฑํ•ด์•ผ ํ–ˆ๋˜ 4์ค„ ํ•จ์ˆ˜์— ๋น„ํ•ด ์ƒ๋‹นํžˆ ์ข‹์€ ๋Š๋‚Œ์„ ์ค๋‹ˆ๋‹ค.

use std::sys;

fn main() {
  match inner_main() {
    Ok(()) => { }
    Err(error) => {
      println!("{}", error);
      sys::exit(1);
    }
}

fn inner_main() -> Result<(), Error> {
  ...
}

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

@nikomatsakis ๊ทธ๊ฒƒ์€ ์•„๋งˆ๋„ ๋” ๋‚˜์€ ์žฅ๊ธฐ์  ๊ด€์ ์ผ ๊ฒƒ์ž…๋‹ˆ๋‹ค. ๊ทธ๋ฆฌ๊ณ  ๋‚˜๋Š” ๋‹น์‹ ์˜ ์ตœ์ข… ๊ฒฐ๊ณผ๊ฐ€ ์‹์š•์„ ๋‹์šฐ๊ณ  ์žˆ๋‹ค๊ณ  ์ƒ๊ฐํ•ฉ๋‹ˆ๋‹ค. ์ด๋Ÿฌํ•œ ์˜ค๋ฅ˜ ์œ ํ˜•์ด ์–ธ์  ๊ฐ€ std ๋กœ ๋๋‚˜์„œ ๊ฐ€๋Šฅํ•œ ํ•œ ์ ์€ ์˜ค๋ฒ„ํ—ค๋“œ๋กœ ์˜ˆ์ œ์—์„œ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ๋‹ค๋ฉด ์ข‹์„ ๊ฒƒ์ž…๋‹ˆ๋‹ค. :-)

ํ”„๋กœ์„ธ์Šค ๋…ธํŠธ: ์ €๋Š” ์ดˆ๊ธฐ ํ”ผ๋“œ๋ฐฑ์„ "์ด๋ฏธ ์•ˆ์ •ํ™”๋œ ๊ฒƒ์„ ๋ฐ”๊พธ์ž"๊ฐ€ ์•„๋‹ˆ๋ผ "ํ•  ์ˆ˜ ์žˆ๋Š” ์ผ์ด ์žˆ์Šต๋‹ˆ๊นŒ?"๋กœ ๊ตฌ์„ฑํ•˜๋ ค๊ณ  ํ–ˆ์Šต๋‹ˆ๋‹ค. ํ™•์‹คํžˆ ํ•  ์ˆ˜ ์—†์Šต๋‹ˆ๋‹ค. :-)

์˜ค๋ž˜ ๊ฑธ๋ฆฌ์ง€ ์•Š์•˜์Šต๋‹ˆ๋‹ค: https://crates.io/crates/exitfailure ๐Ÿ˜†

Debug ํŠธ๋ ˆ์ž‡ ๋Œ€ Display ํŠธ๋ ˆ์ž‡์„ ์‚ฌ์šฉํ•˜์—ฌ ์–ผ๋งˆ๋‚˜ ๋งŽ์€ ์‚ฌ๋žŒ๋“ค์ด ๋†€๋ž๋Š”์ง€ ๊ถ๊ธˆํ•ฉ๋‹ˆ๋‹ค. ์ดˆ๊ธฐ ํ† ๋ก  ์ดˆ์•ˆ๊ณผ ์ตœ์ข… RFC ๋Š” ๋ชจ๋‘ Display ๋ฅผ ์‚ฌ์šฉํ•˜๊ณ  ์žˆ์Šต๋‹ˆ๋‹ค. ์ด๊ฒƒ์€ ์‚ฌ๋žŒ๋“ค์ด ํ•œ ๊ฐ€์ง€๋ฅผ ์–ป๊ณ  ์žˆ๋‹ค๊ณ  ์ƒ๊ฐํ–ˆ์ง€๋งŒ ์•ˆ์ •ํ™”๋œ ํ›„์—์•ผ ๋‹ค๋ฅธ ๊ฒƒ์„ ์–ป๊ณ  ์žˆ๋‹ค๋Š” ๊ฒƒ์„ ์•Œ๊ฒŒ ๋˜๋Š” ๋ณดํŽธ์ ์ธ ์ž„ํŒฉํŠธ ํŠน์„ฑ ์‚ฌ๊ฑด๊ณผ ์œ ์‚ฌํ•ฉ๋‹ˆ๋‹ค. ๋˜ํ•œ ๋งŽ์€ ์‚ฌ๋žŒ๋“ค์ด ๋†€๋ผ์„œ ์ด ๊ธฐ๋Šฅ์„ ์‚ฌ์šฉํ•˜์ง€ ์•Š์„ ๊ฒƒ์ด๋ผ๋Š” ์ ์„ ๊ณ ๋ คํ•  ๋•Œ ๋‹ค์Œ ๋ฒ„์ „์—์„œ ๋ณ€๊ฒฝํ•˜๋ฉด ํฐ ๋ฐฑ์Šฌ๋ž˜์‹œ๊ฐ€ ์—†์„ ๊ฒƒ์ด๋ผ๊ณ  ์ƒ๊ฐํ•ฉ๋‹ˆ๋‹ค.

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

@nikomatsakis ๋น ๋ฅธ ์ฒ˜๋ฆฌ๋ฅผ ์„ ํ˜ธํ•˜๋Š” ๊ฒฝ์šฐ์˜ ์ฃผ์š” ๋ฌธ์ œ๋Š” .unwrap() ์ฒ˜๋ฆฌํ•  ์ˆ˜ ์žˆ๋Š” ๋ฐฉ๋ฒ•์ด ์ด๋ฏธ ์žˆ๋‹ค๋Š” ๊ฒƒ์ž…๋‹ˆ๋‹ค. ๋”ฐ๋ผ์„œ ๊ทธ๋Ÿฐ ๊ด€์ ์—์„œ ๋ณด๋ฉด ? ๋Š” ๋น ๋ฅธ ์†๋„๋กœ ๋”๋Ÿฌ์šด ๊ฒƒ์„ ์ž‘์„ฑํ•˜๋Š” ๋˜ ๋‹ค๋ฅธ ๋ฐฉ๋ฒ•์ด์ง€๋งŒ ์„ธ๋ จ๋œ ๊ฒƒ์„ ์ž‘์„ฑํ•˜๋Š” ์ด์™€ ๋น„์Šทํ•˜๊ฒŒ ์‰ฌ์šด ๋ฐฉ๋ฒ•์€ ์—†์Šต๋‹ˆ๋‹ค.

๋ฌผ๋ก  ๋ฐฐ๊ฐ€ ์ถœํ•ญํ–ˆ๊ธฐ ๋•Œ๋ฌธ์— ์šฐ๋ฆฌ๋Š” ๋Œ€๋ถ€๋ถ„ ๋งํ–ˆ์Šต๋‹ˆ๋‹ค. ๊ฐ€๋Šฅํ•˜๋‹ค๋ฉด ๋‹ค์Œ ํŒ์—์„œ๋Š” ์ด๊ฒƒ์ด ๋ณ€๊ฒฝ๋˜๋Š” ๊ฒƒ์„ ๋ณด๊ณ  ์‹ถ์Šต๋‹ˆ๋‹ค.

@Kixunil , unwrap ๋Š” ์ด ์Šค๋ ˆ๋“œ์˜ ์ œ๋ชฉ์ด main $์—์„œ ๊ตฌ๋ฌธ ์„คํƒ• ? ์„ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ๊ธฐ๋ฅผ ์›ํ•œ๋‹ค๊ณ  ๋‚˜์™€ ์žˆ์œผ๋ฏ€๋กœ ์‹ค์ œ๋กœ ๋ฌธ์ œ๋ฅผ ํ•ด๊ฒฐํ•˜๋Š” ์ข‹์€ ๋ฐฉ๋ฒ•์ด ์•„๋‹™๋‹ˆ๋‹ค. . ๋‚˜๋Š” ๋‹น์‹ ์ด ์–ด๋””์—์„œ ์™”๋Š”์ง€ ์ดํ•ดํ•  ์ˆ˜ ์žˆ์ง€๋งŒ(์‚ฌ์‹ค ๊ทธ๊ฒƒ์€ ์˜ต์…˜ ์ฒ˜๋ฆฌ๋ฅผ ์œ„ํ•ด ? ๋ฅผ ์‚ฌ์šฉํ•˜๋Š” ๊ฒƒ์— ๋Œ€ํ•œ ๋‚˜์˜ ์ดˆ๊ธฐ ๋ง์„ค์ž„์˜ ์ผ๋ถ€์˜€์Šต๋‹ˆ๋‹ค) ๊ทธ๋Ÿฌ๋‚˜ ์–ธ์–ด์— ? ๋ฅผ ํฌํ•จ์‹œํ‚ค๋ฉด ์ด ๋ฌธ์ œ๋Š” ๊ฝค ์ข‹์€ ์œ ์šฉ์„ฑ ์Šน๋ฆฌ IMHO. ๋” ๋‚˜์€ ์ถœ๋ ฅ์ด ํ•„์š”ํ•œ ๊ฒฝ์šฐ ์˜ต์…˜์ด ์žˆ์Šต๋‹ˆ๋‹ค. ๋จผ์ € ํ…Œ์ŠคํŠธํ•˜์ง€ ์•Š๊ณ  ์‚ฌ์šฉ์ž์—๊ฒŒ ๋ฌด์–ธ๊ฐ€๋ฅผ ๋ฆด๋ฆฌ์Šคํ•˜์ง€ ์•Š์œผ๋ฉฐ main ์˜ ์ถœ๋ ฅ์— ๋Œ€ํ•ด ์‚ฌ์šฉ์ž ์ •์˜ ์œ ํ˜•์ด ํ•„์š”ํ•˜๋‹ค๋Š” ๋ฐœ๊ฒฌ์€ ๋งค์šฐ ๋นจ๋ฆฌ ์‹คํ˜„๋  ๊ฒƒ์ž…๋‹ˆ๋‹ค.

"์ด์œ "์— ๊ด€ํ•ด์„œ๋Š” ? in main , ์ง€๊ธˆ์ด ์–ผ๋งˆ๋‚˜ ์ด์ƒํ•œ์ง€ ๊ณ ๋ คํ•˜์‹ญ์‹œ์˜ค. ๋‹ค๋ฅธ ๋ชจ๋“  ๊ณณ์—์„œ ์‹ค์ œ๋กœ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค(๋ฐ˜ํ™˜ ์œ ํ˜•์„ ์ œ์–ดํ•  ์ˆ˜ ์žˆ๊ธฐ ๋•Œ๋ฌธ์—). main ํ•จ์ˆ˜๋Š” ๊ฒฐ๊ตญ ํŠน๋ณ„ํ•˜๊ฒŒ ๋Š๊ปด์ง€์ง€ ์•Š์•„์•ผ ํ•ฉ๋‹ˆ๋‹ค.

.unwrap() ๋Š” ๊ตฌ์„ฑํ•˜์ง€ ์•Š๋Š” ๋น ๋ฅด๊ณ  ๋”๋Ÿฌ์šด ์†”๋ฃจ์…˜์ด๋ฏ€๋กœ ํ”„๋กœ๊ทธ๋žจ์„ ์Šค์ผ€์น˜ํ•˜๋Š” ๋™์•ˆ main() ์—์„œ ์ฝ”๋“œ๋ฅผ ์ธ์ˆ˜๋ถ„ํ•ดํ•  ์ˆ˜ ์—†์Šต๋‹ˆ๋‹ค.

์ด์— ๋น„ํ•ด ? ๋Š” ์ž‘์„ฑํ•˜๋Š” ๋น ๋ฅด๊ณ  ๊ฐ„๋‹จํ•œ ์†”๋ฃจ์…˜์ด๋ฉฐ, ๋น ๋ฅด๊ณ  ๊ฐ„๋‹จ ํ•˜์ง€ ์•Š๊ฒŒ ๋งŒ๋“œ๋Š” ๊ฒƒ์€ ์˜ฌ๋ฐ”๋ฅธ ๋ฐ˜ํ™˜ ์œ ํ˜•์„ main() ์— ๋„ฃ๋Š” ๋ฌธ์ œ๊ฐ€ ์•„๋‹ˆ๋ผ ์ฝ”๋“œ ์ž์ฒด๋ฅผ ์ˆ˜์ •ํ•˜๋Š” ๊ฒƒ.

@Screwtapello ์•„, ์ด์ œ ์ดํ•ด๊ฐ€ ๋ฉ๋‹ˆ๋‹ค. ๊ฐ์‚ฌ ํ•ด์š”!

์ถ”๊ฐ€ ๋ž˜ํผ์— ์˜์กดํ•˜์ง€ ์•Š๊ณ  ๋ชจ๋“  ์‘์šฉ ํ”„๋กœ๊ทธ๋žจ์— ๋Œ€ํ•ด ? in main ๋ฅผ ๊ฐ€์ ธ์˜ค๋Š” ๊ฒƒ์ด ๋ชฉํ‘œ๋ผ๊ณ  ์ƒ๊ฐํ–ˆ์Œ์„ ํ‘œํ˜„ํ•˜๊ณ  ์‹ถ์Šต๋‹ˆ๋‹ค. ๋‹จ์ง€ ํ…Œ์ŠคํŠธ๋ฅผ ์œ„ํ•œ ๊ฒƒ์ด๋ผ๋ฉด ๊ทธ๋ ‡์ง€ ์•Š์Šต๋‹ˆ๋‹ค. ๋งŽ์€ ์ด์ ์ด ์žˆ์œผ๋ฉฐ ์Šฌํ”„๊ฒŒ๋„ .unwrap() ๋ฅผ ๊ณ„์† ๊ณ ์ˆ˜ํ•  ๊ฒƒ์ž…๋‹ˆ๋‹ค.

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

๋””์Šคํ”Œ๋ ˆ์ด ์ผ€์ด์Šค์˜ stdlib ์— newtype์„ ๋„์ž…ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๊นŒ? ๋‹ค์Œ๊ณผ ๊ฐ™์€ ๊ฒƒ:

#[derive(Clone, Copy, PartialEq, PartialOrd, Eq, Ord, Debug, Hash)]
#[must_use]
struct DisplayResult<E: fmt::Display>(Result<(), E>)

impl<E> Termination for DisplayResult<E> {
    // ... same as Result, but use "{}" instead of "{:?}"
}

impl<E> From<Result<(), E>> for DisplayResult<E> {}
impl<E> Deref<Result<(), E>> for DisplayResult<E> {}
impl<E> Try for DisplayResult<E> {}
// ...

์ด๋ฅผ ํ†ตํ•ด ์‚ฌ์šฉ์ž๋Š” ๋‹ค์Œ์„ ์ž‘์„ฑํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

fn main() -> DisplayResult<MyError> {
    // Ordinary code; conversions happen automatically via From, Try, etc.
}

์ฃผ์š” ๋™๊ธฐ๋Š” ๋‹ค์Œ๊ณผ ๊ฐ™์Šต๋‹ˆ๋‹ค.

  • ์˜ค๋ฅ˜๊ฐ€ ๋ฐ˜ํ™˜๋  ๋•Œ ๋””์Šคํ”Œ๋ ˆ์ด๊ฐ€ ์‚ฌ์šฉ๋ฉ๋‹ˆ๋‹ค.
  • ์‚ฌ์šฉ์ž๋Š” ์˜ค๋ฅ˜ ๋˜๋Š” ๊ฒฐ๊ณผ ์œ ํ˜•์„ ์ถ”๊ฐ€๋กœ ๋ž˜ํ•‘ํ•  ํ•„์š”๊ฐ€ ์—†์Šต๋‹ˆ๋‹ค. ๊ทธ๋“ค์€ ์ฃผ ๊ธฐ๋Šฅ์—์„œ ? ๋ฅผ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

ํ›„์† ์กฐ์น˜: ? ๋ฐ From ์˜ ์˜๋ฏธ ์ฒด๊ณ„๋กœ ์ธํ•ด ๋‚ด๊ฐ€ ์›ํ•˜๋Š” ๋งŒํผ ์•”์‹œ์ ์œผ๋กœ ์ž‘๋™ํ•˜์ง€ ์•Š์„ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ? ๊ฐ€ From ๋ฅผ ํ†ตํ•ด ์˜ค๋ฅ˜ ์œ ํ˜• ๊ฐ„์— ๋ณ€ํ™˜๋œ๋‹ค๋Š” ๊ฒƒ์„ ์•Œ๊ณ  ์žˆ์ง€๋งŒ Try ์˜ ๋‹ค๋ฅธ ๊ตฌํ˜„์ž์— ๋Œ€ํ•ด ๋™์ผํ•œ ์ž‘์—…์„ ์ˆ˜ํ–‰ํ•˜๋Š”์ง€ ๋ชจ๋ฅด๊ฒ ์Šต๋‹ˆ๋‹ค. ์ฆ‰, Result<?, io::Error> ์—์„œ Result<?, FromIoError> ๋กœ ๋ณ€ํ™˜๋˜์ง€๋งŒ ๋ฐ˜๋“œ์‹œ Result<?, Err> ์—์„œ DisplayResult<Result<?, Err>> ๋กœ ๋ณ€ํ™˜๋˜๋Š” ๊ฒƒ์€ ์•„๋‹™๋‹ˆ๋‹ค. ๊ธฐ๋ณธ์ ์œผ๋กœ ๋‹ค์Œ๊ณผ ๊ฐ™์€ ์ž‘์—…์„ ์ฐพ๊ณ  ์žˆ์Šต๋‹ˆ๋‹ค.

fn main() -> DisplayResult<io::Error> {
    let f = io::File::open("path_to_file")?;
    let result = String::new();
    f.read_to_string(result)?
}

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

@Lucretiel : ํ”„๋กœ๊ทธ๋ž˜๋จธ๊ฐ€ ์ฃผ๋กœ ์ฝ˜์†”์— ์ข…๋ฃŒ ๋ฉ”์‹œ์ง€๋ฅผ ์ธ์‡„ํ•˜๊ธฐ๋ฅผ ์›ํ•œ๋‹ค๊ณ  ๊ฐ€์ •ํ•˜๋Š” ๊ฒƒ ๊ฐ™์Šต๋‹ˆ๋‹ค. ์ด๊ฒƒ์€ ๋น„๊ธฐ์ˆ ์  ๋ฐ์Šคํฌํ†ฑ ์‘์šฉ ํ”„๋กœ๊ทธ๋žจ, ๋กœ๊น… ๋ฐฐ๊ด€์ด ์žˆ๋Š” ๋ฐ๋ชฌ ๋“ฑ์—๋Š” ์ ์šฉ๋˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค. ์ €๋Š” ํ‘œ์ค€ ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ์— ์žˆ์–ด์•ผ ํ•  ๊ฐ•๋ ฅํ•œ ์ฆ๊ฑฐ(์˜ˆ: ์ˆซ์ž) ์—†์ด '์ผ๋ฐ˜์ ์œผ๋กœ ์œ ์šฉํ•œ' ํ•ญ๋ชฉ์„ ํ‘œ์ค€ ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ์— ์ถ”๊ฐ€ํ•˜์ง€ ์•Š๋Š” ๊ฒƒ์„ ์„ ํ˜ธํ•ฉ๋‹ˆ๋‹ค.

main Result<(), E> where E: Error ๋ฅผ ๋ฐ˜ํ™˜ํ•˜๋Š” ํ”„๋กœ๊ทธ๋ž˜๋จธ๊ฐ€ ์ฝ˜์†”์— ์˜ค๋ฅ˜ ๋ฉ”์‹œ์ง€๋ฅผ ์ธ์‡„ํ•˜๋Š” ๋ฐ ๊ด€์‹ฌ์ด ์žˆ๋‹ค๊ณ  ๊ฐ€์ •ํ•ฉ๋‹ˆ๋‹ค. ๊ทธ๋ ‡์Šต๋‹ˆ๋‹ค. Debug ๋ฅผ ํ†ตํ•ด ์ธ์‡„๋˜๋Š” ํ˜„์žฌ ๋™์ž‘์กฐ์ฐจ๋„ "์ฝ˜์†”์— ์ข…๋ฃŒ ๋ฉ”์‹œ์ง€ ์ธ์‡„"์ž…๋‹ˆ๋‹ค.

์ด ์Šค๋ ˆ๋“œ์—์„œ๋Š” ๋ฌด์–ธ๊ฐ€๊ฐ€ stderr์— ์ธ์‡„๋˜์–ด์•ผ ํ•œ๋‹ค๋Š” ๋ฐ ํญ๋„“์€ ๋™์˜๊ฐ€ ์žˆ๋Š” ๊ฒƒ ๊ฐ™์Šต๋‹ˆ๋‹ค. ๋‚ด๋ ค์•ผ ํ•  ํ•ต์‹ฌ ๊ฒฐ์ •์€ " "{}" ๋˜๋Š” "{:?}" ๋˜๋Š” ๋‹ค๋ฅธ ๊ฒƒ์œผ๋กœ ์ธ์‡„ํ•ด์•ผ ํ•˜๋Š”์ง€, ๊ทธ๋ฆฌ๊ณ  ์žˆ๋‹ค๋ฉด ์–ด๋–ป๊ฒŒ ๊ตฌ์„ฑํ•ด์•ผ ํ•˜๋Š”์ง€"์ž…๋‹ˆ๋‹ค.

@Lucretiel , ์ €์—๊ฒŒ Result ๋ฅผ ๋ฐ˜ํ™˜ํ•˜๋Š” ๊ฐ€์น˜๋Š” ์ข…๋ฃŒ ์ƒํƒœ๋ฅผ ๋ฉ‹์ง€๊ฒŒ ์ œ์–ดํ•˜๊ณ  ์žˆ์Šต๋‹ˆ๋‹ค. ๊ฐ€์žฅ ์ข‹์ง€ ์•Š์€ ๊ฒƒ์„ ์ธ์‡„ํ• ์ง€ ์—ฌ๋ถ€๋Š” ํŒจ๋‹‰ ํ•ธ๋“ค๋Ÿฌ์— ๋งก๊ฒจ์•ผ ํ•ฉ๋‹ˆ๊นŒ? stderr์— ๋ฌด์—‡์„ ์ธ์‡„ํ• ์ง€ ์—ฌ๋ถ€์™€ ๋ฌด์—‡์„ ์ธ์‡„ํ• ์ง€(์—ญ์ถ”์ , ์˜ค๋ฅ˜ ๋ฉ”์‹œ์ง€ ๋“ฑ) ๋ฌธ์ œ๊ฐ€ ์žˆ์Šต๋‹ˆ๋‹ค. https://github.com/rust-lang/rust/issues/43301#issuecomment -389099936, ํŠนํžˆ. ๋งˆ์ง€๋ง‰ ๋ถ€๋ถ„.

๋‚˜๋Š” ์ด๊ฒƒ์„ ์ตœ๊ทผ์— ์‚ฌ์šฉํ–ˆ๊ณ  Display ๋ผ๊ณ  ๋ถ€๋ฅด๊ธฐ๋ฅผ ๋ฐ”๋ž๋‹ค. ์šฐ๋ฆฌ๊ฐ€ ์—ฌ๊ธฐ์—์„œ ์ „ํ™”๋ฅผ ์ž˜๋ชป ๊ฑธ์—ˆ๋‹ค๊ณ  ํ™•์‹ ํ•ฉ๋‹ˆ๋‹ค.

๋‚ด๊ฐ€ ์•Œ์•„์ฐจ๋ฆฐ ํ”„๋กœ์„ธ์Šค ์‹คํŒจ๋Š” libs ํŒ€์ด ์•„๋‹ˆ๋ผ lang ํŒ€(์ฃผ๋กœ Niko์™€ I)์ด ๊ฒฐ์ •ํ–ˆ์ง€๋งŒ ๋ฌธ์ œ์˜ ์ฝ”๋“œ๋Š” ์™„์ „ํžˆ std์— ์žˆ๋‹ค๋Š” ๊ฒƒ์ž…๋‹ˆ๋‹ค. ์•„๋งˆ๋„ libs๊ฐ€ ๋” ๋‚˜์€ ๊ฒฐ์ •์„ ๋‚ด๋ ธ์„ ๊ฒƒ์ž…๋‹ˆ๋‹ค.

@withoutboats ๋„ˆ๋ฌด ๋Šฆ์—ˆ๋‚˜์š”? ์ด ๊ธฐ๋Šฅ์€ ์—ฌ์ „ํžˆ โ€‹โ€‹๋ฌธ์„œ ์—์„œ ์•ผ๊ฐ„ ์ „์šฉ/์‹คํ—˜์œผ๋กœ ํƒœ๊ทธ๊ฐ€ ์ง€์ •๋˜์–ด ์žˆ์ง€๋งŒ ์•ˆ์ •ํ™” ํ”„๋กœ์„ธ์Šค ์ด๋ฉด์˜ ์„ธ๋ถ„์„ฑ์„ ์ดํ•ดํ•˜์ง€ ๋ชปํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

๋‚˜๋„ ์ด ๋ณ€๊ฒฝ ์‚ฌํ•ญ์„ ๋ณด๊ณ  ์‹ถ์Šต๋‹ˆ๋‹ค. ํŒ€์—์„œ ๊ตฌํ˜„์„ Display ์—์„œ Debug ๋กœ ๋ณ€๊ฒฝํ•˜๋„๋ก ์š”์ฒญํ–ˆ์„ ๋•Œ ๋” ๊ฐ•๋ ฅํ•œ ์˜นํ˜ธ์ž๊ฐ€ ๋˜์ง€ ๋ชปํ•œ ๊ฒƒ์„ ํ›„ํšŒํ•ฉ๋‹ˆ๋‹ค.

@Lucretiel Termination ํŠน์„ฑ์€ ์•ผ๊ฐ„์ด์ง€๋งŒ ๊ธฐ๋Šฅ ์ž์ฒด( main Termination ๊ตฌํ˜„ ๋ฐ˜ํ™˜)๋Š” ์ด๋ฏธ ์•ˆ์ •์ ์ž…๋‹ˆ๋‹ค.

ํŠน์„ฑ์˜ ์ด๋ฆ„์„ ์•ˆ์ •ํ™”ํ•˜๊ธฐ ์œ„ํ•œ ํ‹ฐ์ผ“์ด๋‚˜ ํƒ€์ž„๋ผ์ธ์ด ์žˆ์Šต๋‹ˆ๊นŒ?

@xfix ๊ตฌํ˜„์„ ๋ณ€๊ฒฝํ•  ์ˆ˜ ์žˆ๋‹ค๋Š” ๋œป์ด๊ฒ ์ฃ ? ๋™์ž‘์€ ๋ณ€๊ฒฝ๋˜์ง€ ์•Š์ง€๋งŒ( Termination main ) ํŠน์„ฑ ์ž์ฒด๋Š” ๋‹ค์Œ๊ณผ ๊ฐ™์ด ๋ณ€๊ฒฝ๋ฉ๋‹ˆ๋‹ค.

impl<E: Debug> Termination for Result<(), E> ...

์—๊ฒŒ:

impl<E: Display> Termination for Result<(), E> ...

๊ตฌํ˜„์„ ๋ณ€๊ฒฝํ•˜๋Š” ๊ฒƒ์ด ๊ฐ€๋Šฅํ•˜์ง€ ์•Š์Šต๋‹ˆ๊นŒ?

์ด์ „ ๋ฒ„์ „๊ณผ์˜ ํ˜ธํ™˜์„ฑ์„ ๊นจ๋œจ๋ฆฌ์ง€ ์•Š๊ณ ๋Š” ์•„๋‹™๋‹ˆ๋‹ค. ์ด ์ฝ”๋“œ๋Š” ์˜ค๋Š˜๋‚ ์˜ ์•ˆ์ •์ ์ธ Rust์—์„œ ์ปดํŒŒ์ผ๋ฉ๋‹ˆ๋‹ค.

#[derive(Debug)]
struct X;

fn main() -> Result<(), X> {
    Ok(())
}

Display ๋ฅผ ์š”๊ตฌํ•˜๋„๋ก ์ œ์•ˆ๋œ ๋ณ€๊ฒฝ์œผ๋กœ ์ปดํŒŒ์ผ์ด ์ค‘์ง€๋ฉ๋‹ˆ๋‹ค.

์ด๋ฏธ ์–ธ๊ธ‰ํ–ˆ๋“ฏ์ด ์ „๋ฌธํ™”์™€ ๊ฐ™์€ ๊ฒƒ์ด ๋„์›€์ด ๋  ์ˆ˜ ์žˆ์ง€๋งŒ ์ „๋ฌธํ™”์— ๋Œ€ํ•œ ํ˜„์žฌ ์ดํ•ด๋Š” Display ๋ฐ Debug ๋ฅผ ๋ชจ๋‘ ๊ตฌํ˜„ํ•˜๋Š” ์œ ํ˜•์—๋งŒ ์œ ์šฉํ•˜๋‹ค๋Š” ๊ฒƒ์ž…๋‹ˆ๋‹ค(์ฆ‰, ๋” ํŠน๋ณ„ํ•œ ๊ตฌํ˜„).

trait ResultTerm {
    fn which(&self);
}
impl<T: Debug> ResultTerm for T {
    default fn which(&self) {
        println!("{:?}", self)
    }
}
impl<T: Debug + Display> ResultTerm for T {
    fn which(&self) {
        println!("{}", self)
    }
}

enum MyResult<T, E> {
    Ok(T),
    Err(E),
}

impl<T, E> Termination for MyResult<T, E>
where
    E: ResultTerm,
{
    fn report(self) -> i32 {
        match self {
            MyResult::Err(e) => {
                e.which();
                1
            }
            _ => 0,
        }
    }
}

์šด๋™์žฅ

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

์•„, ์•ˆ์ •์ ์ธ ๋…น์ด ๋ฌด์—‡์„ ์˜๋ฏธํ•˜๋Š”์ง€ ์•Œ๊ฒ ์Šต๋‹ˆ๋‹ค. ์›ฌ์ผ์ธ์ง€ ๋‚˜๋Š” ์ด๊ฒƒ์ด ์•ˆ์ • ์ƒํƒœ์—์„œ ์‚ฌ์šฉ ๊ฐ€๋Šฅํ•˜๋‹ค๋Š” ๊ฒƒ์„ ์•Œ์ง€ ๋ชปํ–ˆ์Šต๋‹ˆ๋‹ค.

์ด๊ฒƒ์€ ์ปดํŒŒ์ผ ํƒ€์ž„์— Cargo ํ”Œ๋ž˜๊ทธ๋กœ ์ „ํ™˜ํ•  ์ˆ˜ ์žˆ๋Š” ๊ฒƒ์ž…๋‹ˆ๊นŒ? panic = "abort" ์™€ ๊ฐ™์ด ๋‹ค๋ฅธ ๊ฒƒ๋“ค์„ ์ „ํ™˜ํ•  ์ˆ˜ ์žˆ๋Š” ๊ฒƒ๊ณผ ๊ฐ™์€ ๋ฐฉ์‹์ž…๋‹ˆ๋‹ค.

์•„๋งˆ๋„? ๋‹ค๋ฅธ Rust ์—๋””์…˜์—์„œ ? ์˜ main ์— ๋Œ€ํ•ด ๋‹ค๋ฅธ ๋™์ž‘์„ ํ•˜๋Š” ๊ฒƒ์ด ๊ฐ€๋Šฅํ•˜๋‹ค๋Š” ๊ฒƒ์„ ์•Œ ์ˆ˜ ์žˆ์—ˆ์Šต๋‹ˆ๋‹ค. 2018๋…„์ด ์•„๋‹ˆ๋ผ 2021๋…„์ด ์•„๋‹๊นŒ?

๋™์ผํ•œ ํ”„๋กœ๊ทธ๋žจ์˜ ๋‹ค๋ฅธ ์ƒ์ž๋Š” ๋‹ค๋ฅธ ์—๋””์…˜์— ์žˆ์„ ์ˆ˜ ์žˆ์ง€๋งŒ ๋™์ผํ•œ std ๋ฅผ ์‚ฌ์šฉํ•˜๋ฏ€๋กœ std ์—์„œ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ๋Š” ํŠน์„ฑ๊ณผ ํ•ด๋‹น impls๋Š” ์—๋””์…˜ ๊ฐ„์— ๋™์ผํ•ด์•ผ ํ•ฉ๋‹ˆ๋‹ค. ์šฐ๋ฆฌ๊ฐ€ ์ด๋ก ์ƒ์œผ๋กœ ํ•  ์ˆ˜ ์žˆ๋Š” ๊ฒƒ์€(๋‚˜๋Š” ์ด๊ฒƒ์„ ์˜นํ˜ธํ•˜๋Š” ๊ฒƒ์ด ์•„๋‹™๋‹ˆ๋‹ค) Termination ๋ฐ Termination2 main() ๋‘ ๊ฐ€์ง€ ํŠน์„ฑ์„ ๊ฐ€์ง€๋ฉฐ ํ•˜๋‚˜ ๋˜๋Š” main() ๋ฅผ ์ •์˜ํ•˜๋Š” ํฌ๋ ˆ์ดํŠธ ๋ฒ„์ „์— ๋”ฐ๋ผ ๋‹ค๋ฆ…๋‹ˆ๋‹ค.

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

  1. ๋””๋ฒ„๊ทธ๊ฐ€ ์žˆ์ง€๋งŒ ๋””์Šคํ”Œ๋ ˆ์ด๊ฐ€ ์—†๋Š” ์œ ํ˜•์€ ๊ธฐ๋ณธ์ ์œผ๋กœ ๋””๋ฒ„๊ทธ ์ถœ๋ ฅ์„ ์ธ์‡„ํ•ฉ๋‹ˆ๋‹ค.
  2. ๋””๋ฒ„๊ทธ์™€ ๋””์Šคํ”Œ๋ ˆ์ด๊ฐ€ ๋ชจ๋‘ ์žˆ๋Š” ์œ ํ˜•์€ ๊ธฐ๋ณธ์ ์œผ๋กœ ๋””์Šคํ”Œ๋ ˆ์ด ์ถœ๋ ฅ์ด ์ธ์‡„๋ฉ๋‹ˆ๋‹ค.
  3. ๋””์Šคํ”Œ๋ ˆ์ด๊ฐ€ ์žˆ์ง€๋งŒ ๋””๋ฒ„๊ทธ๊ฐ€ ์—†๋Š” ํ˜•์‹์€ ์ปดํŒŒ์ผ๋Ÿฌ ์˜ค๋ฅ˜๋ฅผ ๋ฐœ์ƒ์‹œํ‚ต๋‹ˆ๋‹ค.

Display๊ฐ€ ์žˆ๋Š” ์œ ํ˜•์ด ์žˆ์ง€๋งŒ ์–ด๋–ค ์ด์œ ๋กœ๋“  Debug๋ฅผ ์ธ์‡„ํ•˜๊ธฐ๋ฅผ ์›ํ•˜๋Š” ๊ฒฝ์šฐ ๋ˆ„๊ตฐ๊ฐ€๊ฐ€ 2๋ฒˆ ํ•ญ๋ชฉ์— ์ด์˜๋ฅผ ์ œ๊ธฐํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ์ด ๊ฒฝ์šฐ๋Š” ๋ฏธ๋ฆฌ ์„ค๊ณ„๋œ ๋‹ค์–‘ํ•œ ์ถœ๋ ฅ ํ˜•์‹ ์˜ค๋ฅ˜ ์œ ํ˜•์— ๋Œ€ํ•œ Niko์˜ ์ œ์•ˆ์œผ๋กœ ํ•ด๊ฒฐ๋  ๊ฒƒ์ด๋ผ๊ณ  ์ƒ๊ฐํ•ฉ๋‹ˆ๋‹ค.

ํฌ์ธํŠธ 3์— ๊ด€ํ•ด์„œ๋Š” ์•ฝ๊ฐ„ ๋ฒ„๋ฒ…๊ฑฐ๋ฆฝ๋‹ˆ๋‹ค(์•„๋งˆ๋„ 1.0์—์„œ trait Display: Debug ๋ฅผ ๋‹ค์‹œ ํ–ˆ์–ด์•ผ ํ–ˆ์„๊นŒ์š”?). ํ•˜์ง€๋งŒ ๋ˆ„๊ตฐ๊ฐ€๊ฐ€ Display impl์„ ์ž‘์„ฑํ•˜๋Š” ๋ฐ ์–ด๋ ค์›€์„ ๊ฒช์—ˆ๋‹ค๋ฉด ๊ทธ๋“ค์—๊ฒŒ ๋บจ์„ ๋•Œ๋ฆฌ๋„๋ก ์š”์ฒญํ•˜๋Š” ๊ฒƒ์€ ๊ทธ๋‹ค์ง€ ์ค‘์š”ํ•˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค. ๋‹จ์ผ ํŒŒ์ƒ(๋‚ด ์ƒ๊ฐ์— ๊ทธ๋“ค์€ ์•„๋งˆ๋„ ์–ด์จŒ๋“  ๊ฐ€์ง€๊ณ  ์žˆ๋‹ค๊ณ  ์ƒ๊ฐํ•ฉ๋‹ˆ๋‹ค... ๋””์Šคํ”Œ๋ ˆ์ด ์œ ํ˜•์— ๋””๋ฒ„๊ทธ๋ฅผ ์‚ฌ์šฉํ•˜๋Š” ๊ฒƒ์„ ์›์น™์ ์œผ๋กœ ๋ฐ˜๋Œ€ํ•˜๋Š” ์‚ฌ๋žŒ์ด ์žˆ์Šต๋‹ˆ๊นŒ?).

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

๋น ๋ฅธ ์Šคํฌ๋ฆฝํŠธ์—์„œ Display ๊ฐ€ Debug ๋ณด๋‹ค ์„ ํ˜ธ๋˜๋Š” ๊ฒฝ์šฐ๋Š” &'static str ๋˜๋Š” String ๋ฅผ ์˜ค๋ฅ˜ ์œ ํ˜•์œผ๋กœ ์‚ฌ์šฉํ•˜๋Š” ๊ฒƒ์ž…๋‹ˆ๋‹ค. #[derive(Debug)] ๋ฅผ ์ ์šฉํ•  ์‚ฌ์šฉ์ž ์ง€์ • ์˜ค๋ฅ˜ ์œ ํ˜•์ด ์žˆ๋Š” ๊ฒฝ์šฐ ์ด๋ฏธ ์˜ค๋ฅ˜ ์ฒ˜๋ฆฌ์— ์‚ฌ์†Œํ•œ ์—๋„ˆ์ง€๋ฅผ ์†Œ๋น„ํ•˜๊ณ  ์žˆ๋Š” ๊ฒƒ์ž…๋‹ˆ๋‹ค.

@SimonSapin ๋น ๋ฅธ ์Šคํฌ๋ฆฝํŒ… ํ™˜๊ฒฝ์—์„œ ๋ฐ”๋žŒ์งํ•˜์ง€ ์•Š๊ฑฐ๋‚˜ ๋…ธ๋ ฅํ•˜์ง€ ์•Š๊ณ  ๋ฌธ์ž์—ด์„ Display ํ˜•์‹์œผ๋กœ ์ธ์‡„ํ•˜๋ ค๋Š” ์œ„์น˜์— ์žˆ์„ ์ •๋„๋กœ ๋ฐ”๋žŒ์งํ•˜์ง€ ์•Š๋‹ค๊ณ  ๋งํ•˜๊ณ  ์‹ถ์Šต๋‹ˆ๋‹ค. ์˜ฌ๋ฐ”๋ฅธ ํ˜•์‹์˜ ์˜ค๋ฅ˜๊ฐ€ ์žˆ์œผ๋ ค๋ฉด ๋‚˜์—๊ฒŒ Debug ๊ฐ€ ์„ ํ˜ธ๋ฉ๋‹ˆ๋‹ค. ์™œ๋ƒํ•˜๋ฉด ๊ทธ๊ฒƒ์ด String์ผ ๋•Œ ์˜ค๋ฅ˜ ํ˜•์‹์ด ์ž˜ ํ˜•์„ฑ๋˜์ง€ ์•Š์•„์„œ Err("โ€ฆ") ์ฃผ์œ„์— ์žˆ์œผ๋ฉด ๋‹ค๋ฅธ ์˜ค๋ฅ˜์—์„œ ์‰ฝ๊ฒŒ ์‹œ๊ฐ์ ์œผ๋กœ ์˜ค๋ฅ˜๋ฅผ ์„ ํƒํ•  ์ˆ˜ ์žˆ๊ธฐ ๋•Œ๋ฌธ์ž…๋‹ˆ๋‹ค. ์ถœ๋ ฅ๋˜์—ˆ์„ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

FWIW ํ˜•์‹์€ Result<_, E> ๊ฐ’์ด ์•„๋‹ˆ๋ผ ๋‚ด๋ถ€์— E ๊ฐ’๋งŒ ์žˆ์Šต๋‹ˆ๋‹ค. ๋”ฐ๋ผ์„œ ์ถœ๋ ฅ์— Err( ๊ฐ€ ํ‘œ์‹œ๋˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค. ๊ทธ๋Ÿฌ๋‚˜ ํ˜„์žฌ ์ฝ”๋“œ๋Š” Error: ์ ‘๋‘์‚ฌ๋ฅผ ์ถ”๊ฐ€ํ•ฉ๋‹ˆ๋‹ค. Display ๊ฐ€ ์‚ฌ์šฉ๋˜๋ฉด ์•„๋งˆ๋„ ๊ทธ๋Œ€๋กœ ์žˆ์„ ๊ฒƒ์ž…๋‹ˆ๋‹ค. ๋”ฐ์˜ดํ‘œ๋ฅผ ์ธ์‡„ํ•˜์ง€ ์•Š๋Š” ๊ฒƒ ์™ธ์—๋„ Display ๋Š” ์‚ฌ์šฉ์ž์—๊ฒŒ (์˜ค๋ฅ˜) ๋ฉ”์‹œ์ง€๋ฅผ ํ‘œ์‹œํ•  ๋•Œ ๋ฐ”๋žŒ์งํ•œ IMO์ธ ๋ฌธ์ž์—ด์˜ ๋‚ด์šฉ์„ ๋ฐฑ์Šฌ๋ž˜์‹œ๋กœ ์ด์Šค์ผ€์ดํ”„ํ•˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค.

https://github.com/rust-lang/rust/blob/cb6eeddd4dcefa4b71bb4b6bb087d05ad8e82145/src/libstd/process.rs#L1527 -L1533

์ฃผ์–ด์ง„ ์ƒํ™ฉ์—์„œ ์šฐ๋ฆฌ๊ฐ€ ํ•  ์ˆ˜ ์žˆ๋Š” ์ตœ์„ ์€ Display impl์„ ์ธ์‡„ํ•˜๊ธฐ ์œ„ํ•ด Display + Debug ๋ฅผ ๊ตฌํ˜„ํ•˜๋Š” ์œ ํ˜•์„ ์ „๋ฌธํ™”ํ•˜๋Š” ๊ฒƒ์ž…๋‹ˆ๋‹ค. Debug ๋ฅผ ๊ตฌํ˜„ํ•˜์ง€ ์•Š๋Š” ์œ ํ˜•์ด ์˜ค๋ฅ˜๋กœ ์‚ฌ์šฉ๋  ์ˆ˜ ์—†๋‹ค๋Š” ๊ฒƒ์€ ๋ถˆํ–‰ํ•œ ์ผ์ด์ง€๋งŒ (๊ต์ฐจ impls๋ฅผ ์ง€์›ํ•  ๋•Œ๊นŒ์ง€) ์šฐ๋ฆฌ๊ฐ€ ํ•  ์ˆ˜ ์žˆ๋Š” ์ตœ์„ ์ž…๋‹ˆ๋‹ค.

์ฃผ์š” ์งˆ๋ฌธ์€ ํ•ด๋‹น impl์ด std์˜ ํŠน์ˆ˜ impls์— ๋Œ€ํ•œ ํ˜„์žฌ ์ •์ฑ…์— ํ•ด๋‹นํ•˜๋Š”์ง€ ์—ฌ๋ถ€์ž…๋‹ˆ๋‹ค. ์šฐ๋ฆฌ๋Š” ์ผ๋ฐ˜์ ์œผ๋กœ ๋™์ž‘์ด ๋‚˜์ค‘์— ๋ณ€๊ฒฝ๋˜์ง€ ์•Š๋Š”๋‹ค๋Š” ์•ˆ์ •์ ์ธ ๋ณด์žฅ์„ ์ œ๊ณตํ•˜์ง€ ์•Š๋Š” std์—์„œ๋งŒ ์ „๋ฌธํ™”๋ฅผ ์‚ฌ์šฉํ•œ๋‹ค๋Š” ๊ทœ์น™์ด ์žˆ์Šต๋‹ˆ๋‹ค(์ „๋ฌธํ™” ์ž์ฒด๊ฐ€ ๋ถˆ์•ˆ์ •ํ•œ ๊ธฐ๋Šฅ์ด๊ธฐ ๋•Œ๋ฌธ์—). ์šฐ๋ฆฌ๊ฐ€ ๊ฒฐ๊ตญ ํŠน์„ฑํ™”๋ฅผ ๊ธฐ๋Šฅ์œผ๋กœ ์ œ๊ฑฐํ•˜๋ฉด ์–ธ์  ๊ฐ€ ์ด๋Ÿฌํ•œ ์œ ํ˜•์ด Debug ์ถœ๋ ฅ์œผ๋กœ ๋˜๋Œ์•„๊ฐˆ ๊ฐ€๋Šฅ์„ฑ์ด ์žˆ๋‹ค๋Š” ๊ฒƒ์„ ์ธ์‹ํ•˜๊ณ  ์ด impl์„ ์ œ๊ณตํ•˜๋Š” ๊ฒƒ์ด ํŽธ์•ˆํ•ฉ๋‹ˆ๊นŒ?

์‚ฌ์‹ค ์ด ์ „๋ฌธํ™”๋Š” ๋ถˆ๊ฑด์ „ํ•จ์„ ๋ถˆ๋Ÿฌ์ผ์œผํ‚ฌ ์ˆ˜ ์žˆ๊ธฐ ๋•Œ๋ฌธ์— ์ง€๊ธˆ ๋‹น์žฅ์€ ํ—ˆ์šฉํ•  ์ˆ˜ ์—†๋‹ค๊ณ  ์ƒ๊ฐํ•ฉ๋‹ˆ๋‹ค. ์ด impl ์€ ์‹ค์ œ๋กœ ์šฐ๋ฆฌ์—๊ฒŒ ๋งŽ์€ ๋ฌธ์ œ๋ฅผ ์ผ์œผํ‚ค๋Š” ์ข…๋ฅ˜์˜ ์ „๋ฌธํ™”์ž…๋‹ˆ๋‹ค!

use std::cell::Cell;
use std::fmt::*;

struct Foo<'a, 'b> {
     a: &'a Cell<&'a i32>,
     b: &'b i32,
}

impl<'a, 'b> Debug for Foo<'a, 'b> {
    fn fmt(&self, _: &mut Formatter) -> Result {
        Ok(())
    }
}

impl<'a> Display for Foo<'a, 'a> {
    fn fmt(&self, _: &mut Formatter) -> Result {
        self.a.set(self.b);
        Ok(())
    }
}

ํ˜„์žฌ ์ „๋ฌธํ™”๊ฐ€ ์ž‘๋™ํ•˜๋Š” ๋ฐฉ์‹ ๋•Œ๋ฌธ์— 'b ๊ฐ€ 'a ๋ณด๋‹ค ์˜ค๋ž˜ ์ง€์†๋˜์ง€ ์•Š๋Š” Foo<'a, 'b> report ๋ฅผ ํ˜ธ์ถœํ•  ์ˆ˜ ์žˆ์œผ๋ฉฐ ํ˜„์žฌ ์ปดํŒŒ์ผ๋Ÿฌ๋Š” ์ˆ˜๋ช… ์š”๊ตฌ ์‚ฌํ•ญ์ด ์ถฉ์กฑ๋˜์ง€ ์•Š๋”๋ผ๋„ Display ์ธ์Šคํ„ด์Šค๋ฅผ ํ˜ธ์ถœํ•˜๋Š” impl์„ ์„ ํƒํ•˜์—ฌ ์‚ฌ์šฉ์ž๊ฐ€ ์ฐธ์กฐ์˜ ์ˆ˜๋ช…์„ ์ž˜๋ชป ์—ฐ์žฅํ•  ์ˆ˜ ์žˆ๋„๋ก ํ•ฉ๋‹ˆ๋‹ค.

๋‚˜๋Š” ๋„ˆํฌ๋“ค์— ๋Œ€ํ•ด ์•Œ์ง€ ๋ชปํ•˜์ง€๋งŒ ๋‚ด๊ฐ€ ๋น ๋ฅธ "์Šคํฌ๋ฆฝํŠธ"๋ฅผ ์ž‘์„ฑํ•  ๋•Œ ๋‚˜๋Š” ๋ชจ๋“  ๊ฒƒ์„ unwrap() ๊ทธ๋ƒฅ ๋ฒ„๋ฆฐ๋‹ค. ์ปจํ…์ŠคํŠธ ์ •๋ณด๋ฅผ ์ œ๊ณตํ•˜๋Š” ์—ญ์ถ”์ ์ด ์žˆ๊ธฐ ๋•Œ๋ฌธ์— 100๋ฐฐ ๋” ์ข‹์Šต๋‹ˆ๋‹ค. ๊ทธ๊ฒƒ ์—†์ด๋Š” ๋‚ด ์ฝ”๋“œ์— let ... = File::open() ๊ฐ€ ๋‘ ๋ฒˆ ์ด์ƒ ์žˆ๋Š” ๊ฒฝ์šฐ ์–ด๋Š ๊ฒƒ์ด ์‹คํŒจํ–ˆ๋Š”์ง€ ์ด๋ฏธ ์‹๋ณ„ํ•  ์ˆ˜ ์—†์Šต๋‹ˆ๋‹ค.

๋‚˜๋Š” ๋„ˆํฌ๋“ค์— ๋Œ€ํ•ด ์•Œ์ง€ ๋ชปํ•˜์ง€๋งŒ ๋‚ด๊ฐ€ ๋น ๋ฅธ "์Šคํฌ๋ฆฝํŠธ"๋ฅผ ์ž‘์„ฑํ•  ๋•Œ ๋‚˜๋Š” ๋ชจ๋“  ๊ฒƒ์„ unwrap() ๊ทธ๋ƒฅ ๋ฒ„๋ฆฐ๋‹ค. ์ปจํ…์ŠคํŠธ ์ •๋ณด๋ฅผ ์ œ๊ณตํ•˜๋Š” ์—ญ์ถ”์ ์ด ์žˆ๊ธฐ ๋•Œ๋ฌธ์— 100๋ฐฐ ๋” ์ข‹์Šต๋‹ˆ๋‹ค. ๊ทธ๊ฒƒ ์—†์ด๋Š” ๋‚ด ์ฝ”๋“œ์— let ... = File::open() ๊ฐ€ ๋‘ ๋ฒˆ ์ด์ƒ ์žˆ๋Š” ๊ฒฝ์šฐ ์–ด๋Š ๊ฒƒ์ด ์‹คํŒจํ–ˆ๋Š”์ง€ ์ด๋ฏธ ์‹๋ณ„ํ•  ์ˆ˜ ์—†์Šต๋‹ˆ๋‹ค.

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

@Kixunil : ๋˜๋Š” ๋” ์ •๊ตํ•œ ์˜ค๋ฅ˜ ์ฒ˜๋ฆฌ ์ „๋žต ๋ฐ/๋˜๋Š” ๋” ๊ด‘๋ฒ”์œ„ํ•œ ๋กœ๊น… ๋ฐ/๋˜๋Š” ๋””๋ฒ„๊น…์„ ์„ ํ˜ธํ•ฉ๋‹ˆ๋‹ค.

"RFC ๊ตฌํ˜„"์ด ์ฒดํฌ๋  ์ˆ˜ ์žˆ๋‹ค๊ณ  ์ƒ๊ฐํ•ฉ๋‹ˆ๋‹ค. ๋งž์ฃ ? ์ ์–ด๋„ ์ด๊ฒƒ ์— ๋”ฐ๋ฅด๋ฉด ! :์›ƒ๋‹ค:

์ด๊ฒƒ์ด ์™„์ „ํžˆ ๋‹จ์„œ๊ฐ€ ์•„๋‹ˆ๋ผ๋ฉด ์‹ค๋ก€ํ•ฉ๋‹ˆ๋‹ค. ๊ทธ๋Ÿฌ๋‚˜ ๊ฐ€๋Šฅํ•˜๋ฉด ์ „๋ฌธํ™”๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ ์˜ค๋ฅ˜ ์ฒด์ธ์„ ๋ณด๊ณ ํ•  ์ˆ˜ ์—†์Šต๋‹ˆ๋‹ค.

use std::error::Error;

impl<E: fmt::Debug> Termination for Result<!, E> {
    default fn report(self) -> i32 {
        let Err(err) = self;
        eprintln!("Error: {:?}", err);
        ExitCode::FAILURE.report()
    }
}

impl<E: fmt::Debug + Error> Termination for Result<!, E> {
    fn report(self) -> i32 {
        let Err(err) = self;
        eprintln!("Error: {:?}", err);

        for cause in Error::chain(&err).skip(1) {
            eprintln!("Caused by: {:?}", cause);
        }
        ExitCode::FAILURE.report()
    }
}

https://github.com/rust-lang/rfcs/blob/f4b8b61a414298ba0f76d9b786d58ccdc34a44bb/text/1937-ques-in-main.md#L260 -L270

impl<T: Termination, E: Display> Termination for Result<T, E> {
    fn report(self) -> i32 {
        match self {
            Ok(val) => val.report(),
            Err(ref err) => {
                print_diagnostics_for_error(err);
                EXIT_FAILURE
            }
        }
    }
}

RFC์˜ ์ด ๋ถ€๋ถ„์ด ๊ตฌํ˜„๋˜์ง€ ์•Š์€ ์ด์œ ๊ฐ€ ์žˆ์Šต๋‹ˆ๊นŒ?

์šฐ๋ฆฌ๋Š” ์‚ฌ์šฉํ•  ํŠน์„ฑ๊ณผ ์•”์‹œ์˜ ์ •ํ™•ํ•œ ์„ธํŠธ๋ฅผ ์•ฝ๊ฐ„ ๋ณ€๊ฒฝํ–ˆ์Šต๋‹ˆ๋‹ค. ํ•˜์ง€๋งŒ ์ด ์‹œ์ ์—์„œ ์„ธ๋ถ€ ์‚ฌํ•ญ์€ ๊ธฐ์–ต๋‚˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค. ๊ทธ๋ฆฌ๊ณ  ์•ˆ์ •ํ™”ํ•ด์•ผ ํ•  ๋ช‡ ๊ฐ€์ง€ ์„ธ๋ถ€ ์‚ฌํ•ญ์ด ๋‚จ์•„ ์žˆ๋‹ค๊ณ  ์ƒ๊ฐํ•ฉ๋‹ˆ๋‹ค. ์ž์„ธํ•œ ๋‚ด์šฉ์€ ์ƒ์œ„ ๋ฌธ์ œ์—์„œ ๋งํฌ๋œ ์•ˆ์ •ํ™” ๋ณด๊ณ ์„œ๋ฅผ ํ™•์ธํ•˜๋Š” ๊ฒƒ์ด ์ข‹์Šต๋‹ˆ๋‹ค.

์ด ๊ธฐ๋Šฅ์˜ ์ƒํƒœ๋Š” ๋ฌด์—‡์ž…๋‹ˆ๊นŒ? ์•ˆ์ •ํ™”์— ๋Œ€ํ•œ ์ œ์•ˆ์ด ์žˆ์Šต๋‹ˆ๊นŒ?

@GrayJack ์ด ๋ฌธ์ œ๋Š” ๊ฝค ์˜ค๋ž˜์ „์— ๋‚˜์™”์œผ๋ฏ€๋กœ ์ข…๋ฃŒ๋˜์–ด์•ผ ํ•ฉ๋‹ˆ๋‹ค.

์‚ฌ์‹ค, ๊ทธ๋ฆฌ๊ณ  ์•ฝ๊ฐ„ ํ˜ผ๋ž€์Šค๋Ÿฌ์›Œ์„œ Termination ํŠธ๋ ˆ์ž‡์˜ ๋งํฌ์—์„œ ์—ฌ๊ธฐ๋กœ ์™”๊ณ  ์ด์— ๋Œ€ํ•ด ์งˆ๋ฌธํ–ˆ์Šต๋‹ˆ๋‹ค termination_trait_lib ์— ์ ์ ˆํ•œ ๋ฌธ์ œ๊ฐ€ ์žˆ์Šต๋‹ˆ๊นŒ?

์ด ๋ฌธ์ œ๋Š” ๋‹ซ์•„์•ผ ํ•ฉ๋‹ˆ๋‹ค

์ด ๋ฌธ์ œ๋Š” Termination ์˜ ์•ˆ์ •ํ™”๋ฅผ ์ถ”์ ํ•˜๊ธฐ ์œ„ํ•ด ์•„์ง ์—ด๋ ค ์žˆ์Šต๋‹ˆ๋‹ค.

์ด ํŽ˜์ด์ง€๊ฐ€ ๋„์›€์ด ๋˜์—ˆ๋‚˜์š”?
0 / 5 - 0 ๋“ฑ๊ธ‰