ããã¯ãRFC " ?
in main
"ïŒrust-lang / rfcsïŒ1937ïŒã®è¿œè·¡ã®åé¡ã§ãã
æé ïŒ
?
main
ïŒïŒ46479ïŒ?
#[test]
ã®?
ïŒ$å®å®åïŒ
main
ãå®å®åïŒ https://github.com/rust-lang/rust/issues/48453ïŒhttps://github.com/rust-lang/ã«ããŒãžé¢é£ããåé¡ïŒ
æªè§£æ±ºã®è³ªåïŒ
çµäºã¹ããŒã¿ã¹ã¯ã©ã®ããã«åŠçãããŸããïŒ
@Screwtapelloã«ãããã®ã³ã¡ã³ãã¯ãFCPã®çµããã«è¿ãããŠãããã«å¿ããŠRFCã«å€æŽãå ããããšãã§ããªãããã§ãã
èŠããã«ãRFCã¯ãååãªæ ¹æ ã¯ãããã®ã®ããããŸãã§ãããã«ç°åžžãªçµæããããããšããçç±ã§å€±æããå Žåã«2ãè¿ãããšãææ¡ããŠããŸãã æãé©ãã¹ãããšã¯ãããã°ã©ã ãæåãŸãã¯å€±æ以å€ã®è©³çŽ°ãå¿ èŠãšããŠããããšã瀺ããªãå Žåã«1ãè¿ãããšã§ãã ããã¯ãRFCããã»ã¹ãæ··ä¹±ãããŠããããã«æããããšãªãè°è«ã§ããã»ã©ååã«ãã€ã¯ã·ã§ãã£ã§ããããããšããã®ç¹å®ã®å®è£ ã®è©³çŽ°ã«çžãããŠããŸããïŒ
ãã ããå®è£ ã®è©³çŽ°ã§ã¯ãããŸãããã
äžéšã®ã¹ã¯ãªããã¯ããµãããã»ã¹ããæ å ±ãååŸããæ¹æ³ãšããŠçµäºã³ãŒãã䜿çšããŸãã
ããã¯ç¹ã«ããµãããã»ã¹ïŒRustã§å®è£ ïŒã«ããã€ããªã®ããã¹ãŠãæ£åžžã/ãåé¡ãçºçããã以å€ã«æäŸããæ å ±ããªãå Žåã«é¢ãããã®ã§ãã
äžéšã®ã¹ã¯ãªããã¯ããµãããã»ã¹ããæ å ±ãååŸããæ¹æ³ãšããŠçµäºã³ãŒãã䜿çšããŸãã
ãã®åäœã¯ããŒã以å€ã®å Žåã¯å€±æãæå³ãããšããç¹ã§ãåžžã«_except_ãšåŒã°ããããã°ã©ã ã«å€§ããäŸåããŸãã mainé¢æ°ã©ãããŒãšã«ãã¯ã¢ããããŒãã«ãåãã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-compiler-middle]ã®åé¡ã§ãã ãã«ããå¿ èŠãªå Žåã¯ãirc.mozilla.orgïŒç§ã¯arielbyïŒãŸãã¯https://gitter.im/rust-impl-period/WG-compiler-middle ïŒç§ã¯@ arielb1 ïŒã®#rustcã«åå ã§ããŸããããã®ïŒã
ïŒ44505ã«WIPã³ã³ãã€ã©ã®readmeããããŸã-ã³ã³ãã€ã©ã®ããã€ãã®ããšã説æããŠããŸãã
ãã®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
å
ïŒ#[cfg_attr(not(stage0), lang = "termination")]
ã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
次ã«ãreturnã¿ã€ãã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
ããåŒã³åºãå¿
èŠããããŸãã çŸåšã Instance::mono
ã䜿çšããŠåçžlang_start
ãã€ã³ã¹ã¿ã³ã¹åããŠãããé©åãªsubstã§monomorphize::resolve
ã䜿çšããããã«å€æŽããå¿
èŠããããŸãã
Termination
ã®äœ¿çšãèš±å¯ããdoctestãã©ã®ããã«æ©èœããã®ãããããããŸããã ãã¶ã@alexcrichtonã«èããŠãã ããïŒãããç§ãããããšã§ãïŒïŒ
#[test]
ã§Termination
ã®äœ¿çšãèš±å¯ããlibtestãã©ã®ããã«æ©èœããã®ãããããããŸããã ãã¶ã@alexcrichtonã«èããŠãã ããïŒãããç§ãããããšã§ãïŒïŒ åäœãã¹ãã¯åºæ¬çã«ãã¯ãã«ãã£ãŠçæãããããã ()
以å€ã®æ»ãåãåŠçããã«ã¯ããã®ãã¯ããŸãã¯ãã®åŒã³åºãå
ãå€æŽããå¿
èŠããããŸãã
@bkchr
å°ãªããšãIRC/gitterã«åå ã§ããŸããïŒ
@bkchrããã§ãã¯ã€ã³ããŠãã-ç§ã¯ããªããš@arielb1ããã°ããåã«gitterã«ã€ããŠäŒè©±ããŠããã®ãèŠãŸãããäœãé²æ©ã¯ãããŸããïŒ ã©ããã§ããã¶ãïŒ
ç³ãèš³ãããŸãããããããŸã§ã®é²æã¯ãããŸããã çŸåšãããããšã¯ãããããããŸãããä»é±äžã«ãããå§ããæéãèŠã€ããããããšãé¡ã£ãŠããŸãã
@bkchrå©ããå¿ èŠãªå Žåã¯ãç§ã«ç¥ãããŠãã ããïŒ
ç§ã¯çŸåšå°ãç«ã¡åŸçããŠããŸããç§ã¯çŸ©åãäœæããããšæããŸãã 矩åãäœæããã«ã¯ãTraifRefãå¿ èŠã§ããTraitRefã®å Žåã¯ãDefIdãå¿ èŠã§ãã çµäºç¹æ§ãã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ã䜿çšãããã®ã§ããã®ããã«çµäºç¹æ§ã®defidãå¿ èŠã§ãã
ãããå¿
èŠãªã®ã¯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ã§compiler-middleã¯ãŒãã³ã°ã°ã«ãŒãgitterã«åå ããhttpsã§ïŒrust-internalsIRCãã£ãã«ãè©Šãããšããå§ãããŸãã ïŒ//chat.mibbit.com/ïŒserver = irc.mozilla.orgïŒ 3AïŒ 2B6697ïŒchannel =ïŒ 23rust-internalsã :)
@bstrieãããããããšããç§ã¯ãã§ã«ã®ãã¿ãŒãã£ããã®äžéšã§ãããç§ã®åé¡ã解決ããããšãã§ããŸãã :)
@bkchrããªãã®åé¡ã¯ãã®è¡ã«ãããŸãã ããã«æ§ç¯ãããç¹æ§åç
§ã¯ã R: Termination
ã®ãããªãã®ã§ããããã§ã R
ã¯é¢æ°ã®æ»ãåã§ãã ããã¯ããã¬ã€ãã®ã¿ã€ããã©ã¡ãŒã¿ïŒãã®å Žåã¯Self
ïŒã®ä»£ãããšãªãå€ã®ã»ããã§ããé©åãªãsubstsããæ§ç¯ããããšã«ãã£ãŠæå®ãããŸãã
ãã ãããã¬ã€ãã§Substs::identity_for_item
ã¡ãœãããåŒã³åºããŠããŸãã ããã«ããããã¬ã€ãå®çŸ©èªäœã®äžã§äœ¿çšãã眮æãè¿ãããŸãã ã€ãŸãããã®å Žåã Termination
ãã¬ã€ãã§å®£èšãããSelf
ãã©ã¡ãŒã¿ãSelf
ã«ãããã³ã°ããŠããŸãã ããã¯ã Terminator
ãã¬ã€ãå
ã®é¢æ°ã®å®çŸ©ã確èªããå Žåã«é©åã§ãããããã§ã¯ããã»ã©å€ãã¯ãããŸããã
代ããã«å¿
èŠãªã®ã¯ããšã³ããªé¢æ°ã®æ»ãåãååŸããããšã§ãã ããã¯ãå€æ°ret_ty
ãŸãã¯actual_ret_ty
ã®1ã€ã«ãããŸããã ã©ã¡ãã§ãæ§ããŸãããã ret_ty
ã®æ¹ãè¯ããšæããŸããããã¯ããŠãŒã¶ãŒã宣èšããæ»ãåã«å¯Ÿå¿ããŸãïŒ actual_ret_ty
ã¯å®éã«è¿ãããã³ãŒãã®åã§ãïŒã
tcxããmk_substs()
ã¡ãœãããåŒã³åºãã ãã§ãå¿
èŠãªsubstãäœæã§ããŸãã ãã®å Žåããã©ã¡ãŒã¿ã¯ã¿ã€ãã ããªã®ã§ã let substs = fcx.tcx.mk_substs(&[ret_ty]);
ã®ãããªãã®ãæ©èœãããšæããŸãã
䜿çšããã®ã¯tcx.mk_substs_trait(ret_ty, &[])
ã ãšæããŸãã
@bkchrã¯ãã§ãã¯ã€ã³ããã ãã§ã-ãã®ã¢ããã€ã¹ã䜿çšããæ©äŒããããŸãããïŒ ïŒãŸããããéãå¿çã®ããã«ãgitterã§å°ããããšã¯è³¢æãããããŸãããïŒ
ãããç§ã¯gitterã®åé¡ã解決ããããšãã§ããŸãã:)
@bkchrã©ãã§ããïŒ ãã§ãã¯ã€ã³ããã ãã§ãã
ãã¹ãŠå€§äžå€«ã§ããããããä»é±ã¯ã³ãŒãã調ã¹ãæéããããŸãã
ããäžäººããããæäŒãäœå°ã¯ãããŸããïŒ å¹Žæ«ãŸã§ã«Rustã³ãã¥ããã£ãžã®è²¢ç®ãéå§ããããšæããŸãããŸãããã®æ©èœãæ¯æŽããããšæããŸãã ããŸãããã°ãããã«ã€ããŠ2人ãååããããšã¯ããã»ã©æ··ä¹±ããªãã§ãããã
@ 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-nounã¯ãexit-as-a-verbã®èªç¶ãªå¯Ÿå¿ç©ã§ãããã»ãšãã©ã®å Žåãå¶åŸ¡ãããæ¹æ³ã§ãå
éšãããããã»ã¹ãçµäºããããã®ããç¥ãããåèªã§ãã
ç¹ã«C++ããã°ã©ããŒã«ãšã£ãŠããçµäºãã¯std::terminate
ãæãèµ·ããããŸããããã¯ãããã©ã«ãã§ç°åžžçµäºïŒ abort
ãåŒã³åºãïŒã«ãªããåºæ¬çã«C ++ã¯ãããã¯ã«çžåœããŸãïŒãã ãããããã¯ãšã¯ç°ãªãã決ããŠå·»ãæ»ãããŸãããã¹ã¿ãã¯ïŒã
åŸ ã£ãŠããã®ã³ã¡ã³ããç¡èŠããŠãã ãããRFCãæ瀺çã«è°è«ãéãããŸãŸã«ãªã£ãŠããããã«èŠããŸãã
ç¹æ§åãšããŠExit
ã奜ãã§ãã
Carrier
ã§èµ·ãã£ãããã«ããã®æ©èœã¯ç¹æ§ãå®å®ãããã£ãšåã«å®å®ããã ãããšç§ã¯èããŠããŸãã
FWIWããã¯ãå®å®åã®åã«ä»®ã®ååãå€æŽãããããšãæ¬åœã«å¬ããæããã1ã€ã®ã±ãŒã¹ã§ãïŒD
RFCã®äœæè
ãšããŠãç§ã¯ãã¬ã€ãã®ååãExit
ããŸãã¯ä»ã®äœãã«å€æŽããããšã«ç°è«ã¯ãããŸããã ç§ã¯ç©äºã«ååãä»ããã®ãç¹ã«åŸæã§ã¯ãªããä»ã®èª°ããããè¯ãã¢ã€ãã¢ãæã£ãŠãããããšãå¬ããæããŸãã
ç¹æ§ã¯ããã¯ãã§ã
std::ops::Termination
std::Termination
ãšåŒã°ããŸããïŒResult
ã®å®è£
ã§ã¯$ïŒ stderr
$ã«åºåããå¿
èŠãããã libcore
ã§ã¯å®è¡ã§ããªãããããã¬ã€ããlibcore
ã«é
眮ã§ããŸããã§ããã
@bkchr implãlibstdã«ãããããšãã£ãŠããã¬ã€ããlibstdã«ãããå¿ èŠããããšããæå³ã§ã¯ãããŸããã
@kennytmç¥ã£ãŠããŸãããResultã¯libcoreã§ãå®çŸ©ãããŠãããããlibstdã®Resultã«ã¿ãŒãããŒã·ã§ã³ãå®è£ ããããšã¯ã§ããŸããã
@zackwç¹æ§åãšããŠã Exit
ã«ããã«+1祚ãæããŸãã
@ U007D ïŒãã®ãããªã¡ãã»ãŒãžãæçš¿ãã代ããã«ããªã¢ã¯ã·ã§ã³ãã¿ã³ïŒäŸïŒðïŒã䜿çšããŠããã ããŸãããïŒ ããã«ãããäžå¿ èŠã«pingãå®è¡ããããšã§ãåé¡ã®ãããµãã¹ã¯ã©ã€ããŒãç ©ãããåé¿ã§ããŸãã
language_feature
libtest
/ libsyntax
ããã§ãã¯ã€ã³ã§ããŸããïŒ @ arielb1 @nikomatsakis @alexcrichton
libsyntaxã®@bkchrã¯ãããæž¡ãå¿ èŠããããããããŸããããçè«çã«ã¯å¯èœã§ãããå®è¡æã®libtestèªäœã§ã¯ããã§ãã¯ã§ãããšã¯æããŸããã
@bkchrã©ããã£ãŠããã«è¡ãã®ïŒ
ç§ã¯ãŸã ããã«åãçµãã§ããŸãããçŸåšç§ã¯ãã以äžè³ªåããããŸãã:)
ãã®å®è£ ã¯å³å¯ããããšæããŸãã
#[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
}
}
}
}
ããã¯æ®å¿µãªåå ãã§ãŒã³ã倱ããŸãã
ãã ãã説æã§ã¯ãªãdisplayimplã䜿çšããæ¹ã確å®ã«åªããŠããŸãã
åå é£éã¯èå³æ·±ãåé¡ã§ãã ç¹ã«ããã®å®è£ ã¯ãåå ãã§ãŒã³ã®æåã®2ã€ã®ã¡ã³ããŒã®ã¿ãåºåããŸãã
倱æã¯ãåå ãã§ãŒã³ãåŠçããæ¹æ³ã«å¯ŸåŠããå¿
èŠããããããã©ã«ãã§ãã®åäœã«èœã¡çããŸããïŒããšãã°ã .context
ã䜿çšããŠãšã©ãŒãèç©ããå ŽåïŒ
{}
ã¯ãã®ãšã©ãŒã®ã¿ãåºåããŸã{:?}
ã¯ããã®ãšã©ãŒãšãã®åå ãïŒååž°çã«ïŒåºåããŸãããã§:?
ã䜿çšããŠãDisplayã§ã¯ãªãDebugã«ãã€ã³ãããããšãã§ããŸãã ããããªãã
ãããç§ã¯ãµããŒãããããã«implãæ¹åããå¿
èŠãããããšããã§ã«ç¥ã£ãŠããŸãã ç§ã¯ç§ãã¡ã«äœãã§ãããã«ã€ããŠãªãŒãã³ã§ãã Debug
ã«ãã€ã³ãããã®ã¯è¯ãèããããããŸããã
ããŒããããã¯ããªãããŒãªãã®ã§ãã ãæŽç·Žããããããã°ã©ã ããã®ç¹æ§ã®æé»ãå©çšãããšç§ãã¡ãèãããã©ããã«äŸåãããšæããŸãã ãããããããã§ã¯ãããŸããããšèšã£ãŠã倧äžå€«ã ãšæãåŸåããããŸããåºæ¬çã«ãæŽç·Žãããããã°ã©ã ã¯ãïŒaïŒåºåããã£ããããŠä»ã®æ¹æ³ã§åŠçããããïŒbïŒæ°ããã¿ã€ããŸãã¯ãããã°ãå®è£
ãããã®ã䜿çšããŸããæ£ããæ¹æ³ã ããã¯ãæçšãªæ
å ±ããã³ãããããã«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
åèãŸã§ã«ããããå®å
šãªãvsããããŠãŒã¶ãŒãã¬ã³ããªãŒãªãããã©ã«ãïŒã€ãŸãDebug
ãšDisplay
ã®ç¹æ§å¶éïŒã®åé¡ãåãæ¿ããŸããã
TL; DRã¯ããäœãããªããå Žåã«ãããã¯ãªãŒã³ã§èŠçŽåºåãæäŸããããã«ãå¢çãDisplay
ã«èšå®ããå¿
èŠããããšèããŠããŸãïŒ @withoutboatsã®å
ã®æçš¿ã«ããïŒã
ãããç§ã®çè«çæ ¹æ ã§ãïŒ
termination
ãã¬ã€ãã®RFCã®åé¡ã§ã @ zackwã¯ã Rustããã¥ã¢ã«panic
/ Result
ã·ã¹ãã ãæã£ãŠãããšãã説åŸåã®ãããã€ã³ãã瀺ããŠããŸããããã¯ã panic
ããã°ãšResult
çšã§ããããã§ãã
ãã¡ããã誰ããæºè¶³ã§ããããã©ã«ãã¯1ã€ã§ã¯ãªãã®ã§ãé©ãæå°ã®ååãé©çšããŠãã©ã¡ãã®ããã©ã«ããããé©åããèªåããŸãã
ãšã©ãŒã¯ãäœãïŒããããä¿®æ£å¯èœïŒãééã£ãŠããïŒãã¡ã€ã«ãèŠã€ãããªããªã©ïŒããšããŠãŒã¶ãŒã«äŒããããšãç®çãšããŠãããããèšèšã§ã¯åŠçãããªãããšããããããŸãã ãã®ããããŠãŒã¹ã±ãŒã¹ãååšãããŠãŒã¶ãŒã察象èªè ã§ããããšãäžè¬çã§ãããšåççã«èŠãªãããšãã§ããŸãã
@nikomatsakisãææããããã«ãéžæããããã©ã«ãã«é¢ä¿ãªããåäœãå€æŽãããéçºè ã¯ãnewtypeãã¿ãŒã³ã䜿çšããããmainïŒïŒã§ã«ã¹ã¿ã å®è£ ãéçºã§ããŸãã
ãããŠæåŸã«ããã䞻芳çãªåŽé¢ãšããŠãéå»2æ¥éã«ãã®æ©èœã䜿çšãããšããã Debug
ã®åºåã«ããããRustã¢ããªããããæŽç·ŽãããŠããªãããã«æããããŸããã
$ foo
Error: Custom { kind: Other, error: StringError("returned Box<Error> from main()") }
$
vs
$ foo
Error: returned Box<Error> from main()
$
Dispay
ç¹æ§ã¯ãïŒãã°ã§ã¯ãªãïŒãšã©ãŒã®ã¯ããã«ææçãªããã©ã«ãã®ããã§ãããããã§ã¯ãããŸãããïŒ
@ U007DåŸ ã£ãŠãã ãããããã2ã€ã®åºåã®ã©ã¡ãã奜ãã§ããïŒ
ïŒ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()
ãªã©ã®ä»ã®ç¶æ³ã§è¡ããã®ãšäŒŒãŠããå¿
èŠããããŸãã ããã©ã«ãã¯1ã€ããååšã§ãããæŽç·ŽããããœãããŠã§ã¢ã¯ãšã«ããåºåããªãŒããŒã©ã€ãããå¿
èŠãããããã Debug
ã䜿çšããŠéçºè
åãã®ããã©ã«ãã«æ祚ããŸãã
ãã®è°è«ã®æ žå¿ã¯ãæ¬åœã«ãããã©ã«ãã®ã¡ãã»ãŒãžã®ã¿ãŒã²ãããªãŒãã£ãšã³ã¹ã¯èª°ããã ãšæããŸãã
å°ãã®éãããã©ã«ãã®ã¿ãŒã²ãããªãŒãã£ãšã³ã¹ãéçºè
ã§ããããšã«å
šå¡ãåæãããšããŸãããã Debug
ã®ããã©ã«ãã®ç¯å²ã¯ç°¡åãªéžæã ãšæããŸãã
ããã§ãããã©ã«ãã®ã¿ãŒã²ãããªãŒãã£ãšã³ã¹ããŠãŒã¶ãŒã§ããããšã«åæãããšããŸããããããã§ããããããä»ã®äººãšã¯æèŠãäžèŽããããæŽç·Žããããåºåããææåããããåºåãªã©ã®äž»èŠ³çãªå質ãéèŠãªåœ¹å²ãæãããŠãããšæããŸããéã¶ã äžéšã®äººã«ãšã£ãŠã¯ããšã³ããŠãŒã¶ãŒã«ãããã¬ãŒã³ããŒã·ã§ã³ã®ã磚ãããDisplay
ãåé¿ããããã®æè¯ã®çç±ãããããŸããã ïŒç§ã¯ããŸããŸãã®èŠè§£ãå
±æããŠããŸããããç§ã¯ãããç解ããå°éããŠããŸããïŒ
ããã§ããç§ã¯ç¢ºãã«ã©ã¡ããã®ã°ã«ãŒãã®åŠ¥åœãªè°è«ãããã©ã«ãã®ã¿ãŒã²ãããšããŠèŠãããšãã§ããŸãã ã©ã®ãªãŒãã£ãšã³ã¹ãããã©ã«ãã®ã¿ãŒã²ããã«ãããã«ã€ããŠåŒ·ãã³ã³ã»ã³ãµã¹ãåŸãããã°ãç¹æ§ã®éçã®éžæã¯æ確ã«ãªããšæããŸãïŒerïŒ... :)
ïŒç§ã¯ãã®ãããã¯å
šäœã«å®å
šã«ç²ŸéããŠããŸãããïŒ Termination
ã®ããã©ã«ãã®ãšã©ãŒåºåããŠãŒã¶ãŒã«è¡šç€ºå¯èœãªåœ¢åŒã§ããå Žåããããå®å
šã«é©åã§ããå°ããªãŠãŒãã£ãªãã£ãååšããå¯èœæ§ã¯èããããŸããã Display
ã®ããã«ïŒ ãã®å Žåãäœè
ããã«ã¹ã¿ã åŠçãã®ããã«æãå·®ã䌞ã¹ãªããã°ãªããªãå¯äžã®çç±ã¯ãç§ãã¡ãããããäœæãããã©ããã§ãã
誰ããããããã®å Žåã®åºåãã©ã®ããã«èŠãããã®äŸãæäŸã§ããŸããïŒäœ¿çšãããç¹å®ã®E
ã¿ã€ãã«ãäŸåãããšæããŸããïŒïŒããã«ã¹ã¿ã åŠçããå¿
èŠãªå Žåã«äœæè
ãå®éã«å®è¡ããå¿
èŠã®ããæé ã¯äœã§ããïŒä»£ããã¯ïŒ ç§ã¯äžèšã®ä»®èª¬ãç«ãŠãŠããŸãã
ïŒåºåã¯æåéã@ U007Dãäžã«è²Œãä»ãããã®ã®ããã«èŠããŸããïŒãªããreturnedBox\ããšåºåãããã®ã§ããããã
ãšã©ãŒã¡ãã»ãŒãžã®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ãäžã«è²Œãä»ãããã®ã®ããã«èŠããŸããïŒ ãªããè¿åãããããã¯ã¹ããå°å·ããã®ã§ãããã
ãã®ããã¯ã¹ã®å®éã®å 容ã®ä»£ããã«mainïŒïŒ"ãã ïŒ
@glaebhoerlæ£è§£ã§ãããã®å Žåãããã®Box<Error>
ã®å®éã®å
容ãã¯ã termination_trait
ããã¹ãããããã«äœæããã«ã¹ã¿ã ã®message
ãã£ãŒã«ãã§ãããéèªçã«è¡šç€ºãããŸãã ã 代ããã«ãfoobarbazããªã©ãæžãããšãã§ããŸãïŒãã ããã³ã³ãã€ã©ãã¹ããå®è¡ãããŠãŒã¶ãŒã«ãšã£ãŠã¯ããã»ã©åœ¹ã«ç«ããªãã£ãå¯èœæ§ããããŸãïŒã
@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
ã®ãã¹ãŠã®æ¬ ç¹ã«å ããŠããŠãŒã¶ãŒãå¿
èŠãšãããç解ã§ããªãå¯èœæ§ã®ããæè¡æ
å ±ãããã«è¿œå ãããŸãã
ããã§ããç§ã¯ã¡ãã»ãŒãžãã©ã¡ãã®èŽè¡ã«ãååã«ã¿ãŒã²ãã£ã³ã°ãããŠããªãããšãå€ãããšã«åæããŸãã ããã¯ãç§ãã¡ã誰ãã¿ãŒã²ããã«ããŠããã®ããæ確ã«ãããã1ã€ã®éèŠãªçç±ãæµ®ã圫ãã«ãããã®ã°ã«ãŒãã«å¯èœãªéãæé«ã®ãšã¯ã¹ããªãšã³ã¹ãæäŸã§ãããšæããŸãã
#[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
å€æŽãå ããŠãã¹ããã³ã³ãã€ã«ãããšã次ã®ãšã©ãŒãçºçããŸãã
ãªããã®ãšã©ãŒãçºçããã®ãåãããŸããïŒ å·®åãèªãã ã ãã§ã¯ããããŸããããããŒã«ã«ã§ãã«ãããŠç解ããããšã¯ã§ããŸãã
quote_item!/expr!
ã¯ã¬ã¬ã·ãŒãªã®ã§ããã䜿çšããªãã§ãã ããã
ããã§ã¯åŒ·ãæèŠã¯ãããŸããã @eddybã¯ã¬ã¬ã·ãŒã§ããããšã«åæããŸãããããã€ãã®çšéãè¿œå ãããšåé€ãé£ãããªããããªã¬ã¬ã·ãŒã§ãããã©ããã¯ããããŸãããã€ãŸããæè¿ã®äº€æãååŸãããšãç°¡åã«ãªããŸãã @eddybã¯ãäžæ¹ããä»æ¹ã«ç§»åããŸããïŒ
æåã®ASTæ§ç¯ã¯ç¢ºãã«èŠçã§ããããã®ããã®ãã«ããŒããããšæããŸãã
ã»ãšãã©ã®å Žåãå°ããªç·šéãè¡ãå¿
èŠããããŸãããïŒ ã€ãŸããé¢æ°ã®åŒã³åºãããreport()
ã®çµæã®ãã¹ãã«å€æŽããŸããïŒ
PSãã¹ã³ãŒãå
ã«ããTermination
ç¹æ§ã«äŸåããããšãé¿ããããã«ã .report()
è¡šèšã䜿çšããã®ã§ã¯ãªãã Termination::report(...)
ã®ãããªãã®ãçæããããšæãã§ããããã
ãããããã®ãšã©ãŒãã©ãããæ¥ãŠããã®ãããããŸãã:(
RFCã¯ãå
ã®ãã¹ãé¢æ°ãåŒã³åºãã©ãããŒé¢æ°ãçæããããšãææ¡ããŸããã ããã¯ç§ã®çŸåšã®ããæ¹ã§ããããŸãã
ã©ãããŒé¢æ°ãåé€ããããšãã§ãããšæããŸãããåãã¹ãé¢æ°ã¯ç°ãªãåãè¿ãå¯èœæ§ããããããé¢æ°ãã€ã³ã¿ãŒãããã¯ã¹åããå¿
èŠããããŸãã
ããŒãããã¹ãã¯ãã§ã«ä»ã®ãã®ãã€ã³ããŒãããŠããã®ã§ãçµäºç¹æ§ãã€ã³ããŒãããã®ã¯ããã»ã©è€éã§ã¯ãããŸããã
@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 -L165
ãããã£ãŠããã®æåã®ãã§ãã¯ããã¯ã¹ã¯...
RFCãå®è£ ãã
...ãªã³ã¯ãããPRãããŒãžãããããšã確èªããŸããïŒ
@ErichDonGublerå®äº:)
ããŒããçŸåšãããŒãžãããprã§å®è£ ãããŠããã®ã¯ååã®rfcã ãã§ã^^
3ã€ã®ãã§ãã¯ããã¯ã¹ã«åãããŠããŸã:)
ç§ã¯ãã®æ©èœãmain
ã§äœ¿çšããããšããŠããŸããããããªãã€ã©ã€ã©ããããšãããããŸããã çµäºç¹æ§ã®æ¢åã®å®è£
ã§ã¯ãè€æ°ã®çš®é¡ã®ãšã©ãŒã䟿å©ã«ãèç©ãããããšãã§ããŸãããããšãã°ã 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
IMOã§ã¯ãªã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
ã«æ»ããŸãã
ãæ·±å»ãªãããã°ã©ã ã§ã¡ã€ã³ã§?
ã䜿çšãããå Žåã«çºçããå¥ã®é çã®çš®ã¯ãç¶æ³ã«ãã£ãŠã¯ãã³ãã³ãã©ã€ã³ããã°ã©ã ããŒã以å€ã®ã¹ããŒã¿ã¹ã§çµäºãããã_anything_ãåºåããªãããšã§ãïŒ grep -q
ãæ€èšããŠãã ããïŒã Error
ã§ã¯ãªããã®ã«Termination
implãå¿
èŠã«ãªããŸããããã¯äœãåºåãããçµäºã¹ããŒã¿ã¹ãå¶åŸ¡ã§ããŸã...ãããŠãããªããã³ãã³ãã©ã€ã³åŒæ°ã解æããåŸããã®ããšãè¿ããŸãã
ããã¯ç§ãæãããšã§ãïŒ
Result<T, E>
ãè¿ãå Žåã¯ãEã®debug implã䜿çšããå¿
èŠããããŸããããã¯æã䟿å©ãªç¹æ§ã§ããåºãå®è£
ãããŠããããã¯ã€ãã¯ã¢ã³ãããŒãã£åºåãã®ãŠãŒã¹ã±ãŒã¹ãšåäœãã¹ãã®ãŠãŒã¹ã±ãŒã¹ãæºãããŠããŸãã Display
ã¯ããŸãåºãå®è£
ãããŠããªãããšãšããããæŽç·Žãããåºåã§ãããšããå°è±¡ãäžããããšã®äž¡æ¹ããã䜿çšããããªããšæããŸãã
ãããããã䞊ã¿ã®åºåãåŸãæ¹æ³ãããã¯ãã§ãã 幞ããªããšã«ããã®ãããªæ¹æ³ã¯ãã§ã«2ã€ãããŸãã ãŸãã @ 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ã«åæããŸãã
ãŸããæŽç·Žãããåºåã®å Žåã Try
ãšTerminate
ãå®è£
ããæ°ããåãäœæãããããã main
ã§ã³ãŒããæžãæ¹ãããããè¯ããšæããŸãã Terminate
ã®ãã€ã³ãã¯ãã©ã€ãã©ãªãç°¡åã«é©åãªããã©ã«ããäœæã§ããããšã§ããããã«æãããŸããããã¯ãããã°ã©ã ã®çµäºæ¹æ³ããšã³ããŠãŒã¶ãŒïŒããã®CLIãªã©ïŒã«ãšã£ãŠéèŠã§ããç¶æ³ã§ã¯æ±ºããŠåœãŠã¯ãŸããŸããã ã
ãã¡ãããä»ã®äººã¯ç°ãªãæèŠãæã£ãŠãããããããŸããã main
ã«çŽæ¥æžã蟌ã代ããã«ãé¢é£ããç¹æ§ã䜿çšããŠã³ãŒããæ¿å
¥ããæ¹æ³ã¯è€æ°ãããŸãã çŽ æŽãããã®ã¯ãè€æ°ã®éžæè¢ãããããšã©ãŒãåžžã«åŠçããããã®1ã€ã®ç¥çŠãããæ¹æ³ãèãåºãå¿
èŠããªãããšã§ãã
ããã€ãã®åé¡ããããŸãããããã€ãã®èããæžãçããŠãããŸãã
ç§ã¯ä»¥äžãèŠããã§ã
fn main() -> i32 {
1
}
ããã¯ãããäžè¬çã«æ¬¡ã®ããã«æžãããšãã§ããŸãã
fn main() -> impl Display {
1
}
ãããã®ã¡ã€ã³é¢æ°ã¯äž¡æ¹ãšãã0ã®çµäºã³ãŒããšprintln!
ã®1ã®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
ã®ãããªå®è£
ãšççŸããŠããŸãã å人çã«ã¯ããŒã以å€ã®çµäºã³ãŒãã¯ã Results
ãŸãã¯Termination
ãå®è£
ããã«ã¹ã¿ã ã¿ã€ãã«ãã£ãŠæä»çã«åŠçããå¿
èŠããããšæããŸãã
Display
ã®å®è£
ããªããããã¡ã€ã³ã®Option
ã¿ã€ãã§?
ãåŠçããæ¹æ³ã«ã€ããŠã¯èå³æ·±ã質åã§ãã
TL; DRïŒ Debug
ã§å€§äžå€«ã§ãã
ãã詳现ãªèª¬æïŒ
ç§ã¯ããã«ã€ããŠæšæ¥ãšä»æ¥ã«ã€ããŠèããããšã«æéãè²»ãããå¯èœãªéãæè¯ã®çãã«å°éããã®ãå©ããããã«ç§ãæã£ãŠããããŸãã¯äœã£ãŠããæé»ã®ä»®å®ãæããã«ããããšãç®çãšããŸããã
éèŠãªåææ¡ä»¶ïŒRustã§èšè¿°ã§ããããŸããŸãªçš®é¡ã®ã¢ããªã±ãŒã·ã§ã³ã®äžã§ãã³ã³ãœãŒã«ã¢ããªã¯ããã®æ±ºå®ã«ãã£ãŠæãæ©æµãåãã/æã圱é¿ãåãããšæããŸãã ç§ã®èãã§ã¯ãã©ã€ãã©ãªãAAAã²ãŒã ã®ã¿ã€ãã«ãIDEããŸãã¯ç¬èªã®å¶åŸ¡ã·ã¹ãã ãäœæããå Žåãããã©ã«ãã®ã¡ã€ã³ã¿ãŒãããŒã·ã§ã³ç¹æ§ãç®±ããåºããŠå¿
èŠãªãã®ãæºããããšã¯ããããæåŸ
ã§ããŸããïŒå®éãäž»èŠïŒã ãããã£ãŠãããã©ã«ããšããŠDisplay
ã«åãã®ã¯ãå°ããªã³ãã³ãã©ã€ã³ã¢ããªã±ãŒã·ã§ã³ã䜿çšãããšãã«äºæ³ããããã®ããæ¥ãŠããŸããããšãã°ã次ã®ããã«ãªããŸãã
$ cd foo
bash: cd: foo: No such file or directory
ç§ãã¡ã®ã»ãšãã©ã¯ãã©ããªçš®é¡ã®ãããã°æ¯æŽãæåŸ ããŠããŸãããäœãããŸããããªãã£ããã瀺ãç°¡æœãªææšã«ãããŸããã ç§ã¯åã«ãããããã©ã«ãã®äœçœ®ãšããŠæå±ããŠããŸãã
ãã®ãããªåçŽãªåºåãåŸãããã«Terminate
implãæžãããšãèãããšãäž»ãªæ©èœããã®?
ã¯ãä»æ¥ã®å®å®ããéãšããã»ã©å€ãããªãããšã«æ°ä»ããŸãïŒæžãããã³ãŒãã®éã«é¢ããŠïŒ ïŒãããã§ã EãåŠçããããã«Result
察å¿ã®ãinner_mainïŒïŒããäœæãããããšããããããŸãã
ãã®ä»®å®ã念é ã«çœ®ããŠãæèæŒç¿ãšããŠãä»æ¥ååšããã 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
ã䜿çšããŠãè² å·ããã°ã«ãŒãããç¹å®ããã®ã¯å°é£ã§ãã
ãããŠæåŸã«ã Debug
implã®æ¹ãããã®æ©èœãããã«6ãæéä¿æããããã幞ãã«ãªãã®ã§ãåæã«ããããããŸã:)ã
ã§ããããç§ã®æèããã»ã¹ã¯å
¬ã®å Žã§æ瀺ãããŠããŸãã èŠçŽãããšã Debug
ã¯Display
ããè¯ããæªãããªããšæããŸãããããã£ãŠãããã©ã«ãã®å®è£
ãšããŠã¯åé¡ãªãã¯ãã§ãã
å€ãã®çãããšåãããã«ããã¯ããããã ãã§ã!!!ããTBHã®ããã«ãç§ããã£ãšã¯ã¯ã¯ã¯ããå®è£
ããã£ããããã®ã«ãšæããŸãã ããããããã¯éçŸå®çã§ãããšããç§ã®æåŸ
ã ããããããŸãã...ãã¶ããç§ã®ãããžã§ã¯ãã§ãã€ã©ãŒãã¬ãŒããåæžããfailure
ã§æ©èœãããœãªã¥ãŒã·ã§ã³ãããã°ãããã¯ç§ã«æé·ããŸãã :)
ãã¹ãã§çµäºç¹æ§ããµããŒãããããã«PRãéããããšã«æ³šæããŠãã ããïŒïŒ48143ïŒ @bkchrã®äœæ¥ã«åºã¥ããŠæ§ç¯ïŒã
ãã¹ãã®çµæãåŠçããããã®ã¡ãœããã䜿çšããŠã Termination
ãã¬ã€ããèªç±ã«æ¡åŒµããŸããã ããã«ããå®è£
ãç°¡çŽ åãããŸãããããã¹ãã®å€±æã¯å®è¡å¯èœãªå€±æããã詳现ãªåºåãå¿
èŠã«ãªãå¯èœæ§ãããããããããçã«ããªã£ãŠããŸãã
Termination
ã¯ãlibstdã®ç¹æ§ã®åè©ã«å¯Ÿããäžè¬çãªèšå®ã«åºã¥ããŠã Terminate
ã«ååãå€æŽããå¿
èŠããããŸãã
@withoutboatsããæç¹ã§ãåè©ã®ç¹æ§ã¯ããã®ç¹æ§ãšåãååã®åäžã®ã¡ãœãããæã€ãã®ãã»ãšãã©ã§ãããšããè°è«ããã£ããšæããŸãã ãšã«ãããç§ã¯èªåã®èªè»¢è»å°å±ã®ææ¡ã Exit
ãããäžåºŠæµ®ãã¶ããšãã§ããŸããïŒ
ç¡åã®ãã€ã¯ã·ã§ãã£ã³ã°ïŒããã¯åäžã¡ãœããã®ç¹æ§ã§ãã åãååãä»ãããå Žåã¯ãããããToExitCode
/ to_exit_code
ïŒ
Result
ãè¿ãããšãå®å®ãããããšã¯ãç¹æ§ãå®å®ãããããšãšã¯ç¬ç«ããŠè¡ãããšãã§ããŸãããïŒ
ç§ã«ãšã£ãŠãããã¯?
ã®ããã«æããããã»ãšãã©ã®å€ã¯èšèªæ©èœããåŸãããç¹æ§ã®ç解ãé
ãããããšãã§ããŸãã RFCã®è°è«ã§ã¯ãã³ãŒããinner_main
ã«é
眮ããæ¹ãããã®ããã®ãã¬ã€ãimplãããç°¡åã«æããã®ã§ããã¬ã€ããå®å®ãããå¿
èŠããããã©ããããçåã«æããŸãã...
ã¯ããç¹æ§ãå®å®ãããå¿
èŠã¯ãããŸããããã ãããã¬ãŒã ã¯ãŒã¯ã®ããã«ãå¿
ãããinner_main
ã«ããŸãäŸåã§ããªãå Žåã¯ãå®å®ããç¶æ
ã§åœ¹ç«ã¡ãŸãã
@SimonSapin To
ã¯åå€æãæããšæããŸãããããã§ã¯ãããŸããã ããããã¡ãœããterminate
ãšããååãä»ããããšãã§ããŸãïŒãŸããç¹æ§åè©ã«ååãä»ããã¿ã€ãã³ã°ã«é¢ãããã®å¶éã¯åœãŠã¯ãŸããªããšæããŸãã Try
ã¯æãããªåäŸã§ãïŒã
T
ãåäœã§ã¯ãªãå Žåã«fn main() -> T
ãå®å®ãããããšãææ¡ããŸããã ããã«ãããå€ãã®è©³çŽ°ïŒç¹ã«ç¹æ§ã®åå/å Žæ/詳现ïŒãäžå®å®ã«ãªããŸãããããã€ãã¯ä¿®æ£ãããŠããŸãã 詳现ã¯ãã¡ãïŒ
https://github.com/rust-lang/rust/issues/48453
ãã£ãŒãããã¯ããå¯ããã ããã
terminate
ã¯ã report
ãããããããããããã§ãã åžžã«terminate
ã§ããã report
ãçç¥ã§ããŸãã
ãã ããããšãã°std::process::exit
ãšã¯ç°ãªãããã®ã¡ãœããã¯äœãçµäºããŸããã main()
ã®æ»ãå€ã®ã¿ãçµäºã³ãŒãã«å€æããŸãïŒãªãã·ã§ã³Result::Err
ãstderrã«åºåããåŸïŒã
Exit
ãžã®å¥ã®æ祚ã ç°¡æœã§ãéåžžã«èª¬æçã§ãçµäºã³ãŒã/çµäºã¹ããŒã¿ã¹ã®åŸæ¥ã®æŠå¿µãšäžèŽããŠããããšãæ°ã«å
¥ã£ãŠããŸãã
äœããæ¬åœã«ããŸããããªãã£ãããã«çªç¶ããŒãã«çµäºããã®ã§ã¯ãªããã¡ã€ã³ããæ»ã£ãŠåªé
ã«çµäºããã®ã§ã Terminate
ãããExit
ã®æ¹ãééããªã奜ãã§ãã
çµæãè¿ãå®å®ååäœãã¹ããææ¡ããããã«ã httpsïŒ//github.com/rust-lang/rust/issues/48854ãè¿œå ããŸããã
ãããç§ã¯ããã«ã€ããŠè©±ãã®ã«é©åãªå ŽæãèŠã€ããŸããã
?
ã䜿çšããdoctestsãçŸåšæ©èœããæ¹æ³ã¯ã次ã®ãããªãã®ã§ãã
fn main
ã宣èšããŠãããã©ããã確èªããŸãã//
ã®åŸã«ãªããfnmainãã®è¡ããšã®ããã¹ãæ€çŽ¢ãå®è¡ããŸãïŒfn main
ãèŠã€ãã£ãå Žåãããã¯ãã§ã«ããã«ãããã®ã«ã¯è§ŠããŸããfn main
ãèŠã€ãããªãã£ãå Žåã¯ãã»ãšãã©ã®doctest*ãåºæ¬çãªfn main() { }
ã«ã©ãããããŸãã#![inner_attributes]
ããã³extern crate
宣èšãæœåºããçæãããmainé¢æ°ã®å€éšã«é
眮ããŸããããã以å€ã¯ãã¹ãŠå
éšã«é
眮ãããŸãã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
å人çã«ã¯ã ?
-in-doctestsãhttps://github.com/rust-lang/rfcs/pull/2107ã®ãããªãã®ãä»ããŠfn main() -> Result<(), Box<Debug>> catch { your_code_here(); }
ãšããŠæ©èœããããšãæ³åããŠããŸããïŒhttpsïŒ//ã®æ§æã䜿çšïŒ github.com/rust-lang/rust/issues/41414#issuecomment-373985777ïŒã
impl Trait
ããŒãžã§ã³ã¯ãã£ãããã§ãããrustcã?
desugarã§å
éšçã«äœ¿çšã§ãããå¶çŽã®ãªãå Žåã¯åãã¿ã€ããåªå
ããããµããŒããããã°æ©èœããå¯èœæ§ããããŸãããç§ã®èšæ¶ã¯ãã®ãããªæ©èœã®ã¢ã€ãã¢ã¯ãç©äºãã©ã®ããã«æ©èœããããç解ããŠãã人ã
ãææã§ååãããåŸåãããããšïŒsweat_smileïŒããããåºåãimpl Trait
ã®å Žåã«ã®ã¿é©çšãããå
éšçãªãã®ã§ããå¯èœæ§ããããŸã...
ããããããã¯éåžžã«çŸå®çãªæžå¿µã§ãã ãããåæšè«ãã©ã®ããã«å°ç¡ãã«ããããå¿ããŠããŸããã ãã£ãããããã¯ããã®ãªã³ã¯ãããåé¡ã®ããã«Ok-wrappingãéå§ããå Žåãããã¯ã¯ããã«ç°¡åãªïŒãããŠã¯ããã«éããå®å®åã®èŠ³ç¹ããïŒåé²ã®éã®ããã«æããŸãã
ç§ãçåã«æãå¯äžã®ããšã¯ãããããšãã£ã·ã§ã³ã®ç§»è¡ã«ãã£ãŠã©ã®ããã«åœ±é¿ãåããããšããããšã§ãã catch
æ§æã¯2018幎ã®æ代ã«å€æŽãããŠããŸãããïŒ Rustdocã¯ãå®è¡ããŠããã©ã€ãã©ãªãšåããšãã£ã·ã§ã³ã§doctestãã³ã³ãã€ã«ããå¯èœæ§ãé«ããããæž¡ããããšããã¯ãã©ã°ã«åºã¥ããŠæ§æãåºå¥ããå¿
èŠããããŸãã
ãããå®å®ããŠããã®ã§ã¯ãªãããšå¿é ããŠããŸãããåçŽãªã±ãŒã¹ã¯ãŸã 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-betaã§è§£æ±ºãããŠããã®ã§ãç§ã®èŠ³ç¹ããã¯ããã§ãã
ã¯ããå¿é ããŠãã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ããã°ã©ã ãäœæãããšãã¯ãå®éã«ã¯äžèšã®ã¢ãããŒãã䜿çšããã®ã§ãäŸã«çŸå®ãåæ ããããå Žåã¯ãã·ã§ãŒãã«ããã䜿çšããã«ãå®éã®ããã°ã©ã ã§äœããããã瀺ãå¿
èŠããããšæããŸãïŒåŠ¥åœãªç¯å²ã§ïŒ ïŒã ç§ã¯å®éããã®çš®ã®ããšã¯æ¬åœã«éèŠã ãšæããŸããããã®æŽå²çãªå¯äœçšã®1ã€ã¯ã 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å®å®çã§ã³ã³ãã€ã«ãããŸãã
#[derive(Debug)]
struct OnlyDebug;
fn main() -> Result<(), OnlyDebug> {
Err(OnlyDebug)
}
Display
ã«åãæ¿ãããšããã®ã³ãŒããå£ãããšæããŸãã ã§ããããããããŸããïŒ ãããæ¬åœã«è¹ã®åžã®åé¡ã§ããå Žåãç§ã¯ç解ããŠãããèŠç¹ã詳ãã説æããããšã«ã¯ããŸãæå³ããããŸããããå°ãªããšãäœããèšã£ãŠãä»ã®äººã説åŸããŠèŠãããšãã§ããªããã©ããã確èªããã®ã«åå匷ããšæããŠããŸããããä¿®æ£ããããã«ã§ããããšãããã°ã ïŒç§ãããã§éå°åå¿ããŠããå¯èœæ§ãååã«ãããŸããããããŸã§ã®ãšãããCSVã®äŸã§ããªã?-in-main
ã䜿çšããªãã®ã§ããïŒã ããããã©ã®ããã«å®çŸå¯èœãã¯ããããŸããããããããããã¯?-in-main
ã«ãã£ãŠè§£æ±ºãããããšãæå³ããåé¡ã§ã¯ãªãã£ããããããŸããããäžéšã®äººã
ã¯ç¢ºãã«ãã®å°è±¡ãæã£ãŠããŸãããçŸåšã®å®è£
ã§ã¯ãããã¥ã¡ã³ããã¹ããåäœãã¹ãã§åœ¹ç«ã€ããšãããããŸããããä»ã®ç¶æ³ã§äœ¿çšããããšãèããã®ã¯é£ããã§ããïŒ
Debug
Display
ã衚瀺ããæ¹ããCLIã¢ããªã±ãŒã·ã§ã³ã«é©ããŠããããšã«åæããŸãã Debug
$ã§ã¯ãªãDisplay
ã«ããå¿
èŠãããããšã«åæããŸãããããã¯ãå®éã«?
ã§å®è¡ã§ãããšã©ãŒã倧å¹
ã«å¶éãã ?-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ã®ç®æšã®äžéšã¯ãã³ãŒãäŸã§ã®åäžã®ã³ãŒããã€ãŸãã¢ã³ã©ãããåé¿ããããšã§ãã ããããïŒ-in-mainèªäœãå調ã«ãªããšãæ©èœå šäœãæãªãããŸãã æ¬çªã³ãŒããªã©ã§ã®äœ¿çšãæããšã©ãŸããããããªçµæã¯é¿ããããšæããŸãã
ç§ã¯ãã®æ©èœãã¡ã€ã³ã§äœ¿çšããããšããŠããŸããããããªãã€ã©ã€ã©ããããšãããããŸããã çµäºç¹æ§ã®æ¢åã®å®è£ ã§ã¯ãè€æ°ã®çš®é¡ã®ãšã©ãŒã䟿å©ã«ãèç©ãããããšãã§ããŸãããããšãã°ããšã©ãŒãå®è£ ããŠããªããããfailure::Failã䜿çšã§ããŸããã Boxã䜿ããªã
ã åãçç±ã ãããã°ãžã®å€æŽãåªå ããå¿ èŠããããšæããŸãã =ïŒ
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
}
è¿ãå°æ¥ãããã«è²¢ç®ããæéã¯ãŸã ãããŸããããã¡ã€ã³ã®?
ã¯æ¬æ ŒçãªCLIããã°ã©ã ã§äœ¿çšã§ããã¯ãã§ãããå
ã®ãã©ããã«ã¯æ©èœããã£ãããšã«ãåæããŸããããã容æã«ããããšãç®çãšããRFCã 圌ãã¯æŒžé²äž»çŸ©ã®åã®äžã«èœãšãããŸããããå€å圌ãã¯å蚪ãããã¹ãã§ãã
å€ãã®ã³ãŒããå®å®çã§äœ¿çšãããåã«ããããããã«è¡ãããå Žåã¯ãåŸæ¹äºææ§ã®ãªãæ¹æ³ã§ãããä¿®æ£ããããšã¯åé¡ãªããšæããŸãã
Rustã§å€ãã®CLIããã°ã©ã ãäœæããRustã¹ã¿ã€ã«ãæ åœããŠãã人ãšããŠãç§ã¯ããã§@burntsushiã«ã»ãŒåæããŸãã ç§ã¯RFCã§æå®ããããã®æ©èœã®ããŒãžã§ã³ãåãã§äœ¿çšããã§ãããã
ãããã Debug
ã®å®è£
ããŠãŒã¶ãŒã«è¡šç€ºããããšã¯ãã°ã§ãããCLIããã°ã©ã ã®ããããå Žæã§unwrap
ãåŒã³åºããããã¯ããã«åªããŠãããšã¯æããŸããã ãããã£ãŠããµã³ãã«ã³ãŒãã§ãããã®ããŒãžã§ã³ã®æ©èœã䜿çšããããšã¯æ³åã§ããŸããã main
ããå®åæãåé€ãããšãæ°ããRustéçºè
ã®åŠç¿ãç°¡çŽ åããã quick_main!
ãŸãã¯åçã®ãã®ã説æããå¿
èŠããªããªã£ããããããã¯æ®å¿µã§ãã
ããã䜿çšããããšãæ³åã§ããã»ãšãã©ã®ç¶æ³ã¯ãdoctestããunwrap
ãåé€ããããšã§ãã ããããããããŸã ãµããŒããããŠãããã©ããã¯ããããŸããã
Display
ã䜿çšããå ŽåãMainError
ã®ãããªé«éã§ããŒãã£ãªã¿ã€ããå°å ¥ããŠãè€æ°ã®çš®é¡ã®ãšã©ãŒãèç©ã§ããŸãã
å人çã«ã¯ããã®çš®ã®åé¿çã¯ååãªè€éããè¿œå ããããã ?
-in- main
å®å
šã«åé¿ããæ¹ãç°¡åã§ãã
@Aaronepower ïŒ
ç§ãç¥ãéãïŒstdlibãã³ã³ãã€ã«ããæéããªããã¹ãã·ã£ã©ã€ãŒãŒã·ã§ã³ããããã«ããŒããŠãããã©ããããããªããããå®å šã«ééã£ãŠããå¯èœæ§ããããŸãïŒã次ã®implãTerminationã«è¿œå ã§ããªãçç±ã¯ãããŸããã ããã«ããã衚瀺ã䜿çšå¯èœãªå Žåã¯äžæããã«äœ¿çšã§ãã䜿çšã§ããªãå Žåã¯ãããã°ã«ãã©ãŒã«ããã¯ã§ããŸãã
ããã«ããã fn main() -> Result<(), failure::Error>
ãèšè¿°ãã Display
ã䜿çšããŠäººéãèªãã圢åŒã®ãšã©ãŒãååŸã§ããããã«ãªãã°ãç§ã®äž»èŠãªæžå¿µäºé
ã¯ç¢ºå®ã«æºããããŸãã ãã ããããã§ãã RUST_BACKTRACE=1
ãèšå®ãããŠããå Žåã«ããªãã·ã§ã³ã§ããã¯ãã¬ãŒã¹ãfailure::Error
ã«è¡šç€ºãããšããåé¡ãæ®ããšæããŸãããããã¯ç¯å²å€ã§ããå¯èœæ§ããããŸãã failure
ã§åãäžããããŸãã
ããã¯ãã°ããåã«å®å®ããŸãããã Result
ã®åäœãå®éã«å€æŽã§ãããšã¯æããŸããã ç§ã¯å人çã«ãç§ãè¡ãåŸåã®ãããŠãŒã¹ã±ãŒã¹ïŒé«éã§ããŒãã£ãªã¹ã¯ãªãããªã©ïŒã®çŸåšã®åäœã«ããªãæºè¶³ããŠããŸãããããè€éãªã¹ã¯ãªããã§ã¯ãããæãŸãªãããšã«åæããŸãã ãã ãããã£ã¹ã«ãã·ã§ã³ã®æç¹ã§ããã®åäœãå¶åŸ¡ã§ããããã€ãã®æ¹æ³ã«ã€ããŠã話ãåããŸããïŒgithubãç§ããç©äºãé ããŠããããããããã®ã³ã¡ã³ããä»ã¯èŠã€ããããšãã§ããªãããã§ãïŒã
ããšãã°ããšã©ãŒã¿ã€ãã«ç¬èªã®ãã©ãããŒããå®çŸ©ããããã«From
ãå®è£
ã§ããŸãã
struct PrettyPrintedError { ... }
impl<E: Display> From<E> for PrettyPrintedError { }
impl Debug { /* .. invoke Display .. */ }
ããã§ã次ã®ããã«æžãããšãã§ããŸããã€ãŸãã main
�
ã䜿çšã§ããŸãã
fn main() -> Result<(), PrettyPrintedError> { ... }
ããããããã®ãããªã¿ã€ãã¯ã¯ã€ãã¯CLIãŸãã¯äœãã®äžéšã§ããå¿ èŠããããŸããïŒ
@nikomatsakisãããç§ã¯å®å
šã«ãã®åé¿çãååŸããŸãããããã¯?-in-main
ã䜿çšãããšããç°¡æœãã®ç®çãæã¡è² ãããããªæ°ãããŸãã æ®å¿µãªãããããã®åé¿çã䜿çšããŠ?-in-main
ã䜿çšããããšã¯å¯èœã§ãããšã ?-in-main
èªäœãæãªãããŠããããã«æããŸãã ããšãã°ãç°¡æœãªäŸã§åé¿çãæžãåºãã€ããã¯ãããŸããããŸããç§ãæžããã¹ãŠã®äŸã§quicli
ã«äŸåããã€ããããããŸããã åºæ¬çã«ç§ãäœæãããã¹ãŠã®CLIããã°ã©ã ã§ãšã©ãŒã®Display
åºåãå¿
èŠãªãããã¯ã€ãã¯ããã°ã©ã ã«ã䜿çšããŸããã ç§ã®æèŠã§ã¯ããšã©ãŒã®ãããã°åºåã¯ããŠãŒã¶ãŒã®åã«çœ®ãCLIããã°ã©ã ã®ãã°ã§ãã
?-in-main
ã®ä»£ããã«ãè¿œå ã®ã4è¡é¢æ°ããããŸãã ãããã£ãŠã ?-in-main
ãä¿®æ£ããŠDisplay
$ã䜿çšããããã®åé¿çããããããã¯ããã«å€ãå Žåãå人çã«ã¯ããã䜿çšããçç±ã¯ã»ãšãã©ãããŸããïŒããã¥ã¡ã³ããã¹ããåäœãã¹ã以å€ã§ã¯ãäžèšã®éãïŒã
ããã¯ãšãã£ã·ã§ã³ã§å€æŽãããå¯èœæ§ããããã®ã§ããïŒ
@BurntSushiåé¿çãstd
ã«ããããšã«ã€ããŠã©ãæããŸããïŒããã§ã main()
ã«ããå°ãé·ãreturnå宣èšãæžãã ãã§æžã¿ãŸããïŒ
@Kixunilç§ã®æåã®æ°æã¡ã¯ããããå£ã«åããããããªããšããããšã§ãã ããããããŸãèããŠããŸããã
@BurntSushi
?-in-main
ã®ä»£ããã«ãè¿œå ã®ã4è¡é¢æ°ããããŸãã
æçµçã«ã¯åäœã¯å®å®ããŠãããçŸæç¹ã§ã¯çŸå®çã«å€æŽã§ãããšã¯æããŸããã ïŒã€ãŸããå¥å šæ§éåãªã©ã§ã¯ãããŸãããïŒ
ããã¯èšã£ãŠããçŸåšã®èšå®ã¯Display
ãããããªãçŽ æŽãããã奜ãŸãããšæããŸããããããã©ã«ãããã©ã®ããã«ããããåé¡ã ãšæããŸããã€ãŸããã©ã¡ãã®èšå®ã次ã®ããã«æ©èœãããããšãã§ããŸãããã®ä»ãããŸããŸãªãã¥ãŒã¿ã€ããä»ããŠã ãããã£ãŠãããã©ã«ãã§ã¯ã Debug
ãå¿
èŠãšãããquick-n-dirtyãã¹ã¯ãªããããŸãã¯æŽç·Žãããæçµè£œåãåªå
ããŸãã æŽç·Žãããæçµè£œåã¯ãè¿œå ã®ã€ã³ããŒããããã«å®è¡ã§ããå Žæã§ãããããŸããŸãªå¯èœãªåœ¢åŒããéžæãããå Žæã ãšæãåŸåããããŸãïŒããšãã°ããšã©ãŒã ããå¿
èŠãªã®ãã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
ã«ãªã£ãŠããŸããšããªãŒããŒããããã§ããã ãå°ãªãããŠäŸã§äœ¿çšã§ããããã«ãªããŸãã :-)
ããã»ã¹ããŒãïŒããã§ã¯ãæåã®ãã£ãŒãããã¯ãããã§ã«å®å®ããŠãããã®ãå€æŽããŸããããã§ã¯ãªããã§ããããšã¯ãããŸãããã§æ§æããäœããæ±ããã®ã§ã¯ãªããé«ã¬ãã«ã®ç®æšã«çŠç¹ãåœãŠãããšããŸããã確ãã«ã§ããŸããã :-)
Debug
ã®ç¹æ§ãšDisplay
ã®ç¹æ§ã䜿çšããããšã§ãã©ãã ãã®äººãé©ããŠããã®ã ãããã æåã®ãã£ã¹ã«ãã·ã§ã³ãã©ãããšæçµçãªRFCã¯ã©ã¡ããDisplay
ã䜿çšããŠããŸãã ããã¯ã人ã
ã1ã€ã®ãã®ãæã«å
¥ããŠãããšæã£ãŠãããããããå®å®ããåŸã«å¥ã®ãã®ãæã«å
¥ããŠããããšãç¥ã£ãŠãããšãããæ®éçãªimplç¹æ§ã®äºä»¶ã«äŒŒãŠããŸãã ãŸããå€ãã®äººããã®æ©èœã䜿çšããªãããšã«é©ããŠããããšãèãããšã次ã®ãšãã£ã·ã§ã³ã§ãã®æ©èœãå€æŽããŠãã倧ããªããã¯ã¹ã©ãã·ã¥ã¯çºçããªããšæããŸãã
@WiSaGaN RFCã®è©³çŽ°ã¯ãéæå€æŽãããå¯èœæ§ããããŸãã ããã¯æåŸ ãããå¥åº·çã§ãã RFCã¯èšèšããã¥ã¡ã³ãã§ãããããããããããããå®å šã«è¡šçŸããããã®ã§ã¯ãããŸããã æ å ±çºèŠã¯å€§å€ã§ããã以äžæ³šæãæããªãã®ã¯ç§ã®ããã§ãã ãã®æ©èœã®å®å®æ§ãåæ€èšããããšãé¿ãã代ããã«ãå®è¡å¯èœã«å®è¡ã§ããããé«ãã¬ãã«ã®ç®æšã«çŠç¹ãåœãŠãããšãã§ããããšãæãã§ããŸãã
@nikomatsakisã¯ã€ãã¯ã¢ã³ãããŒãã£ã±ãŒã¹ã奜ãããšã§ç§ãç®ã«ããäž»ãªåé¡ã¯ããããã«å¯ŸåŠããæ¹æ³ããã§ã«ãããšããããšã§ãïŒ .unwrap()
ã ãããã£ãŠããã®èŠ³ç¹ãããããšã ?
ã¯ããã°ããæ±ããã®ãæžãããã®ãã1ã€ã®æ¹æ³ã§ãããæŽç·Žããããã®ãæžãããã®åæ§ã«ç°¡åãªæ¹æ³ã¯ãããŸããã
ãã¡ãããè¹ã¯åºèªããã®ã§ãç§ãã¡ã¯ã»ãšãã©ãã蟌ãŸããŠããŸãã å¯èœã§ããã°ãããã次ã®çã§å€æŽãããã®ã楜ãã¿ã«ããŠããŸãã
@Kixunil ã unwrap
ã¯ãåé¡ã«å¯ŸåŠããããã®è¯ãæ¹æ³ã§ã¯ãããŸããããã®ã¹ã¬ããã®ã¿ã€ãã«ã«ã¯ã main
ã§ã·ã³ã¿ãã¯ã¹ã·ã¥ã¬ãŒ?
ã䜿çšã§ããããã«ããããšèšèŒãããŠããããã§ãã ã ç§ã¯ããªããã©ãããæ¥ãŠããã®ãç解ã§ããŸããïŒå®éããªãã·ã§ã³åŠçã«?
ã䜿çšããããšã¯ç§ã®æåã®èºèºã®äžéšã§ããïŒãèšèªã«?
ãå«ãŸããŠããããããã®åé¡ã¯ããªãè¯ããŠãŒã¶ããªãã£ãç§èŠã«åã¡ãŸãã ããè¯ãåºåãå¿
èŠãªå Žåã¯ããªãã·ã§ã³ããããŸãã æåã«ãã¹ãããã«ãŠãŒã¶ãŒã«ãªãªãŒã¹ããããšã¯ãããŸããã main
ã®åºåã«ã«ã¹ã¿ã ã¿ã€ããå¿
èŠã§ããããšãããããŸãã
main
ã«?
ã欲ãããçç±ãã«ã€ããŠã¯ãä»ã®å¥åŠããããèããŠãã ããã å®è³ªçã«ä»ã®ã©ãã§ã䜿çšã§ããŸãïŒãªã¿ãŒã³ã¿ã€ããå¶åŸ¡ã§ããããïŒã main
é¢æ°ã¯ãããç¹å¥ãªæãã«ãªã£ãŠããŸããŸããããããã¹ãã§ã¯ãããŸããã
.unwrap()
ã¯ãæ§æãããŠããªãæã£åãæ©ããœãªã¥ãŒã·ã§ã³ã§ãããããããã°ã©ã ãã¹ã±ããããŠãããšãã«ãã³ãŒããmain()
ã«åºãå
¥ãããããšã¯ã§ããŸããã
æ¯èŒãããšã ?
ã¯æ§æãè¡ãè¿
éã§æ±ããœãªã¥ãŒã·ã§ã³ã§ãããè¿
éã§æ±ããªãããã«ããããšã¯ãæ£ããreturn-typeãmain()
ã«çœ®ãããšã®åé¡ã§ãããã³ãŒãèªäœãå€æŽããŸãã
@Screwtapelloãããä»ããã¯ç§ã«ã¯çã«ããªã£ãŠããŸãã ããããšãïŒ
ããã®ç®çã¯ãè¿œå ã®ã©ãããŒã䜿çšããã«ããã¹ãŠã®ã¢ããªã±ãŒã·ã§ã³ã«?
ãmain
ã«å«ããããšã ãšæã£ãããšãè¡šçŸããããšæããŸã...ãã¹ãã®ããã ãã®å Žåã¯ãããã«å€ãã®å©ç¹ããããæ²ããããšã«.unwrap()
ã«åºå·ãç¶ããã§ãããã
@oblitumãã¹ãã ãã§ã¯ãããŸããã ïŒããã©ã«ãã§ã¯ïŒ Display
圢åŒã䜿çšããããšã¯ãããŸããã ããã¯ãæ¢ããŠããåºåã§ããå Žåãšããã§ãªãå ŽåããããŸããã .unwrap
ã®åºåãããã»ãŒééããªãåªããŠããŸãã ããã¯èšã£ãŠãã ?
ã䜿çšãããšãã³ãŒãããããæŽç·Žãããããã®ã«ãªãå¯èœæ§ããããŸãã ãããã«ããã @ nikomatsakisãäžã§è©³è¿°ããããã«ã main
ã®?
ãšã©ãŒã®åºåãã«ã¹ã¿ãã€ãºããããšã¯ãŸã å¯èœã§ãã
é³åã±ãŒã¹ã®stdlib
ã«ãã¥ãŒã¿ã€ããå°å
¥ããããšã¯å¯èœã§ããããïŒ äœãã®ãããªãã®ïŒ
#[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ãšç§ïŒã«ãã£ãŠè¡ãããããšã§ãããåé¡ã®ã³ãŒãã¯å®å šã«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
ã®äž¡æ¹ãå®è£
ããã¿ã€ãã«ã®ã¿åœ¹ç«ã€ãšããããšã§ãïŒã€ãŸããããç¹å¥ãª1ã€ã®å®è£
ïŒã
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
ã§äœ¿çšå¯èœãªç¹æ§ãšãã®å®è£
ã¯ããšãã£ã·ã§ã³éã§åãã§ããå¿
èŠããããŸãã çè«çã«ã¯ïŒç§ã¯ãããæ¯æããŠããŸãããïŒã$ïŒ main()
Termination
ãšTermination2
$ã®2ã€ã®ç¹æ§ãããã1ã€ãŸãã¯ãã®ä»ã¯ã main()
ãå®çŸ©ããã¯ã¬ãŒãã®ãšãã£ã·ã§ã³ã«ãã£ãŠç°ãªããŸãã
äœãéæšå¥šã«ããå¿ èŠã¯ãªããšæããŸãã çŸåšã®ç¶æ³ãæ¬çªãŠãŒã¶ãŒã«äžæºãæã£ãŠããã®ãšåãããã«ããã£ã¹ãã¬ã€ã¿ã€ãã®ã¿ã«å¶éãããšãã¯ã€ãã¯ã¹ã¯ãªãããŠãŒã¶ãŒïŒãããã°ã®æŽŸçã¯ç°¡åã§ããããã£ã¹ãã¬ã€ã®å®è£ ã¯ããã§ã¯ãããŸããïŒãäžæºã«ããã®ã«åœ¹ç«ã€å¯èœæ§ããããšãã@Aaronepowerã®ææ ããšã³ãŒãââãŸãã ã§ãããšããŠããæçµçã«ã¯ã¡ãªããããªããšæããŸãã @shepmasterã«ãã£ãŠæ瀺ãããç¹æ®åã¢ãããŒãã¯ã次ã®åäœãäœæãããšããç¹ã§ææã ãšæããŸãã
誰ãããã€ã³ã2ã«å察ãããããããŸãããããªãããã£ã¹ãã¬ã€ä»ãã®ã¿ã€ããæã£ãŠããŠããäœããã®çç±ã§ãããã°ãåºåãããå Žåã§ãã ãã®ã±ãŒã¹ã¯ãããŸããŸãªäºåã«èšèšãããåºå圢åŒã®ãšã©ãŒã¿ã€ãïŒç¹æ®ãªã«ãŒãã䜿çšããå Žåã§ãããããã調æ»ãã䟡å€ããããŸãïŒã®Nikoã®ææ¡ã«ãã£ãŠå¯ŸåŠããããšæããŸãã
ãã€ã³ã3ã«é¢ããŠã¯ãå°ãããã¡ãªãã§ããïŒ1.0ã§trait Display: Debug
ãå®è¡ããå¿
èŠããã£ãã®ã§ã¯ãªãã§ããããïŒïŒã誰ããDisplay implãäœæããã®ã«èŠåŽããå Žåã¯ã圌ãã«å¹³ææã¡ãäŸé Œããããšã¯ããŸããããŸãããåäžã®æŽŸçç©ïŒããããããšã«ããæã£ãŠãããšæããŸã...ååãšããŠã衚瀺ã¿ã€ãã«ãããã°ãèšå®ããããšã«å察ãã人ã¯ããŸããïŒïŒã
ãã£ã¹ãã¬ã€ã¿ã€ãã®ã¿ã«å¶éãããšãã¯ã€ãã¯ã¹ã¯ãªãããŠãŒã¶ãŒã®äžæºã«ã€ãªããå¯èœæ§ããããŸãïŒãããã°ã®å°åºã¯ç°¡åã§ããããã£ã¹ãã¬ã€ã®å®è£ ã¯ç°¡åã§ã¯ãããŸããïŒ
ã¯ã€ãã¯ã¹ã¯ãªããã§Debug
ãããDisplay
ã®æ¹ãæãŸããå Žåã¯ããšã©ãŒã¿ã€ããšããŠ&'static str
ãŸãã¯String
ã䜿çšããŸãã #[derive(Debug)]
ãå©ãã«ã¹ã¿ã ãšã©ãŒã¿ã€ããããå Žåã¯ããšã©ãŒåŠçã«åãã«è¶³ããªããšãã«ã®ãŒããã§ã«è²»ãããŠããŸãã
@SimonSapinã¯ã€ãã¯ã¹ã¯ãªããç°å¢ã§ã¯å¥œãŸãããªããšã¯èšããŸããããåªåãããã«æååãDisplay
圢åŒã§å°å·ããããšããç«å Žã«ç«ã€ã»ã©ã¯å¥œãŸãããããŸããããšã©ãŒãé©åã«ãã©ãŒãããããã«ã¯ã Debug
ããå§ãããŸããããã¯ãæååã®å Žåã®ãšã©ãŒãã©ãŒããããé©åã«åœ¢æãããŠããªãããã Err("âŠ")
ãå²ããšãä»ã®ãšã©ãŒããç°¡åã«èŠèŠçã«èå¥ã§ããããã§ããæŸåºãããå¯èœæ§ã®ããåºåã
FWIWã§ãã©ãŒããããããã®ã¯ã Result<_, E>
å€ã§ã¯ãªããå
éšã®E
å€ã®ã¿ã§ãã ãããã£ãŠãåºåã«Err(
ã¯è¡šç€ºãããŸããã ãã ããçŸåšã®ã³ãŒãã¯Error:
ãã¬ãã£ãã¯ã¹ãè¿œå ããŸããããã¯ãããããDisplay
ã䜿çšãããå Žåã«æ®ããŸãã åŒçšç¬Šãåºåããªãããšã«å ããŠã Display
ã¯æååã®å
容ãããã¯ã¹ã©ãã·ã¥ãšã¹ã±ãŒãããŸãããããã¯ããŠãŒã¶ãŒã«ïŒãšã©ãŒïŒã¡ãã»ãŒãžã衚瀺ããå Žåã«æãŸããIMOã§ãã
ç¶æ³ãèãããšãç§ãã¡ãã§ããæåã®ããšã¯ã Display + Debug
ãå®è£
ããŠDisplay
implãåºåããåã«ç¹åããããšã ãšæããŸãã Debug
ãå®è£
ããªãåã¯ïŒäº€å·®ç¹ã®å®è£
ããµããŒããããŸã§ïŒãšã©ãŒãšããŠäœ¿çšã§ããªãã®ã¯æ®å¿µã§ãããæåãå°œããããšãã§ããŸãã
äž»ãªè³ªåã¯ããã®implãstdã®ç¹æ®ãªimplã«é¢ããçŸåšã®ããªã·ãŒã«è©²åœãããã©ããã§ãã éåžžãç¹æ®åã¯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(())
}
}
ã¹ãã·ã£ã©ã€ãŒãŒã·ã§ã³ãçŸåšæ©èœããŠããæ¹æ³ã®ããã Foo<'a, 'b>
ã§$ report
ãåŒã³åºãããšãã§ããŸããããã§ã 'b
ã¯'a
ãããé·æã¡ããŸãããçŸåšãã³ã³ãã€ã©ãŒã¯å®å
šã«å¯èœã§ããã©ã€ãã¿ã€ã èŠä»¶ãæºããããŠããªãå Žåã§ã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ããã°ã©ã ãäœæãããšãã¯ãå®éã«ã¯äžèšã®ã¢ãããŒãã䜿çšããã®ã§ãäŸã«çŸå®ãåæ ããããå Žåã¯ãã·ã§ãŒãã«ããã䜿çšããã«ãå®éã®ããã°ã©ã ã§äœããããã瀺ãå¿ èŠããããšæããŸãïŒåŠ¥åœãªç¯å²ã§ïŒ ïŒã ç§ã¯å®éããã®çš®ã®ããšã¯æ¬åœã«éèŠã ãšæããŸããããã®æŽå²çãªå¯äœçšã®1ã€ã¯ã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å®å®çã§ã³ã³ãã€ã«ãããŸãã
Display
ã«åãæ¿ãããšããã®ã³ãŒããå£ãããšæããŸãã ã§ããããããããŸããïŒ ãããæ¬åœã«è¹ã®åžã®åé¡ã§ããå Žåãç§ã¯ç解ããŠãããèŠç¹ã詳ãã説æããããšã«ã¯ããŸãæå³ããããŸããããå°ãªããšãäœããèšã£ãŠãä»ã®äººã説åŸããŠèŠãããšãã§ããªããã©ããã確èªããã®ã«åå匷ããšæããŠããŸããããä¿®æ£ããããã«ã§ããããšãããã°ã ïŒç§ãããã§éå°åå¿ããŠããå¯èœæ§ãååã«ãããŸããããããŸã§ã®ãšãããCSVã®äŸã§ããªã?-in-main
ã䜿çšããªãã®ã§ããïŒã ããããã©ã®ããã«å®çŸå¯èœãã¯ããããŸããããããããããã¯?-in-main
ã«ãã£ãŠè§£æ±ºãããããšãæå³ããåé¡ã§ã¯ãªãã£ããããããŸããããäžéšã®äººã ã¯ç¢ºãã«ãã®å°è±¡ãæã£ãŠããŸãããçŸåšã®å®è£ ã§ã¯ãããã¥ã¡ã³ããã¹ããåäœãã¹ãã§åœ¹ç«ã€ããšãããããŸããããä»ã®ç¶æ³ã§äœ¿çšããããšãèããã®ã¯é£ããã§ããïŒ