์ด๊ฒ์ RFC " ?
in main
"(rust-lang/rfcs#1937)์ ๋ํ ์ถ์ ๋ฌธ์ ์
๋๋ค.
๋จ๊ณ:
?
in main
(#46479)?
in doctest?
in #[test]
์์ ํ:
main
์์ ํ(https://github.com/rust-lang/rust/issues/48453) https://github.com/rust-lang/ ์ ๋ณํฉ๋จ ๊ด๋ จ ๋ฌธ์ :
ํด๊ฒฐ๋์ง ์์ ์ง๋ฌธ:
์ข ๋ฃ ์ํ๋ ์ด๋ป๊ฒ ์ฒ๋ฆฌ๋ฉ๋๊น?
@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
์ฌ์ฉ ํ์ฉ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 ์ฐธ์กฐ).
๊ทธ๊ฒ์ ์๋ฏธ๋:
librustc/middle/lang_items.rs
)Termination
ํธ๋ ์์ #[cfg_attr(not(stage0), lang = "termination")]
์ถ๊ฐ. #[lang = "termination"]
์์ฑ์ ์ถ๊ฐํ ์ ์๋ ์ด์ ๋ "stage0" ์ปดํ์ผ๋ฌ(๋ถํธ์คํธ๋ํ ์ค)๊ฐ termination
๊ฐ ์กด์ฌํ๋ค๋ ์ฌ์ค์ ์์ง ๋ชปํ๊ธฐ ๋๋ฌธ์ libstd๋ฅผ ์ปดํ์ผํฉ๋๋ค. stage0 ์ปดํ์ผ๋ฌ๋ฅผ ์
๋ฐ์ดํธํ ๋ cfg_attr
๋ฅผ ์๋์ผ๋ก ์ ๊ฑฐํฉ๋๋ค.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
๋ฅผ ์ฌ์ฉํ๋๋ก ๋ณ๊ฒฝํด์ผ ํฉ๋๋ค.
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
๋๋ ๋ค๋ฅธ ์ด๋ค ๊ฒ์ผ๋ก ๋ณ๊ฒฝํ๋ ๋ฐ ์ด์๊ฐ ์์ต๋๋ค. ๋๋ ํน๋ณํ ์ด๋ฆ์ ์ง๋ ๊ฒ์ ์ํ์ง ๋ชปํ๋ฉฐ ๋ค๋ฅธ ์ฌ๋์ด ๋ ๋์ ์์ด๋์ด๋ฅผ ๊ฐ๊ฒ ๋์ด ๊ธฐ์ฉ๋๋ค.
ํน์ฑ์ด๋ผ๊ณ ํด์ผํ๋
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 Box
from 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 ๋งค์ฐ ๊ฐ๋จํฉ๋๋ค.
From
์ด์ ์ค๋ฅ ์ ํ์ ๊ตฌํํ์ญ์์ค.Debug
(๋๋ Display
)๋ฅผ ๊ตฌํํฉ๋๋ค.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๊ฐ ์๋ํ๋ ๋ฐฉ์์ ๋ค์๊ณผ ๊ฐ์ต๋๋ค.
fn main
๋ฅผ ์ ์ธํ๋์ง doctest๋ฅผ ์ค์บํฉ๋๋ค.//
๋ค์ ์์ง ์์ "fn main"์ ๋ํ ์ค ๋จ์ ํ
์คํธ ๊ฒ์์ ์ํํฉ๋๋ค)fn main
๊ฐ ๋ฐ๊ฒฌ๋๋ฉด ์ด๋ฏธ ์๋ ๊ฒ์ ๊ฑด๋๋ฆฌ์ง ์์ต๋๋ค.fn main
๊ฐ ๋ฐ๊ฒฌ๋์ง ์์ผ๋ฉด ๋๋ถ๋ถ์* doctest๋ฅผ ๊ธฐ๋ณธ fn main() { }
๋ก ๋ํํฉ๋๋ค.#![inner_attributes]
๋ฐ extern crate
์ ์ธ์ ์ถ์ถํ์ฌ ์์ฑ๋ ๊ธฐ๋ณธ ํจ์ ์ธ๋ถ์ ๋ฐฐ์นํ์ง๋ง ๋๋จธ์ง๋ ๋ชจ๋ ๋ด๋ถ์ ๋ค์ด๊ฐ๋๋ค.std
๋ผ๊ณ ํ์ง ์์) rustdoc์ ์์ฑ๋ main ํจ์ ๋ฐ๋ก ์์ extern crate my_crate;
๋ฌธ๋ ์ฝ์
ํฉ๋๋ค.(๋ช ๊ฐ์ง ์ธ๋ถ ์ฌํญ์ ๋จ๊ฒผ์ง๋ง ํธ๋ฆฌํ๊ฒ ์ฌ๊ธฐ์ ์ ์ฒด๋ฅผ ์์ฑํ์ต๋๋ค.)
๋ฐ๋ผ์ ?
๋ฅผ 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 ๊ฐ ์ ์ํ ์ ๋ฌธํ ์ ๊ทผ ๋ฐฉ์์ ๋ค์ ๋์์ ์์ฑํ๋ค๋ ์ ์์ ์ฝ์์ด ์๋ค๊ณ ์๊ฐํฉ๋๋ค.
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์ธ ๋ฌธ์์ด์ ๋ด์ฉ์ ๋ฐฑ์ฌ๋์๋ก ์ด์ค์ผ์ดํํ์ง ์์ต๋๋ค.
์ฃผ์ด์ง ์ํฉ์์ ์ฐ๋ฆฌ๊ฐ ํ ์ ์๋ ์ต์ ์ 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()
}
}
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
์ ์์ ํ๋ฅผ ์ถ์ ํ๊ธฐ ์ํด ์์ง ์ด๋ ค ์์ต๋๋ค.
๊ฐ์ฅ ์ ์ฉํ ๋๊ธ
์ด ๋ฌธ์ ์ ๋ํด ์๋ฌด๊ฒ๋ ํ๊ธฐ์๋ ๋๋ฌด ๋ฆ์ ์์ ์ ๋ผ์ด๋ค์ด์ ์ฃ์กํฉ๋๋ค. ํ์ง๋ง ๋ง์ผ์ ๊ฒฝ์ฐ๋ฅผ ๋๋นํ์ฌ ์ฌ๊ธฐ์ ์ ํผ๋๋ฐฑ์ ๋จ๊ธฐ๊ณ ์ถ์์ต๋๋ค. ๋๋ ์ด ์ค๋ ๋์ ๋๋ถ๋ถ์ ์ฝ์์ผ๋ฏ๋ก ๊ทธ ๋งฅ๋ฝ์ ์ผ๋์ ๋๊ณ ์ด์ผ๊ธฐํฉ๋๋ค. ๊ทธ๋ฌ๋ ์ด ์ฐ๋ ๋๋ ๊ธธ๊ธฐ ๋๋ฌธ์ ์ ๊ฐ ๊ฐ๊ณผํ ๋ถ๋ถ์ด ์๋ค๋ฉด ์๋ง ๊ฐ๊ณผํ์ ๊ฒ์ด๊ณ ์ง์ ํด ์ฃผ์๋ฉด ๊ฐ์ฌํ๊ฒ ์ต๋๋ค. :-)
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
๋ฅผ ์ฌ์ฉํ ์ํฉ์ ์์ํ๋ ๋ฐ ์ด๋ ค์์ด ์์ต๋๋ค. ์ฆ, ์ค์ ํ๋ก๊ทธ๋จ๊ณผ ์ต๋ํ ์ผ์นํ๋ ์์ ๋ฅผ ์์ฑํ๋ ค๊ณ ๋ ธ๋ ฅํ์ผ๋ฉฐ ์ผ๋ฐ์ ์ผ๋ก ๋ค์๊ณผ ๊ฐ์ด ์์ฑํ์ต๋๋ค.๊ฒ๋ณด๊ธฐ์๋ ์ด๊ฒ์
?-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์์ ์ปดํ์ผ๋ฉ๋๋ค.
Display
๋ก ์ ํํ๋ฉด ์ด ์ฝ๋๊ฐ ๊นจ์ง ๊ฒ ๊ฐ์ต๋๋ค. ๊ทธ๋ฌ๋ ๋๋ ํ์คํ ๋ชจ๋ฅธ๋ค! ์ด๊ฒ์ด ์ ๋ง๋ก ๋ฐฐ๋ฅผ ํ๋ ๋ฌธ์ ๋ผ๋ฉด, ๋๋ ์ดํดํ๊ณ ์์ ์ ์ค๋ช ํ๋ ๋ฐ ๋๋ฌด ๋ง์ ์์ฉ์ด ์์ง๋ง, ์ ์ด๋ ์ด๊ฒ์ ๋ํด ์ถฉ๋ถํ ๊ฐํ๊ฒ ๋๋ผ๊ณ ์์ต๋๋ค. ๊ทธ๊ฒ์ ๊ณ ์น ์ ์๋ ์ผ์ด ์๋ค๋ฉด. (์ฌ๊ธฐ์ ๋ด๊ฐ ๊ณผ๋ฏผ ๋ฐ์์ ๋ณด์ผ ์๋ ์์ง๋ง ์ง๊ธ๊น์ง ๋ ์ฌ๋์ด ๋ด CSV ์์ ์์ "์?-in-main
๋ฅผ ์ฌ์ฉํ์ง ์์ต๋๊น?"๋ผ๊ณ ๋ฌผ์๊ณ ๋ด ๋๋ต์ ๊ธฐ๋ณธ์ ์ผ๋ก, "๊ทธ๋ฐ ์ผ์ด ์ด๋ป๊ฒ ๊ฐ๋ฅํ ์ง ๋ชจ๋ฅด๊ฒ ์ต๋๋ค." ์๋ง๋ ๊ทธ๊ฒ์?-in-main
๋ก ํด๊ฒฐ๋ ๋ฌธ์ ๊ฐ ์๋์์ง๋ง ์ผ๋ถ ์ฌ๋๋ค์ ํ์คํ ๊ทธ๋ฐ ์ธ์์ ๋ฐ์์ต๋๋ค. ํ์ฌ ๊ตฌํ์ผ๋ก , ๋ฌธ์ ํ ์คํธ์ ๋จ์ ํ ์คํธ์์ ์ ์ฉํ๋ค๊ณ ๋ณผ ์ ์์ง๋ง ๋ค๋ฅธ ์ํฉ์์ ์ฌ์ฉํ ์๊ฐ์ ์ด๋ ต์ต๋๋ค.)