Rust: RFC 1937 рдХреЗ рд▓рд┐рдП рдЯреНрд░реИрдХрд┐рдВрдЧ рд╕рдорд╕реНрдпрд╛: `?` `рдореБрдЦреНрдп` . рдореЗрдВ

рдХреЛ рдирд┐рд░реНрдорд┐рдд 18 рдЬреБрд▓ре░ 2017  ┬╖  183рдЯрд┐рдкреНрдкрдгрд┐рдпрд╛рдБ  ┬╖  рд╕реНрд░реЛрдд: rust-lang/rust

рдпрд╣ RFC " ? in main " (rust-lang/rfcs#1937) рдХреЗ рд▓рд┐рдП рдПрдХ рдЯреНрд░реИрдХрд┐рдВрдЧ рд╕рдорд╕реНрдпрд╛ рд╣реИред

рдХрджрдо:

рд╕реНрдерд┐рд░реАрдХрд░рдг:

  • [x] рдЧреИрд░-() рд░рд┐рдЯрд░реНрди рдкреНрд░рдХрд╛рд░реЛрдВ рдХреЗ рд╕рд╛рде main рдХреЛ рд╕реНрдерд┐рд░ рдХрд░реЗрдВ (https://github.com/rust-lang/rust/issues/48453) https://github.com/rust-lang/ рдореЗрдВ рдорд░реНрдЬ рдХрд┐рдпрд╛ рдЧрдпрд╛
  • [x] рдЧреИрд░-() рд░рд┐рдЯрд░реНрди рдкреНрд░рдХрд╛рд░реЛрдВ рдХреЗ рд╕рд╛рде рдпреВрдирд┐рдЯ рдкрд░реАрдХреНрд╖рдгреЛрдВ рдХреЛ рд╕реНрдерд┐рд░ рдХрд░реЗрдВ (https://github.com/rust-lang/rust/issues/48854)

рд╕рдВрдмрдВрдзрд┐рдд рдореБрджреНрджреЛрдВ:

  • [x] рдпреВрдирд┐рдЯ рдкрд░реАрдХреНрд╖рдгреЛрдВ рдХреЗ рд▓рд┐рдП рддреНрд░реБрдЯрд┐ рд╕рдВрджреЗрд╢ рдмрд╣реБрдд рдЕрдЪреНрдЫрд╛ рдирд╣реАрдВ рд╣реИ (https://github.com/rust-lang/rust/issues/50291)

рдЕрдирд╕реБрд▓рдЭреЗ рдкреНрд░рд╢реНрди:

  • [ ] рд╡рд┐рд╢реЗрд╖рддрд╛ рдХрд╛ рдирд╛рдо рдкреЗрд╢ рдХрд┐рдпрд╛ рдЬрд╛ рд░рд╣рд╛ рд╣реИ
  • [x] рд╕рдЯреАрдХ рдкреНрд░рд╛рд░рдВрднрд┐рдХ рдХрд╛рд░реНрдпрд╛рдиреНрд╡рдпрди

    • рдЗрд╕реЗ #48453 . рджреНрд╡рд╛рд░рд╛ рд╕реНрдерд┐рд░ рдХрд┐рдпрд╛ рдЬрд╛рдПрдЧрд╛

  • [x] рдирд┐рдХрд╛рд╕ рдХреЛрдб ( рдЪрд░реНрдЪрд╛ ) рдПрдХ рдЕрд▓рдЧ рдЯреНрд░реИрдХрд┐рдВрдЧ рдореБрджреНрджреЗ рдкрд░ рд▓реЗ рдЬрд╛рдпрд╛ рдЧрдпрд╛, https://github.com/rust-lang/rust/issues/48711

    • рдЗрд╕реЗ https://github.com/rust-lang/rust/pull/48497 рдХреЗ рдмрд╛рдж #48453 рджреНрд╡рд╛рд░рд╛ рд╕реНрдерд┐рд░ рдХрд┐рдпрд╛ рдЬрд╛рдПрдЧрд╛ред

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

рд╕рдмрд╕реЗ рдЙрдкрдпреЛрдЧреА рдЯрд┐рдкреНрдкрдгреА

рдПрдХ рдРрд╕реЗ рдмрд┐рдВрджреБ рдкрд░ рдЪрд┐рд▓реНрд▓рд╛рдиреЗ рдХреЗ рд▓рд┐рдП рдХреНрд╖рдорд╛ рдЪрд╛рд╣рддреЗ рд╣реИрдВ рдЬрд┐рд╕рдореЗрдВ рдЗрд╕ рдмрд╛рд░реЗ рдореЗрдВ рдХреБрдЫ рднреА рдХрд░рдиреЗ рдореЗрдВ рд╢рд╛рдпрдж рдмрд╣реБрдд рджреЗрд░ рд╣реЛ рдЪреБрдХреА рд╣реИ, рд▓реЗрдХрд┐рди рдЕрдЧрд░ рд╡рд╣рд╛рдВ рдерд╛ рддреЛ рдореИрдВ рдпрд╣рд╛рдВ рдЕрдкрдиреА рдкреНрд░рддрд┐рдХреНрд░рд┐рдпрд╛ рдЫреЛрдбрд╝рдирд╛ рдЪрд╛рд╣рддрд╛ рдерд╛ред рдореИрдВрдиреЗ рдЗрд╕ рдзрд╛рдЧреЗ рдХрд╛ рдЕрдзрд┐рдХрд╛рдВрд╢ рднрд╛рдЧ рдкрдврд╝рд╛ рд╣реИ, рдЗрд╕рд▓рд┐рдП рдореИрдВ рдЙрд╕ рд╕рдВрджрд░реНрдн рдХреЛ рдзреНрдпрд╛рди рдореЗрдВ рд░рдЦрдХрд░ рдмреЛрд▓ рд░рд╣рд╛ рд╣реВрдВред рд╣рд╛рд▓рд╛рдВрдХрд┐, рдпрд╣ рдзрд╛рдЧрд╛ рд▓рдВрдмрд╛ рд╣реИ, рдЗрд╕рд▓рд┐рдП рдЕрдЧрд░ рдРрд╕рд╛ рд▓рдЧрддрд╛ рд╣реИ рдХрд┐ рдореИрдВрдиреЗ рдХреБрдЫ рдЕрдирджреЗрдЦрд╛ рдХрд░ рджрд┐рдпрд╛ рд╣реИ, рддреЛ рд╢рд╛рдпрдж рдореИрдВрдиреЗ рдХрд┐рдпрд╛ рдФрд░ рдореБрдЭреЗ рдЗрд╕рдХреА рдУрд░ рдЗрд╢рд╛рд░рд╛ рдХрд░рдиреЗ рдХреА рд╕рд░рд╛рд╣рдирд╛ рд╣реЛрдЧреАред :-)

TL; DR - рдореБрдЭреЗ рд▓рдЧрддрд╛ рд╣реИ рдХрд┐ рддреНрд░реБрдЯрд┐ рдХрд╛ Debug рд╕рдВрджреЗрд╢ рджрд┐рдЦрд╛рдирд╛ рдПрдХ рдЧрд▓рддреА рдереА, рдФрд░ рдпрд╣ рдХрд┐ рдПрдХ рддреНрд░реБрдЯрд┐ рдХреЗ Display рд╕рдВрджреЗрд╢ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдирд╛ рдПрдХ рдмреЗрд╣рддрд░ рд╡рд┐рдХрд▓реНрдк рд╣реЛрдЧрд╛ред

рдореЗрд░реЗ рд╡рд┐рд╢реНрд╡рд╛рд╕ рдХреЗ рдореВрд▓ рдореЗрдВ рдпрд╣ рд╣реИ рдХрд┐, рдЬреЛ рдХреЛрдИ _рд░реВрд╕реНрдЯ_ рдореЗрдВ _рдирд┐рдпрдорд┐рдд рд░реВрдк рд╕реЗ рд╕реАрдПрд▓рдЖрдИ рдкреНрд░реЛрдЧреНрд░рд╛рдо рдмрдирд╛рддрд╛ рд╣реИ, рдореБрдЭреЗ рдХрднреА рднреА рдЗрд╕ рдмрд╛рд░реЗ рдореЗрдВ рдЕрдзрд┐рдХ рдзреНрдпрд╛рди рджреЗрдиреЗ рдХреА рдпрд╛рдж рдирд╣реАрдВ рдЖрддреА рдХрд┐ $#$ Error $#$ рдХрд╛ Debug рд╕рдВрджреЗрд╢ рдХреНрдпрд╛ рд╣реИред рдЕрд░реНрдерд╛рддреН, рддреНрд░реБрдЯрд┐ рдХрд╛ Debug рдбрд┐рдЬрд╝рд╛рдЗрди рджреНрд╡рд╛рд░рд╛, рдбреЗрд╡рд▓рдкрд░реНрд╕ рдХреЗ рд▓рд┐рдП рд╣реИ, рди рдХрд┐ рдЕрдВрддрд┐рдо рдЙрдкрдпреЛрдЧрдХрд░реНрддрд╛рдУрдВ рдХреЗ рд▓рд┐рдПред рдЬрдм рдЖрдк рдПрдХ рд╕реАрдПрд▓рдЖрдИ рдкреНрд░реЛрдЧреНрд░рд╛рдо рдмрдирд╛рддреЗ рд╣реИрдВ, рддреЛ рдЗрд╕рдХрд╛ рдЗрдВрдЯрд░рдлрд╝реЗрд╕ рдореВрд▓ рд░реВрдк рд╕реЗ рдЕрдВрддрд┐рдо рдЙрдкрдпреЛрдЧрдХрд░реНрддрд╛рдУрдВ рджреНрд╡рд╛рд░рд╛ рдкрдврд╝рдиреЗ рдХреЗ рд▓рд┐рдП рд╣реЛрддрд╛ рд╣реИ, рдЗрд╕рд▓рд┐рдП Debug рд╕рдВрджреЗрд╢ рдХреА рдпрд╣рд╛рдВ рдмрд╣реБрдд рдХрдо рдЙрдкрдпреЛрдЧрд┐рддрд╛ рд╣реИред рдпрд╣реА рд╣реИ, рдЕрдЧрд░ рдореИрдВрдиреЗ рдЕрдВрддрд┐рдо рдЙрдкрдпреЛрдЧрдХрд░реНрддрд╛рдУрдВ рдХреЛ рднреЗрдЬреЗ рдЧрдП рдХрд┐рд╕реА рднреА рд╕реАрдПрд▓рдЖрдИ рдкреНрд░реЛрдЧреНрд░рд╛рдо рдХреЛ рд╕рд╛рдорд╛рдиреНрдп рдСрдкрд░реЗрд╢рди рдореЗрдВ рдЬрдВрдЧ рдорд╛рди рдХрд╛ рдбреАрдмрдЧ рдкреНрд░рддрд┐рдирд┐рдзрд┐рддреНрд╡ рджрд┐рдЦрд╛рдпрд╛ рд╣реИ, рддреЛ рдореИрдВ рдПрдХ рдмрдЧ рдХреЛ рдареАрдХ рдХрд░рдиреЗ рдкрд░ рд╡рд┐рдЪрд╛рд░ рдХрд░реВрдВрдЧрд╛ред рдореБрдЭреЗ рдЖрдо рддреМрд░ рдкрд░ рд▓рдЧрддрд╛ рд╣реИ рдХрд┐ рдпрд╣ рд░рд╕реНрдЯ рдореЗрдВ рд▓рд┐рдЦреЗ рдЧрдП рдкреНрд░рддреНрдпреЗрдХ рд╕реАрдПрд▓рдЖрдИ рдХрд╛рд░реНрдпрдХреНрд░рдо рдХреЗ рд▓рд┐рдП рд╕рд╣реА рд╣реЛрдирд╛ рдЪрд╛рд╣рд┐рдП, рд╣рд╛рд▓рд╛рдВрдХрд┐ рдореИрдВ рд╕рдордЭрддрд╛ рд╣реВрдВ рдХрд┐ рдпрд╣ рдПрдХ рдРрд╕рд╛ рдмрд┐рдВрджреБ рд╣реЛ рд╕рдХрддрд╛ рд╣реИ рдЬрд┐рд╕ рдкрд░ рдЙрдЪрд┐рдд рд▓реЛрдЧ рдЕрд╕рд╣рдордд рд╣реЛ рд╕рдХрддреЗ рд╣реИрдВред рдЗрд╕рдХреЗ рд╕рд╛рде рд╣реА, рдореЗрд░реА рд░рд╛рдп рдХрд╛ рдХреБрдЫ рдЪреМрдВрдХрд╛рдиреЗ рд╡рд╛рд▓рд╛ рдирд┐рд╣рд┐рддрд╛рд░реНрде рдпрд╣ рд╣реИ рдХрд┐ рд╣рдордиреЗ рдПрдХ рдРрд╕реА рд╕реБрд╡рд┐рдзрд╛ рдХреЛ рдкреНрд░рднрд╛рд╡реА рдврдВрдЧ рд╕реЗ рд╕реНрдерд┐рд░ рдХрд░ рджрд┐рдпрд╛ рд╣реИ рдЬрд╣рд╛рдВ рдЗрд╕рдХреЗ рд╕рдВрдЪрд╛рд▓рди рдХрд╛ рдбрд┐рдлрд╝реЙрд▓реНрдЯ рдореЛрдб рдЖрдкрдХреЛ рдПрдХ рдмрдЧ (рдлрд┐рд░ рд╕реЗ, рдЖрдИрдПрдордУ) рд╕реЗ рд╢реБрд░реВ рдХрд░рддрд╛ рд╣реИ рдЬрд┐рд╕реЗ рдареАрдХ рдХрд┐рдпрд╛ рдЬрд╛рдирд╛ рдЪрд╛рд╣рд┐рдПред

рдбрд┐рдлрд╝реЙрд▓реНрдЯ рд░реВрдк рд╕реЗ Debug рддреНрд░реБрдЯрд┐ рдХрд╛ рдкреНрд░рддрд┐рдирд┐рдзрд┐рддреНрд╡ рджрд┐рдЦрд╛рдХрд░, рдореБрдЭреЗ рдпрд╣ рднреА рд▓рдЧрддрд╛ рд╣реИ рдХрд┐ рд╣рдо рдЦрд░рд╛рдм рдЕрднреНрдпрд╛рд╕ рдХреЛ рдкреНрд░реЛрддреНрд╕рд╛рд╣рд┐рдд рдХрд░ рд░рд╣реЗ рд╣реИрдВред рд╡рд┐рд╢реЗрд╖ рд░реВрдк рд╕реЗ, рд░рд╕реНрдЯ рд╕реАрдПрд▓рдЖрдИ рдХрд╛рд░реНрдпрдХреНрд░рдо рд▓рд┐рдЦрдиреЗ рдХреЗ рджреМрд░рд╛рди рдпрд╣ рджреЗрдЦрдирд╛ рдмрд╣реБрдд рдЖрдо рд╣реИ рдХрд┐ рддреНрд░реБрдЯрд┐ рдХрд╛ Display рднреА рдЕрдВрдд рдЙрдкрдпреЛрдЧрдХрд░реНрддрд╛рдУрдВ рджреНрд╡рд╛рд░рд╛ рдЙрдкрднреЛрдЧ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдкрд░реНрдпрд╛рдкреНрдд рдирд╣реАрдВ рд╣реИ, рдФрд░ рдпрд╣ рд╡рд╛рд╕реНрддрд╡рд┐рдХ рдХрд╛рд░реНрдп рдХрд┐рдпрд╛ рдЬрд╛рдирд╛ рдЪрд╛рд╣рд┐рдП рдЗрд╕реЗ рдареАрдХ рдХрд░реЗрдВред рдЗрд╕рдХрд╛ рдПрдХ рдареЛрд╕ рдЙрджрд╛рд╣рд░рдг рд╣реИ io::Error ред рдПрдХ рд╕рдВрдмрдВрдзрд┐рдд рдлрд╝рд╛рдЗрд▓ рдкрде рдХреЗ рдмрд┐рдирд╛ io::Error рджрд┐рдЦрд╛рдирд╛ (рдпрд╣ рдорд╛рдирддреЗ рд╣реБрдП рдХрд┐ рдпрд╣ рдлрд╝рд╛рдЗрд▓ рдкрдврд╝рдиреЗ/рд▓рд┐рдЦрдиреЗ/рдЦреЛрд▓рдиреЗ/рдмрдирд╛рдиреЗ рд╕реЗ рдЖрдпрд╛ рд╣реИ) рдореВрд▓ рд░реВрдк рд╕реЗ рдПрдХ рдмрдЧ рд╣реИ, рдХреНрдпреЛрдВрдХрд┐ рдЕрдВрддрд┐рдо рдЙрдкрдпреЛрдЧрдХрд░реНрддрд╛ рдХреЗ рд▓рд┐рдП рдЗрд╕рдХреЗ рд╕рд╛рде рдХреБрдЫ рднреА рдХрд░рдирд╛ рдореБрд╢реНрдХрд┐рд▓ рд╣реИред рдбрд┐рдлрд╝реЙрд▓реНрдЯ рд░реВрдк рд╕реЗ Debug рддреНрд░реБрдЯрд┐ рдХреЗ рдкреНрд░рддрд┐рдирд┐рдзрд┐рддреНрд╡ рдХреЛ рджрд┐рдЦрд╛рдиреЗ рдХрд╛ рдЪреБрдирд╛рд╡ рдХрд░рдХреЗ, рд╣рдордиреЗ рд╕реАрдПрд▓рдЖрдИ рдкреНрд░реЛрдЧреНрд░рд╛рдо рдмрдирд╛рдиреЗ рд╡рд╛рд▓реЗ рд▓реЛрдЧреЛрдВ рджреНрд╡рд╛рд░рд╛ рдЙрди рдкреНрд░рдХрд╛рд░ рдХреА рдмрдЧреЛрдВ рдХреЛ рдЙрдЬрд╛рдЧрд░ рдХрд░рдирд╛ рдХрдард┐рди рдмрдирд╛ рджрд┐рдпрд╛ рд╣реИред (рдЗрд╕рдХреЗ рдКрдкрд░, Debug рдХрд╛ io::Error рдЕрдкрдиреЗ 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 рд╕реЗ рдмрджрд▓рдирд╛ _lovely_ рд╣реЛрдЧрд╛, рд▓реЗрдХрд┐рди рдореИрдВ рдирд╣реАрдВ рдХрд░ рд╕рдХрддрд╛, рдХреНрдпреЛрдВрдХрд┐ рдпрд╣ рдХрд┐рд╕реА рддреНрд░реБрдЯрд┐ рдХреЗ Display рдХреЛ рдирд╣реАрдВ рджрд┐рдЦрд╛рдПрдЧрд╛ред рдпрд╣реА рд╣реИ, рд╡рд╛рд╕реНрддрд╡рд┐рдХ рд╕реАрдПрд▓рдЖрдИ рдХрд╛рд░реНрдпрдХреНрд░рдо рд▓рд┐рдЦрддреЗ рд╕рдордп, рдореИрдВ рд╡рд╛рд╕реНрддрд╡ рдореЗрдВ рдЙрдкрд░реЛрдХреНрдд рджреГрд╖реНрдЯрд┐рдХреЛрдг рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░реВрдВрдЧрд╛, рдЗрд╕рд▓рд┐рдП рдпрджрд┐ рдореИрдВ рдЪрд╛рд╣рддрд╛ рд╣реВрдВ рдХрд┐ рдореЗрд░реЗ рдЙрджрд╛рд╣рд░рдг рд╡рд╛рд╕реНрддрд╡рд┐рдХрддрд╛ рдХреЛ рдкреНрд░рддрд┐рдмрд┐рдВрдмрд┐рдд рдХрд░реЗрдВ, рддреЛ рдореБрдЭреЗ рд▓рдЧрддрд╛ рд╣реИ рдХрд┐ рдореБрдЭреЗ рд╡рд╛рд╕реНрддрд╡рд┐рдХ рдХрд╛рд░реНрдпрдХреНрд░рдореЛрдВ рдореЗрдВ рджрд┐рдЦрд╛рдирд╛ рдЪрд╛рд╣рд┐рдП рдФрд░ рд╢реЙрд░реНрдЯрдХрдЯ рдирд╣реАрдВ рд▓реЗрдирд╛ рдЪрд╛рд╣рд┐рдП (рдЙрдЪрд┐рдд рд╕реАрдорд╛ рддрдХ) ) рдореБрдЭреЗ рд╡рд╛рд╕реНрддрд╡ рдореЗрдВ рд▓рдЧрддрд╛ рд╣реИ рдХрд┐ рдЗрд╕ рддрд░рд╣ рдХреА рдЪреАрдЬ рд╡рд╛рд╕реНрддрд╡ рдореЗрдВ рдорд╣рддреНрд╡рдкреВрд░реНрдг рд╣реИ, рдФрд░ рдРрддрд┐рд╣рд╛рд╕рд┐рдХ рд░реВрдк рд╕реЗ рдЗрд╕рдХрд╛ рдПрдХ рд╕рд╛рдЗрдб рдЗрдлреЗрдХреНрдЯ рдпрд╣ рдерд╛ рдХрд┐ рдЗрд╕рдиреЗ рд▓реЛрдЧреЛрдВ рдХреЛ рд╣рд░ рдЬрдЧрд╣ unwrap рдЫрд┐рдбрд╝рдХреЗ рдмрд┐рдирд╛ рдореБрд╣рд╛рд╡рд░реЗрджрд╛рд░ рд░рд╕реНрдЯ рдХреЛрдб рд▓рд┐рдЦрдиреЗ рдХрд╛ рддрд░реАрдХрд╛ рджрд┐рдЦрд╛рдпрд╛ред рд▓реЗрдХрд┐рди рдЕрдЧрд░ рдореИрдВ рдЕрдкрдиреЗ рдЙрджрд╛рд╣рд░рдгреЛрдВ рдореЗрдВ ?-in-main рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рд╡рд╛рдкрд╕ рд▓реМрдЯрддрд╛ рд╣реВрдВ, рддреЛ рдореИрдВ рдЕрдкрдиреЗ рд▓рдХреНрд╖реНрдп рд╕реЗ рдкреАрдЫреЗ рд╣рдЯ рдЧрдпрд╛ рд╣реВрдВ: рдЕрдм рдореИрдВ рдРрд╕реЗ рд▓реЛрдЧреЛрдВ рдХреЛ рд╕реНрдерд╛рдкрд┐рдд рдХрд░ рд░рд╣рд╛ рд╣реВрдВ рдЬреЛ рдХреЗрд╡рд▓ рдкреНрд░реЛрдЧреНрд░рд╛рдо рд▓рд┐рдЦрдиреЗ рдХреЗ рд▓рд┐рдП рдмреЗрд╣рддрд░ рдирд╣реАрдВ рдЬрд╛рдирддреЗ рд╣реИрдВ, рдбрд┐рдлрд╝реЙрд▓реНрдЯ рд░реВрдк рд╕реЗ, рдмрд╣реБрдд рдЙрддреНрд╕рд░реНрдЬрд┐рдд рдХрд░рддреЗ рд╣реИрдВ рдЕрдиреБрдкрдпреЛрдЧреА рддреНрд░реБрдЯрд┐ рд╕рдВрджреЗрд╢ред

"рдПрдХ рддреНрд░реБрдЯрд┐ рд╕рдВрджреЗрд╢ рдЙрддреНрд╕рд░реНрдЬрд┐рдд рдХрд░реЗрдВ рдФрд░ рдПрдХ рдЙрдкрдпреБрдХреНрдд рддреНрд░реБрдЯрд┐ рдХреЛрдб рдХреЗ рд╕рд╛рде рдмрд╛рд╣рд░ рдирд┐рдХрд▓реЗрдВ" рдХрд╛ рдкреИрдЯрд░реНрди рд╡рд╛рд╕реНрддрд╡ рдореЗрдВ рдкреЙрд▓рд┐рд╢ рдХрд┐рдП рдЧрдП рдХрд╛рд░реНрдпрдХреНрд░рдореЛрдВ рдореЗрдВ рдЙрдкрдпреЛрдЧ рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИред рдЙрджрд╛рд╣рд░рдг рдХреЗ рд▓рд┐рдП, рдпрджрд┐ ?-in-main рдиреЗ Display рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд┐рдпрд╛ рд╣реИ, рддреЛ рдореИрдВ рдЖрдЬ ripgrep рдореЗрдВ main рдФрд░ run рдлрд╝рдВрдХреНрд╢рдВрд╕ рдХреЛ рдорд░реНрдЬ рдХрд░ рд╕рдХрддрд╛ рд╣реВрдВ:

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

рдмреЗрд╢рдХ, рдореИрдВ рднрд╡рд┐рд╖реНрдп рдореЗрдВ ?-in-main Termination рд╡рд┐рд╢реЗрд╖рддрд╛ рдХреЗ рд▓рд┐рдП рдЕрдкрдирд╛ рдЦреБрдж рдХрд╛ рдЗрдореНрдкреНрд▓рд╛рдВрдЯ рдкреНрд░рджрд╛рди рдХрд░рдХреЗ рдХрд░ рд╕рдХрддрд╛ рд╣реВрдВ рдЬреЛ рдПрдХ рдмрд╛рд░ рд╕реНрдерд┐рд░ рд╣реЛ рдЬрд╛рддрд╛ рд╣реИ, рд▓реЗрдХрд┐рди рдЕрдЧрд░ рдореИрдВ рд╕рд┐рд░реНрдл main рд▓рд┐рдЦ рд╕рдХрддрд╛ рд╣реВрдВ рддреЛ рдореБрдЭреЗ рдРрд╕рд╛ рдХрд░рдиреЗ рдореЗрдВ рдкрд░реЗрд╢рд╛рдиреА рдХреНрдпреЛрдВ рд╣реЛрдЧреА рдореЗрд░реЗ рдкрд╛рд╕ impl рдХреЛ рд╢рд╛рдорд┐рд▓ рдХрд░рдирд╛ рд╣реЛрдЧрд╛ рддрд╛рдХрд┐ рд╡реЗ рд╡рд╛рд╕реНрддрд╡рд┐рдХрддрд╛ рд╕реЗ рдореЗрд▓ рдЦрд╛ рд╕рдХреЗрдВ, рдФрд░ рдЙрд╕ рдмрд┐рдВрджреБ рдкрд░, рдореИрдВ рдЖрдЬ рдХреЗ рдЙрджрд╛рд╣рд░рдгреЛрдВ рдХреЗ рд╕рд╛рде рднреА рд░рд╣ рд╕рдХрддрд╛ рд╣реВрдВ ( main рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдХреЗ рдФрд░ рдПрдХ try_main )ред

рджреЗрдЦрдиреЗ рд╕реЗ рдРрд╕рд╛ рд▓рдЧрддрд╛ рд╣реИ рдХрд┐ рдЗрд╕реЗ рдареАрдХ рдХрд░рдирд╛ рдПрдХ рдмреНрд░реЗрдХрд┐рдВрдЧ рдмрджрд▓рд╛рд╡ рд╣реЛрдЧрд╛ред рдпрд╣реА рд╣реИ, рдпрд╣ рдХреЛрдб рдЖрдЬ рдЬрдВрдЧ рд╕реНрдерд┐рд░ рдкрд░ рд╕рдВрдХрд▓рд┐рдд рдХрд░рддрд╛ рд╣реИ:

#[derive(Debug)]
struct OnlyDebug;

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

рдореБрдЭреЗ рд▓рдЧрддрд╛ рд╣реИ рдХрд┐ Display рдкрд░ рд╕реНрд╡рд┐рдЪ рдХрд░рдиреЗ рд╕реЗ рдпрд╣ рдХреЛрдб рдЯреВрдЯ рдЬрд╛рдПрдЧрд╛ред рд▓реЗрдХрд┐рди рдореБрдЭреЗ рдкрдХреНрдХрд╛ рдкрддрд╛ рдирд╣реАрдВ рд╣реИ! рдпрджрд┐ рдпрд╣ рд╡рд╛рд╕реНрддрд╡ рдореЗрдВ рдПрдХ рдЬрд╣рд╛рдЬ-рд╕реЗ-рдиреМрдХрд╛рдпрди рдореБрджреНрджрд╛ рд╣реИ, рддреЛ рдореИрдВ рд╕рдордЭрддрд╛ рд╣реВрдВ рдФрд░ рдЗрд╕ рдмрд┐рдВрджреБ рдкрд░ рд╡рд┐рд╕реНрддрд╛рд░ рдХрд░рдиреЗ рдореЗрдВ рдмрд╣реБрдд рдЕрдзрд┐рдХ рдЙрдкрдпреЛрдЧ рдирд╣реАрдВ рд╣реИ, рд▓реЗрдХрд┐рди рдореБрдЭреЗ рдЗрд╕рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рдХрдо рд╕реЗ рдХрдо рдХреБрдЫ рдХрд╣рдиреЗ рдФрд░ рджреЗрдЦрдиреЗ рдХреЗ рд▓рд┐рдП рдкрд░реНрдпрд╛рдкреНрдд рд░реВрдк рд╕реЗ рдкрд░реНрдпрд╛рдкреНрдд рдорд╣рд╕реВрд╕ рд╣реЛрддрд╛ рд╣реИ рдХрд┐ рдХреНрдпрд╛ рдореИрдВ рджреВрд╕рд░реЛрдВ рдХреЛ рд╕рдордЭрд╛ рдирд╣реАрдВ рд╕рдХрддрд╛ рдФрд░ рджреЗрдЦ рд╕рдХрддрд╛ рд╣реВрдВ рдЕрдЧрд░ рдЗрд╕реЗ рдареАрдХ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдХреБрдЫ рдХрд┐рдпрд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИред (рдпрд╣ рднреА рдмрд╣реБрдд рд╕рдВрднрд╡ рд╣реИ рдХрд┐ рдореИрдВ рдпрд╣рд╛рдВ рдУрд╡рд░рд░рд┐рдПрдХреНрдЯ рдХрд░ рд░рд╣рд╛ рд╣реВрдВ, рд▓реЗрдХрд┐рди рдореЗрд░реЗ рдкрд╛рд╕ рдЕрдм рддрдХ рдХреБрдЫ рд▓реЛрдЧреЛрдВ рдиреЗ рдореБрдЭрд╕реЗ рдкреВрдЫрд╛ рд╣реИ "рдЖрдк ?-in-main рдХрд╛ рдЙрдкрдпреЛрдЧ рдХреНрдпреЛрдВ рдирд╣реАрдВ рдХрд░ рд░рд╣реЗ рд╣реИрдВ?" рдореЗрд░реЗ рд╕реАрдПрд╕рд╡реА рдЙрджрд╛рд╣рд░рдгреЛрдВ рдореЗрдВ, рдФрд░ рдореЗрд░рд╛ рдЬрд╡рд╛рдм рдореВрд▓ рд░реВрдк рд╕реЗ рд░рд╣рд╛ рд╣реИ, "рдореИрдВ рдирд╣реАрдВ рджреЗрдЦрддрд╛ рдХрд┐ рдРрд╕рд╛ рдХрд░рдирд╛ рдХреИрд╕реЗ рд╕рдВрднрд╡ рд╣реЛрдЧрд╛ред" рд╣реЛ рд╕рдХрддрд╛ рд╣реИ рдХрд┐ рдпрд╣ рдХреЛрдИ рд╕рдорд╕реНрдпрд╛ рдирд╣реАрдВ рдереА рдЬрд┐рд╕реЗ ?-in-main рджреНрд╡рд╛рд░рд╛ рд╣рд▓ рдХрд░рдиреЗ рдХрд╛ рдЗрд░рд╛рджрд╛ рдерд╛, рд▓реЗрдХрд┐рди рдХреБрдЫ рд▓реЛрдЧреЛрдВ рдХреЛ рдирд┐рд╢реНрдЪрд┐рдд рд░реВрдк рд╕реЗ рд╡рд╣ рдкреНрд░рднрд╛рд╡ рдерд╛ред рдЗрд╕рдХреЗ рд╡рд░реНрддрдорд╛рди рдХрд╛рд░реНрдпрд╛рдиреНрд╡рдпрди рдХреЗ рд╕рд╛рде , рдореИрдВ рджреЗрдЦ рд╕рдХрддрд╛ рдерд╛ рдХрд┐ рдпрд╣ рдбреЙрдХреНрдЯрд░ рдкрд░реАрдХреНрд╖рдгреЛрдВ рдФрд░ рдЗрдХрд╛рдИ рдкрд░реАрдХреНрд╖рдгреЛрдВ рдореЗрдВ рдЙрдкрдпреЛрдЧреА рд╣реИ, рд▓реЗрдХрд┐рди рдореБрдЭреЗ рдЕрдиреНрдп рдкрд░рд┐рд╕реНрдерд┐рддрд┐рдпреЛрдВ рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рд╕реЛрдЪрдиреЗ рдореЗрдВ рдХрдард┐рдирд╛рдИ рд╣реЛрддреА рд╣реИ рдЬрд┐рд╕рдореЗрдВ рдореИрдВ рдЗрд╕рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░реВрдВрдЧрд╛ред)

рд╕рднреА 183 рдЯрд┐рдкреНрдкрдгрд┐рдпрд╛рдБ

рдмрд╛рд╣рд░ рдирд┐рдХрд▓рдиреЗ рдХреА рд╕реНрдерд┐рддрд┐ рд╕реЗ рдХреИрд╕реЗ рдирд┐рдкрдЯрд╛ рдЬрд╛рдПрдЧрд╛?

@Screwtapello рдХреА рдпрд╣ рдЯрд┐рдкреНрдкрдгреА рд▓рдЧрддрд╛ рд╣реИ рдХрд┐ рдЗрд╕рдХреЗ рдЕрдВрдд рдХреЗ рдмрд╣реБрдд рдХрд░реАрдм рдХреА рдЧрдИ рд╣реИ FCP рдЗрд╕рдХреЗ рдЬрд╡рд╛рдм рдореЗрдВ RFC рдореЗрдВ рдХрд┐рдП рдЬрд╛рдиреЗ рд╡рд╛рд▓реЗ рдХрд┐рд╕реА рднреА рдкрд░рд┐рд╡рд░реНрддрди рдХреЗ рд▓рд┐рдПред

рд╕рдВрдХреНрд╖реЗрдк рдореЗрдВ: RFC рдиреЗ рд╡рд┐рдлрд▓рддрд╛ рдкрд░ 2 рдХреЛ рдЗрд╕ рдЖрдзрд╛рд░ рдкрд░ рд╡рд╛рдкрд╕ рдХрд░рдиреЗ рдХрд╛ рдкреНрд░рд╕реНрддрд╛рд╡ рдХрд┐рдпрд╛ рд╣реИ, рдЬреЛ рдЕрдЪреНрдЫреА рддрд░рд╣ рд╕реЗ рд╕реНрдерд╛рдкрд┐рдд рд╣реЛрдиреЗ рдХреЗ рдмрд╛рд╡рдЬреВрдж рдЕрд╕реНрдкрд╖реНрдЯ рд╣реИрдВ рдФрд░ рдереЛрдбрд╝рд╛ рдЕрд╕рд╛рдорд╛рдиреНрдп рдкрд░рд┐рдгрд╛рдо рджреЗрддреЗ рд╣реИрдВ; рдХрдо рд╕реЗ рдХрдо рдЖрд╢реНрдЪрд░реНрдп рдХреА рдмрд╛рдд рдпрд╣ рд╣реИ рдХрд┐ 1 рдХреЛ рд╡рд╛рдкрд╕ рдХрд░рдирд╛ рд╣реИ рдЬрдм рдХрд╛рд░реНрдпрдХреНрд░рдо рдХрд╛ рдХреЛрдИ рд╕рдВрдХреЗрдд рдирд╣реАрдВ рд╣реИ, рдпрд╣ рдХреЗрд╡рд▓ рд╕рдлрд▓рддрд╛ рдпрд╛ рд╡рд┐рдлрд▓рддрд╛ рдХреЗ рдЕрд▓рд╛рд╡рд╛ рдФрд░ рдЕрдзрд┐рдХ рд╡рд┐рд╡рд░рдг рдЪрд╛рд╣рддрд╛ рд╣реИред рдХреНрдпрд╛ рдпрд╣ рдкрд░реНрдпрд╛рдкреНрдд рд░реВрдк рд╕реЗ рдмрд╛рдЗрдХрд╢реЗрдбреА рд╣реИ рдХрд┐ рдЗрд╕ рдкрд░ рдЪрд░реНрдЪрд╛ рдХрд┐рдП рдмрд┐рдирд╛ рдпрд╣ рдорд╣рд╕реВрд╕ рдХрд┐рдпрд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИ рдХрд┐ рд╣рдо рдЖрд░рдПрдлрд╕реА рдкреНрд░рдХреНрд░рд┐рдпрд╛ рдХреЛ рд╡рд┐рдХреГрдд рдХрд░ рд░рд╣реЗ рд╣реИрдВ, рдпрд╛ рдЕрдм рд╣рдо рдЗрд╕ рд╡рд┐рд╢рд┐рд╖реНрдЯ рдХрд╛рд░реНрдпрд╛рдиреНрд╡рдпрди рд╡рд┐рд╡рд░рдг рдореЗрдВ рдмрдВрдж рд╣реИрдВ?

рд╣рд╛рд▓рд╛рдВрдХрд┐ рдпрд╣ рдПрдХ рдХрд╛рд░реНрдпрд╛рдиреНрд╡рдпрди рд╡рд┐рд╡рд░рдг рдирд╣реАрдВ рд╣реИ, рд╣реИ рдирд╛?

рдХреБрдЫ рд╕реНрдХреНрд░рд┐рдкреНрдЯ рдЙрдк-рдкреНрд░рдХреНрд░рд┐рдпрд╛ рд╕реЗ рдЬрд╛рдирдХрд╛рд░реА рдкреНрд░рд╛рдкреНрдд рдХрд░рдиреЗ рдХреЗ рддрд░реАрдХреЗ рдХреЗ рд░реВрдк рдореЗрдВ рдирд┐рдХрд╛рд╕ рдХреЛрдб рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рддреА рд╣реИрдВред

рдпрд╣ рд╡рд┐рд╢реЗрд╖ рд░реВрдк рд╕реЗ рдЙрд╕ рдорд╛рдорд▓реЗ рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рд╣реИ рдЬрдм рдПрдХ рдЙрдк-рдкреНрд░рдХреНрд░рд┐рдпрд╛ (рдЬрдВрдЧ рдореЗрдВ рд▓рд╛рдЧреВ) рдХреЗ рдкрд╛рд╕ рдмрд╛рдЗрдирд░реА "рд╕рдм рдХреБрдЫ рдареАрдХ рд╣реИ"/"рдХреБрдЫ рдЧрд▓рдд рд╣реЛ рдЧрдпрд╛" рд╕реЗ рдкрд░реЗ рджреЗрдиреЗ рдХреЗ рд▓рд┐рдП рдХреЛрдИ рдЬрд╛рдирдХрд╛рд░реА рдирд╣реАрдВ рд╣реИред

рдХреБрдЫ рд╕реНрдХреНрд░рд┐рдкреНрдЯ рдЙрдк-рдкреНрд░рдХреНрд░рд┐рдпрд╛ рд╕реЗ рдЬрд╛рдирдХрд╛рд░реА рдкреНрд░рд╛рдкреНрдд рдХрд░рдиреЗ рдХреЗ рддрд░реАрдХреЗ рдХреЗ рд░реВрдк рдореЗрдВ рдирд┐рдХрд╛рд╕ рдХреЛрдб рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рддреА рд╣реИрдВред

рд╡рд╣ рд╡реНрдпрд╡рд╣рд╛рд░ рд╣рдореЗрд╢рд╛ рдЙрд╕ рдХрд╛рд░реНрдпрдХреНрд░рдо рдкрд░ рдЕрддреНрдпрдзрд┐рдХ рдирд┐рд░реНрднрд░ рд╣реЛрддрд╛ рд╣реИ рдЬрд┐рд╕реЗ _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

рдЗрд╕рд▓рд┐рдП рдореИрдВ рдпрд╣рд╛рдВ рд╣реВрдБ :-)ред рдореБрдЭреЗ рдореЗрдВрдЯрд░рд┐рдВрдЧ рдирд┐рд░реНрджреЗрд╢ рдЬрд▓реНрдж рд╣реА рд▓рд┐рдЦрдиреЗ рдЪрд╛рд╣рд┐рдПред

рдареАрдХ рд╣реИ, рддреЛ рдореИрдВ рдЖрдкрдХреЗ рдирд┐рд░реНрджреЗрд╢реЛрдВ рдХреА рдкреНрд░рддреАрдХреНрд╖рд╛ рдХрд░ рд░рд╣рд╛ рд╣реВрдБред

рд╕рд▓рд╛рд╣ рдирд┐рд░реНрджреЗрд╢

рдпрд╣ рдПрдХ [рдбрдмреНрд▓реНрдпреВрдЬреА-рдХрдВрдкрд╛рдЗрд▓рд░-рдордзреНрдп] рдореБрджреНрджрд╛ рд╣реИред рдЕрдЧрд░ рдЖрдк рдорджрдж рд▓реЗрдирд╛ рдЪрд╛рд╣рддреЗ рд╣реИрдВ, рддреЛ рдЖрдк irc.mozilla.org (I'm arielby) рдкрд░ #rustc рд╕реЗ рдЬреБрдбрд╝ рд╕рдХрддреЗ рд╣реИрдВ рдпрд╛ https://gitter.im/rust-impl-period/WG-compiler-middle (рдореИрдВ @arielb1 рд╣реВрдВ) рд╡рд╣рд╛рдВ)ред

#44505 рдкрд░ рдПрдХ WIP рдХрдВрдкрд╛рдЗрд▓рд░ рд░реАрдбрдореА рд╣реИ - рдпрд╣ рдХрдВрдкрд╛рдЗрд▓рд░ рдореЗрдВ рдХреБрдЫ рдЪреАрдЬреЛрдВ рдХрд╛ рд╡рд░реНрдгрди рдХрд░рддрд╛ рд╣реИред

рдЗрд╕ рдЖрд░рдПрдлрд╕реА рдХреЗ рд▓рд┐рдП рдХрд╛рд░реНрдп рдпреЛрдЬрдирд╛:

  • [ ] - Termination рд▓реИрдВрдЧ-рдЖрдЗрдЯрдо рдХреЛ libcore рдореЗрдВ рдЬреЛрдбрд╝реЗрдВ
  • [ ] - Termination рдореЗрдВ main . рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдиреЗ рдХреА рдЕрдиреБрдорддрд┐ рджреЗрдВ
  • [ ] - рд╕рд┐рджреНрдзрд╛рдВрддреЛрдВ рдореЗрдВ Termination рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдиреЗ рдХреА рдЕрдиреБрдорддрд┐ рджреЗрдВ
  • [ ] - #[test] . рдореЗрдВ #[test] Termination рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдиреЗ рдХреА рдЕрдиреБрдорддрд┐ рджреЗрдВ

Termination рд▓реИрдВрдЧ-рдЖрдЗрдЯрдо рдХреЛ libcore рдореЗрдВ рдЬреЛрдбрд╝реЗрдВ

рд╕рдмрд╕реЗ рдкрд╣рд▓реЗ, рдЖрдкрдХреЛ рдХреБрдЫ рджрд╕реНрддрд╛рд╡реЗрдЬрд╝реЛрдВ рдХреЗ рд╕рд╛рде Termination рд╡рд┐рд╢реЗрд╖рддрд╛ рдХреЛ libcore/ops/termination.rs рдореЗрдВ рдЬреЛрдбрд╝рдирд╛ рд╣реЛрдЧрд╛ред рдЖрдкрдХреЛ #[unstable(feature = "termination_trait", issue = "0")] рд╡рд┐рд╢реЗрд╖рддрд╛ рдХреЗ рд╕рд╛рде рдЗрд╕реЗ рдЕрд╕реНрдерд┐рд░ рдХреЗ рд░реВрдк рдореЗрдВ рдЪрд┐рд╣реНрдирд┐рдд рдХрд░рдиреЗ рдХреА рднреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реЛрдЧреА - рдпрд╣ рд▓реЛрдЧреЛрдВ рдХреЛ рдЗрд╕рдХреЗ рд╕реНрдерд┐рд░ рд╣реЛрдиреЗ рд╕реЗ рдкрд╣рд▓реЗ рдЗрд╕рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдиреЗ рд╕реЗ рд░реЛрдХреЗрдЧрд╛ред

рдлрд┐рд░, рдЖрдкрдХреЛ рдЗрд╕реЗ src/librustc/middle/lang_items.rs рдореЗрдВ рд▓реИрдВрдЧ-рдЖрдЗрдЯрдо рдХреЗ рд░реВрдк рдореЗрдВ рдЪрд┐рд╣реНрдирд┐рдд рдХрд░рдирд╛ рд╣реЛрдЧрд╛ред рдЗрд╕рдХрд╛ рдорддрд▓рдм рд╣реИ рдХрд┐ рдХрдВрдкрд╛рдЗрд▓рд░ main рдЯрд╛рдЗрдк-рдЪреЗрдХ рдХрд░рддреЗ рд╕рдордп рдЗрд╕рдХрд╛ рдкрддрд╛ рд▓рдЧрд╛ рд╕рдХрддрд╛ рд╣реИ (рдЙрджрд╛рд╣рд░рдг рдХреЗ рд▓рд┐рдП 0c3ac648f85cca1e8dd89dfff727a422bc1897a6 рджреЗрдЦреЗрдВ)ред
рдЗрд╕рдХрд╛ рдордд:

  1. рдЗрд╕реЗ рд▓реИрдВрдЧ-рдЖрдЗрдЯрдо рд╕реВрдЪреА рдореЗрдВ рдЬреЛрдбрд╝рдирд╛ ( librustc/middle/lang_items.rs рдореЗрдВ)
  2. #[cfg_attr(not(stage0), lang = "termination")] рдХреЛ Termination рд╡рд┐рд╢реЗрд╖рддрд╛ рдореЗрдВ рдЬреЛрдбрд╝рдирд╛ред рдЖрдк рдХреЗрд╡рд▓ #[lang = "termination"] рд╡рд┐рд╢реЗрд╖рддрд╛ рдирд╣реАрдВ рдЬреЛрдбрд╝ рд╕рдХрддреЗ, рдЗрд╕рдХрд╛ рдХрд╛рд░рдг рдпрд╣ рд╣реИ рдХрд┐ "рд╕реНрдЯреЗрдЬ0" рдХрдВрдкрд╛рдЗрд▓рд░ (рдмреВрдЯрд╕реНрдЯреНрд░реИрдкрд┐рдВрдЧ рдХреЗ рджреМрд░рд╛рди) рдХреЛ рдкрддрд╛ рдирд╣реАрдВ рдЪрд▓реЗрдЧрд╛ рдХрд┐ termination рдХреБрдЫ рдРрд╕рд╛ рд╣реИ рдЬреЛ рдореМрдЬреВрдж рд╣реИ, рдЗрд╕рд▓рд┐рдП рдпрд╣ рд╕рдХреНрд╖рдо рдирд╣реАрдВ рд╣реЛрдЧрд╛ libstd рд╕рдВрдХрд▓рд┐рдд рдХрд░реЗрдВред рдЬрдм рд╣рдо рд╕реНрдЯреЗрдЬ0 рдХрдВрдкрд╛рдЗрд▓рд░ рдХреЛ рдЕрдкрдбреЗрдЯ рдХрд░реЗрдВрдЧреЗ рддреЛ рд╣рдо рдореИрдиреНрдпреБрдЕрд▓ рд░реВрдк рд╕реЗ cfg_attr рдХреЛ рд╣рдЯрд╛ рджреЗрдВрдЧреЗред
    рд╡рд┐рд╡рд░рдг рдХреЗ рд▓рд┐рдП XXX рдкрд░ рдмреВрдЯрд╕реНрдЯреНрд░реИрдкрд┐рдВрдЧ рджрд╕реНрддрд╛рд╡реЗрдЬрд╝ рджреЗрдЦреЗрдВред

рдореБрдЦреНрдп рдореЗрдВ Termination рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдиреЗ рдХреА рдЕрдиреБрдорддрд┐ рджреЗрдВ

рдпрд╣ рджрд┐рд▓рдЪрд╕реНрдк рд╣рд┐рд╕реНрд╕рд╛ рд╣реИ рдЬрд┐рд╕реЗ рдореИрдВ рдЬрд╛рдирддрд╛ рд╣реВрдВ рдХрд┐ рдХреИрд╕реЗ рдирд┐рдкрдЯрдирд╛ рд╣реИред рдЗрд╕рдХрд╛ рдорддрд▓рдм рд╣реИ рдХрд┐ рдПрдХ main рдмрдирд╛рдирд╛ рдЬреЛ () рд▓реМрдЯрд╛рддрд╛ рд╣реИ рди рдХрд┐ рдЯрд╛рдЗрдк-рдЪреЗрдХ (рд╡рд░реНрддрдорд╛рди рдореЗрдВ рдЖрдкрдХреЛ main function has wrong type рддреНрд░реБрдЯрд┐ рдорд┐рд▓рддреА рд╣реИ) рдФрд░ рдХрд╛рдо рдХрд░реЗрдВред

рдЗрд╕реЗ рдЯрд╛рдЗрдк-рдЪреЗрдХ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП, рдЖрдкрдХреЛ рдкрд╣рд▓реЗ рдореМрдЬреВрджрд╛ рддреНрд░реБрдЯрд┐ рдХреЛ рджреВрд░ рдХрд░рдирд╛ рд╣реЛрдЧрд╛:
https://github.com/rust-lang/rust/blob/9a00f3cc306f2f79bfbd54f1986d8ca7a74f6661/src/librustc_typeck/lib.rs#L171 -L218

рдлрд┐рд░, рдЖрдкрдХреЛ рдПрдХ рдЪреЗрдХ рдЬреЛрдбрд╝рдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реИ рдХрд┐ рд░рд┐рдЯрд░реНрди рдкреНрд░рдХрд╛рд░ Termination рд╡рд┐рд╢реЗрд╖рддрд╛ рдХреЛ рд▓рд╛рдЧреВ рдХрд░рддрд╛ рд╣реИ (рдЖрдк register_predicate_obligation рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдХреЗ рдПрдХ рд╡рд┐рд╢реЗрд╖рддрд╛ рджрд╛рдпрд┐рддреНрд╡ рдЬреЛрдбрд╝рддреЗ рд╣реИрдВ - рдЗрд╕рдХреЗ рдЙрдкрдпреЛрдЧ рдХреЗ рд▓рд┐рдП рдЦреЛрдЬреЗрдВ)ред рдпрд╣ рдпрд╣рд╛рдБ рдХрд┐рдпрд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИ:
https://github.com/rust-lang/rust/blob/9a00f3cc306f2f79bfbd54f1986d8ca7a74f6661/src/librustc_typeck/check/mod.rs#L1100 -L1108

рджреВрд╕рд░рд╛ рд╣рд┐рд╕реНрд╕рд╛ рдЗрд╕реЗ рдХрд╛рдо рдХрд░ рд░рд╣рд╛ рд╣реИред рдпрд╣ рдЕрдкреЗрдХреНрд╖рд╛рдХреГрдд рдЖрд╕рд╛рди рд╣реЛрдирд╛ рдЪрд╛рд╣рд┐рдПред рдЬреИрд╕рд╛ рдХрд┐ рдЖрд░рдПрдлрд╕реА рдХрд╣рддрд╛ рд╣реИ, рдЖрдк рд░рд┐рдЯрд░реНрди рдкреНрд░рдХрд╛рд░ рдкрд░ 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 Instance::mono рдЗрдВрд╕реНрдЯреЗрдВрдЯ рдХрд░рддрд╛ рд╣реИ, рдФрд░ рдЖрдкрдХреЛ рдЗрд╕реЗ рд╕рд╣реА рд╡рд┐рдХрд▓реНрдк рдХреЗ рд╕рд╛рде monomorphize::resolve рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдмрджрд▓рдирд╛ рд╣реЛрдЧрд╛ред

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

рд╕рд┐рджреНрдзрд╛рдВрддреЛрдВ рдореЗрдВ Termination рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдиреЗ рдХреА рдЕрдиреБрдорддрд┐ рджреЗрдВ

рдореИрдВ рд╡рд╛рд╕реНрддрд╡ рдореЗрдВ рд╕рдордЭ рдирд╣реАрдВ рдкрд╛ рд░рд╣рд╛ рд╣реВрдВ рдХрд┐ doctests рдХреИрд╕реЗ рдХрд╛рдо рдХрд░рддрд╛ рд╣реИред рд╢рд╛рдпрдж @alexcrichton рд╕реЗ рдкреВрдЫреЗрдВ (рдореИрдВ рдпрд╣реА рдХрд░реВрдВрдЧрд╛)?

Termination рдореЗрдВ #[test] . рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдиреЗ рдХреА рдЕрдиреБрдорддрд┐ рджреЗрдВ

рдореИрдВ рд╡рд╛рд╕реНрддрд╡ рдореЗрдВ рд╕рдордЭ рдирд╣реАрдВ рдкрд╛ рд░рд╣рд╛ рд╣реВрдВ рдХрд┐ libtest рдХреИрд╕реЗ рдХрд╛рдо рдХрд░рддрд╛ рд╣реИред рд╢рд╛рдпрдж @alexcrichton рд╕реЗ рдкреВрдЫреЗрдВ (рдореИрдВ рдпрд╣реА рдХрд░реВрдВрдЧрд╛)? рдпреВрдирд┐рдЯ рдкрд░реАрдХреНрд╖рдг рдореВрд▓ рд░реВрдк рд╕реЗ рдПрдХ рдореИрдХреНрд░реЛ рджреНрд╡рд╛рд░рд╛ рдЙрддреНрдкрдиреНрди рд╣реЛрддреЗ рд╣реИрдВ, рдЗрд╕рд▓рд┐рдП рдЖрдкрдХреЛ рдЙрд╕ рдореИрдХреНрд░реЛ, рдпрд╛ рдЙрд╕рдХреЗ рдХреЙрд▓рд░ рдХреЛ рдЙрди рд░рд┐рдЯрд░реНрди рдкреНрд░рдХрд╛рд░реЛрдВ рдХреЛ рд╕рдВрднрд╛рд▓рдиреЗ рдХреЗ рд▓рд┐рдП рдмрджрд▓рдирд╛ рд╣реЛрдЧрд╛ рдЬреЛ () рдирд╣реАрдВ рд╣реИрдВред

@bkchr

рдХреНрдпрд╛ рдЖрдк рдХрдо рд╕реЗ рдХрдо рдЖрдИрдЖрд░рд╕реА/рдЧрдЯрд░ рдореЗрдВ рд╢рд╛рдорд┐рд▓ рд╣реЛ рд╕рдХрддреЗ рд╣реИрдВ?

@bkchr рдЕрднреА рдЪреЗрдХ рдЗрди рдХрд░ рд░рд╣рд╛ рд╣реИ - рдореИрдВрдиреЗ рджреЗрдЦрд╛ рдХрд┐ рдЖрдк рдФрд░ @ arielb1 рдХреБрдЫ рд╕рдордп рдкрд╣рд▓реЗ рдЧрдЯрд░ рдкрд░ рдмрд╛рддрдЪреАрдд рдХрд░ рд░рд╣реЗ рдереЗ, рдХреЛрдИ рдкреНрд░рдЧрддрд┐? рдХрд╣реАрдВ рдЪреВрд╕реЛ?

рдХреЛрдИ рдЦреЗрдж рдирд╣реАрдВ, рдЕрдм рддрдХ рдХреЛрдИ рдкреНрд░рдЧрддрд┐ рдирд╣реАрдВ рд╣реБрдИред рд╡рд░реНрддрдорд╛рди рдореЗрдВ рдореЗрд░реЗ рдкрд╛рд╕ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдмрд╣реБрдд рд╕реА рдЪреАрдЬреЗрдВ рд╣реИрдВ, рд▓реЗрдХрд┐рди рдореБрдЭреЗ рдЖрд╢рд╛ рд╣реИ рдХрд┐ рдЗрд╕ рд╕рдкреНрддрд╛рд╣ рдореБрдЭреЗ рдЗрд╕реЗ рд╢реБрд░реВ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдХреБрдЫ рд╕рдордп рдорд┐рд▓реЗрдЧрд╛ред

@bkchr рдЕрдЧрд░ рдЖрдкрдХреЛ рдХреБрдЫ рдорджрдж рдЪрд╛рд╣рд┐рдП рддреЛ рдореБрдЭреЗ рдмрддрд╛рдПрдВ!

рдореИрдВ рд╡рд░реНрддрдорд╛рди рдореЗрдВ рдереЛрдбрд╝рд╛ рдлрдВрд╕ рдЧрдпрд╛ рд╣реВрдБ, рдореИрдВ рджрд╛рдпрд┐рддреНрд╡ рдмрдирд╛рдирд╛ рдЪрд╛рд╣рддрд╛ рд╣реВрдБред рджрд╛рдпрд┐рддреНрд╡ рдмрдирд╛рдиреЗ рдХреЗ рд▓рд┐рдП рдореБрдЭреЗ рдПрдХ TraifRef рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реИ, рдПрдХ TraitRef рдХреЗ рд▓рд┐рдП рдореБрдЭреЗ рдПрдХ DefId рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реИред рдХреНрдпрд╛ рдХреЛрдИ рдореБрдЭреЗ рдЯрд░реНрдорд┐рдиреЗрд╢рди рдЯреНрд░реИрдЯ рд╕реЗ DefId рдмрдирд╛рдиреЗ рдХреЗ рддрд░реАрдХреЗ рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рдХреБрдЫ рдХреЛрдб рдмрддрд╛ рд╕рдХрддрд╛ рд╣реИ?

@bkchr рд╡рд┐рд╢реЗрд╖рддрд╛ рдХреЛ рд▓реИрдВрдЧ рдЖрдЗрдЯрдо рд╕реВрдЪреА рдореЗрдВ рдЬреЛрдбрд╝рд╛ рдЬрд╛рдирд╛ рдЪрд╛рд╣рд┐рдП, рдЬреИрд╕реЗ: 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 рдХреИрд╕реЗ рдЬрд╛рддрд╛ рд╣реИ? рдмрд╕ рдлрд┐рд░ рд╕реЗ рдЬрд╛рдБрдЪ рдХрд░ рд░рд╣рд╛ рд╣реВрдБред =) рдпрджрд┐ рдЖрдк рд╡реНрдпрд╕реНрдд рд╣реИрдВ рддреЛ рдЪрд┐рдВрддрд╛ рдХреА рдХреЛрдИ рдмрд╛рдд рдирд╣реАрдВ рд╣реИ, рдмрд╕ рдпрд╣ рд╕реБрдирд┐рд╢реНрдЪрд┐рдд рдХрд░рдирд╛ рдЪрд╛рд╣рддреЗ рд╣реИрдВ рдХрд┐ рдЖрдкрдХреЛ рд╡рд╣ рд╕рднреА рд╕рд╣рд╛рдпрддрд╛ рдорд┐рд▓ рд░рд╣реА рд╣реИ рдЬрд┐рд╕рдХреА рдЖрдкрдХреЛ рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реИред

рдХреНрд╖рдорд╛ рдХрд░реЗрдВ, рдЗрд╕ рд╕рдордп рд╡реНрдпрд╕реНрдд рд╣реИрдВ :/ рдЕрдм рддрдХ, рдореБрдЭреЗ рд╡рд╣ рд╕рдм рд╕рд╣рд╛рдпрддрд╛ рдорд┐рд▓реА рдЬрд┐рд╕рдХреА рдореБрдЭреЗ рдЖрд╡рд╢реНрдпрдХрддрд╛ рдереА :)

рдЯрд░реНрдорд┐рдиреЗрд╢рдирдЯреНрд░реЗрдЯ рдХреА рдЬрд╛рдВрдЪ рдХреЗ рд▓рд┐рдП рдпрд╣ рдХреЛрдб рд╣реИ: 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 рдкрд░ рдХрдВрдкрд╛рдЗрд▓рд░-рдорд┐рдбрд┐рд▓ рд╡рд░реНрдХрд┐рдВрдЧ рдЧреНрд░реБрдк рдЧрдЯрд░ рдореЗрдВ рд╢рд╛рдорд┐рд▓ рд╣реЛрдиреЗ рдХреА рд╕рд▓рд╛рд╣ рджреВрдВрдЧрд╛, рд╕рд╛рде рд╣реА https рдкрд░ #rust-internals IRC рдЪреИрдирд▓ рдХреЛ рдЖрдЬрд╝рдорд╛рдиреЗ рдХреА рд╕рд▓рд╛рд╣ рджреВрдВрдЧрд╛ред ://chat.mibbit.com/?server=irc.mozilla.org%3A%2B6697&channel=%23rust-internalsред :)

@bstree рд╣рд╛рдБ рдзрдиреНрдпрд╡рд╛рдж, рдореИрдВ рдкрд╣рд▓реЗ рд╕реЗ рд╣реА рдЧрдЯрд░ рдЪреИрдЯ рдХрд╛ рд╣рд┐рд╕реНрд╕рд╛ рд╣реВрдВ рдФрд░ рдореЗрд░реА рд╕рдорд╕реНрдпрд╛ рдХрд╛ рд╕рдорд╛рдзрд╛рди рдХрд░ рд╕рдХрддрд╛ рд╣реИред :)

@bkchr рдЖрдкрдХреА рд╕рдорд╕реНрдпрд╛ рдЗрд╕ рд▓рд╛рдЗрди рдкрд░ рд╣реИред рдЖрдк рдЬрд┐рд╕ рд╡рд┐рд╢реЗрд╖рддрд╛ рд╕рдВрджрд░реНрдн рдХрд╛ рдирд┐рд░реНрдорд╛рдг рдХрд░рдирд╛ рдЪрд╛рд╣рддреЗ рд╣реИрдВ рд╡рд╣ R: Termination рдЬреИрд╕рд╛ рдХреБрдЫ рд╣реИ рдЬрд╣рд╛рдВ R рдлрд╝рдВрдХреНрд╢рди рдХрд╛ рд░рд┐рдЯрд░реНрди рдкреНрд░рдХрд╛рд░ рд╣реИред рдпрд╣ рдПрдХ рдЙрдкрдпреБрдХреНрдд "рдкрджрд╛рд░реНрде" рдмрдирд╛рдХрд░ рдирд┐рд░реНрджрд┐рд╖реНрдЯ рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИ, рдЬреЛ рд╡рд┐рд╢реЗрд╖рддрд╛ рдХреЗ рдкреНрд░рдХрд╛рд░ рдХреЗ рдорд╛рдкрджрдВрдбреЛрдВ (рдЗрд╕ рдорд╛рдорд▓реЗ рдореЗрдВ, Self ) рдХреЗ рд╕реНрдерд╛рди рдкрд░ рдореВрд▓реНрдпреЛрдВ рдХрд╛ рд╕реЗрдЯ рд╣реИред

рд╣рд╛рд▓рд╛рдБрдХрд┐, рдЖрдк рд╡рд┐рд╢реЗрд╖рддрд╛ рдкрд░ Substs::identity_for_item рдкрджреНрдзрддрд┐ рд▓рд╛рдЧреВ рдХрд░ рд░рд╣реЗ рд╣реИрдВред рдпрд╣ рдЖрдкрдХреЛ рдЙрди рдкреНрд░рддрд┐рд╕реНрдерд╛рдкрдиреЛрдВ рдХреЛ рд╡рд╛рдкрд╕ рджреЗрдЧрд╛ рдЬреЛ рдПрдХ рд╡рд┐рд╢реЗрд╖рддрд╛ рдкрд░рд┐рднрд╛рд╖рд╛ рдХреЗ рдЕрдВрджрд░ рд╣реА рдЙрдкрдпреЛрдЧ рдХрд░реЗрдЧрд╛ред рдпрд╛рдиреА, рдЗрд╕ рдорд╛рдорд▓реЗ рдореЗрдВ рдЖрдк Self Termination #$ рдкреИрд░рд╛рдореАрдЯрд░ рдХреЛ Self рдкрд░ рдореИрдк рдХрд░ рд░рд╣реЗ рд╣реИрдВред рдпрд╣ рдЙрдЪрд┐рдд рд╣реЛрдЧрд╛ рдпрджрд┐ рдЖрдк Terminator рд╡рд┐рд╢реЗрд╖рддрд╛ рдХреЗ рдЕрдВрджрд░ рдХрд┐рд╕реА рдлрд╝рдВрдХреНрд╢рди рдХреА рдкрд░рд┐рднрд╛рд╖рд╛ рдХреА рдЬрд╛рдБрдЪ рдХрд░ рд░рд╣реЗ рдереЗ, рд▓реЗрдХрд┐рди рдпрд╣рд╛рдБ рдЗрддрдирд╛ рдирд╣реАрдВред

рдЗрд╕рдХреЗ рдмрдЬрд╛рдп рдЖрдк рдЬреЛ рдЪрд╛рд╣рддреЗ рд╣реИрдВ рд╡рд╣ рдПрдВрдЯреНрд░реА рдлрд╝рдВрдХреНрд╢рди рдХрд╛ рд░рд┐рдЯрд░реНрди рдкреНрд░рдХрд╛рд░ рдкреНрд░рд╛рдкреНрдд рдХрд░рдирд╛ рд╣реИред рдпрд╣ ret_ty рдпрд╛ actual_ret_ty рдЪрд░реЛрдВ рдореЗрдВ рд╕реЗ рдПрдХ рд╣реИред рдпрд╛ рддреЛ рдареАрдХ рд╣реИ, рд▓реЗрдХрд┐рди рдореБрдЭреЗ рд▓рдЧрддрд╛ рд╣реИ рдХрд┐ ret_ty рдмреЗрд╣рддрд░ рд╣реИ - рдЬреЛ рдЙрдкрдпреЛрдЧрдХрд░реНрддрд╛ рджреНрд╡рд╛рд░рд╛ рдШреЛрд╖рд┐рдд рд░рд┐рдЯрд░реНрди рдкреНрд░рдХрд╛рд░ рд╕реЗ рдореЗрд▓ рдЦрд╛рддрд╛ рд╣реИ (рдЬрдмрдХрд┐ actual_ret_ty рд╡рд╛рд╕реНрддрд╡рд┐рдХ рдХреЛрдб рд▓реМрдЯрд╛рдпрд╛ рдЧрдпрд╛ рдкреНрд░рдХрд╛рд░ рд╣реИ)ред

рдЖрдк tcx рд╕реЗ рдХреЗрд╡рд▓ mk_substs() рд╡рд┐рдзрд┐ рдХреЛ рдХреЙрд▓ рдХрд░рдХреЗ рдЕрдкрдиреЗ рдЗрдЪреНрдЫрд┐рдд рдкрджрд╛рд░реНрде рдмрдирд╛ рд╕рдХрддреЗ рд╣реИрдВред рдЗрд╕ рдорд╛рдорд▓реЗ рдореЗрдВ, рдХреЗрд╡рд▓ рдПрдХ рдкреИрд░рд╛рдореАрдЯрд░ рд╣реИ, рдкреНрд░рдХрд╛рд░, рдЗрд╕рд▓рд┐рдП let substs = fcx.tcx.mk_substs(&[ret_ty]); рдЬреИрд╕рд╛ рдХреБрдЫ рдХрд╛рдо рдХрд░реЗрдЧрд╛, рдореБрдЭреЗ рд▓рдЧрддрд╛ рд╣реИред

рдореЗрд░рд╛ рдорд╛рдирдирд╛ тАЛтАЛтАЛтАЛрд╣реИ рдХрд┐ рдЙрдкрдпреЛрдЧ рдХрд░рдиреЗ рд╡рд╛рд▓реА рдЪреАрдЬрд╝ tcx.mk_substs_trait(ret_ty, &[]) рд╣реИред

@bkchr рдмрд╕ рдЬрд╛рдБрдЪ рдХрд░ рд░рд╣рд╛ рд╣реИ - рдЙрд╕ рд╕рд▓рд╛рд╣ рдХреЛ рдЙрдкрдпреЛрдЧ рдХрд░рдиреЗ рдХрд╛ рдореМрдХрд╛ рдорд┐рд▓рд╛? (рдЗрд╕рдХреЗ рдЕрд▓рд╛рд╡рд╛, рддреЗрдЬреА рд╕реЗ рдкреНрд░рддрд┐рдХреНрд░рд┐рдпрд╛рдУрдВ рдХреЗ рд▓рд┐рдП, рдЧрдЯрд░ рдкрд░ рдкреВрдЫрдирд╛ рдмреБрджреНрдзрд┐рдорд╛рдиреА рд╣реЛ рд╕рдХрддреА рд╣реИред)

рд╣рд╛рдБ, рдореИрдВ рдЧрдЯрд░ рдХреЗ рд╕рд╛рде рд╕рдорд╕реНрдпрд╛ рдХрд╛ рд╕рдорд╛рдзрд╛рди рдХрд░ рд╕рдХрддрд╛ рд╣реВрдБ :)

@bkchr рдХреИрд╕реЗ рдЬрд╛рддрд╛ рд╣реИ? рдмрд╕ рдЪреЗрдХ рдЗрди рдХрд░ рд░рд╣рд╛ рд╣реИред

рд╕рдм рдХреБрдЫ рдареАрдХ рд╣реИ, рдореБрдЭреЗ рд╢рд╛рдпрдж рдЗрд╕ рд╕рдкреНрддрд╛рд╣ рдХреЛрдб рджреЗрдЦрдиреЗ рдХреЗ рд▓рд┐рдП рдХреБрдЫ рд╕рдордп рдорд┐рд▓реЗрдЧрд╛ред

рдХреНрдпрд╛ рдЗрд╕рдореЗрдВ рдПрдХ рдФрд░ рд╡реНрдпрдХреНрддрд┐ рдХреА рдорджрдж рдХреЗ рд▓рд┐рдП рдЬрдЧрд╣ рд╣реИ? рдореИрдВ рд╕рд╛рд▓ рдХреЗ рдЕрдВрдд рд╕реЗ рдкрд╣рд▓реЗ рд░рд╕реНрдЯ рд╕рдореБрджрд╛рдп рдореЗрдВ рдпреЛрдЧрджрд╛рди рджреЗрдирд╛ рд╢реБрд░реВ рдХрд░рдирд╛ рдЪрд╛рд╣рддрд╛ рд╣реВрдВ рдФрд░ рдЗрд╕ рд╕реБрд╡рд┐рдзрд╛ рдореЗрдВ рдорджрдж рдХрд░рдирд╛ рдкрд╕рдВрдж рдХрд░реВрдВрдЧрд╛ред рдЙрдореНрдореАрдж рд╣реИ рдХрд┐ рдЗрд╕ рдкрд░ рджреЛ рд▓реЛрдЧреЛрдВ рдХрд╛ рд╕рд╣рдпреЛрдЧ рдХрд░рдирд╛ рдмрд╣реБрдд рднреНрд░рдорд┐рдд рдХрд░рдиреЗ рд╡рд╛рд▓рд╛ рдирд╣реАрдВ рд╣реЛрдЧрд╛ред

@ рдпреВ007рдбреА

рдпрд╣ рдПрдХ рдЫреЛрдЯреА рд╕реА рд╡рд┐рд╢реЗрд╖рддрд╛ рд╣реИ рдФрд░ @bkchr рд▓рдЧрднрдЧ рдкреВрд░рд╛ рд╣реЛ рдЪреБрдХрд╛ рд╣реИред

рдЖрд╣, рдареАрдХ рд╣реИ - рдпрд╣ рдЬрд╛рдирдирд╛ рдЕрдЪреНрдЫрд╛ рд╣реИ, рдзрдиреНрдпрд╡рд╛рджред рдореИрдВ рдХрд┐рд╕реА рдФрд░ рдЪреАрдЬрд╝ рдкрд░ рдирдЬрд╝рд░ рд░рдЦреВрдБрдЧрд╛ рдЬрд┐рд╕рдореЗрдВ рдореИрдВ рдорджрдж рдХрд░ рд╕рдХрддрд╛ рд╣реВрдБред

@ U007D рдХреНрдпрд╛ рдЖрдкрдиреЗ https://www.rustaceans.org/findwork рджреЗрдЦрд╛ рд╣реИ?

@lnicola рд╣рд╛рдБ, рдореЗрд░реЗ рдкрд╛рд╕ рд╣реИ! рдореИрдВ рдХрд┐рд╕реА рдРрд╕реА рдЪреАрдЬ рдХреЗ рдЪреМрд░рд╛рд╣реЗ рдкрд░ рдХреБрдЫ рдЦреЛрдЬрдиреЗ рдХреА рдХреЛрд╢рд┐рд╢ рдХрд░ рд░рд╣рд╛ рд╣реВрдВ, рдЬрд┐рд╕ рдкрд░ рдХрд╛рдо рдХрд░рдиреЗ рдореЗрдВ рд╕рдХреНрд╖рдо рд╣реЛрдиреЗ рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рдореБрдЭреЗ рд╡рд┐рд╢реНрд╡рд╛рд╕ рд╣реИ (рдпрд╛рдиреА рд╢реБрджреНрдз рд╕рдХрд╛рд░рд╛рддреНрдордХ рдмрдиреЗрдВ) рдФрд░ рдореИрдВ рдЗрд╕рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рднрд╛рд╡реБрдХ рд╣реВрдВред рд╕рдЪ рдХрд╣реВрдВ, рднрд▓реЗ рд╣реА рдореИрдВ рд▓рдЧрднрдЧ рдПрдХ рд╕рд╛рд▓ рд╕реЗ рд░рд╕реНрдЯ рд╕реАрдЦ рд░рд╣рд╛ рд╣реВрдВ, рдлрд┐рд░ рднреА рдХрд┐рд╕реА рдЪреАрдЬ рдХреЗ рд▓рд┐рдП рд╕реНрд╡реЗрдЪреНрдЫрд╛ рд╕реЗ рдХрджрдо рдЙрдард╛рдирд╛ рдереЛрдбрд╝рд╛ рдбрд░рд╛рдиреЗ рд╡рд╛рд▓рд╛ рд╣реИред рдПрдлрдбрдмреНрд▓реНрдпреВрдЖрдИрдбрдмреНрд▓реНрдпреВ, рдпрд╣ рдХрд┐рд╕реА рднреА рддрд░рд╣ рд╕реЗ рд░рд╕реНрдЯ рд╕рдореБрджрд╛рдп рдХреА рдЧрд▓рддреА рдирд╣реАрдВ рд╣реИ - рд░рд╕реНрдЯ рд╕рдореБрджрд╛рдп рдЗрд╕реЗ рдПрдХ рдЦреБрд▓реА, рд╕реНрд╡рд╛рдЧрдд рдпреЛрдЧреНрдп рдФрд░ рд╕рдорд╛рд╡реЗрд╢реА рд╕рдВрд╕реНрдХреГрддрд┐ рдмрдирд╛рдиреЗ рдХреЗ рд▓рд┐рдП рдкреАрдЫреЗ рдХреА рдУрд░ рдЭреБрдХ рдЧрдпрд╛ рд╣реИ - рд╕рдмрд╕реЗ рдЕрдЪреНрдЫрд╛ рдореБрдЭреЗ рдЕрдиреБрднрд╡ рдХрд░рдиреЗ рдХрд╛ рдЖрдирдВрдж рдорд┐рд▓рд╛ рд╣реИред (рдореБрдЭреЗ рд╕рдВрджреЗрд╣ рд╣реИ рдХрд┐ рддрдХрдиреАрдХреА рдЙрджреНрдпреЛрдЧ рдореЗрдВ рд╡рд░реНрд╖реЛрдВ рдФрд░ рд╡рд░реНрд╖реЛрдВ рдХреЗ рдЕрдиреБрднрд╡ рд╕реЗ рдкреБрд░рд╛рдиреЗ рдпреБрджреНрдз рдХреЗ рдирд┐рд╢рд╛рди рдХреЗ рд╕рд╛рде рдЗрд╕рдХрд╛ рдЕрдзрд┐рдХ рд╕рдВрдмрдВрдз рд╣реИ рдЬрд╣рд╛рдВ рдЯреАрдо рд╕рд╣рдпреЛрдЧреА рдХреЗ рдмрдЬрд╛рдп рдкреНрд░рддрд┐рд╕реНрдкрд░реНрдзреА рд╣реЛрддреА рд╣реИред)

рд╡реИрд╕реЗ рднреА, рдЗрд╕ рд╕рд╛рд▓ рдХреБрдЫ рдЪреБрдирдирд╛ рдФрд░ рдХрдо рд╕реЗ рдХрдо рд╕рдХрд╛рд░рд╛рддреНрдордХ рдпреЛрдЧрджрд╛рди рджреЗрдирд╛ рд╢реБрд░реВ рдХрд░рдирд╛ рдореЗрд░рд╛ рд▓рдХреНрд╖реНрдп рд╣реИред рдореЗрд░реЗ рд▓рд┐рдП рдЗрд╕рдореЗрдВ рд╢рд╛рдорд┐рд▓ рд╣реЛрдиреЗ рдХрд╛ рд╕рдордп рдЖ рдЧрдпрд╛ рд╣реИ! :)

рд╕реБрдЭрд╛рд╡ рдХреЗ рд▓рд┐рдП рдзрдиреНрдпрд╡рд╛рдж, @lnicolaред рдпрд╣ рдПрдХ рдЕрдЪреНрдЫрд╛ рд╕рдВрд╕рд╛рдзрди рд╣реИред

@bkchr рдХреЛрдИ рдЕрдкрдбреЗрдЯ?

рдореИрдВ рдЗрд╕ рдкрд░ рд╣реВрдВ (https://github.com/rust-lang/rust/pull/46479)ред рдЕрдм рдореЗрд░реЗ рдкрд╛рд╕ рдкреБрд▓ рдЕрдиреБрд░реЛрдз рдореЗрдВ рдЯрд┐рдкреНрдкрдгрд┐рдпреЛрдВ рдореЗрдВ рдХрд╛рдо рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдЫреБрдЯреНрдЯрд┐рдпрд╛рдВ рдФрд░ рд╕рдордп рд╣реИред рд╕рднреА рджреЗрд░реА рдХреЗ рд▓рд┐рдП рдЦреЗрдж рд╣реИ: /

рдУрд╣, рдХреНрд╖рдорд╛ рдХрд░реЗрдВ, рдЖрдкрдиреЗ рдзреНрдпрд╛рди рдирд╣реАрдВ рджрд┐рдпрд╛ рдХрд┐ рдЖрдкрдХреЗ рдкрд╛рд╕ рдПрдХ рдкреБрд▓ рдЕрдиреБрд░реЛрдз рдерд╛ред рдЗрд╕реЗ рдХреНрд░реЙрд╕-рд▓рд┐рдВрдХ рдХрд┐рдпрд╛ред

рд╣реИрд▓реЛ, рдЙрд╣ред рдЗрд╕рд▓рд┐рдП рдореИрдВрдиреЗ рд╕реЛрдЪрд╛ рдХрд┐ рдореИрдВ рдЕрдкрдиреЗ рд╕рдВрднрд╛рд╡рд┐рдд рд░рд╕реНрдЯ рдпреЛрдЧрджрд╛рдирдХрд░реНрддрд╛ рдХрд░рд┐рдпрд░ рдХреА рд╢реБрд░реБрдЖрдд рдмрд╛рдЗрдХрд╢реЗрдбрд┐рдВрдЧ рд╕реЗ рдХрд░реВрдВрдЧрд╛, рдЬреИрд╕рд╛ рдХрд┐ рдкрд░рдВрдкрд░рд╛ рд╣реИред рд╡рд┐рд╢реЗрд╖ рд░реВрдк рд╕реЗ, рдЗрд╕рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ:

  • [ ] рд╡рд┐рд╢реЗрд╖рддрд╛ рдХрд╛ рдирд╛рдо рдкреЗрд╢ рдХрд┐рдпрд╛ рдЬрд╛ рд░рд╣рд╛ рд╣реИ

рдХреИрд╕реЗ рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ Exit ? рдпрд╣ рдореМрдЬреВрджрд╛ рд░рд╕реНрдЯ рд╢рдмреНрджрд╛рд╡рд▓реА рдХреЛ рдлрд┐рдЯ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рд╕рдВрдХреНрд╖рд┐рдкреНрдд рдФрд░ рдмрд┐рдВрджреБ рдкрд░ рд╣реИред Exit-as-a-noun, exit-as-a-verb рдХреЗ рд▓рд┐рдП рдПрдХ рдкреНрд░рд╛рдХреГрддрд┐рдХ рдкреНрд░рддрд┐рд░реВрдк рд╣реИ, рдЬреЛ рдХрд┐ рдЕрдзрд┐рдХрд╛рдВрд╢ рдХреЗ рд▓рд┐рдП, рдПрдХ рдирд┐рдпрдВрддреНрд░рд┐рдд рддрд░реАрдХреЗ рд╕реЗ "рдЕрдВрджрд░ рд╕реЗ" рдкреНрд░рдХреНрд░рд┐рдпрд╛ рдХреЛ рд╕рдорд╛рдкреНрдд рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдкрд░рд┐рдЪрд┐рдд рд╢рдмреНрдж рд╣реИред

рд╕реА ++ рдкреНрд░реЛрдЧреНрд░рд╛рдорд░ рдХреЗ рд▓рд┐рдП рд╡рд┐рд╢реЗрд╖ рд░реВрдк рд╕реЗ, "рдЯрд░реНрдорд┐рдиреЗрд╢рди" std::terminate рдХреЛ рдзреНрдпрд╛рди рдореЗрдВ рд░рдЦрддрд╛ рд╣реИ рдЬреЛ рдЕрд╕рд╛рдорд╛рдиреНрдп рд╕рдорд╛рдкреНрддрд┐ (рдХреЙрд▓рд┐рдВрдЧ abort ) рдХреЗ рд▓рд┐рдП рдбрд┐рдлрд╝реЙрд▓реНрдЯ рд╣реИ рдФрд░ рдореВрд▓ рд░реВрдк рд╕реЗ рд╕реА ++ рдПрдХ рдЖрддрдВрдХ рдХреЗ рдмрд░рд╛рдмрд░ рд╣реИ (рд▓реЗрдХрд┐рди рдПрдХ рдЖрддрдВрдХ рдХреЗ рд╡рд┐рдкрд░реАрдд, рдХрднреА рднреА рддрдирд╛рд╡ рдХреЛ рдХрдо рдирд╣реАрдВ рдХрд░рддрд╛ рд╣реИ) рдвреЗрд░)ред

рд░реБрдХреЛ, рдЙрд╕ рдЯрд┐рдкреНрдкрдгреА рдХреЛ рдЕрдирджреЗрдЦрд╛ рдХрд░реЗрдВ, рдРрд╕рд╛ рд▓рдЧрддрд╛ рд╣реИ рдХрд┐ RFC рдЫреЛрдбрд╝ рджрд┐рдпрд╛ рдЧрдпрд╛ рд╣реИ рдЬреЛ рд╕реНрдкрд╖реНрдЯ рд░реВрдк рд╕реЗ рдЪрд░реНрдЪрд╛ рдХреЗ рд▓рд┐рдП рдЦреБрд▓рд╛ рд╣реИред

рдореБрдЭреЗ рд╡рд┐рд╢реЗрд╖рддрд╛ рдирд╛рдо рдХреЗ рд░реВрдк рдореЗрдВ Exit рдкрд╕рдВрдж рд╣реИред

рдореБрдЭреЗ рд▓рдЧ рд░рд╣рд╛ рд╣реИ рдХрд┐ рд╡рд┐рд╢реЗрд╖рддрд╛ рдХреЗ рд╣реЛрдиреЗ рд╕реЗ рдмрд╣реБрдд рдкрд╣рд▓реЗ рдпрд╣ рд╕реБрд╡рд┐рдзрд╛ рд╕реНрдерд┐рд░ рд╣реЛ рдЬрд╛рдПрдЧреА, рдЬреИрд╕рд╛ рдХрд┐ Carrier рдХреЗ рд╕рд╛рде рд╣реБрдЖ рдерд╛ред

рдПрдлрдбрдмреНрд▓реНрдпреВрдЖрдИрдбрдмреНрд▓реНрдпреВ рдпрд╣ рдПрдХ рдФрд░ рдорд╛рдорд▓рд╛ рд╣реИ рдЬрд╣рд╛рдВ рдореБрдЭреЗ рд╡рд╛рд╕реНрддрд╡ рдореЗрдВ рдЦреБрд╢реА рд╣реИ рдХрд┐ рд╕реНрдерд┐рд░реАрдХрд░рдг рд╕реЗ рдкрд╣рд▓реЗ рдЕрд╕реНрдерд╛рдпреА рдирд╛рдо рдмрджрд▓ рджрд┐рдпрд╛ рдЧрдпрд╛ рдерд╛: рдбреА

RFC рдХреЗ рд▓реЗрдЦрдХ рдХреЗ рд░реВрдк рдореЗрдВ рдореБрдЭреЗ рд╡рд┐рд╢реЗрд╖рддрд╛ рдХрд╛ рдирд╛рдо рдмрджрд▓рдиреЗ рдкрд░ рдХреЛрдИ рдЖрдкрддреНрддрд┐ рдирд╣реАрдВ рд╣реИ Exit , рдпрд╛ рд╡рд╛рд╕реНрддрд╡ рдореЗрдВ рдХреБрдЫ рднреАред рдореИрдВ рдЪреАрдЬреЛрдВ рдХрд╛ рдирд╛рдордХрд░рдг рдХрд░рдиреЗ рдореЗрдВ рд╡рд┐рд╢реЗрд╖ рд░реВрдк рд╕реЗ рдЕрдЪреНрдЫрд╛ рдирд╣реАрдВ рд╣реВрдВ рдФрд░ рдХрд┐рд╕реА рдФрд░ рдХреЗ рд▓рд┐рдП рдмреЗрд╣рддрд░ рд╡рд┐рдЪрд╛рд░ рд░рдЦрдиреЗ рдХреЗ рд▓рд┐рдП рдЦреБрд╢ рд╣реВрдВред

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

рдХреНрдпрд╛ рдЧреБрдг рд╣реЛрдирд╛ рдЪрд╛рд╣рд┐рдП

  1. libcore рдХреЗ рдмрдЬрд╛рдп libstd рдореЗрдВ рд░рдЦрд╛ рдЧрдпрд╛ рд╣реИ, рдФрд░
  2. рдмрд╕ std::Termination рдХрд╣рд╛ рдЬрд╛рддрд╛ рд╣реИ, std::ops::Termination рдирд╣реАрдВ?

рд╡рд┐рд╢реЗрд╖рддрд╛ рдХреЛ libcore рдореЗрдВ рдирд╣реАрдВ рд░рдЦрд╛ рдЬрд╛ рд╕рдХрд╛, рдХреНрдпреЛрдВрдХрд┐ Result рдХреЗ рдХрд╛рд░реНрдпрд╛рдиреНрд╡рдпрди рдХреЗ рд▓рд┐рдП Result рдкрд░ рдкреНрд░рд┐рдВрдЯ рдХрд░рдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реИ рдФрд░ рдпрд╣ stderr libcore рдореЗрдВ рдирд╣реАрдВ рдХрд┐рдпрд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИред

@bkchr libstd рдореЗрдВ рд╣реЛрдиреЗ рдХрд╛ рдорддрд▓рдм рдпрд╣ рдирд╣реАрдВ рд╣реИ рдХрд┐ рд╡рд┐рд╢реЗрд╖рддрд╛ рдХреЛ libstd рдореЗрдВ рднреА рд╣реЛрдирд╛ рдЪрд╛рд╣рд┐рдПред

@kennytm рдореБрдЭреЗ рдкрддрд╛ рд╣реИ, рд▓реЗрдХрд┐рди рдкрд░рд┐рдгрд╛рдо libcore рдореЗрдВ рднреА рдкрд░рд┐рднрд╛рд╖рд┐рдд рдХрд┐рдпрд╛ рдЧрдпрд╛ рд╣реИ, рдЗрд╕рд▓рд┐рдП libstd рдореЗрдВ рдкрд░рд┐рдгрд╛рдо рдХреЗ рд▓рд┐рдП рд╕рдорд╛рдкреНрддрд┐ рдХреЛ рд▓рд╛рдЧреВ рдирд╣реАрдВ рдХрд┐рдпрд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИред

@zackw +1 рдЕрдзрд┐рдХ рд╡реЛрдЯ рдХреЗ рд▓рд┐рдП Exit рд╡рд┐рд╢реЗрд╖рддрд╛ рдирд╛рдо рдХреЗ рд░реВрдк рдореЗрдВред

@ U007D : рдХреНрдпрд╛ рдЖрдк рдХреГрдкрдпрд╛ рдРрд╕рд╛ рд╕рдВрджреЗрд╢ рдкреЛрд╕реНрдЯ рдХрд░рдиреЗ рдХреЗ рдмрдЬрд╛рдп рдкреНрд░рддрд┐рдХреНрд░рд┐рдпрд╛ рдмрдЯрди (рдЬреИрд╕реЗ, ) рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ? рдпрд╣ рдЖрдкрдХреЛ рдЕрдирд╛рд╡рд╢реНрдпрдХ рд░реВрдк рд╕реЗ рдкрд┐рдВрдЧ рдХрд░рдХреЗ рдЧреНрд░рд╛рд╣рдХреЛрдВ рдХреЛ рдкрд░реЗрд╢рд╛рди рдХрд░рдиреЗ рд╡рд╛рд▓реА рд╕рдорд╕реНрдпрд╛ рд╕реЗ рдмрдЪрдиреЗ рджреЗрдЧрд╛ред

рдХреНрдпрд╛ рдореИрдВ рдЪреЗрдХ рдЗрди рдХрд░ рд╕рдХрддрд╛ рд╣реВрдБ libtest / libsyntax , рдЕрдЧрд░ language_feature рд╕рдХреНрд░рд┐рдп рд╣реИ (рдПрдХ рдЯреЛрдХрд░рд╛ рдореЗрдВ)? @arielb1 @nikomatsakis @alexcrichton

@bkchr libsyntax рдореЗрдВ рдЖрдкрдХреЛ рдЗрд╕реЗ рдкрд╛рд╕ рдХрд░рдирд╛ рдкрдбрд╝ рд╕рдХрддрд╛ рд╣реИ рд▓реЗрдХрд┐рди рдпрд╣ рд╕рд┐рджреНрдзрд╛рдВрдд рд░реВрдк рдореЗрдВ рд╕рдВрднрд╡ рд╣реИ, рд▓реЗрдХрд┐рди рд░рдирдЯрд╛рдЗрдо рдкрд░ рд╣реА 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 ред рдореБрдЭреЗ рдпрд╣ рднреА рд▓рдЧрддрд╛ рд╣реИ рдХрд┐ рдЗрд╕ рддреНрд░реБрдЯрд┐ рдХреЗ рдкреНрд░рджрд░реНрд╢рди рдирд┐рд╣рд┐рддрд╛рд░реНрде рдХреЗ рдмрдЬрд╛рдп description рдкрджреНрдзрддрд┐ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдирд╛ рдПрдХ рдЧрд▓рддреА рд╣реИред

рдореИрдВ рдЗрд╕ рдЖрд╢рдп рдХреЛ рдЗрд╕ рд╡реНрдпрд╛рдкрдХ рдЕрд░реНрде рд╕реЗ рдмрджрд▓рдиреЗ рдХрд╛ рдкреНрд░рд╕реНрддрд╛рд╡ рдХрд░рддрд╛ рд╣реВрдБ:

#[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 рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдХреЗ рддреНрд░реБрдЯрд┐рдпреЛрдВ рдХрд╛ рдирд┐рд░реНрдорд╛рдг рдХрд░рддреЗ рд╣реИрдВ:

  • {} рдХреЗрд╡рд▓ рдЗрд╕ рддреНрд░реБрдЯрд┐ рдХреЛ рдкреНрд░рд┐рдВрдЯ рдХрд░рддрд╛ рд╣реИ
  • {:?} рдЗрд╕ рддреНрд░реБрдЯрд┐ рдХреЗ рд╕рд╛рде-рд╕рд╛рде рдЗрд╕рдХреЗ рдХрд╛рд░рдг (рдкреБрдирд░рд╛рд╡рд░реНрддреА) рдХреЛ рдкреНрд░рд┐рдВрдЯ рдХрд░рддрд╛ рд╣реИ

рд╣рдо рдпрд╣рд╛рдВ :? рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдиреЗ рдХрд╛ рдирд┐рд░реНрдгрдп рд▓реЗ рд╕рдХрддреЗ рд╣реИрдВ рдФрд░ рдЗрд╕реЗ рдбрд┐рд╕реНрдкреНрд▓реЗ рдХреЗ рдмрдЬрд╛рдп рдбреАрдмрдЧ рдХреЛ рдмрд╛рдзреНрдп рдХрд░ рд╕рдХрддреЗ рд╣реИрдВред рдЕрдирд┐рд╢реНрдЪрд┐рддред

рд╣рд╛рдБ, рдореБрдЭреЗ рдкрд╣рд▓реЗ рд╕реЗ рд╣реА рдкрддрд╛ рд╣реИ рдХрд┐ рдореБрдЭреЗ рд╕рдорд░реНрдерди рдХреЗ рд▓рд┐рдП рдЗрдореНрдкреНрд▓рд╛рдВрдЯ рдореЗрдВ рд╕реБрдзрд╛рд░ рдХрд░рдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реИред рдореИрдВ рдЦреБрд▓рд╛ рд╣реВрдВ рдХрд┐ рд╣рдо рдХреНрдпрд╛ рдХрд░ рд╕рдХрддреЗ рд╣реИрдВред Debug рд╕реЗ рдЬреБрдбрд╝рдирд╛ рдПрдХ рдЕрдЪреНрдЫрд╛ рд╡рд┐рдЪрд╛рд░ рд╣реЛ рд╕рдХрддрд╛ рд╣реИред

рд╣рдореНрдо, рдпрд╣ рдПрдХ рдореБрд╢реНрдХрд┐рд▓ рд╣реИред рдореБрдЭреЗ рд▓рдЧрддрд╛ рд╣реИ рдХрд┐ рдпрд╣ рдЗрд╕ рдмрд╛рдд рдкрд░ рдирд┐рд░реНрднрд░ рдХрд░рддрд╛ рд╣реИ рдХрд┐ рдХреНрдпрд╛ рд╣рдо рд╕реЛрдЪрддреЗ рд╣реИрдВ рдХрд┐ рдПрдХ "рдкреЙрд▓рд┐рд╢" рдХрд╛рд░реНрдпрдХреНрд░рдо рдЗрд╕ рд╡рд┐рд╢реЗрд╖рддрд╛ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░реЗрдЧрд╛ред рдореБрдЭреЗ рд▓рдЧрддрд╛ рд╣реИ рдХрд┐ рдпрд╣ рдХрд╣рдирд╛ рдареАрдХ рд╣реИ рдХрд┐ "рдирд╣реАрдВ, рд╡реЗ рдирд╣реАрдВ рдХрд░реЗрдВрдЧреЗ" - рдореВрд▓ рд░реВрдк рд╕реЗ, рдПрдХ рдкреЙрд▓рд┐рд╢ рдкреНрд░реЛрдЧреНрд░рд╛рдо рдпрд╛ рддреЛ (рдП) рдЖрдЙрдЯрдкреБрдЯ рдХреЛ рдкрдХрдбрд╝ рд▓реЗрдЧрд╛ рдФрд░ рдЗрд╕реЗ рдХрд┐рд╕реА рдЕрдиреНрдп рддрд░реАрдХреЗ рд╕реЗ рд╕рдВрднрд╛рд▓реЗрдЧрд╛ рдпрд╛ (рдмреА) рдХреБрдЫ рдирдП рдкреНрд░рдХрд╛рд░ рдпрд╛ рдХреБрдЫ рдРрд╕рд╛ рдЙрдкрдпреЛрдЧ рдХрд░реЗрдЧрд╛ рдЬреЛ рдбреАрдмрдЧ рд▓рд╛рдЧреВ рдХрд░рддрд╛ рд╣реИ рд╕рд╣реА рддрд░реАрдХрд╛ред рдЗрд╕рдХрд╛ рдорддрд▓рдм рдпрд╣ рд╣реЛрдЧрд╛ рдХрд┐ рд╣рдо рдЙрдкрдпреЛрдЧреА рдЬрд╛рдирдХрд╛рд░реА рдХреЛ рдбрдВрдк рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдЗрдореНрдкреНрд▓рд╛рдВрдЯ рдХреЛ рдЕрдиреБрдХреВрд▓рд┐рдд рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ рд▓реЗрдХрд┐рди рдЬрд░реВрд░реА рд░реВрдк рд╕реЗ рд╕рдмрд╕реЗ рд╕реБрдВрджрд░ рд░реВрдк рдореЗрдВ (рдЬреЛ рдХрд┐ Debug рдХреА рднреВрдорд┐рдХрд╛ рдХреА рддрд░рд╣ рд▓рдЧрддрд╛ рд╣реИ)ред

Debug рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдХреЗ рдЗрд╕реЗ рдкреНрд░реЛрдЯреЛрдЯрд╛рдЗрдк рдкрд░ рдмрд╣реБрдд рд╕реНрдкрд╖реНрдЯ рд░реВрдк рд╕реЗ рд▓рдХреНрд╖рд┐рдд рдХрд░рдирд╛ рд╕рд╣реА рд╡рд┐рдХрд▓реНрдк рд╣реЛ рд╕рдХрддрд╛ рд╣реИ, рдХреНрдпреЛрдВрдХрд┐ рдореБрдЭреЗ рдирд╣реАрдВ рд▓рдЧрддрд╛ рдХрд┐ рд╣рдо рдХрднреА рднреА рддреНрд░реБрдЯрд┐рдпреЛрдВ рдХреЛ рд╕реНрд╡рдЪрд╛рд▓рд┐рдд рд░реВрдк рд╕реЗ рдЗрд╕ рддрд░рд╣ рд╕реЗ рд╕рдВрднрд╛рд▓ рд╕рдХрддреЗ рд╣реИрдВ рдЬреЛ рдЕрдзрд┐рдХрд╛рдВрд╢ рдЙрддреНрдкрд╛рджрди рдЙрдкрдпреЛрдЧ рдорд╛рдорд▓реЛрдВ рдХреЗ рд▓рд┐рдП рд╕рд╣реА рд╣реИред

@withboats рдореИрдВ рд╕рд╣рдордд рд╣реВрдБред

@nikomatsakis рдореБрдЭреЗ рд▓рдЧрддрд╛ рд╣реИ рдХрд┐ рдЖрдкрдХрд╛ рдорддрд▓рдм рд╣реИ "рдЬрд░реВрд░реА рдирд╣реАрдВ рдХрд┐ рд╕рдмрд╕реЗ рд╕реБрдВрджрд░ рд░реВрдк рдореЗрдВ"? рдпрджрд┐ рд╣рд╛рдВ, рддреЛ рдореИрдВ рд╕рд╣рдордд рд╣реВрдВред

рдЕрджреНрдпрддрди: рдЗрд╕ рдкрд░ рдХреБрдЫ рджрд┐рдиреЛрдВ рддрдХ рдХрд╛рдо рдХрд░рдиреЗ рдХреЗ рдмрд╛рдж, рдореИрдВ рдЗрд╕ рдкрд░ рдлрд╝реНрд▓рд┐рдк рдХрд░ рдЪреБрдХрд╛ рд╣реВрдБред рдиреАрдЪреЗ рджреЗрдЦреЗрдВред

:+1: рдпрд╣рд╛рдВ Debug рдкрд░; рдореБрдЭреЗ https://github.com/rust-lang/rfcs/pull/1937#issuecomment -284509933 рд╕реЗ @nikomatsakis рдХрд╛ "рдПрдХ рдмреЗрдЬреЛрдбрд╝ рдЕрдкрд╡рд╛рдж рдХреЗ рд╕рдорд╛рди" рдкрд╕рдВрдж рд╣реИред Diggsey рдХреА рдПрдХ рдЯрд┐рдкреНрдкрдгреА рднреА Debug рд╕реБрдЭрд╛рд╡ рджреЗ рд░рд╣реА рд╣реИ: https://github.com/rust-lang/rfcs/pull/1937#issuecomment -289248751

FYI рдХрд░реЗрдВ, рдореИрдВрдиреЗ "рдЕрдзрд┐рдХ рдкреВрд░реНрдг" рдмрдирд╛рдо "рдЕрдзрд┐рдХ рдЙрдкрдпреЛрдЧрдХрд░реНрддрд╛ рдХреЗ рдЕрдиреБрдХреВрд▓" рдбрд┐рдлрд╝реЙрд▓реНрдЯ (рдпрд╛рдиреА Debug рдмрдирд╛рдо Display рд╡рд┐рд╢реЗрд╖рддрд╛ рдмрд╛рдзреНрдп) рдореБрджреНрджреЗ рдкрд░ рдлрд╝реНрд▓рд┐рдк рдХрд┐рдпрд╛ рд╣реИред

рдЯреАрдПрд▓; рдбреАрдЖрд░ рдЕрдм рдореБрдЭреЗ рд╡рд┐рд╢реНрд╡рд╛рд╕ рд╣реИ рдХрд┐ рд╣рдореЗрдВ 'рдХреБрдЫ рднреА рдирд╣реАрдВ' рдорд╛рдорд▓реЗ рдореЗрдВ рдХреНрд▓реАрдирд░, рд╕рд╛рд░рд╛рдВрд╢ рдЖрдЙрдЯрдкреБрдЯ рдкреНрд░рджрд╛рди рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП Display ( @withboats ' рдореВрд▓ рдкреЛрд╕реНрдЯ рдХреЗ рдЕрдиреБрд╕рд╛рд░) рдкрд░ рдмрд╛рдзреНрдп рд╣реЛрдирд╛ рдЪрд╛рд╣рд┐рдПред

рдпрд╣рд╛рдБ рдореЗрд░рд╛ рддрд░реНрдХ рд╣реИ:

termination рд╡рд┐рд╢реЗрд╖рддрд╛ рдХреЗ RFC рдореБрджреНрджреЗ рдкрд░ @zackw рд╕рдореНрдореЛрд╣рдХ рдмрд┐рдВрджреБ рдмрдирд╛рддрд╛ рд╣реИ рдХрд┐ рд░рд╕реНрдЯ рдореЗрдВ рджреЛрд╣рд░реА panic / Result рдкреНрд░рдгрд╛рд▓реА рд╣реИ рдХреНрдпреЛрдВрдХрд┐ panic s рдмрдЧ рдХреЗ рд▓рд┐рдП рд╣реИрдВ рдФрд░ Result s рддреНрд░реБрдЯрд┐рдпреЛрдВ рдХреЗ рд▓рд┐рдП рд╣реИрдВред рдЗрд╕рд╕реЗ, рдореБрдЭреЗ рд▓рдЧрддрд╛ рд╣реИ рдХрд┐ рдбрд┐рдлрд╝реЙрд▓реНрдЯ рдкреИрдирд┐рдХ рдкреНрд░рд╕реНрддреБрддрд┐ рд╕реЗ рд╕реНрд╡рддрдВрддреНрд░ рд░реВрдк рд╕реЗ рдбрд┐рдлрд╝реЙрд▓реНрдЯ рддреНрд░реБрдЯрд┐ рдкреНрд░рд╕реНрддреБрддрд┐ рдХрд╛ рдореВрд▓реНрдпрд╛рдВрдХрди рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдПрдХ рд╕рдореНрдореЛрд╣рдХ рдорд╛рдорд▓рд╛ рдмрдирд╛рдпрд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИред

рдмреЗрд╢рдХ рдХреЛрдИ рдПрдХ рдбрд┐рдлрд╝реЙрд▓реНрдЯ рдирд╣реАрдВ рд╣реИ рдЬреЛ рд╕рднреА рдХреЛ рд╕рдВрддреБрд╖реНрдЯ рдХрд░реЗрдЧрд╛, рдЗрд╕рд▓рд┐рдП рдХрдо рд╕реЗ рдХрдо рдЖрд╢реНрдЪрд░реНрдп рдХреЗ рд╕рд┐рджреНрдзрд╛рдВрдд рдХреЛ рд▓рд╛рдЧреВ рдХрд░рддреЗ рд╣реБрдП, рдореИрдВ рдЦреБрдж рд╕реЗ рдкреВрдЫрддрд╛ рд╣реВрдВ рдХрд┐ рдХреМрди рд╕рд╛ рдбрд┐рдлрд╝реЙрд▓реНрдЯ рдЕрдзрд┐рдХ рдЙрдкрдпреБрдХреНрдд рд╣реИ?

  • рдПрдХ рддреНрд░реБрдЯрд┐ рдХреЛ рдЕрдХреНрд╕рд░ рдбрд┐рдЬрд╝рд╛рдЗрди рджреНрд╡рд╛рд░рд╛ рдирд┐рдпрдВрддреНрд░рд┐рдд рдирд╣реАрдВ рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИ, рдЬрд┐рд╕рдореЗрдВ рдЗрд╕рдХрд╛ рдЙрджреНрджреЗрд╢реНрдп рдЙрдкрдпреЛрдЧрдХрд░реНрддрд╛ рдХреЛ рд╕реВрдЪрд┐рдд рдХрд┐рдпрд╛ рдЬрд╛рдирд╛ рд╣реИ рдХрд┐ рдХреБрдЫ (рд╕рдВрднрд╡рддрдГ рдареАрдХ рдХрд░рдиреЗ рдпреЛрдЧреНрдп) рдЧрд▓рдд рд╣реЛ рдЧрдпрд╛ (рдлрд╝рд╛рдЗрд▓ рдирд╣реАрдВ рдорд┐рд▓реА, рдЖрджрд┐)ред рдЬреИрд╕реЗ, рдЙрдкрдпреЛрдЧ рдХрд╛ рдорд╛рдорд▓рд╛ рдореМрдЬреВрдж рд╣реИ рдФрд░ рдпрдереЛрдЪрд┐рдд рд░реВрдк рд╕реЗ рд╕рд╛рдорд╛рдиреНрдп рдорд╛рдирд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИ рдХрд┐ рдЙрдкрдпреЛрдЧрдХрд░реНрддрд╛ рдЗрдЪреНрдЫрд┐рдд рджрд░реНрд╢рдХ рд╣реИред

  • рдЬреИрд╕рд╛ рдХрд┐ @nikomatsakis рдиреЗ рдмрддрд╛рдпрд╛, рд╣рдорд╛рд░реЗ рджреНрд╡рд╛рд░рд╛ рдЪреБрдиреЗ рдЧрдП рдбрд┐рдлрд╝реЙрд▓реНрдЯ рдХреА рдкрд░рд╡рд╛рд╣ рдХрд┐рдП рдмрд┐рдирд╛, рдХреЛрдИ рднреА рдбреЗрд╡рд▓рдкрд░ рдЬреЛ рд╡реНрдпрд╡рд╣рд╛рд░ рдХреЛ рдмрджрд▓рдирд╛ рдЪрд╛рд╣рддрд╛ рд╣реИ, рд╡рд╣ рдпрд╛ рддреЛ рдирдП рдкреНрд░рдХрд╛рд░ рдХреЗ рдкреИрдЯрд░реНрди рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░ рд╕рдХрддрд╛ рд╣реИ рдпрд╛ рдореБрдЦреНрдп () рдореЗрдВ рдПрдХ рдХрд╕реНрдЯрдо рдХрд╛рд░реНрдпрд╛рдиреНрд╡рдпрди рд╡рд┐рдХрд╕рд┐рдд рдХрд░ рд╕рдХрддрд╛ рд╣реИред

рдФрд░ рдЕрдВрдд рдореЗрдВ рдЕрдзрд┐рдХ рд╡реНрдпрдХреНрддрд┐рдкрд░рдХ рдкрдХреНрд╖ рдкрд░, рдкрд┐рдЫрд▓реЗ рдХреБрдЫ рджрд┐рдиреЛрдВ рдореЗрдВ рдЗрд╕ рд╕реБрд╡рд┐рдзрд╛ рдХреЗ рд╕рд╛рде рдХрд╛рдо рдХрд░рдиреЗ рдореЗрдВ, рдореИрдВрдиреЗ рдкрд╛рдпрд╛ рд╣реИ рдХрд┐ Debug рдЖрдЙрдЯрдкреБрдЯ рдиреЗ рдореБрдЭреЗ рдпрд╣ рдорд╣рд╕реВрд╕ рдХрд░рд╛рдпрд╛ рдХрд┐ рдореЗрд░рд╛ "рд░рд╕реНрдЯ рдРрдк" рдЕрдзрд┐рдХ рдмрд┐рдирд╛ рдкреЙрд▓рд┐рд╢ рд╡рд╛рд▓рд╛ рд▓рдЧрд╛:

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

рдмрдирд╛рдо

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

Dispay рд╡рд┐рд╢реЗрд╖рддрд╛ рдПрдХ рддреНрд░реБрдЯрд┐ рдХреЗ рд▓рд┐рдП рдмрд╣реБрдд рдЕрдзрд┐рдХ рд╕рднреНрдп рдбрд┐рдлрд╝реЙрд▓реНрдЯ рдкреНрд░рддреАрдд рд╣реЛрддреА рд╣реИ (рдмрдЧ рдХреЗ рд╡рд┐рдкрд░реАрдд), рд╣реИ рдирд╛?

@ U007D рд░реБрдХреЛ, рдЖрдк рдЙрди рджреЛ рдЖрдЙрдЯрдкреБрдЯ рдореЗрдВ рд╕реЗ рдХреМрди рд╕рд╛ рдкрд╕рдВрдж рдХрд░рддреЗ рд╣реИрдВ?

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

рдпрд╛

(рдмреА) Error: returned Box<Error> from main()

рд╡рд╣ рд╡рд┐рдХрд▓реНрдк (рдмреА) рдкрд╕рдВрдж рдХрд░рддрд╛ рд╣реИред

@nikomatsakis рдореВрд▓ рд░реВрдк рд╕реЗ, рдореИрдВ рдПрдХ рдХреЗ рд╕рд╛рде рдареАрдХ рдерд╛) Debug рдореЗрд░реЗ рд╕рд┐рд░ рдореЗрдВ рдПрдХ рдЕрд╡рдзрд╛рд░рдгрд╛ рдХреЗ рд░реВрдк рдореЗрдВ, рд▓реЗрдХрд┐рди рд╡рд╛рд╕реНрддрд╡ рдореЗрдВ рдЖрдЙрдЯрдкреБрдЯ рдХреЛ рджреЗрдЦрдиреЗ рдХреЗ рдХреБрдЫ рджрд┐рдиреЛрдВ рдХреЗ рд▓рд┐рдП рдЗрд╕рдХреЗ рд╕рд╛рде рдХрд╛рдо рдХрд░рдиреЗ рдХреЗ рдмрд╛рдж, рдЕрдм рдореИрдВ рдмреА рдкрд╕рдВрдж рдХрд░рддрд╛ рд╣реВрдВ) Display рдЬреИрд╕рд╛ рдПрдХ рдбрд┐рдлрд╝реЙрд▓реНрдЯред рдореБрдЭреЗ рд▓рдЧрддрд╛ рд╣реИ рдХрд┐ рдмреА) рдХреЗ рд▓рд┐рдП рдореЗрд░реА рд╡рд░реАрдпрддрд╛ рдФрд░ рднреА рд╕реНрдкрд╖реНрдЯ рд╣реЛ рдЬрд╛рдПрдЧреА рдпрджрд┐ рдореИрдВ рдПрдХ рдЬрдВрдЬреАрд░ рддреНрд░реБрдЯрд┐ рдореЙрдбрд▓рд┐рдВрдЧ рдХрд░ рд░рд╣рд╛ рдерд╛ред

рдореБрдЭреЗ рдирд╣реАрдВ рд▓рдЧрддрд╛ рдХрд┐ "рдкреЙрд▓рд┐рд╢" рдпрд╛ "рд╕рднреНрдп" рдЗрд╕рдХрд╛ рд▓рдХреНрд╖реНрдп рд╣реИ, рд╣рд╛рд▓рд╛рдВрдХрд┐, рдЪреВрдВрдХрд┐ рдореИрдВ рд╕рдордЭрддрд╛ рд╣реВрдВ рдХрд┐ рдзрд╛рдЧреЗ рдХреЛ рдкрд╣рд▓реЗ рд╕реЗ рд╣реА рдЙрджрд╛рд╣рд░рдгреЛрдВ рдХреЗ рд▓рд┐рдП рд╕реНрд╡реАрдХрд╛рд░ рдХрд░ рд▓рд┐рдпрд╛ рдЧрдпрд╛ рд╣реИ, рд▓реЛрдЧреЛрдВ рдХреЛ рдкреВрд░реА рддрд░рд╣ рд╕реЗ рдХрд╕реНрдЯрдо рд╣реИрдВрдбрд▓рд┐рдВрдЧ рдЬреЛрдбрд╝рдиреЗ рдХреА рдЙрдореНрдореАрдж рд╣реИ рдХреНрдпреЛрдВрдХрд┐ рдХрд╛рд░реНрдпрдХреНрд░рдо рдкрд░рд┐рдкрдХреНрд╡ рд╣реЛрддрд╛ рд╣реИред

рдЙрди рдорд╛рдорд▓реЛрдВ рдореЗрдВ, рдореЗрд░реЗ рд▓рд┐рдП "рдХрдо рд╕реЗ рдХрдо рдЖрд╢реНрдЪрд░реНрдп" рдПрдХ рдбреЗрд╡рд▓рдкрд░-рдЙрдиреНрдореБрдЦ рдЖрдЙрдЯрдкреБрдЯ рд╣реИ рдЬреИрд╕реЗ unwrap ред

рдпрджрд┐ рд▓рдВрдмреА рддреНрд░реБрдЯрд┐ рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рдЪрд┐рдВрддрд╛ рд╣реИ, рддреЛ рдХреНрдпрд╛ рдпрд╣рд╛рдВ {:#?} рдкрд░ рдЪрд░реНрдЪрд╛ рдХрд░рдирд╛ рдЙрдЪрд┐рдд рд╣реЛрдЧрд╛?

рдЕрдВрддрд┐рдо-рдЙрдкрдпреЛрдЧрдХрд░реНрддрд╛рдУрдВ рдХреЗ рд▓рд┐рдП рддреНрд░реБрдЯрд┐-рд░рд┐рдкреЛрд░реНрдЯрд┐рдВрдЧ рдкреНрд░рддреНрдпреЗрдХ рдЙрдкрдХрд░рдг рдФрд░ рдкреНрд░рддреНрдпреЗрдХ рдЙрдкрдпреЛрдЧ-рдорд╛рдорд▓реЗ рдХреЗ рд▓рд┐рдП рдЕрд▓рдЧ-рдЕрд▓рдЧ рд╣реЛрдиреЗ рдЬрд╛ рд░рд╣реА рд╣реИ, рд▓реЗрдХрд┐рди рдбреЗрд╡рд▓рдкрд░реНрд╕ рдХреЗ рд▓рд┐рдП рддреНрд░реБрдЯрд┐-рд░рд┐рдкреЛрд░реНрдЯрд┐рдВрдЧ рд╡рд╣реА рд╣реЛрдиреА рдЪрд╛рд╣рд┐рдП рдЬреЛ рд░рд╕реНрдЯ рдЕрдиреНрдп рд╕реНрдерд┐рддрд┐рдпреЛрдВ рдЬреИрд╕реЗ .unwrap() рдореЗрдВ рдХрд░рддрд╛ рд╣реИред рдЪреВрдВрдХрд┐ рдХреЗрд╡рд▓ рдПрдХ рдбрд┐рдлрд╝реЙрд▓реНрдЯ рд╣реЛ рд╕рдХрддрд╛ рд╣реИ, рдФрд░ рдкреЙрд▓рд┐рд╢ рдХрд┐рдП рдЧрдП рд╕реЙрдлрд╝реНрдЯрд╡реЗрдпрд░ рдХреЛ рд╡реИрд╕реЗ рднреА рдЖрдЙрдЯрдкреБрдЯ рдХреЛ рдУрд╡рд░рд░рд╛рдЗрдб рдХрд░рдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реЛрдЧреА, рдореИрдВ рдбрд┐рдлрд╝реЙрд▓реНрдЯ рд░реВрдк рд╕реЗ Debug рдХреЗ рд╕рд╛рде рдбреЗрд╡рд▓рдкрд░-рдЙрдиреНрдореБрдЦ рд╣реЛрдиреЗ рдХреЗ рд▓рд┐рдП рд╡реЛрдЯ рдХрд░рддрд╛ рд╣реВрдВред

рдореБрдЭреЗ рд▓рдЧрддрд╛ рд╣реИ рдХрд┐ рдЗрд╕ рдЪрд░реНрдЪрд╛ рдХрд╛ рдХреЗрдВрджреНрд░ рд╡рд╛рд╕реНрддрд╡ рдореЗрдВ "рдбрд┐рдлрд╝реЙрд▓реНрдЯ рд╕рдВрджреЗрд╢ рдХреЗ рд▓рд┐рдП рд▓рдХреНрд╖рд┐рдд рджрд░реНрд╢рдХ рдХреМрди рд╣реИ?"

рдЖрдЗрдП рдПрдХ рдкрд▓ рдХреЗ рд▓рд┐рдП рдХрд╣реЗрдВ рдХрд┐ рд╣рдо рд╕рднреА рд╕рд╣рдордд рдереЗ рдХрд┐ рдбрд┐рдлрд╝реЙрд▓реНрдЯ рд▓рдХреНрд╖рд┐рдд рджрд░реНрд╢рдХ рдбреЗрд╡рд▓рдкрд░реНрд╕ рдереЗред рдореБрдЭреЗ рд▓рдЧрддрд╛ рд╣реИ рдХрд┐ Debug рдбрд┐рдлрд╝реЙрд▓реНрдЯ рдмрд╛рдЙрдВрдб рдПрдХ рд╕реАрдзрд╛ рд╡рд┐рдХрд▓реНрдк рд╣реЛрдЧрд╛ред

рдЕрдм рдПрдХ рдкрд▓ рдХреЗ рд▓рд┐рдП рдорд╛рди рд▓реЗрдВ рдХрд┐ рд╣рдо рд╕рд╣рдордд рдереЗ рдХрд┐ рдбрд┐рдлрд╝реЙрд▓реНрдЯ рд▓рдХреНрд╖рд┐рдд рджрд░реНрд╢рдХ рдЙрдкрдпреЛрдЧрдХрд░реНрддрд╛ рдереЗ, рддреЛ рдпрд╣ рд╡рд╣ рдЬрдЧрд╣ рд╣реИ рдЬрд╣рд╛рдВ, рд╡рд┐рд╢реЗрд╖ рд░реВрдк рд╕реЗ, рдореИрдВ рдХреБрдЫ рдЕрдиреНрдп рд▓реЛрдЧреЛрдВ рд╕реЗ рдЕрд╕рд╣рдордд рд╣реВрдВ рдФрд░ рдорд╣рд╕реВрд╕ рдХрд░рддрд╛ рд╣реВрдВ рдХрд┐ "рдкреЛрд▓рд┐рд╢" рдФрд░ "рд╕рднреНрдп" рдЖрдЙрдЯрдкреБрдЯ рдЬреИрд╕реЗ рд╡реНрдпрдХреНрддрд┐рдкрд░рдХ рдЧреБрдгреЛрдВ рдХрд╛ рдПрдХ рдорд╣рддреНрд╡рдкреВрд░реНрдг рд╣рд┐рд╕реНрд╕рд╛ рд╣реИ рдкреНрд▓реЗ Playред рдХреБрдЫ рдХреЗ рд▓рд┐рдП, Display рд╕реЗ рдмрдЪрдиреЗ рдХреЗ рд▓рд┐рдП рдЕрдВрддрд┐рдо рдЙрдкрдпреЛрдЧрдХрд░реНрддрд╛ рдкреНрд░рд╕реНрддреБрддрд┐ "рдкреЛрд▓рд┐рд╢" рд╕рднреА рдХрд╛ рд╕рдмрд╕реЗ рдЕрдЪреНрдЫрд╛ рдХрд╛рд░рдг рд╣реЛ рд╕рдХрддрд╛ рд╣реИред (рдореИрдВ рдЙрд╕ рджреГрд╖реНрдЯрд┐рдХреЛрдг рдХреЛ рд╕рд╛рдЭрд╛ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдирд╣реАрдВ рд╣реЛрддрд╛, рд▓реЗрдХрд┐рди рдореИрдВ рдЗрд╕реЗ рд╕рдордЭрддрд╛ рд╣реВрдВ рдФрд░ рдЗрд╕рдХрд╛ рд╕рдореНрдорд╛рди рдХрд░рддрд╛ рд╣реВрдВред)

рддреЛ рд╣рд╛рдБ, рдореИрдВ рдирд┐рд╢реНрдЪрд┐рдд рд░реВрдк рд╕реЗ рдХрд┐рд╕реА рднреА рд╕рдореВрд╣ рдХреЗ рд▓рд┐рдП рдбрд┐рдлрд╝реЙрд▓реНрдЯ рд▓рдХреНрд╖реНрдп рдХреЗ рд░реВрдк рдореЗрдВ рдЙрдЪрд┐рдд рддрд░реНрдХ рджреЗрдЦ рд╕рдХрддрд╛ рд╣реВрдВред рдореБрдЭреЗ рд▓рдЧрддрд╛ рд╣реИ рдХрд┐ рдЕрдЧрд░ рдордЬрдмреВрдд рдЖрдо рд╕рд╣рдорддрд┐ рд╡рд┐рдХрд╕рд┐рдд рд╣реЛрддреА рд╣реИ рдХрд┐ рдХрд┐рд╕ рджрд░реНрд╢рдХ рдХреЛ рдбрд┐рдлрд╝реЙрд▓реНрдЯ рд▓рдХреНрд╖реНрдп рд╣реЛрдирд╛ рдЪрд╛рд╣рд┐рдП, рддреЛ рд╡рд┐рд╢реЗрд╖рддрд╛ рдмрд╛рдзреНрдп рдХреЗ рд▓рд┐рдП рд╡рд┐рдХрд▓реНрдк рд╕реНрдкрд╖реНрдЯ (рдПрд░) рд╣реЛрдЧрд╛ ... :)

(рдореИрдВ рдЗрд╕ рдкреВрд░реЗ рд╡рд┐рд╖рдп рдореЗрдВ рдкреВрд░реА рддрд░рд╣ рд╕реЗ рд╡рд╛рдХрд┐рдл рдирд╣реАрдВ рд╣реВрдВ, рд▓реЗрдХрд┐рди) рдХреНрдпрд╛ рдпрд╣ рдХрд▓реНрдкрдирд╛ рдпреЛрдЧреНрдп рдирд╣реАрдВ рд╣реИ рдХрд┐ рдЫреЛрдЯреА рдЙрдкрдпреЛрдЧрд┐рддрд╛рдПрдВ рд╣реЛ рд╕рдХрддреА рд╣реИрдВ рдЬрд┐рд╕рдХреЗ рд▓рд┐рдП Termination рдХреЗ рд╕рд╛рде рдбрд┐рдлрд╝реЙрд▓реНрдЯ рддреНрд░реБрдЯрд┐ рдЖрдЙрдЯрдкреБрдЯ рдкреВрд░реА рддрд░рд╣ рд╕реЗ рдкрд░реНрдпрд╛рдкреНрдд рд╣реЛрдЧрд╛, рдмрд╢рд░реНрддреЗ рдпрд╣ рдХреБрдЫ рдЙрдкрдпреЛрдЧрдХрд░реНрддрд╛-рдкреНрд░рд╕реНрддреБрдд рдХрд░рдиреЗ рдпреЛрдЧреНрдп рдкреНрд░рд╛рд░реВрдк рдореЗрдВ рд╣реЛ Display рдХреА рддрд░рд╣? рдЙрд╕ рд╕реНрдерд┐рддрд┐ рдореЗрдВ, рд▓реЗрдЦрдХреЛрдВ рдХреЛ "рдХрд╕реНрдЯрдо рд╣реИрдВрдбрд▓рд┐рдВрдЧ" рдХреЗ рд▓рд┐рдП рдкрд╣реБрдВрдЪрдиреЗ рдХрд╛ рдПрдХрдорд╛рддреНрд░ рдХрд╛рд░рдг рдпрд╣ рд╣реИ рдХрд┐ рдпрджрд┐ рд╣рдо рдЙрдиреНрд╣реЗрдВ рдмрдирд╛рддреЗ рд╣реИрдВред

рдХреНрдпрд╛ рдХреЛрдИ рдЙрджрд╛рд╣рд░рдг рдкреНрд░рджрд╛рди рдХрд░ рд╕рдХрддрд╛ рд╣реИ рдХрд┐ рдкреНрд░рддреНрдпреЗрдХ рдорд╛рдорд▓реЗ рдореЗрдВ рдЖрдЙрдЯрдкреБрдЯ рдХреИрд╕рд╛ рджрд┐рдЦрддрд╛ рд╣реИ (рдореБрдЭреЗ рд▓рдЧрддрд╛ рд╣реИ рдХрд┐ рдпрд╣ рд╡рд┐рд╢реЗрд╖ E рдкреНрд░рдХрд╛рд░ рдХреЗ рдЙрдкрдпреЛрдЧ рдкрд░ рднреА рдирд┐рд░реНрднрд░ рдХрд░рддрд╛ рд╣реИ?), рдФрд░ рд▓реЗрдЦрдХреЛрдВ рдХреЛ рд╡рд╛рд╕реНрддрд╡ рдореЗрдВ рдХреНрдпрд╛ рдХрджрдо рдЙрдард╛рдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реИ рдпрджрд┐ рд╡реЗ "рдХрд╕реНрдЯрдо рд╣реИрдВрдбрд▓рд┐рдВрдЧ" рдЪрд╛рд╣рддреЗ рд╣реИрдВ рдмрдЬрд╛рдп? рдореИрдВ рд╕рд┐рд░реНрдл рдКрдкрд░ рдХрд╛рд▓реНрдкрдирд┐рдХ рдкрд░ рдЬрд╛ рд░рд╣рд╛ рд╣реВрдБред

(рдХреНрдпрд╛ рдЖрдЙрдЯрдкреБрдЯ рд╕рдЪрдореБрдЪ @ U007D рдЬреИрд╕рд╛ рджрд┐рдЦрддрд╛ рд╣реИ рдКрдкрд░ рдЪрд┐рдкрдХрд╛рдпрд╛ рдЧрдпрд╛ рд╣реИ? рдпрд╣ "рд▓реМрдЯрд╛ рд╣реБрдЖ рдмреЙрдХреНрд╕\" рдХреНрдпреЛрдВ рдкреНрд░рд┐рдВрдЯ рдХрд░реЗрдЧрд╛рдмреЙрдХреНрд╕<рддреНрд░реБрдЯрд┐>?)

рддреНрд░реБрдЯрд┐ рд╕рдВрджреЗрд╢ рдХрд╛ Display рднреА рдХрд┐рддрдиреА рдмрд╛рд░ рдЙрдкрдпреЛрдЧрдХрд░реНрддрд╛ рдХреЗ рдЕрдиреБрдХреВрд▓ рд╣реИ? рдЙрджрд╛рд╣рд░рдг рдХреЗ рд▓рд┐рдП, рдирд┐рдореНрдирд▓рд┐рдЦрд┐рдд рдХрд╛рд░реНрдпрдХреНрд░рдо:

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

рдирд┐рдореНрдирд▓рд┐рдЦрд┐рдд рд╕рдВрджреЗрд╢ рдЙрддреНрд╕рд░реНрдЬрд┐рдд рдХрд░рддрд╛ рд╣реИ:

No such file or directory (os error 2)

рдЬреЛ, рдореИрдВ рдХрд╣реВрдВрдЧрд╛, рдорд╣рд╛рди рдпреВрдПрдХреНрд╕ рдирд╣реАрдВ рд╣реИ, рд╡рд┐рд╢реЗрд╖ рд░реВрдк рд╕реЗ рдлрд╝рд╛рдЗрд▓ рдирд╛рдо рдХрд╛ рдЙрд▓реНрд▓реЗрдЦ рдирд╣реАрдВ рдХрд┐рдпрд╛ рдЧрдпрд╛ рд╣реИред рдХрдо рд╕реЗ рдХрдо рддрдм рддрдХ рдирд╣реАрдВ рдЬрдм рддрдХ рдкреНрд░реЛрдЧреНрд░рд╛рдо рд╕рдЪрдореБрдЪ рдЗрдирдкреБрдЯ рдХреЗ рд░реВрдк рдореЗрдВ рдПрдХ рдлрд╝рд╛рдЗрд▓ рдирд╛рдо рдирд╣реАрдВ рд▓реЗрддрд╛ред рджреВрд╕рд░реА рддрд░рдл, рдпрд╣ рд╕реНрд░реЛрдд рдлрд╝рд╛рдЗрд▓/рд▓рд╛рдЗрди рдирдВрдмрд░/рд╕реНрдЯреИрдХ рдЯреНрд░реЗрд╕ рдЧреБрдо рд╣реЛрдиреЗ рдкрд░ рднреА рдорд╣рд╛рди рдбреЗрд╡рд▓рдкрд░ рдЕрдиреБрднрд╡ рдирд╣реАрдВ рд╣реИред Debug рдЖрдЙрдЯрдкреБрдЯ, рдЬрд╛рд╣рд┐рд░ рд╣реИ, рдФрд░ рднреА рдЦрд░рд╛рдм рдЙрдкрдпреЛрдЧрдХрд░реНрддрд╛ рдЕрдиреБрднрд╡ рд╣реИ, рдФрд░ рдбреЗрд╕реАрд▓рд░ рдХреЗ рд▓рд┐рдП рдХреЛрдИ рдЙрдкрдпреЛрдЧреА рдЬрд╛рдирдХрд╛рд░реА рднреА рдирд╣реАрдВ рдЬреЛрдбрд╝рддрд╛ рд╣реИред

рддреЛ рдореБрдЭреЗ рд▓рдЧрддрд╛ рд╣реИ рдХрд┐ рдореИрдВ рдЬреЛ рдХрд╣рдиреЗ рдХреА рдХреЛрд╢рд┐рд╢ рдХрд░ рд░рд╣рд╛ рд╣реВрдВ рд╡рд╣ рдпрд╣ рд╣реИ рдХрд┐ рдкреБрд╕реНрддрдХрд╛рд▓рдп рддреНрд░реБрдЯрд┐рдпреЛрдВ рдХреА рд╕реВрдЪрдирд╛ рд╕рд╛рдордЧреНрд░реА рдореЗрдВ рд╕реБрдзрд╛рд░ рдХрд┐рдП рдмрд┐рдирд╛, рди рддреЛ Debug рдФрд░ рди рд╣реА Display рдорд╣рд╛рди рд╣реИред

рдХреНрдпрд╛ рдЖрдЙрдЯрдкреБрдЯ рд╕рдЪрдореБрдЪ рд╡реИрд╕рд╛ рд╣реА рджрд┐рдЦрддрд╛ рд╣реИ рдЬреИрд╕рд╛ @ U007D рдКрдкрд░ рдЪрд┐рдкрдХрд╛рдпрд╛ рдЧрдпрд╛ рд╣реИ? рдпрд╣ "рд▓реМрдЯрд╛ рд╣реБрдЖ рдмреЙрдХреНрд╕" рдХреНрдпреЛрдВ рдкреНрд░рд┐рдВрдЯ рдХрд░реЗрдЧрд╛рд╕реЗ рдореБрдЦреНрдп ()" рдХреЗ рдмрдЬрд╛рдп... рдЙрд╕ рдмреЙрдХреНрд╕ рдХреА рд╡рд╛рд╕реНрддрд╡рд┐рдХ рд╕рд╛рдордЧреНрд░реА?

@glaebhoerl рдЖрдк рд╕рд╣реА рд╣реИрдВ - рдЗрд╕ рдорд╛рдорд▓реЗ рдореЗрдВ, "рдЙрд╕ Box<Error> " рдХреА рд╡рд╛рд╕реНрддрд╡рд┐рдХ рд╕рд╛рдордЧреНрд░реА рдПрдХ рдХрд╕реНрдЯрдо message рдлрд╝реАрд▓реНрдб рдереА рдЬрд┐рд╕реЗ рдореИрдВрдиреЗ termination_trait рдХрд╛ рдкрд░реАрдХреНрд╖рдг рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдмрдирд╛рдпрд╛ рдерд╛, рд╢рдмреНрджрд╢рдГ рдкреНрд░рджрд░реНрд╢рд┐рдд рдХрд┐рдпрд╛ рдЧрдпрд╛ рдерд╛ . рдореИрдВ рдЗрд╕рдХреЗ рдмрдЬрд╛рдп "рдлреВ рдмрд╛рд░ рдмрд╛рдЬ" рдпрд╛ рд╡рд╣рд╛рдВ рдХреБрдЫ рднреА рд▓рд┐рдЦ рд╕рдХрддрд╛ рдерд╛ (рд▓реЗрдХрд┐рди рд╣реЛ рд╕рдХрддрд╛ рд╣реИ рдХрд┐ рдпрд╣ рд╕рдВрдХрд▓рдХ рдкрд░реАрдХреНрд╖рдг рдЪрд▓рд╛рдиреЗ рд╡рд╛рд▓реЗ рдЙрдкрдпреЛрдЧрдХрд░реНрддрд╛ рдХреЗ рд▓рд┐рдП рдЙрддрдирд╛ рдЙрдкрдпреЛрдЧреА рди рд╣реЛ)ред

@jdahlstrom рдХреЗ рдЙрджрд╛рд╣рд░рдг рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рддреЗ рд╣реБрдП, рдпрд╣рд╛рдВ Box рдПрдб рдорд╛рдирдХ рдкреБрд╕реНрддрдХрд╛рд▓рдп "рдлрд╝рд╛рдЗрд▓ рдирд╣реАрдВ рдорд┐рд▓реА" 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! рдореИрдХреНрд░реЛ рдкрд░ рд╕реНрд╡рд┐рдЪ рдХрд░реЗрдВ рдпрд╛ рдореИрдиреНрдпреБрдЕрд▓ рдПрд╕реНрдЯ рдмрд┐рд▓реНрдбрд┐рдВрдЧ рдореЗрдВ рд╕рдм рдХреБрдЫ рдлрд┐рд░ рд╕реЗ рдХрд╛рдо рдХрд░реЗрдВ?

рдореИрдВ рдХрд┐рд╕реА рднреА рдорджрдж рдХреА рд╕рд░рд╛рд╣рдирд╛ рдХрд░рддрд╛ рд╣реВрдВ :)

рдореБрдЭреЗ рд▓рдЧрддрд╛ рд╣реИ рдХрд┐ libtest рдореЗрдВ рдкрд░рд┐рднрд╛рд╖рд┐рдд рдХреБрдЫ рдореИрдХреНрд░реЛ рдХреЗ рд▓рд┐рдП рдореИрдХреНрд░реЛ рдЖрдордВрддреНрд░рдг рдЙрддреНрдкрдиреНрди рдХрд░рдирд╛ рдмрд╣реБрдд рдЕрдЪреНрдЫрд╛ рдХрд╛рдо рдХрд░ рд╕рдХрддрд╛ рд╣реИред

@eddyb рдореБрдЭреЗ рдпрдХреАрди рдирд╣реАрдВ рд╣реИ рдХрд┐ рдореИрдВ рдпрд╣рд╛рдВ рдЖрдкрдХрд╛ рд╕реБрдЭрд╛рд╡ рд╕рдордЭрддрд╛ рд╣реВрдВ:

рдореБрдЭреЗ рд▓рдЧрддрд╛ рд╣реИ рдХрд┐ libtest рдореЗрдВ рдкрд░рд┐рднрд╛рд╖рд┐рдд рдХреБрдЫ рдореИрдХреНрд░реЛ рдХреЗ рд▓рд┐рдП рдореИрдХреНрд░реЛ рдЖрдордВрддреНрд░рдг рдЙрддреНрдкрдиреНрди рдХрд░рдирд╛ рдмрд╣реБрдд рдЕрдЪреНрдЫрд╛ рдХрд╛рдо рдХрд░ рд╕рдХрддрд╛ рд╣реИред

рдУрд╣, рдореБрдЭреЗ рд▓рдЧрддрд╛ рд╣реИ рд╢рд╛рдпрдж рдореИрдВ рдХрд░рддрд╛ рд╣реВрдБред рдЖрдк рдХрд╣ рд░рд╣реЗ рд╣реИрдВ - рдПрдХ рдореИрдХреНрд░реЛ рдХреЛ libtest рдореЗрдВ рдкрд░рд┐рднрд╛рд╖рд┐рдд рдХрд░реЗрдВ рдФрд░ рдлрд┐рд░ рдХреЛрдб рдЙрддреНрдкрдиреНрди рдХрд░реЗрдВ рдЬреЛ рдЗрд╕реЗ рдЖрдордВрддреНрд░рд┐рдд рдХрд░рддрд╛ рд╣реИ? рджрд┐рд▓рдЪрд╕реНрдк рд╡рд┐рдЪрд╛рд░ред рд╣рд╛рд▓рд╛рдВрдХрд┐ рд╡рд╣ рдореИрдХреНрд░реЛ рдирд╛рдо "рд░рд┐рд╕рд╛рд╡" рдирд╣реАрдВ рд╣реЛрдЧрд╛? (рдпрд╛рдиреА, рдпрд╣ libtest рдХреЗ рд╕рд╛рд░реНрд╡рдЬрдирд┐рдХ рдЗрдВрдЯрд░рдлрд╝реЗрд╕ рдХрд╛ рд╣рд┐рд╕реНрд╕рд╛ рдмрди рдЬрд╛рддрд╛ рд╣реИ?)


@bkchr

рдореЗрд░реЗ рдкрд░рд┐рд╡рд░реНрддрдиреЛрдВ рдХреЗ рд╕рд╛рде рдПрдХ рдкрд░реАрдХреНрд╖рдг рд╕рдВрдХрд▓рд┐рдд рдХрд░рдиреЗ рд╕реЗ рдирд┐рдореНрди рддреНрд░реБрдЯрд┐ рд╣реЛрддреА рд╣реИ:

рдХреНрдпрд╛ рдЖрдкрдХреЗ рдкрд╛рд╕ рдХреЛрдИ рд╡рд┐рдЪрд╛рд░ рд╣реИ рдХрд┐ рд╡рд╣ рддреНрд░реБрдЯрд┐ рдХреНрдпреЛрдВ рдЙрддреНрдкрдиреНрди рд╣реЛ рд░рд╣реА рд╣реИ? рдмрд╕ рдЕрдВрддрд░ рдкрдврд╝рдиреЗ рд╕реЗ, рдореИрдВ рдирд╣реАрдВ рдХрд░рддрд╛, рд▓реЗрдХрд┐рди рдореИрдВ рд╕реНрдерд╛рдиреАрдп рд░реВрдк рд╕реЗ рдирд┐рд░реНрдорд╛рдг рдХрд░рдиреЗ рдФрд░ рдЗрд╕реЗ рд╕рдордЭрдиреЗ рдХреА рдХреЛрд╢рд┐рд╢ рдХрд░ рд╕рдХрддрд╛ рд╣реВрдВред

рдореБрдЭреЗ рдЕрдм quote_item!/expr! рдХрд╛ рдЙрдкрдпреЛрдЧ рдирд╣реАрдВ рдХрд░рдирд╛ рдЪрд╛рд╣рд┐рдП, рдХреНрдпреЛрдВрдХрд┐ рд╡реЗ рд╡рд┐рд░рд╛рд╕рдд рд╣реИрдВред

рдореЗрд░реА рдпрд╣рд╛рдВ рдХреЛрдИ рдордЬрдмреВрдд рд░рд╛рдп рдирд╣реАрдВ рд╣реИред рдореИрдВ @eddyb рд╕реЗ рд╕рд╣рдордд рд╣реВрдВ рдХрд┐ рд╡реЗ рд╡рд┐рд░рд╛рд╕рдд рд╣реИрдВ, рд▓реЗрдХрд┐рди рдореБрдЭреЗ рдпрдХреАрди рдирд╣реАрдВ рд╣реИ рдХрд┐ рд╡реЗ рд╡рд┐рд░рд╛рд╕рдд рдХреА рддрд░рд╣ рд╣реИрдВ рдЬрд╣рд╛рдВ рдХреБрдЫ рдФрд░ рдЙрдкрдпреЛрдЧ рдЬреЛрдбрд╝рдиреЗ рд╕реЗ рдЙрдиреНрд╣реЗрдВ рдирд┐рдХрд╛рд▓рдирд╛ рдореБрд╢реНрдХрд┐рд▓ рд╣реЛ рдЬрд╛рдПрдЧрд╛ - рдпрд╛рдиреА, рдПрдХ рдмрд╛рд░ рд╣рдореЗрдВ рд╣рд╛рд▓ рд╣реА рдореЗрдВ рдкреНрд░рддрд┐рд╕реНрдерд╛рдкрди рдорд┐рд▓ рдЬрд╛рдПрдЧрд╛, рддреЛ рдХреНрдпрд╛ рдпрд╣ рдЖрд╕рд╛рди рд╣реЛрдЧрд╛ @eddyb рдПрдХ рд╕реЗ рджреВрд╕рд░реЗ рдореЗрдВ рдЬрд╛рдиреЗ рдХреЗ рд▓рд┐рдП?

рдореИрдиреБрдЕрд▓ рдПрдПрд╕рдЯреА рдмрд┐рд▓реНрдбрд┐рдВрдЧ рдирд┐рд╢реНрдЪрд┐рдд рд░реВрдк рд╕реЗ рдПрдХ рджрд░реНрдж рд╣реИ, рд╣рд╛рд▓рд╛рдВрдХрд┐ рдореБрдЭреЗ рд▓рдЧрддрд╛ рд╣реИ рдХрд┐ рдЗрд╕рдХреЗ рд▓рд┐рдП рд╣рдорд╛рд░реЗ рдкрд╛рд╕ рдХреБрдЫ рд╕рд╣рд╛рдпрдХ рд╣реИрдВред

рдЕрдзрд┐рдХрддрд░ рд╣рдореЗрдВ рдХреЗрд╡рд▓ рдПрдХ рдЫреЛрдЯрд╛ рд╕рд╛ рд╕рдВрдкрд╛рджрди рдХрд░рдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реИ, рд╣реИ рдирд╛? рдпрд╛рдиреА, report() рдХреЗ рдкрд░рд┐рдгрд╛рдо рдХрд╛ рдкрд░реАрдХреНрд╖рдг рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдлрд╝рдВрдХреНрд╢рди рдХреЛ рд▓рд╛рдЧреВ рдХрд░рдиреЗ рд╕реЗ рдмрджрд▓реЗрдВ?

рдкреБрдирд╢реНрдЪ, рд╣рдо рд╢рд╛рдпрдж .report() рд╕рдВрдХреЗрддрди рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдиреЗ рдХреЗ рдмрдЬрд╛рдп Termination::report(...) рдЬреИрд╕рд╛ рдХреБрдЫ рдЙрддреНрдкрдиреНрди рдХрд░рдирд╛ рдЪрд╛рд╣рддреЗ рд╣реИрдВ, Termination рд╡рд┐рд╢реЗрд╖рддрд╛ рдХреЗ рджрд╛рдпрд░реЗ рдореЗрдВ рд╣реЛрдиреЗ рдкрд░ рднрд░реЛрд╕рд╛ рдХрд░рдиреЗ рд╕реЗ рдмрдЪрдиреЗ рдХреЗ рд▓рд┐рдП?

рдирд╣реАрдВ, рдореБрдЭреЗ рдирд╣реАрдВ рдкрддрд╛ рдХрд┐ рд╡рд╣ рддреНрд░реБрдЯрд┐ рдХрд╣рд╛рдВ рд╕реЗ рдЖ рд░рд╣реА рд╣реИ :(

рдЖрд░рдПрдлрд╕реА рдиреЗ рдПрдХ рд░реИрдкрд░ рдлрд╝рдВрдХреНрд╢рди рдЙрддреНрдкрдиреНрди рдХрд░рдиреЗ рдХрд╛ рдкреНрд░рд╕реНрддрд╛рд╡ рд░рдЦрд╛ рдЬреЛ рдореВрд▓ рдкрд░реАрдХреНрд╖рдг рдлрд╝рдВрдХреНрд╢рди рдХреЛ рдХреЙрд▓ рдХрд░рддрд╛ рд╣реИред рдРрд╕рд╛ рдХрд░рдиреЗ рдХрд╛ рдореЗрд░рд╛ рд╡рд░реНрддрдорд╛рди рддрд░реАрдХрд╛ рднреА рдпрд╣реА рд╣реИред
рдореБрдЭреЗ рд▓рдЧрддрд╛ рд╣реИ рдХрд┐ рд╣рдо рд░реИрдкрд░ рдлрд╝рдВрдХреНрд╢рди рдХреЛ рднреА рдЫреЛрдбрд╝ рд╕рдХрддреЗ рд╣реИрдВ, рд▓реЗрдХрд┐рди рдлрд┐рд░ рд╣рдореЗрдВ рдлрд╝рдВрдХреНрд╢рди рдкреЙрдЗрдВрдЯрд░ рдХреЛ рдмреЙрдХреНрд╕рд┐рдВрдЧ рдХрд░рдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реЛрдЧреА, рдХреНрдпреЛрдВрдХрд┐ рдкреНрд░рддреНрдпреЗрдХ рдкрд░реАрдХреНрд╖рдг рдлрд╝рдВрдХреНрд╢рди рдПрдХ рдЕрд▓рдЧ рдкреНрд░рдХрд╛рд░ рд▓реМрдЯрд╛ рд╕рдХрддрд╛ рд╣реИред

рд╣рдореНрдо, рдЪреВрдВрдХрд┐ рдкрд░реАрдХреНрд╖рдг рдкрд╣рд▓реЗ рд╕реЗ рд╣реА рдЕрдиреНрдп рд╕рд╛рдорд╛рди рдЖрдпрд╛рдд рдХрд░рддрд╛ рд╣реИ, рдЗрд╕рд▓рд┐рдП рдЯрд░реНрдорд┐рдиреЗрд╢рди рд╡рд┐рд╢реЗрд╖рддрд╛ рдХреЛ рднреА рдЖрдпрд╛рдд рдХрд░рдирд╛ рдЗрддрдирд╛ рдЬрдЯрд┐рд▓ рдирд╣реАрдВ рд╣реИред

@alexcrichton рдХреНрдпрд╛ рдЖрдкрдХреЛ рд╢рд╛рдпрдж рдЕрдВрджрд╛рдЬрд╛ рд╣реИ рдХрд┐ рдпрд╣ рддреНрд░реБрдЯрд┐ рдХрд╣рд╛рдВ рд╕реЗ рдЖ рд░рд╣реА рд╣реИ?

@nikomatsakis libtest рдЕрд╕реНрдерд┐рд░ рд╣реИ рдФрд░ рдХреНрдпрд╛ рд╣рдо рдореИрдХреНрд░реЛрдЬрд╝ рдХреЛ рдЕрд╕реНрдерд┐рд░ рдХреЗ рд░реВрдк рдореЗрдВ рдЪрд┐рд╣реНрдирд┐рдд рдирд╣реАрдВ рдХрд░ рд╕рдХрддреЗ, рднрд▓реЗ рд╣реА рд╡рд╣ рдирд╣реАрдВ рдереЗ?

@eddyb рдУрд╣, рдЕрдЪреНрдЫреА рдмрд╛рдд рд╣реИред

рдЖрд░рдПрдлрд╕реА рдиреЗ рдПрдХ рд░реИрдкрд░ рдлрд╝рдВрдХреНрд╢рди рдЙрддреНрдкрдиреНрди рдХрд░рдиреЗ рдХрд╛ рдкреНрд░рд╕реНрддрд╛рд╡ рд░рдЦрд╛ рдЬреЛ рдореВрд▓ рдкрд░реАрдХреНрд╖рдг рдлрд╝рдВрдХреНрд╢рди рдХреЛ рдХреЙрд▓ рдХрд░рддрд╛ рд╣реИред рдРрд╕рд╛ рдХрд░рдиреЗ рдХрд╛ рдореЗрд░рд╛ рд╡рд░реНрддрдорд╛рди рддрд░реАрдХрд╛ рднреА рдпрд╣реА рд╣реИред

рдПрдХ рд░реИрдкрд░ рд╕рдорд╛рд░реЛрд╣ рдореБрдЭреЗ рдареАрдХ рд▓рдЧрддрд╛ рд╣реИред

@eddyb рдореИрдХреНрд░реЛ рдХреЗ рд╕рд╛рде рдЖрдкрдХрд╛ рдорддрд▓рдм create_test рдЬреИрд╕рд╛ рдХреБрдЫ рд╣реИ рдЬрд┐рд╕реЗ libtest рдореЗрдВ рдкрд░рд┐рднрд╛рд╖рд┐рдд рдХрд┐рдпрд╛ рдЧрдпрд╛ рд╣реИ? рд▓реЗрдХрд┐рди рдЬреЛ рдореБрдЭреЗ рд╕рдордЭ рдореЗрдВ рдирд╣реАрдВ рдЖрддрд╛ рд╣реИ рд╡рд╣ рд╣реИ "рдореИрдХреНрд░реЛ рдХреЛ рдЕрд╕реНрдерд┐рд░ рдХреЗ рд░реВрдк рдореЗрдВ рдЪрд┐рд╣реНрдирд┐рдд рдХрд░реЗрдВ"ред рдЗрд╕рд╕реЗ рдЖрдкрдХрд╛ рдХреНрдпрд╛ рдЖрд╢рдп рд╣реИ? рдХреНрдпрд╛ рдЖрдк рдореБрдЭреЗ рдПрдХ рдЙрджрд╛рд╣рд░рдг рджреЗ рд╕рдХрддреЗ рд╣реИрдВ?

@bkchr рдореИрдХреНрд░реЛ рдкрд░рд┐рднрд╛рд╖рд╛ рдкрд░ #[unstable(...)] рд╡рд┐рд╢реЗрд╖рддрд╛ рдбрд╛рд▓рдирд╛, рдЬреИрд╕реЗ: https://github.com/rust-lang/rust/blob/3a39b2aa5a68dd07aacab2106db3927f666a485a/src/libstd/thread/local.rs#L159 -L165

рддреЛ, рдХреНрдпрд╛ рдпрд╣ рдкрд╣рд▓рд╛ рдЪреЗрдХрдмреЙрдХреНрд╕ рд╣реЛрдирд╛ рдЪрд╛рд╣рд┐рдП ...

рдЖрд░рдПрдлрд╕реА рд▓рд╛рдЧреВ рдХрд░реЗрдВ

...рдЕрдм рдЬрд╛рдВрдЪ рд▓реЗрдВ рдХрд┐ рд▓рд┐рдВрдХ рдХрд┐рдП рдЧрдП рдкреАрдЖрд░ рдХреЛ рдорд░реНрдЬ рдХрд░ рджрд┐рдпрд╛ рдЧрдпрд╛ рд╣реИ?

@ErichDonGubler рд╣реЛ рдЧрдпрд╛ :)

рд╣рдореНрдо, рдпрд╣ рд╡рд░реНрддрдорд╛рди рдореЗрдВ рдХреЗрд╡рд▓ рдЖрдзрд╛ rfc рд╣реИ рдЬрд┐рд╕реЗ рдорд░реНрдЬ рдХрд┐рдП рдЧрдП pr ^^ . рдХреЗ рд╕рд╛рде рд▓рд╛рдЧреВ рдХрд┐рдпрд╛ рдЧрдпрд╛ рд╣реИ

3 рдЪреЗрдХрдмреЙрдХреНрд╕ рдореЗрдВ рдЕрд▓рдЧ :)

рдореИрдВ main рдореЗрдВ рдЗрд╕ рд╕реБрд╡рд┐рдзрд╛ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдиреЗ рдХреА рдХреЛрд╢рд┐рд╢ рдХрд░ рд░рд╣рд╛ рд╣реВрдВ рдФрд░ рдореБрдЭреЗ рдпрд╣ рдмрд╣реБрдд рдирд┐рд░рд╛рд╢рд╛рдЬрдирдХ рд▓рдЧрд╛ рд╣реИред рдЯрд░реНрдорд┐рдиреЗрд╢рди рд╡рд┐рд╢реЗрд╖рддрд╛ рдХреЗ рдореМрдЬреВрджрд╛ рдирд┐рд╣рд┐рддрд╛рд░реНрде рдореБрдЭреЗ рдХрдИ рдкреНрд░рдХрд╛рд░ рдХреА рддреНрд░реБрдЯрд┐рдпреЛрдВ рдХреЛ рдЖрд╕рд╛рдиреА рд╕реЗ "рд╕рдВрдЪрд┐рдд" рдХрд░рдиреЗ рдХреА рдЕрдиреБрдорддрд┐ рдирд╣реАрдВ рджреЗрддреЗ рд╣реИрдВ - рдЙрджрд╛рд╣рд░рдг рдХреЗ рд▓рд┐рдП, рдореИрдВ failure::Fail рдХрд╛ рдЙрдкрдпреЛрдЧ рдирд╣реАрдВ рдХрд░ рд╕рдХрддрд╛, рдХреНрдпреЛрдВрдХрд┐ рдпрд╣ Error рдХреЛ рд▓рд╛рдЧреВ рдирд╣реАрдВ рдХрд░рддрд╛ рд╣реИ Box<Error> рдХрд╛ рдЙрдкрдпреЛрдЧ рдирд╣реАрдВ рдХрд░ рд╕рдХрддрд╛ред рдореБрдЭреЗ рд▓рдЧрддрд╛ рд╣реИ рдХрд┐ рд╣рдореЗрдВ Debug рдореЗрдВ рдмрджрд▓рдиреЗ рдХреЛ рдкреНрд░рд╛рдердорд┐рдХрддрд╛ рджреЗрдиреА рдЪрд╛рд╣рд┐рдПред =)

рд╣рд╛рдп, @nikomatsakis ,

рдЬрдм рдореИрдВрдиреЗ termination_trait рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдиреЗ рдХрд╛ рдкреНрд░рдпрд╛рд╕ рдХрд┐рдпрд╛ рддреЛ рдореБрдЭреЗ рдмрд┐рд▓реНрдХреБрд▓ рд╡реИрд╕реА рд╣реА рдирд┐рд░рд╛рд╢рд╛ рд╣реБрдИ рдЬреИрд╕реА рдЖрдкрдиреЗ рдХреА рдереАред

рд╕рдВрдХрд▓рдХ рдкрд░ рд╣реИрдХрд┐рдВрдЧ рдкрд░ рдЖрдкрдХреА рдкреЛрд╕реНрдЯ рдХреЗ рд╕рд╛рде рд╕рдВрдпреБрдХреНрдд рд░реВрдк рд╕реЗ рдореБрдЭреЗ рдЗрд╕ рдорд╣реАрдиреЗ рдХреА рд╢реБрд░реБрдЖрдд рдореЗрдВ рдЗрд╕ рд╕рдорд╕реНрдпрд╛ рдкрд░ рдПрдХ рджрд░рд╛рд░ рд▓реЗрдиреЗ рдХреЗ рд▓рд┐рдП рдкреНрд░реЗрд░рд┐рдд рдХрд┐рдпрд╛ред рдореИрдВрдиреЗ рдпрд╣рд╛рдВ рдкрд░реАрдХреНрд╖рдгреЛрдВ рдХреЗ рд╕рд╛рде Display (рдФрд░ рдкрд┐рдЫрд▓реА рдкреНрд░рддрд┐рдмрджреНрдзрддрд╛ рдореЗрдВ Debug рдХреЗ рд▓рд┐рдП) рдХреЗ рд▓рд┐рдП рдЗрдореНрдкреНрд▓рд╛рдВрдЯ рдкреЛрд╕реНрдЯ рдХрд┐рдпрд╛ рд╣реИ: https://github.com/rust-lang/rust/pull/47544ред (рдпрд╣ рдмрд╣реБрдд рдорд╛рдореВрд▓реА рд╣реИ, рд▓реЗрдХрд┐рди рдлрд┐рд░ рднреА, рдореЗрд░рд╛ рдкрд╣рд▓рд╛ рд░рд╕реНрдЯ рдХрдВрдкрд╛рдЗрд▓рд░ рдкреАрдЖрд░!: рдЯрд╛рдбрд╛ :) :)

рдореЗрд░реА рд╕рдордЭ рдпрд╣ рд╣реИ рдХрд┐ рд▓реИрдВрдЧ рдЯреАрдо рдПрдХ рдХреЙрд▓ рдХрд░реЗрдЧреА рдХрд┐ рдХрд┐рд╕ рд╡рд┐рд╢реЗрд╖рддрд╛ рдХреЗ рд╕рд╛рде рдЬрд╛рдирд╛ рд╣реИ, рд▓реЗрдХрд┐рди рдХрд┐рд╕реА рднреА рддрд░рд╣ рд╕реЗ, рдХрд╛рд░реНрдпрд╛рдиреНрд╡рдпрди рдЬрд╛рдиреЗ рдХреЗ рд▓рд┐рдП рддреИрдпрд╛рд░ рд╣реИред

рдПрдХ рдкреНрд░рд╢реНрди рдЬрд┐рд╕рдореЗрдВ рдореБрдЭреЗ рдЕрднреА рднреА рджрд┐рд▓рдЪрд╕реНрдкреА рд╣реИ: рдорд╛рди рд▓реАрдЬрд┐рдП рдХрд┐ рдЖрдк рдбрд┐рдлрд╝реЙрд▓реНрдЯ рддреНрд░реБрдЯрд┐ рд╕рдВрджреЗрд╢ рдЖрдЙрдЯрдкреБрдЯ (рдЪрд╛рд╣реЗ Debug рдпрд╛ Display ) рдкрд░ рднрд░реЛрд╕рд╛ рдирд╣реАрдВ рдХрд░рдирд╛ рдЪрд╛рд╣рддреЗ рд╣реИрдВ, рдФрд░ рдЗрд╕рдХреЗ рдмрдЬрд╛рдп рдЕрдкрдирд╛ рдЦреБрдж рдХрд╛ рдЪрд╛рд╣рддреЗ рд╣реИрдВ, рдЖрдк рдХреИрд╕реЗ рдХрд░рддреЗ рд╣реИрдВ рд╡рд╣? (рдХреНрд╖рдорд╛ рдХрд░реЗрдВ рдпрджрд┐ рдпрд╣ рдкрд╣рд▓реЗ рд╕реЗ рд╣реА рдХрд╣реАрдВ рд▓рд┐рдЦрд╛ рд╣реБрдЖ рдерд╛ рдФрд░ рдореИрдВрдиреЗ рдЗрд╕реЗ рдпрд╛рдж рдХрд┐рдпрд╛ред) рдЖрдкрдХреЛ ? -in- main рдкреВрд░реА рддрд░рд╣ рд╕реЗ рдЙрдкрдпреЛрдЧ рдХрд░рдирд╛ рдмрдВрдж рдирд╣реАрдВ рдХрд░рдирд╛ рдкрдбрд╝реЗрдЧрд╛, рд╣реИ рдирд╛? рдпрд╣ рдЕрдкрдирд╛ рдкрд░рд┐рдгрд╛рдо рдФрд░/рдпрд╛ рддреНрд░реБрдЯрд┐ рдкреНрд░рдХрд╛рд░ рдФрд░/рдпрд╛ impl рд▓рд┐рдЦрдиреЗ рдЬреИрд╕рд╛ рдХреБрдЫ рд╣реИ? (рдпрд╣ рдореЗрд░реЗ рд▓рд┐рдП рджреБрд░реНрднрд╛рдЧреНрдпрдкреВрд░реНрдг рд▓рдЧрддрд╛ рд╣реИ рдпрджрд┐ ? -in- main рдХреЗрд╡рд▓ рдПрдХ рдЦрд┐рд▓реМрдирд╛ рдерд╛, рдФрд░ рдЬреИрд╕реЗ рд╣реА рдЖрдк "рдЧрдВрднреАрд░ рд╣реЛрдирд╛" рдЪрд╛рд╣рддреЗ рдереЗ, рдЖрдкрдХреЛ рдХрдо рдПрд░реНрдЧреЛрдиреЛрдорд┐рдХ рддрд░реАрдХреЛрдВ рдкрд░ рд╡рд╛рдкрд╕ рдЬрд╛рдирд╛ рд╣реЛрдЧрд╛ред)

@glaebhoerl рдпрд╣ рдмрд╣реБрдд рд╕реАрдзрд╛ рд╣реИ:

  1. рдПрдХ рдирдпрд╛ рдкреНрд░рдХрд╛рд░ рдмрдирд╛рдПрдБред
  2. From рдЕрдкрдиреЗ рдкреБрд░рд╛рдиреЗ рддреНрд░реБрдЯрд┐ рдкреНрд░рдХрд╛рд░ рдХреЛ рд▓рд╛рдЧреВ рдХрд░реЗрдВред
  3. Debug (рдпрд╛ Display ) рд▓рд╛рдЧреВ рдХрд░реЗрдВред
  4. рдкреНрд░рдХрд╛рд░ рдХреЛ 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 рдЬреИрд╕реЗ рдкреНрд░рдХрд╛рд░реЛрдВ рдХреЗ рд▓рд┐рдП рд╡рд┐рдзрд┐ рдХреНрдпрд╛ рд▓реМрдЯрд╛рдПрдЧреА? рдпрд╣ рдХреИрд╕реЗ рддрдп рд╣реЛрдЧрд╛ рдХрд┐ рдЗрд╕ рд╕рдВрджреЗрд╢ рдХреЛ рдХрдм рдЫрд╛рдкрдирд╛ рд╣реИ? рд╡рд░реНрддрдорд╛рди рдореЗрдВ Termination рдХреЗ рд▓рд┐рдП Result рдХрд╛ рдХрд╛рд░реНрдпрд╛рдиреНрд╡рдпрди, report рдлрд╝рдВрдХреНрд╢рди рдореЗрдВ рддреНрд░реБрдЯрд┐ рдкреНрд░рд┐рдВрдЯ рдХрд░рддрд╛ рд╣реИред рдпрд╣ рдХрд╛рдо рдХрд░рддрд╛ рд╣реИ, рдХреНрдпреЛрдВрдХрд┐ Result рдЬрд╛рдирддрд╛ рд╣реИ, рдХрд┐ рдпрд╣ рдПрдХ Err рд╣реИред рд╣рдо рдХрд╣реАрдВ рдПрдХ рдЪреЗрдХ report() != 0 рдХреЛ рдПрдХреАрдХреГрдд рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ рдФрд░ рдлрд┐рд░ рдкреНрд░рд┐рдВрдЯ рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ, рд▓реЗрдХрд┐рди рдпрд╣ рд╕рд╣реА рдирд╣реАрдВ рд▓рдЧрддрд╛ рд╣реИред
рдЕрдЧрд▓реА рд╕рдорд╕реНрдпрд╛ рдпрд╣ рд╣реЛрдЧреА рдХрд┐ рд╣рдо Result рдХреЗ рд▓рд┐рдП рдПрдХ рдорд╛рдирдХ рдХрд╛рд░реНрдпрд╛рдиреНрд╡рдпрди рдкреНрд░рджрд╛рди рдХрд░рдирд╛ рдЪрд╛рд╣рддреЗ рд╣реИрдВ, рд▓реЗрдХрд┐рди рд╕рдВрднрд╡рддрдГ рдореБрджреНрд░рд┐рдд рд╣реЛрдиреЗ рдХреЗ рд▓рд┐рдП Error рдкреНрд░рдХрд╛рд░ рдХреЛ рд▓рд╛рдЧреВ рдХрд░рдиреЗ рдХреА рдХреНрдпрд╛ рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реИ? рдпрд╣ рд╣рдореЗрдВ рд╡рд░реНрддрдорд╛рди рдкреНрд░рд╢реНрди Debug рдпрд╛ Display рдкрд░ рд╡рд╛рдкрд╕ рд▓рд╛рдПрдЧрд╛ред

рдПрдХ рдФрд░ рд╕рд┐рд░рджрд░реНрдж рдЬреЛ рдЖрддрд╛ рд╣реИ рдпрджрд┐ рдЖрдк "рдЧрдВрднреАрд░" рдХрд╛рд░реНрдпрдХреНрд░рдо рдореЗрдВ рдореБрдЦреНрдп рд░реВрдк рд╕реЗ ? рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдирд╛ рдЪрд╛рд╣рддреЗ рд╣реИрдВ, рддреЛ рдХреБрдЫ рдкрд░рд┐рд╕реНрдерд┐рддрд┐рдпреЛрдВ рдореЗрдВ, рдХрдорд╛рдВрдб-рд▓рд╛рдЗрди рдкреНрд░реЛрдЧреНрд░рд╛рдо рдЧреИрд░-рд╢реВрдиреНрдп рд╕реНрдерд┐рддрд┐ рд╕реЗ рдмрд╛рд╣рд░ рдирд┐рдХрд▓рдирд╛ рдЪрд╛рд╣рддреЗ рд╣реИрдВ рд▓реЗрдХрд┐рди _anything_ рдкреНрд░рд┐рдВрдЯ рдХрд┐рдП рдмрд┐рдирд╛ ( grep -q рдкрд░ рд╡рд┐рдЪрд╛рд░ рдХрд░реЗрдВ) Termination impl рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реИ рдЬреЛ _isn't_ рдПрдХ Error рд╣реИ, рдЬреЛ рдХреБрдЫ рднреА рдкреНрд░рд┐рдВрдЯ рдирд╣реАрдВ рдХрд░рддрд╛ рд╣реИ, рдЬреЛ рдЖрдкрдХреЛ рдмрд╛рд╣рд░ рдирд┐рдХрд▓рдиреЗ рдХреА рд╕реНрдерд┐рддрд┐ рдХреЛ рдирд┐рдпрдВрддреНрд░рд┐рдд рдХрд░рдиреЗ рджреЗрддрд╛ рд╣реИ ... рдФрд░ рдЖрдкрдХреЛ рдпрд╣ рддрдп рдХрд░рдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реИ рдХрд┐ рдЖрдк ' рдЙрд╕ рдЪреАрдЬрд╝ рдХреЛ рд╡рд╛рдкрд╕ рд▓реМрдЯрд╛рдирд╛ _after_ рдХрдорд╛рдВрдб рд▓рд╛рдЗрди рддрд░реНрдХреЛрдВ рдХреЛ рдкрд╛рд░реНрд╕ рдХрд░рдирд╛ред

рдореИрдВ рдРрд╕рд╛ рд╕реЛрдЪрддрд╛ рд╣реВрдВ:

рд╡рд╛рдкрд╕ Result<T, E> рдИ рдХреЗ рд▓рд┐рдП рдбрд┐рдмрдЧ рдЗрдВрдк рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдирд╛ рдЪрд╛рд╣рд┐рдПред рдпрд╣ рд╕рдмрд╕реЗ рд╕реБрд╡рд┐рдзрд╛рдЬрдирдХ рд╡рд┐рд╢реЗрд╖рддрд╛ рд╣реИ - рдпрд╣ рд╡реНрдпрд╛рдкрдХ рд░реВрдк рд╕реЗ рд▓рд╛рдЧреВ рдХрд┐рдпрд╛ рдЧрдпрд╛ рд╣реИ, рдФрд░ "рддреНрд╡рд░рд┐рдд рдФрд░ рдЧрдВрджреЗ рдЖрдЙрдЯрдкреБрдЯ" рдЙрдкрдпреЛрдЧ рдХреЗ рдорд╛рдорд▓реЗ рдХреЗ рд╕рд╛рде-рд╕рд╛рде рдпреВрдирд┐рдЯ рдкрд░реАрдХреНрд╖рдг рдЙрдкрдпреЛрдЧ рдорд╛рдорд▓реЗ рдХреЛ рднреА рд╕рдВрддреБрд╖реНрдЯ рдХрд░рддрд╛ рд╣реИред рдореИрдВ Display рджреЛрдиреЛрдВ рдХрд╛ рдЙрдкрдпреЛрдЧ рдирд╣реАрдВ рдХрд░рдирд╛ рдкрд╕рдВрдж рдХрд░реВрдВрдЧрд╛ рдХреНрдпреЛрдВрдХрд┐ рдпрд╣ рдХрдо рд╡реНрдпрд╛рдкрдХ рд░реВрдк рд╕реЗ рд▓рд╛рдЧреВ рдХрд┐рдпрд╛ рдЧрдпрд╛ рд╣реИ рдФрд░ рдХреНрдпреЛрдВрдХрд┐ рдЗрд╕рд╕реЗ рдпрд╣ рдЖрднрд╛рд╕ рд╣реЛрддрд╛ рд╣реИ рдХрд┐ рдпрд╣ рдкреЙрд▓рд┐рд╢ рдЖрдЙрдЯрдкреБрдЯ рд╣реИ, рдЬреЛ рдореБрдЭреЗ рд▓рдЧрддрд╛ рд╣реИ рдХрд┐ рдЕрддреНрдпрдзрд┐рдХ рд╕рдВрднрд╛рд╡рдирд╛ рдирд╣реАрдВ рд╣реИред

рд▓реЗрдХрд┐рди рдкреЗрд╢реЗрд╡рд░ рджрд┐рдЦрдиреЗ рд╡рд╛рд▓реЗ рдЖрдЙрдЯрдкреБрдЯ рдкреНрд░рд╛рдкреНрдд рдХрд░рдиреЗ рдХрд╛ рдПрдХ рддрд░реАрдХрд╛ рднреА рд╣реЛрдирд╛ рдЪрд╛рд╣рд┐рдПред рд╕реМрднрд╛рдЧреНрдп рд╕реЗ, рдкрд╣рд▓реЗ рд╕реЗ рд╣реА рдРрд╕реЗ рджреЛ рддрд░реАрдХреЗ рд╣реИрдВред рд╕рдмрд╕реЗ рдкрд╣рд▓реЗ, рдЬреИрд╕рд╛ рдХрд┐ @withboats рдиреЗ рдХрд╣рд╛, рд▓реЛрдЧ "рдбрд┐рд╕реНрдкреНрд▓реЗ-рдлреНрд░реЙрдо-рдбреАрдмрдЧ" рдмреНрд░рд┐рдЬ рдмрдирд╛ рд╕рдХрддреЗ рд╣реИрдВ рдпрджрд┐ рд╡реЗ E: Display рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдирд╛ рдЪрд╛рд╣рддреЗ рд╣реИрдВ рдпрд╛ рдЕрдиреНрдпрдерд╛ рдкреЗрд╢реЗрд╡рд░ рд╕реНрдЯрд╛рдЗрд▓ рдЖрдЙрдЯрдкреБрдЯ рджреЗрдирд╛ рдЪрд╛рд╣рддреЗ рд╣реИрдВред рд▓реЗрдХрд┐рди рдЕрдЧрд░ рдпрд╣ рдмрд╣реБрдд рд╣реИрдХреА рд▓рдЧрддрд╛ рд╣реИ, рддреЛ рдЖрдк рдкрд░рд┐рдгрд╛рдо рдХреЛ рдмрджрд▓рдиреЗ рдХреЗ рд▓рд┐рдП рдЕрдкрдирд╛ рдЦреБрдж рдХрд╛ рдкреНрд░рдХрд╛рд░ рднреА рдкрд░рд┐рднрд╛рд╖рд┐рдд рдХрд░ рд╕рдХрддреЗ рд╣реИрдВред рдЙрджрд╛рд╣рд░рдг рдХреЗ рд▓рд┐рдП, рдЖрдк рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ:

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

рдФрд░ рдлрд┐рд░ Try рдХреЗ рд▓рд┐рдП ProfessionalLookingResult рд▓рд╛рдЧреВ рдХрд░реЗрдВред рдлрд┐рд░ рдЖрдк Terminate рдХреЛ рднреА рд▓рд╛рдЧреВ рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ, рдЬреЛ рднреА рд╣реЛ:

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

рдореИрдВ @nikomatsakis рд╕реЗ рд╕рд╣рдордд рд╣реВрдВ рдХрд┐ рдЗрд╕реЗ Debug рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдирд╛ рдЪрд╛рд╣рд┐рдПред

рдореБрдЭреЗ рдпрд╣ рднреА рд▓рдЧрддрд╛ рд╣реИ рдХрд┐ рдкреЙрд▓рд┐рд╢ рдХрд┐рдП рдЧрдП рдЖрдЙрдЯрдкреБрдЯ рдХреЗ рд▓рд┐рдП, main рдореЗрдВ рдХреБрдЫ рдХреЛрдб рд▓рд┐рдЦрдирд╛ рд╢рд╛рдпрдж Try рдФрд░ Terminate рдХреЛ рд▓рд╛рдЧреВ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдПрдХ рдирдпрд╛ рдкреНрд░рдХрд╛рд░ рдмрдирд╛рдиреЗ рд╕реЗ рдмреЗрд╣рддрд░ рд╣реИред Terminate рдХрд╛ рдмрд┐рдВрджреБ рдореБрдЭреЗ рд▓рдЧрддрд╛ рд╣реИ рдХрд┐ рдкреБрд╕реНрддрдХрд╛рд▓рдп рдЖрд╕рд╛рдиреА рд╕реЗ рдПрдХ рдЕрдЪреНрдЫрд╛ рдбрд┐рдлрд╝реЙрд▓реНрдЯ рдмрдирд╛ рд╕рдХрддреЗ рд╣реИрдВ, рдЬреЛ рдХрд┐ рдРрд╕реА рд╕реНрдерд┐рддрд┐ рдХреЗ рд▓рд┐рдП рдХрднреА рднреА рдорд╛рдорд▓рд╛ рдирд╣реАрдВ рд╣реИ рдЬрд┐рд╕рдореЗрдВ рдкреНрд░реЛрдЧреНрд░рд╛рдо рд╕рдорд╛рдкреНрдд рд╣реЛрддрд╛ рд╣реИ рдЙрдкрдпреЛрдЧрдХрд░реНрддрд╛рдУрдВ рдХреЛ рд╕рдорд╛рдкреНрдд рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдорд╣рддреНрд╡рдкреВрд░реНрдг рд╣реИ (рдЙрджрд╛рд╣рд░рдг рдХреЗ рд▓рд┐рдП рдкреЗрд╢реЗрд╡рд░ рд╕реАрдПрд▓рдЖрдИ) .

рдмреЗрд╢рдХ рдЕрдиреНрдп рд▓реЛрдЧреЛрдВ рдХреА рдПрдХ рдЕрд▓рдЧ рд░рд╛рдп рд╣реЛ рд╕рдХрддреА рд╣реИ, рдФрд░ рдХреЛрдб рдХреЛ рд╕реАрдзреЗ main рдореЗрдВ рд▓рд┐рдЦрдиреЗ рдХреЗ рдмрдЬрд╛рдп рдХреЛрдб рдХреЛ рдЗрдВрдЬреЗрдХреНрдЯ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рд╢рд╛рдорд┐рд▓ рд▓рдХреНрд╖рдгреЛрдВ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдиреЗ рдХреЗ рдХрдИ рддрд░реАрдХреЗ рд╣реИрдВред рд╕рдмрд╕реЗ рдЕрдЪреНрдЫреА рдмрд╛рдд рдпрд╣ рд╣реИ рдХрд┐ рд╣рдорд╛рд░реЗ рдкрд╛рд╕ рдХрдИ рд╡рд┐рдХрд▓реНрдк рд╣реИрдВ рдФрд░ рд╣рдореЗрдВ рд╣рдореЗрд╢рд╛ рддреНрд░реБрдЯрд┐рдпреЛрдВ рдХреЛ рд╕рдВрднрд╛рд▓рдиреЗ рдХреЗ рд▓рд┐рдП рдПрдХ рд╣реА рдзрдиреНрдп рддрд░реАрдХреЗ рдХреЗ рд╕рд╛рде рдЖрдиреЗ рдХреА рдЬрд░реВрд░рдд рдирд╣реАрдВ рд╣реИред

рдореИрдВ рдХреБрдЫ рд╡рд┐рдЪрд╛рд░реЛрдВ рдХреЛ рд╕рдВрдХреНрд╖реЗрдк рдореЗрдВ рдмрддрд╛рддрд╛ рд╣реВрдВ, рд╣рд╛рд▓рд╛рдВрдХрд┐ рдЙрдирдХреЗ рд╕рд╛рде рдХреБрдЫ рд╕рдорд╕реНрдпрд╛рдПрдВ рд╣реИрдВред

рдореБрдЭреЗ рдирд┐рдореНрдирд▓рд┐рдЦрд┐рдд рджреЗрдЦрдирд╛ рдЕрдЪреНрдЫрд╛ рд▓рдЧреЗрдЧрд╛

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 рд▓рд╛рдЧреВ рдХрд░рддреЗ рд╣реИрдВред

рдпрд╣ рдПрдХ рджрд┐рд▓рдЪрд╕реНрдк рд╕рд╡рд╛рд▓ рд╣реИ рдХрд┐ ? рдХреЛ Option рдкрд░ рдореБрдЦреНрдп рд░реВрдк рд╕реЗ рдХреИрд╕реЗ рд╕рдВрднрд╛рд▓рдирд╛ рд╣реИ рдХреНрдпреЛрдВрдХрд┐ рдЙрдирдХреЗ рдкрд╛рд╕ Display рдХреЗ рд▓рд┐рдП рдХрд╛рд░реНрдпрд╛рдиреНрд╡рдпрди рдирд╣реАрдВ рд╣реИред

рдЯреАрдПрд▓; рдбреАрдЖрд░: рдореИрдВ Debug рдХреЗ рд╕рд╛рде рдареАрдХ рд╣реВрдВред

рдЕрдзрд┐рдХ рд╡рд┐рд╕реНрддреГрдд рд╕реНрдкрд╖реНрдЯреАрдХрд░рдг:
рдореИрдВрдиреЗ рдХрд▓ рдФрд░ рдЖрдЬ рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рд╕реЛрдЪрдиреЗ рдореЗрдВ рдХреБрдЫ рд╕рдордп рдмрд┐рддрд╛рдпрд╛, рдЬрд┐рд╕рдХрд╛ рдЙрджреНрджреЗрд╢реНрдп рдореЗрд░реЗ рдкрд╛рд╕ рдирд┐рд╣рд┐рдд рдзрд╛рд░рдгрд╛рдУрдВ рдХреЛ рдЙрдЬрд╛рдЧрд░ рдХрд░рдирд╛ рд╣реИ рдпрд╛ рд╕рд░реНрд╡реЛрддреНрддрдо рд╕рдВрднрд╡ рдЙрддреНрддрд░ рддрдХ рдкрд╣реБрдВрдЪрдиреЗ рдореЗрдВ рдорджрдж рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдХрд░ рд░рд╣рд╛ рд╣реВрдВред

рдореБрдЦреНрдп рдзрд╛рд░рдгрд╛: рд░рд╕реНрдЯ рдореЗрдВ рд▓рд┐рдЦреЗ рдЬрд╛ рд╕рдХрдиреЗ рд╡рд╛рд▓реЗ рд╕рднреА рд╡рд┐рднрд┐рдиреНрди рдкреНрд░рдХрд╛рд░ рдХреЗ рдЕрдиреБрдкреНрд░рдпреЛрдЧреЛрдВ рдореЗрдВ рд╕реЗ, рдореБрдЭреЗ рд▓рдЧрддрд╛ рд╣реИ рдХрд┐ рдХрдВрд╕реЛрд▓ рдРрдк рдЗрд╕ рдирд┐рд░реНрдгрдп рд╕реЗ рд╕рдмрд╕реЗ рдЕрдзрд┐рдХ рд▓рд╛рднрд╛рдиреНрд╡рд┐рдд/рд╕рдмрд╕реЗ рдЕрдзрд┐рдХ рдкреНрд░рднрд╛рд╡рд┐рдд рд╣реЛрдиреЗ рдХреЗ рд▓рд┐рдП рдЦрдбрд╝рд╛ рд╣реИред рдореЗрд░реА рд╕реЛрдЪ рдпрд╣ рд╣реИ рдХрд┐ рд▓рд╛рдЗрдмреНрд░реЗрд░реА, рдПрдПрдП рдЧреЗрдо рдЯрд╛рдЗрдЯрд▓, рдЖрдИрдбреАрдИ рдпрд╛ рдорд╛рд▓рд┐рдХрд╛рдирд╛ рдирд┐рдпрдВрддреНрд░рдг рдкреНрд░рдгрд╛рд▓реА рд▓рд┐рдЦрддреЗ рд╕рдордп, рд╢рд╛рдпрдж рдХрд┐рд╕реА рдХреЛ рдмреЙрдХреНрд╕ рд╕реЗ рдмрд╛рд╣рд░ рдХреА рдЬрд░реВрд░рдд рдХреЛ рдкреВрд░рд╛ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдПрдХ рдбрд┐рдлрд╝реЙрд▓реНрдЯ рдореБрдЦреНрдп рд╕рдорд╛рдкреНрддрд┐ рд╡рд┐рд╢реЗрд╖рддрд╛ рдХреА рдЙрдореНрдореАрдж рдирд╣реАрдВ рд╣реЛрдЧреА (рд╡рд╛рд╕реНрддрд╡ рдореЗрдВ, рдХрд┐рд╕реА рдХреЗ рдкрд╛рд╕ рдПрдХ рднреА рдирд╣реАрдВ рд╣реЛ рд╕рдХрддрд╛ рд╣реИ рдореБрдЦреНрдп)ред рддреЛ рдбрд┐рдлрд╝реЙрд▓реНрдЯ рд░реВрдк рд╕реЗ 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 рдХреЛ рд▓рд╛рдЧреВ рдХрд░рдиреЗ рд╕реЗ рд╢реБрджреНрдз рдмрдЪрдд рд╣реЛрддреАред

"рдкреНрд░рд╛рдердорд┐рдХ рд▓рд╛рднрд╛рд░реНрдереА рдХреНрд▓реА рдПрдкреНрд▓рд┐рдХреЗрд╢рди рд╣реИ" рдзрд╛рд░рдгрд╛ рдХреЛ рдзрд╛рд░рдг рдХрд░рддреЗ рд╣реБрдП, рдмрдбрд╝реА рд╕рдВрдЦреНрдпрд╛ рдореЗрдВ рдХрдВрд╕реЛрд▓ рдРрдк рд╣реИрдВ рдЬреЛ рд╕рд╣рд╛рдпрддрд╛ рдФрд░ рдЙрдкрдпреЛрдЧ рдХреА рдЬрд╛рдирдХрд╛рд░реА рдкреНрд░рджрд╛рди рдХрд░рддреЗ рд╣реИрдВред рдЙрджрд╛рд╣рд░рдг рдХреЗ рд▓рд┐рдП:

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

The most similar command is
    log

рддреЛ рдХрдВрд╕реЛрд▓ рдРрдкреНрд╕ рдХреЗ рд▓рд┐рдП рднреА, рдореЗрд░реЗ рд▓рд┐рдП Debug рдХреЗ рд╕рд╛рде рдЬрд╛рдХрд░ "рдШрд╛рдпрд▓ рд╕рдореВрд╣" рдХреА рдкрд╣рдЪрд╛рди рдХрд░рдирд╛ рдореБрд╢реНрдХрд┐рд▓ рд╣реИред

рдФрд░ рдЕрдВрдд рдореЗрдВ, рдореИрдВ Debug impl рдХреЗ рд╕рд╛рде рдФрд░ 6 рдорд╣реАрдиреЗ рдХреЗ рд▓рд┐рдП рдЖрдпреЛрдЬрд┐рдд рд╕реБрд╡рд┐рдзрд╛ рдХреЗ рдореБрдХрд╛рдмрд▓реЗ рдЬреНрдпрд╛рджрд╛ рдЦреБрд╢ рд░рд╣реВрдВрдЧрд╛, рдЗрд╕рд▓рд┐рдП, рд╕реНрд╡рд╛рд░реНрдереА рд░реВрдк рд╕реЗ, рд╡рд╣ рд╣реИ :)ред

рддреЛ рдореЗрд░реА рд╡рд┐рдЪрд╛рд░ рдкреНрд░рдХреНрд░рд┐рдпрд╛ рд╕рд╛рд░реНрд╡рдЬрдирд┐рдХ рд░реВрдк рд╕реЗ рд░рдЦреА рдЧрдИ рд╣реИред рд╕рдВрдХреНрд╖реЗрдк рдореЗрдВ, рдореБрдЭреЗ рд▓рдЧрддрд╛ рд╣реИ рдХрд┐ Debug Display рд╕реЗ рдмреЗрд╣рддрд░ рдФрд░ рдмрджрддрд░ рдирд╣реАрдВ рд╣реЛрдЧрд╛, рдФрд░ рдЗрд╕ рддрд░рд╣, рдбрд┐рдлрд╝реЙрд▓реНрдЯ рдХрд╛рд░реНрдпрд╛рдиреНрд╡рдпрди рдХреЗ рд░реВрдк рдореЗрдВ рдареАрдХ рд╣реЛрдирд╛ рдЪрд╛рд╣рд┐рдПред

рдЖрдк рдореЗрдВ рд╕реЗ рдХрдИ рд▓реЛрдЧреЛрдВ рдХреА рддрд░рд╣, рдореБрдЭреЗ рдпрдХреАрди рд╣реИ, рдореИрдВ рдЪрд╛рд╣рддрд╛ рд╣реВрдВ рдХрд┐ рдПрдХ рдХрд╛рд░реНрдпрд╛рдиреНрд╡рдпрди рдерд╛ рдЬрд┐рд╕рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рдореИрдВ рдФрд░ рдЕрдзрд┐рдХ рдЙрддреНрд╕рд╛рд╣рд┐рдд рдорд╣рд╕реВрд╕ рдХрд░ рд░рд╣рд╛ рдерд╛ - рдЬреИрд╕реЗ, "рд╣рд╛рдВ, рдпрд╣ рд╡рд╣реА рд╣реИ !!!", рдЯреАрдмреАрдПрдЪред рд▓реЗрдХрд┐рди рд╣реЛ рд╕рдХрддрд╛ рд╣реИ рдХрд┐ рдпрд╣ рд╕рд┐рд░реНрдл рдореЗрд░реА рдЙрдореНрдореАрджреЗрдВ рдЕрд╡рд╛рд╕реНрддрд╡рд┐рдХ рд╣реЛ... рд╣реЛ рд╕рдХрддрд╛ рд╣реИ рдХрд┐ рдПрдХ рдмрд╛рд░ рд╣рдорд╛рд░реЗ рдкрд╛рд╕ рдПрдХ рд╕рдорд╛рдзрд╛рди рд╣реЛ рдЬреЛ failure рдХреЗ рд╕рд╛рде рдореЗрд░реА рдкрд░рд┐рдпреЛрдЬрдирд╛рдУрдВ рдореЗрдВ рдмреЙрдпрд▓рд░рдкреНрд▓реЗрдЯ рдХреЛ рдХрд╛рдЯрдиреЗ рдХреЗ рд╕рд╛рде рдХрд╛рдо рдХрд░рддрд╛ рд╣реИ, рддреЛ рдпрд╣ рдореБрдЭ рдкрд░ рдмрдврд╝реЗрдЧрд╛ред :)

рдиреЛрдЯ рдореИрдВрдиреЗ рдкрд░реАрдХреНрд╖рдг рдореЗрдВ рдЯрд░реНрдорд┐рдиреЗрдЯрд┐рдпреЛ рд╡рд┐рд╢реЗрд╖рддрд╛ рдХрд╛ рд╕рдорд░реНрдерди рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдПрдХ рдкреАрдЖрд░ рдЦреЛрд▓рд╛: #48143 ( @bkchr рдХреЗ рдХрд╛рдо рдкрд░ рдирд┐рд░реНрдорд╛рдг)ред

рдореИрдВрдиреЗ рдкрд░реАрдХреНрд╖рдг рдХреЗ рдкрд░рд┐рдгрд╛рдо рдХреЛ рд╕рдВрд╕рд╛рдзрд┐рдд рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдПрдХ рд╡рд┐рдзрд┐ рдХреЗ рд╕рд╛рде Termination рд╡рд┐рд╢реЗрд╖рддрд╛ рдХрд╛ рд╡рд┐рд╕реНрддрд╛рд░ рдХрд░рдиреЗ рдХреА рд╕реНрд╡рддрдВрддреНрд░рддрд╛ рд▓реАред рдЗрд╕рдиреЗ рдХрд╛рд░реНрдпрд╛рдиреНрд╡рдпрди рдХреЛ рд╕рд░рд▓ рдмрдирд╛рдпрд╛, рд▓реЗрдХрд┐рди рдпрд╣ рднреА рд╕рдордЭ рдореЗрдВ рдЖрддрд╛ рд╣реИ, рдХреНрдпреЛрдВрдХрд┐ рдкрд░реАрдХреНрд╖рдг рд╡рд┐рдлрд▓рддрд╛рдУрдВ рдХреЛ рдирд┐рд╖реНрдкрд╛рджрди рдпреЛрдЧреНрдп рд╡рд┐рдлрд▓рддрд╛рдУрдВ рдХреА рддреБрд▓рдирд╛ рдореЗрдВ рдЕрдзрд┐рдХ рд╡рд░реНрдмреЛрдЬрд╝ рдЖрдЙрдЯрдкреБрдЯ рдЪрд╛рд╣рд┐рдПред

Termination рдХрд╛ рдирд╛рдо рдмрджрд▓рдХрд░ Terminate рдХрд░ рджрд┐рдпрд╛ рдЬрд╛рдирд╛ рдЪрд╛рд╣рд┐рдП рдХреНрдпреЛрдВрдХрд┐ libstd рдореЗрдВ рд▓рдХреНрд╖рдгреЛрдВ рдХреЗ рд▓рд┐рдП рдХреНрд░рд┐рдпрд╛рдУрдВ рдХреЗ рд▓рд┐рдП рд╣рдорд╛рд░реА рд╕рд╛рдорд╛рдиреНрдп рд╡рд░реАрдпрддрд╛ рдХреЗ рдмрд╛рджред

@withboats рдореБрдЭреЗ рд▓рдЧрддрд╛ рд╣реИ рдХрд┐ рдХрд┐рд╕реА рдмрд┐рдВрджреБ рдкрд░ рдПрдХ рдЪрд░реНрдЪрд╛ рд╣реБрдИ рдереА рдХрд┐ рдХреНрд░рд┐рдпрд╛ рд▓рдХреНрд╖рдг рдЕрдзрд┐рдХрддрд░ рд╡реЗ рд╣реЛрддреЗ рд╣реИрдВ рдЬрд┐рдирдХреЗ рдкрд╛рд╕ рдПрдХ рд╣реА рд╡рд┐рдзрд┐ рд╣реЛрддреА рд╣реИ рдЬрд┐рд╕рдореЗрдВ рд╡рд┐рд╢реЗрд╖рддрд╛ рдХреЗ рд╕рдорд╛рди рдирд╛рдо рд╣реЛрддрд╛ рд╣реИред рдХрд┐рд╕реА рднреА рддрд░рд╣, рдХреНрдпрд╛ рдореИрдВ рдЕрдкрдирд╛ рдЦреБрдж рдХрд╛ рдмрд╛рдЗрдХрд╢реЗрдб рд╕реБрдЭрд╛рд╡ рдлрд┐рд░ рд╕реЗ рддреИрд░ рд╕рдХрддрд╛ рд╣реВрдВ, Exit ?

рдЕрдирд╛рд╡рд╢реНрдпрдХ рдмрд╛рдЗрдХ рд╢реЗрдбрд┐рдВрдЧ: рдпрд╣ рдПрдХ рдПрдХрд▓-рд╡рд┐рдзрд┐ рд╡рд┐рд╢реЗрд╖рддрд╛ рд╣реИред рдЕрдЧрд░ рд╣рдо рдЙрдиреНрд╣реЗрдВ рд╡рд╣реА рдирд╛рдо рджреЗрдирд╛ рдЪрд╛рд╣рддреЗ рд╣реИрдВ, рддреЛ рд╢рд╛рдпрдж ToExitCode / to_exit_code ?

Result рдХреЛ рд╕реНрдерд┐рд░ рдХрд░рдирд╛ рд╡рд┐рд╢реЗрд╖рддрд╛ рдХреЛ рд╕реНрдерд┐рд░ рдХрд░рдиреЗ рд╕реЗ рд╕реНрд╡рддрдВрддреНрд░ рд░реВрдк рд╕реЗ рдХрд┐рдпрд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИ, рд╣реИ рдирд╛?

рдореЗрд░реЗ рд▓рд┐рдП, рдпрд╣ рдмрд╣реБрдд рдХреБрдЫ ? рдЬреИрд╕рд╛ рд▓рдЧрддрд╛ рд╣реИ, рдЬрд╣рд╛рдВ рдЕрдзрд┐рдХрд╛рдВрд╢ рдореВрд▓реНрдп рднрд╛рд╖рд╛ рдХреА рд╡рд┐рд╢реЗрд╖рддрд╛ рд╕реЗ рдЖрддрд╛ рд╣реИ, рдФрд░ рд╣рдо рд╡рд┐рд╢реЗрд╖рддрд╛ рдХрд╛ рдкрддрд╛ рд▓рдЧрд╛рдиреЗ рдореЗрдВ рджреЗрд░реА рдХрд░ рд╕рдХрддреЗ рд╣реИрдВред рдЖрд░рдПрдлрд╕реА рдЪрд░реНрдЪрд╛ рдиреЗ рдореБрдЭреЗ рдпрд╣ рднреА рдЖрд╢реНрдЪрд░реНрдпрдЪрдХрд┐рдд рдХрд░ рджрд┐рдпрд╛ рдХрд┐ рдХреНрдпрд╛ рд╡рд┐рд╢реЗрд╖рддрд╛ _ever_ рдХреЛ рд╕реНрдерд┐рд░ рдХрд░рдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реИ, рдХреНрдпреЛрдВрдХрд┐ рдХреЛрдб рдХреЛ inner_main рдореЗрдВ рдбрд╛рд▓рдиреЗ рд╕реЗ рдЗрд╕рдХреЗ рд▓рд┐рдП рдПрдХ рд╡рд┐рд╢реЗрд╖рддрд╛ рдирд┐рд╣рд┐рддрд╛рд░реНрде рд╕реЗ рдЖрд╕рд╛рди рд▓рдЧ рд░рд╣рд╛ рдерд╛ ...

рд╣рд╛рдВ, рд╣рдореЗрдВ рд╡рд┐рд╢реЗрд╖рддрд╛ рдХреЛ рд╕реНрдерд┐рд░ рдХрд░рдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рдирд╣реАрдВ рд╣реИ - рд╣рд╛рд▓рд╛рдВрдХрд┐ рдпрд╣ рдврд╛рдВрдЪреЗ рдЬреИрд╕реА рдЪреАрдЬреЛрдВ рдХреЗ рд▓рд┐рдП рд╕реНрдерд┐рд░ рдкрд░ рдЙрдкрдпреЛрдЧреА рд╣реИ, рдЬреЛ рдЬрд░реВрд░реА рдирд╣реАрдВ рдХрд┐ inner_main рдкрд░ рдЗрддрдирд╛ рднрд░реЛрд╕рд╛ рдХрд░ рд╕рдХреЗред

@SimonSapin рдореИрдВ рдПрдХ рдкреНрд░рдХрд╛рд░ рдХреЗ рд░реВрдкрд╛рдВрддрд░рдг рдХреЗ рд╕рдВрджрд░реНрдн рдореЗрдВ To рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рд╕реЛрдЪрддрд╛ рд╣реВрдВ, рдФрд░ рдРрд╕рд╛ рдирд╣реАрдВ рд╣реИред рд▓реЗрдХрд┐рди рд╣рдо рд╡рд┐рдзрд┐ рдХреЛ terminate рдирд╛рдо рджреЗ рд╕рдХрддреЗ рд╣реИрдВ (рдореБрдЭреЗ рдирд╣реАрдВ рд▓рдЧрддрд╛ рдХрд┐ рдпрд╣ рдкреНрд░рддрд┐рдмрдВрдз рдХрдм рд▓рдХреНрд╖рдг рдХреНрд░рд┐рдпрд╛рдУрдВ рдХреЛ рдирд╛рдо рджреЗрдирд╛ рд╣реИред Try рдПрдХ рд╕реНрдкрд╖реНрдЯ рдХрд╛рдЙрдВрдЯрд░ рдЙрджрд╛рд╣рд░рдг рд╣реИред)

рдореИрдВрдиреЗ рдкреНрд░рд╕реНрддрд╛рд╡ рджрд┐рдпрд╛ рд╣реИ рдХрд┐ рд╣рдо fn main() -> T рдХреЛ рд╕реНрдерд┐рд░ рдХрд░реЗрдВ рдЬрд╣рд╛рдВ T рдЗрдХрд╛рдИ рдирд╣реАрдВ рд╣реИред рдпрд╣ рдХрдИ рд╡рд┐рд╡рд░рдг рдЫреЛрдбрд╝ рджреЗрддрд╛ рд╣реИ - рд╡рд┐рд╢реЗрд╖ рд░реВрдк рд╕реЗ рд╡рд┐рд╢реЗрд╖рддрд╛ рдХрд╛ рдирд╛рдо/рд╕реНрдерд╛рди/рд╡рд┐рд╡рд░рдг - рдЕрд╕реНрдерд┐рд░, рд▓реЗрдХрд┐рди рдХреБрдЫ рдЪреАрдЬреЗрдВ рддрдп рдХреА рдЬрд╛рддреА рд╣реИрдВред рдпрд╣рд╛рдВ рд╡рд┐рд╡рд░рдг:

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

рдХреГрдкрдпрд╛ рдЕрдкрдиреА рдкреНрд░рддрд┐рдХреНрд░рд┐рдпрд╛ рджреЗрдВ!

terminate рдХреА рддреБрд▓рдирд╛ рдореЗрдВ report #$0$#$ рдЕрдзрд┐рдХ рд╡рд░реНрдгрдирд╛рддреНрдордХ рдкреНрд░рддреАрдд рд╣реЛрддрд╛ рд╣реИред рд╣рдо рд╣рдореЗрд╢рд╛ terminate , рд▓реЗрдХрд┐рди report рдЖрдИрдПрдирдЬреА рдХреЛ рдЫреЛрдбрд╝ рд╕рдХрддреЗ рд╣реИрдВред

рд▓реЗрдХрд┐рди рдЙрджрд╛рд╣рд░рдг рдХреЗ рд╡рд┐рдкрд░реАрдд std::process::exit рдпрд╣ рд╡рд┐рдзрд┐ рдХреБрдЫ рднреА рд╕рдорд╛рдкреНрдд рдирд╣реАрдВ рдХрд░рддреА рд╣реИред рдпрд╣ рдХреЗрд╡рд▓ main() рдХреЗ рд╡рд╛рдкрд╕реА рдореВрд▓реНрдп рдХреЛ рдПрдХ рдирд┐рдХрд╛рд╕ рдХреЛрдб рдореЗрдВ рдкрд░рд┐рд╡рд░реНрддрд┐рдд рдХрд░рддрд╛ рд╣реИ (рд╡реИрдХрд▓реНрдкрд┐рдХ рд░реВрдк рд╕реЗ Result::Err рдХреЛ stderr рдкрд░ рдкреНрд░рд┐рдВрдЯ рдХрд░рдиреЗ рдХреЗ рдмрд╛рдж)ред

Exit рдХреЗ рд▓рд┐рдП рдПрдХ рдФрд░ рд╡реЛрдЯред рдореБрдЭреЗ рдпрд╣ рдкрд╕рдВрдж рд╣реИ рдХрд┐ рдпрд╣ рд╕рдВрдХреНрд╖рд┐рдкреНрдд, рдХрд╛рдлреА рд╡рд░реНрдгрдирд╛рддреНрдордХ рдФрд░ рдирд┐рдХрд╛рд╕ рдХреЛрдб/рдирд┐рдХрд╛рд╕ рд╕реНрдерд┐рддрд┐ рдХреА рдкрд╛рд░рдВрдкрд░рд┐рдХ рдЕрд╡рдзрд╛рд░рдгрд╛ рдХреЗ рдЕрдиреБрд░реВрдк рд╣реИред

рдореИрдВ рдирд┐рд╢реНрдЪрд┐рдд рд░реВрдк рд╕реЗ Exit рд╕реЗ рдЕрдзрд┐рдХ Terminate рдХреЛ рддрд░рдЬреАрд╣ рджреВрдВрдЧрд╛ рдХреНрдпреЛрдВрдХрд┐ рд╣рдо рдореБрдЦреНрдп рд╕реЗ рд▓реМрдЯрдХрд░ рдЗрдирд╛рдпрдд рд╕реЗ рдмрд╛рд╣рд░ рдирд┐рдХрд▓ рд░рд╣реЗ рд╣реИрдВ, рдмрдЬрд╛рдп рдЗрд╕рдХреЗ рдХрд┐ рд╣рдо рдЕрдЪрд╛рдирдХ рдХрдард┐рди рд╕рдорд╛рдкреНрддрд┐ рдХреЗ рдмрдЬрд╛рдп рдЬрд╣рд╛рдВ рдХреБрдЫ рд╡рд╛рд╕реНрддрд╡ рдореЗрдВ рдЧрд▓рдд рд╣реЛ рдЧрдпрд╛ рдерд╛ред

рдореИрдВрдиреЗ рдкрд░рд┐рдгрд╛рдо рд▓реМрдЯрд╛рдиреЗ рд╡рд╛рд▓реЗ рдпреВрдирд┐рдЯ рдкрд░реАрдХреНрд╖рдгреЛрдВ рдХреЛ рд╕реНрдерд┐рд░ рдХрд░рдиреЗ рдХрд╛ рдкреНрд░рд╕реНрддрд╛рд╡ рджреЗрдиреЗ рдХреЗ рд▓рд┐рдП https://github.com/rust-lang/rust/issues/48854 рдЬреЛрдбрд╝рд╛ред

рдЕрд░реЗ, рдореБрдЭреЗ рдЗрд╕ рдмрд╛рд░реЗ рдореЗрдВ рдмрд╛рдд рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рд╕рд╣реА рдЬрдЧрд╣ рдорд┐рд▓ рдЧрдИ рд╣реИред

рд╕рд┐рджреНрдзрд╛рдВрддреЛрдВ рдореЗрдВ ? рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдирд╛

рд╡рд░реНрддрдорд╛рди рдореЗрдВ doctests рдХреЗ рдХрд╛рд░реНрдп рдХрд░рдиреЗ рдХрд╛ рддрд░реАрдХрд╛ рдХреБрдЫ рдЗрд╕ рдкреНрд░рдХрд╛рд░ рд╣реИ:

  • рд░рд╕реНрдЯрдбреЙрдХ рдЗрд╕ рдмрд╛рдд рдХреА рдЬрд╛рдВрдЪ рдХрд░рддрд╛ рд╣реИ рдХрд┐ рдпрд╣ fn main . рдШреЛрд╖рд┐рдд рдХрд░рддрд╛ рд╣реИ рдпрд╛ рдирд╣реАрдВ

    • (рд╡рд░реНрддрдорд╛рди рдореЗрдВ рдпрд╣ рдХреЗрд╡рд▓ "fn main" рдХреЗ рд▓рд┐рдП рдПрдХ рдкрдВрдХреНрддрд┐-рджрд░-рдкрдВрдХреНрддрд┐ рдкрд╛рда рдЦреЛрдЬ рдХрд░рддрд╛ рд╣реИ рдЬреЛ // рдХреЗ рдмрд╛рдж рдирд╣реАрдВ рд╣реИ)

  • рдЕрдЧрд░ fn main рдорд┐рд▓рд╛, рддреЛ рдпрд╣ рдкрд╣рд▓реЗ рд╕реЗ рдореМрдЬреВрдж рдЪреАрдЬрд╝реЛрдВ рдХреЛ рдирд╣реАрдВ рдЫреВрдПрдЧрд╛
  • рдпрджрд┐ fn main рдирд╣реАрдВ рдорд┐рд▓рд╛, рддреЛ рдпрд╣ рдЕрдзрд┐рдХрд╛рдВрд╢* рд╕рд┐рджреНрдзрд╛рдВрдд рдХреЛ рдореВрд▓ fn main() { } рдореЗрдВ рд▓рдкреЗрдЯ рджреЗрдЧрд╛

    • *рдкреВрд░реНрдг рд╕рдВрд╕реНрдХрд░рдг: рдпрд╣ #![inner_attributes] рдФрд░ extern crate рдШреЛрд╖рдгрд╛рдУрдВ рдХреЛ рдирд┐рдХрд╛рд▓реЗрдЧрд╛ рдФрд░ рдЙрдиреНрд╣реЗрдВ рдЬреЗрдирд░реЗрдЯ рдХрд┐рдП рдЧрдП рдореБрдЦреНрдп рдлрд╝рдВрдХреНрд╢рди рдХреЗ рдмрд╛рд╣рд░ рд░рдЦреЗрдЧрд╛, рд▓реЗрдХрд┐рди рдмрд╛рдХреА рд╕рдм рдХреБрдЫ рдЕрдВрджрд░ рдЪрд▓рд╛ рдЬрд╛рдПрдЧрд╛ред

  • рдпрджрд┐ doctest рдореЗрдВ рдХреЛрдИ рдмрд╛рд╣рд░реА рдХреНрд░реЗрдЯ рд╕реНрдЯреЗрдЯрдореЗрдВрдЯ рд╢рд╛рдорд┐рд▓ рдирд╣реАрдВ рд╣реИ (рдФрд░ рдЬрд┐рд╕ рдХреНрд░реЗрдЯ рдХреЛ рдкреНрд░рд▓реЗрдЦрд┐рдд рдХрд┐рдпрд╛ рдЬрд╛ рд░рд╣рд╛ рд╣реИ рдЙрд╕реЗ std рдирд╣реАрдВ рдХрд╣рд╛ рдЬрд╛рддрд╛ рд╣реИ) рддреЛ рд░рд╕реНрдЯрдбреЙрдХ рдЬреЗрдирд░реЗрдЯ рдХрд┐рдП рдЧрдП рдореБрдЦреНрдп рдлрд╝рдВрдХреНрд╢рди рд╕реЗ рдареАрдХ рдкрд╣рд▓реЗ extern crate my_crate; рд╕реНрдЯреЗрдЯрдореЗрдВрдЯ рднреА рд╕рдореНрдорд┐рд▓рд┐рдд рдХрд░реЗрдЧрд╛ред
  • рд░рд╕реНрдЯрдбреЙрдХ рддрдм рдкрд░реАрдХреНрд╖рдг рд╣рд╛рд░реНрдиреЗрд╕ рдХреЗ рд╣рд┐рд╕реНрд╕реЗ рдХреЗ рд░реВрдк рдореЗрдВ рдЕрдВрддрд┐рдо рдкрд░рд┐рдгрд╛рдо рдХреЛ рдПрдХ рд╕реНрдЯреИрдВрдбрдЕрд▓реЛрди рдмрд╛рдЗрдирд░реА рдХреЗ рд░реВрдк рдореЗрдВ рд╕рдВрдХрд▓рд┐рдд рдХрд░рддрд╛ рд╣реИ рдФрд░ рдЪрд▓рд╛рддрд╛ рд╣реИред

(рдореИрдВрдиреЗ рдХреБрдЫ рд╡рд┐рд╡рд░рдг рдЫреЛрдбрд╝реЗ рд╣реИрдВ, рд▓реЗрдХрд┐рди рдореИрдВрдиреЗ рдЖрд╕рд╛рдиреА рд╕реЗ рдпрд╣рд╛рдВ рдПрдХ рдкреВрд░реНрдг рд▓реЗрдЦрди рдХрд┐рдпрд╛ рд╣реИред)

рдЗрд╕рд▓рд┐рдП, рдПрдХ рд╕рд┐рджреНрдзрд╛рдВрдд рдореЗрдВ ? рдХреЛ рдореВрд▓ рд░реВрдк рд╕реЗ рдЙрдкрдпреЛрдЧ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП, рдЬрд┐рд╕ рдмрд┐рдЯ рдХреЛ рдмрджрд▓рдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реИ рд╡рд╣ рд╡рд╣ рд╣рд┐рд╕реНрд╕рд╛ рд╣реИ рдЬрд╣рд╛рдВ рдпрд╣ fn main() { your_code_here(); } рдЬреЛрдбрд╝рддрд╛ рд╣реИ рдЕрдкрдиреЗ рд╕реНрд╡рдпрдВ рдХреЗ fn main() -> Result<(), Error> $ рдХреА рдШреЛрд╖рдгрд╛ рдХрд░рдирд╛ рдЬрд┐рддрдиреА рдЬрд▓реНрджреА рд╣реЛ рд╕рдХреЗ рдХрд╛рдо рдХрд░реЗрдЧрд╛ рдХрд┐ рдирд┐рдпрдорд┐рдд рдХреЛрдб рдореЗрдВ - rustdoc рдХреЛ рд╡рд╣рд╛рдВ рд╕рдВрд╢реЛрдзрд┐рдд рдХрд░рдиреЗ рдХреА рднреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рдирд╣реАрдВ рд╣реИред рд╣рд╛рд▓рд╛рдБрдХрд┐, рдЗрд╕реЗ рдореИрдиреНрдпреБрдЕрд▓ рд░реВрдк рд╕реЗ рдореБрдЦреНрдп рдШреЛрд╖рд┐рдд рдХрд┐рдП рдмрд┐рдирд╛ рдХрд╛рдо рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдПрдХ рдЫреЛрдЯреЗ рд╕реЗ рдЯреНрд╡реАрдХ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реЛрдЧреАред рдЗрд╕ рд╕реБрд╡рд┐рдзрд╛ рдХрд╛ рдмрд╛рд░реАрдХреА рд╕реЗ рдкрд╛рд▓рди рдирд╣реАрдВ рдХрд░рдиреЗ рдХреЗ рдмрд╛рдж, рдореБрдЭреЗ рдпрдХреАрди рдирд╣реАрдВ рд╣реИ рдХрд┐ рдПрдХ рдЖрдХрд╛рд░-рдлрд┐рдЯ-рд╕рднреА рд╕рдорд╛рдзрд╛рди рд╣реИ рдпрд╛ рдирд╣реАрдВред рдХреНрдпрд╛ 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 рдореЗрдВ рдЖрдВрддрд░рд┐рдХ рд░реВрдк рд╕реЗ рдЙрдкрдпреЛрдЧ рдХрд░ рд╕рдХрддрд╛ рд╣реИ, рд▓реЗрдХрд┐рди рдореЗрд░реА рдпрд╛рдж рд╣реИ рдХрд┐ рдЗрд╕ рддрд░рд╣ рдХреА рд╕реБрд╡рд┐рдзрд╛ рдХрд╛ рд╡рд┐рдЪрд╛рд░ рдЙрди рд▓реЛрдЧреЛрдВ рдХреЛ рдмрдирд╛рддрд╛ рд╣реИ рдЬреЛ рд╕рдордЭрддреЗ рд╣реИрдВ рдХрд┐ рдЪреАрдЬреЗрдВ рдХреИрд╕реЗ рдбрд░рд╛рд╡рдиреА рдХрд╛рдо рдХрд░рддреА рд╣реИрдВ: рдкрд╕реАрдирд╛_рд╕реНрдорд╛рдЗрд▓: рд▓реЗрдХрд┐рди рд╢рд╛рдпрдж рдпрд╣ рдПрдХ рдЖрдВрддрд░рд┐рдХ рдЪреАрдЬ рд╣реИ рдЬреЛ рдХреЗрд╡рд▓ рддрднреА рд▓рд╛рдЧреВ рд╣реЛрддреА рд╣реИ рдЬрдм рдЖрдЙрдЯрдкреБрдЯ impl Trait рд╕рдВрднрд╡ рд╣реЛрдЧрд╛ ...

рдУрд╣, рд╡реЗ рдмрд╣реБрдд рд╡рд╛рд╕реНрддрд╡рд┐рдХ рдЪрд┐рдВрддрд╛рдПрдБ рд╣реИрдВред рдореИрдВ рдЗрд╕ рдмрд╛рд░реЗ рдореЗрдВ рднреВрд▓ рдЧрдпрд╛ рдерд╛ рдХрд┐ рдпрд╣ рдХреИрд╕реЗ рдкреНрд░рдХрд╛рд░ рдХреЗ рдЕрдиреБрдорд╛рди рдХреЛ рдЧрдбрд╝рдмрдбрд╝ рдХрд░ рджреЗрдЧрд╛ред рдпрджрд┐ рдХреИрдЪ рдмреНрд▓реЙрдХ рдиреЗ рдЙрд╕ рд▓рд┐рдВрдХреНрдб рдЗрд╢реНрдпреВ рдХреА рддрд░рд╣ рдУрдХреЗ-рд░реИрдкрд┐рдВрдЧ рд╢реБрд░реВ рдХрд░ рджреА рд╣реИ, рддреЛ рдпрд╣ рдмрд╣реБрдд рдЖрд╕рд╛рди (рдФрд░ рдмрд╣реБрдд рддреЗрдЬ, рд╕реНрдерд┐рд░реАрдХрд░рдг-рд╡рд╛рд░) рдЖрдЧреЗ рдмрдврд╝рдиреЗ рд╡рд╛рд▓рд╛ рд░рд╛рд╕реНрддрд╛ рд▓рдЧрддрд╛ рд╣реИред

рдореБрдЭреЗ рдЖрд╢реНрдЪрд░реНрдп рд╣реИ рдХрд┐ рдХреЗрд╡рд▓ рдПрдХ рдЪреАрдЬ рдпрд╣ рд╣реИ рдХрд┐ рдпрд╣ рд╕рдВрд╕реНрдХрд░рдг рд╕рдВрдХреНрд░рдордг рд╕реЗ рдХреИрд╕реЗ рдкреНрд░рднрд╛рд╡рд┐рдд рд╣реЛрдЧрд╛ред рдХреНрдпрд╛ 2018 рдХреЗ рдпреБрдЧ рдореЗрдВ catch рд╕рд┐рдВрдЯреИрдХреНрд╕ рдирд╣реАрдВ рдмрджрд▓ рд░рд╣рд╛ рд╣реИ? Rustdoc рд╕рдВрднрд╡рддрдГ рдЙрд╕реА рд╕рдВрд╕реНрдХрд░рдг рдореЗрдВ рд╕рд┐рджреНрдзрд╛рдВрддреЛрдВ рдХреЛ рд╕рдВрдХрд▓рд┐рдд рдХрд░рдирд╛ рдЪрд╛рд╣реЗрдЧрд╛ рдЬрд┐рд╕ рдкреБрд╕реНрддрдХрд╛рд▓рдп рдореЗрдВ рд╡рд╣ рдЪрд▓ рд░рд╣рд╛ рд╣реИ, рдЗрд╕рд▓рд┐рдП рдЗрд╕реЗ рдпреБрдЧ рдзреНрд╡рдЬ рдХреЗ рдЖрдзрд╛рд░ рдкрд░ рд╕рд┐рдВрдЯреИрдХреНрд╕ рдХреЗ рдмреАрдЪ рдЕрдВрддрд░ рдХрд░рдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реЛрдЧреАред

рдореБрдЭреЗ рдЪрд┐рдВрддрд╛ рд╣реИ рдХрд┐ рдпрд╣ рдЕрдм рд╕реНрдерд┐рд░ рд╣реЛ рдЧрдпрд╛ рд╣реИ рд▓реЗрдХрд┐рди рд╕рд╛рдзрд╛рд░рдг рдорд╛рдорд▓реЗ рд╕реНрдкрд╖реНрдЯ рд░реВрдк рд╕реЗ рдЕрднреА рднреА 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 рд╕рдВрджреЗрд╢ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдирд╛ рдПрдХ рдмреЗрд╣рддрд░ рд╡рд┐рдХрд▓реНрдк рд╣реЛрдЧрд╛ред

рдореЗрд░реЗ рд╡рд┐рд╢реНрд╡рд╛рд╕ рдХреЗ рдореВрд▓ рдореЗрдВ рдпрд╣ рд╣реИ рдХрд┐, рдЬреЛ рдХреЛрдИ _рд░реВрд╕реНрдЯ_ рдореЗрдВ _рдирд┐рдпрдорд┐рдд рд░реВрдк рд╕реЗ рд╕реАрдПрд▓рдЖрдИ рдкреНрд░реЛрдЧреНрд░рд╛рдо рдмрдирд╛рддрд╛ рд╣реИ, рдореБрдЭреЗ рдХрднреА рднреА рдЗрд╕ рдмрд╛рд░реЗ рдореЗрдВ рдЕрдзрд┐рдХ рдзреНрдпрд╛рди рджреЗрдиреЗ рдХреА рдпрд╛рдж рдирд╣реАрдВ рдЖрддреА рдХрд┐ $#$ Error $#$ рдХрд╛ Debug рд╕рдВрджреЗрд╢ рдХреНрдпрд╛ рд╣реИред рдЕрд░реНрдерд╛рддреН, рддреНрд░реБрдЯрд┐ рдХрд╛ Debug рдбрд┐рдЬрд╝рд╛рдЗрди рджреНрд╡рд╛рд░рд╛, рдбреЗрд╡рд▓рдкрд░реНрд╕ рдХреЗ рд▓рд┐рдП рд╣реИ, рди рдХрд┐ рдЕрдВрддрд┐рдо рдЙрдкрдпреЛрдЧрдХрд░реНрддрд╛рдУрдВ рдХреЗ рд▓рд┐рдПред рдЬрдм рдЖрдк рдПрдХ рд╕реАрдПрд▓рдЖрдИ рдкреНрд░реЛрдЧреНрд░рд╛рдо рдмрдирд╛рддреЗ рд╣реИрдВ, рддреЛ рдЗрд╕рдХрд╛ рдЗрдВрдЯрд░рдлрд╝реЗрд╕ рдореВрд▓ рд░реВрдк рд╕реЗ рдЕрдВрддрд┐рдо рдЙрдкрдпреЛрдЧрдХрд░реНрддрд╛рдУрдВ рджреНрд╡рд╛рд░рд╛ рдкрдврд╝рдиреЗ рдХреЗ рд▓рд┐рдП рд╣реЛрддрд╛ рд╣реИ, рдЗрд╕рд▓рд┐рдП Debug рд╕рдВрджреЗрд╢ рдХреА рдпрд╣рд╛рдВ рдмрд╣реБрдд рдХрдо рдЙрдкрдпреЛрдЧрд┐рддрд╛ рд╣реИред рдпрд╣реА рд╣реИ, рдЕрдЧрд░ рдореИрдВрдиреЗ рдЕрдВрддрд┐рдо рдЙрдкрдпреЛрдЧрдХрд░реНрддрд╛рдУрдВ рдХреЛ рднреЗрдЬреЗ рдЧрдП рдХрд┐рд╕реА рднреА рд╕реАрдПрд▓рдЖрдИ рдкреНрд░реЛрдЧреНрд░рд╛рдо рдХреЛ рд╕рд╛рдорд╛рдиреНрдп рдСрдкрд░реЗрд╢рди рдореЗрдВ рдЬрдВрдЧ рдорд╛рди рдХрд╛ рдбреАрдмрдЧ рдкреНрд░рддрд┐рдирд┐рдзрд┐рддреНрд╡ рджрд┐рдЦрд╛рдпрд╛ рд╣реИ, рддреЛ рдореИрдВ рдПрдХ рдмрдЧ рдХреЛ рдареАрдХ рдХрд░рдиреЗ рдкрд░ рд╡рд┐рдЪрд╛рд░ рдХрд░реВрдВрдЧрд╛ред рдореБрдЭреЗ рдЖрдо рддреМрд░ рдкрд░ рд▓рдЧрддрд╛ рд╣реИ рдХрд┐ рдпрд╣ рд░рд╕реНрдЯ рдореЗрдВ рд▓рд┐рдЦреЗ рдЧрдП рдкреНрд░рддреНрдпреЗрдХ рд╕реАрдПрд▓рдЖрдИ рдХрд╛рд░реНрдпрдХреНрд░рдо рдХреЗ рд▓рд┐рдП рд╕рд╣реА рд╣реЛрдирд╛ рдЪрд╛рд╣рд┐рдП, рд╣рд╛рд▓рд╛рдВрдХрд┐ рдореИрдВ рд╕рдордЭрддрд╛ рд╣реВрдВ рдХрд┐ рдпрд╣ рдПрдХ рдРрд╕рд╛ рдмрд┐рдВрджреБ рд╣реЛ рд╕рдХрддрд╛ рд╣реИ рдЬрд┐рд╕ рдкрд░ рдЙрдЪрд┐рдд рд▓реЛрдЧ рдЕрд╕рд╣рдордд рд╣реЛ рд╕рдХрддреЗ рд╣реИрдВред рдЗрд╕рдХреЗ рд╕рд╛рде рд╣реА, рдореЗрд░реА рд░рд╛рдп рдХрд╛ рдХреБрдЫ рдЪреМрдВрдХрд╛рдиреЗ рд╡рд╛рд▓рд╛ рдирд┐рд╣рд┐рддрд╛рд░реНрде рдпрд╣ рд╣реИ рдХрд┐ рд╣рдордиреЗ рдПрдХ рдРрд╕реА рд╕реБрд╡рд┐рдзрд╛ рдХреЛ рдкреНрд░рднрд╛рд╡реА рдврдВрдЧ рд╕реЗ рд╕реНрдерд┐рд░ рдХрд░ рджрд┐рдпрд╛ рд╣реИ рдЬрд╣рд╛рдВ рдЗрд╕рдХреЗ рд╕рдВрдЪрд╛рд▓рди рдХрд╛ рдбрд┐рдлрд╝реЙрд▓реНрдЯ рдореЛрдб рдЖрдкрдХреЛ рдПрдХ рдмрдЧ (рдлрд┐рд░ рд╕реЗ, рдЖрдИрдПрдордУ) рд╕реЗ рд╢реБрд░реВ рдХрд░рддрд╛ рд╣реИ рдЬрд┐рд╕реЗ рдареАрдХ рдХрд┐рдпрд╛ рдЬрд╛рдирд╛ рдЪрд╛рд╣рд┐рдПред

рдбрд┐рдлрд╝реЙрд▓реНрдЯ рд░реВрдк рд╕реЗ Debug рддреНрд░реБрдЯрд┐ рдХрд╛ рдкреНрд░рддрд┐рдирд┐рдзрд┐рддреНрд╡ рджрд┐рдЦрд╛рдХрд░, рдореБрдЭреЗ рдпрд╣ рднреА рд▓рдЧрддрд╛ рд╣реИ рдХрд┐ рд╣рдо рдЦрд░рд╛рдм рдЕрднреНрдпрд╛рд╕ рдХреЛ рдкреНрд░реЛрддреНрд╕рд╛рд╣рд┐рдд рдХрд░ рд░рд╣реЗ рд╣реИрдВред рд╡рд┐рд╢реЗрд╖ рд░реВрдк рд╕реЗ, рд░рд╕реНрдЯ рд╕реАрдПрд▓рдЖрдИ рдХрд╛рд░реНрдпрдХреНрд░рдо рд▓рд┐рдЦрдиреЗ рдХреЗ рджреМрд░рд╛рди рдпрд╣ рджреЗрдЦрдирд╛ рдмрд╣реБрдд рдЖрдо рд╣реИ рдХрд┐ рддреНрд░реБрдЯрд┐ рдХрд╛ Display рднреА рдЕрдВрдд рдЙрдкрдпреЛрдЧрдХрд░реНрддрд╛рдУрдВ рджреНрд╡рд╛рд░рд╛ рдЙрдкрднреЛрдЧ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдкрд░реНрдпрд╛рдкреНрдд рдирд╣реАрдВ рд╣реИ, рдФрд░ рдпрд╣ рд╡рд╛рд╕реНрддрд╡рд┐рдХ рдХрд╛рд░реНрдп рдХрд┐рдпрд╛ рдЬрд╛рдирд╛ рдЪрд╛рд╣рд┐рдП рдЗрд╕реЗ рдареАрдХ рдХрд░реЗрдВред рдЗрд╕рдХрд╛ рдПрдХ рдареЛрд╕ рдЙрджрд╛рд╣рд░рдг рд╣реИ io::Error ред рдПрдХ рд╕рдВрдмрдВрдзрд┐рдд рдлрд╝рд╛рдЗрд▓ рдкрде рдХреЗ рдмрд┐рдирд╛ io::Error рджрд┐рдЦрд╛рдирд╛ (рдпрд╣ рдорд╛рдирддреЗ рд╣реБрдП рдХрд┐ рдпрд╣ рдлрд╝рд╛рдЗрд▓ рдкрдврд╝рдиреЗ/рд▓рд┐рдЦрдиреЗ/рдЦреЛрд▓рдиреЗ/рдмрдирд╛рдиреЗ рд╕реЗ рдЖрдпрд╛ рд╣реИ) рдореВрд▓ рд░реВрдк рд╕реЗ рдПрдХ рдмрдЧ рд╣реИ, рдХреНрдпреЛрдВрдХрд┐ рдЕрдВрддрд┐рдо рдЙрдкрдпреЛрдЧрдХрд░реНрддрд╛ рдХреЗ рд▓рд┐рдП рдЗрд╕рдХреЗ рд╕рд╛рде рдХреБрдЫ рднреА рдХрд░рдирд╛ рдореБрд╢реНрдХрд┐рд▓ рд╣реИред рдбрд┐рдлрд╝реЙрд▓реНрдЯ рд░реВрдк рд╕реЗ Debug рддреНрд░реБрдЯрд┐ рдХреЗ рдкреНрд░рддрд┐рдирд┐рдзрд┐рддреНрд╡ рдХреЛ рджрд┐рдЦрд╛рдиреЗ рдХрд╛ рдЪреБрдирд╛рд╡ рдХрд░рдХреЗ, рд╣рдордиреЗ рд╕реАрдПрд▓рдЖрдИ рдкреНрд░реЛрдЧреНрд░рд╛рдо рдмрдирд╛рдиреЗ рд╡рд╛рд▓реЗ рд▓реЛрдЧреЛрдВ рджреНрд╡рд╛рд░рд╛ рдЙрди рдкреНрд░рдХрд╛рд░ рдХреА рдмрдЧреЛрдВ рдХреЛ рдЙрдЬрд╛рдЧрд░ рдХрд░рдирд╛ рдХрдард┐рди рдмрдирд╛ рджрд┐рдпрд╛ рд╣реИред (рдЗрд╕рдХреЗ рдКрдкрд░, Debug рдХрд╛ io::Error рдЕрдкрдиреЗ 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 рд╕реЗ рдмрджрд▓рдирд╛ _lovely_ рд╣реЛрдЧрд╛, рд▓реЗрдХрд┐рди рдореИрдВ рдирд╣реАрдВ рдХрд░ рд╕рдХрддрд╛, рдХреНрдпреЛрдВрдХрд┐ рдпрд╣ рдХрд┐рд╕реА рддреНрд░реБрдЯрд┐ рдХреЗ Display рдХреЛ рдирд╣реАрдВ рджрд┐рдЦрд╛рдПрдЧрд╛ред рдпрд╣реА рд╣реИ, рд╡рд╛рд╕реНрддрд╡рд┐рдХ рд╕реАрдПрд▓рдЖрдИ рдХрд╛рд░реНрдпрдХреНрд░рдо рд▓рд┐рдЦрддреЗ рд╕рдордп, рдореИрдВ рд╡рд╛рд╕реНрддрд╡ рдореЗрдВ рдЙрдкрд░реЛрдХреНрдд рджреГрд╖реНрдЯрд┐рдХреЛрдг рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░реВрдВрдЧрд╛, рдЗрд╕рд▓рд┐рдП рдпрджрд┐ рдореИрдВ рдЪрд╛рд╣рддрд╛ рд╣реВрдВ рдХрд┐ рдореЗрд░реЗ рдЙрджрд╛рд╣рд░рдг рд╡рд╛рд╕реНрддрд╡рд┐рдХрддрд╛ рдХреЛ рдкреНрд░рддрд┐рдмрд┐рдВрдмрд┐рдд рдХрд░реЗрдВ, рддреЛ рдореБрдЭреЗ рд▓рдЧрддрд╛ рд╣реИ рдХрд┐ рдореБрдЭреЗ рд╡рд╛рд╕реНрддрд╡рд┐рдХ рдХрд╛рд░реНрдпрдХреНрд░рдореЛрдВ рдореЗрдВ рджрд┐рдЦрд╛рдирд╛ рдЪрд╛рд╣рд┐рдП рдФрд░ рд╢реЙрд░реНрдЯрдХрдЯ рдирд╣реАрдВ рд▓реЗрдирд╛ рдЪрд╛рд╣рд┐рдП (рдЙрдЪрд┐рдд рд╕реАрдорд╛ рддрдХ) ) рдореБрдЭреЗ рд╡рд╛рд╕реНрддрд╡ рдореЗрдВ рд▓рдЧрддрд╛ рд╣реИ рдХрд┐ рдЗрд╕ рддрд░рд╣ рдХреА рдЪреАрдЬ рд╡рд╛рд╕реНрддрд╡ рдореЗрдВ рдорд╣рддреНрд╡рдкреВрд░реНрдг рд╣реИ, рдФрд░ рдРрддрд┐рд╣рд╛рд╕рд┐рдХ рд░реВрдк рд╕реЗ рдЗрд╕рдХрд╛ рдПрдХ рд╕рд╛рдЗрдб рдЗрдлреЗрдХреНрдЯ рдпрд╣ рдерд╛ рдХрд┐ рдЗрд╕рдиреЗ рд▓реЛрдЧреЛрдВ рдХреЛ рд╣рд░ рдЬрдЧрд╣ unwrap рдЫрд┐рдбрд╝рдХреЗ рдмрд┐рдирд╛ рдореБрд╣рд╛рд╡рд░реЗрджрд╛рд░ рд░рд╕реНрдЯ рдХреЛрдб рд▓рд┐рдЦрдиреЗ рдХрд╛ рддрд░реАрдХрд╛ рджрд┐рдЦрд╛рдпрд╛ред рд▓реЗрдХрд┐рди рдЕрдЧрд░ рдореИрдВ рдЕрдкрдиреЗ рдЙрджрд╛рд╣рд░рдгреЛрдВ рдореЗрдВ ?-in-main рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рд╡рд╛рдкрд╕ рд▓реМрдЯрддрд╛ рд╣реВрдВ, рддреЛ рдореИрдВ рдЕрдкрдиреЗ рд▓рдХреНрд╖реНрдп рд╕реЗ рдкреАрдЫреЗ рд╣рдЯ рдЧрдпрд╛ рд╣реВрдВ: рдЕрдм рдореИрдВ рдРрд╕реЗ рд▓реЛрдЧреЛрдВ рдХреЛ рд╕реНрдерд╛рдкрд┐рдд рдХрд░ рд░рд╣рд╛ рд╣реВрдВ рдЬреЛ рдХреЗрд╡рд▓ рдкреНрд░реЛрдЧреНрд░рд╛рдо рд▓рд┐рдЦрдиреЗ рдХреЗ рд▓рд┐рдП рдмреЗрд╣рддрд░ рдирд╣реАрдВ рдЬрд╛рдирддреЗ рд╣реИрдВ, рдбрд┐рдлрд╝реЙрд▓реНрдЯ рд░реВрдк рд╕реЗ, рдмрд╣реБрдд рдЙрддреНрд╕рд░реНрдЬрд┐рдд рдХрд░рддреЗ рд╣реИрдВ рдЕрдиреБрдкрдпреЛрдЧреА рддреНрд░реБрдЯрд┐ рд╕рдВрджреЗрд╢ред

"рдПрдХ рддреНрд░реБрдЯрд┐ рд╕рдВрджреЗрд╢ рдЙрддреНрд╕рд░реНрдЬрд┐рдд рдХрд░реЗрдВ рдФрд░ рдПрдХ рдЙрдкрдпреБрдХреНрдд рддреНрд░реБрдЯрд┐ рдХреЛрдб рдХреЗ рд╕рд╛рде рдмрд╛рд╣рд░ рдирд┐рдХрд▓реЗрдВ" рдХрд╛ рдкреИрдЯрд░реНрди рд╡рд╛рд╕реНрддрд╡ рдореЗрдВ рдкреЙрд▓рд┐рд╢ рдХрд┐рдП рдЧрдП рдХрд╛рд░реНрдпрдХреНрд░рдореЛрдВ рдореЗрдВ рдЙрдкрдпреЛрдЧ рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИред рдЙрджрд╛рд╣рд░рдг рдХреЗ рд▓рд┐рдП, рдпрджрд┐ ?-in-main рдиреЗ Display рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд┐рдпрд╛ рд╣реИ, рддреЛ рдореИрдВ рдЖрдЬ ripgrep рдореЗрдВ main рдФрд░ run рдлрд╝рдВрдХреНрд╢рдВрд╕ рдХреЛ рдорд░реНрдЬ рдХрд░ рд╕рдХрддрд╛ рд╣реВрдВ:

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

рдмреЗрд╢рдХ, рдореИрдВ рднрд╡рд┐рд╖реНрдп рдореЗрдВ ?-in-main Termination рд╡рд┐рд╢реЗрд╖рддрд╛ рдХреЗ рд▓рд┐рдП рдЕрдкрдирд╛ рдЦреБрдж рдХрд╛ рдЗрдореНрдкреНрд▓рд╛рдВрдЯ рдкреНрд░рджрд╛рди рдХрд░рдХреЗ рдХрд░ рд╕рдХрддрд╛ рд╣реВрдВ рдЬреЛ рдПрдХ рдмрд╛рд░ рд╕реНрдерд┐рд░ рд╣реЛ рдЬрд╛рддрд╛ рд╣реИ, рд▓реЗрдХрд┐рди рдЕрдЧрд░ рдореИрдВ рд╕рд┐рд░реНрдл main рд▓рд┐рдЦ рд╕рдХрддрд╛ рд╣реВрдВ рддреЛ рдореБрдЭреЗ рдРрд╕рд╛ рдХрд░рдиреЗ рдореЗрдВ рдкрд░реЗрд╢рд╛рдиреА рдХреНрдпреЛрдВ рд╣реЛрдЧреА рдореЗрд░реЗ рдкрд╛рд╕ impl рдХреЛ рд╢рд╛рдорд┐рд▓ рдХрд░рдирд╛ рд╣реЛрдЧрд╛ рддрд╛рдХрд┐ рд╡реЗ рд╡рд╛рд╕реНрддрд╡рд┐рдХрддрд╛ рд╕реЗ рдореЗрд▓ рдЦрд╛ рд╕рдХреЗрдВ, рдФрд░ рдЙрд╕ рдмрд┐рдВрджреБ рдкрд░, рдореИрдВ рдЖрдЬ рдХреЗ рдЙрджрд╛рд╣рд░рдгреЛрдВ рдХреЗ рд╕рд╛рде рднреА рд░рд╣ рд╕рдХрддрд╛ рд╣реВрдВ ( main рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдХреЗ рдФрд░ рдПрдХ try_main )ред

рджреЗрдЦрдиреЗ рд╕реЗ рдРрд╕рд╛ рд▓рдЧрддрд╛ рд╣реИ рдХрд┐ рдЗрд╕реЗ рдареАрдХ рдХрд░рдирд╛ рдПрдХ рдмреНрд░реЗрдХрд┐рдВрдЧ рдмрджрд▓рд╛рд╡ рд╣реЛрдЧрд╛ред рдпрд╣реА рд╣реИ, рдпрд╣ рдХреЛрдб рдЖрдЬ рдЬрдВрдЧ рд╕реНрдерд┐рд░ рдкрд░ рд╕рдВрдХрд▓рд┐рдд рдХрд░рддрд╛ рд╣реИ:

#[derive(Debug)]
struct OnlyDebug;

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

рдореБрдЭреЗ рд▓рдЧрддрд╛ рд╣реИ рдХрд┐ Display рдкрд░ рд╕реНрд╡рд┐рдЪ рдХрд░рдиреЗ рд╕реЗ рдпрд╣ рдХреЛрдб рдЯреВрдЯ рдЬрд╛рдПрдЧрд╛ред рд▓реЗрдХрд┐рди рдореБрдЭреЗ рдкрдХреНрдХрд╛ рдкрддрд╛ рдирд╣реАрдВ рд╣реИ! рдпрджрд┐ рдпрд╣ рд╡рд╛рд╕реНрддрд╡ рдореЗрдВ рдПрдХ рдЬрд╣рд╛рдЬ-рд╕реЗ-рдиреМрдХрд╛рдпрди рдореБрджреНрджрд╛ рд╣реИ, рддреЛ рдореИрдВ рд╕рдордЭрддрд╛ рд╣реВрдВ рдФрд░ рдЗрд╕ рдмрд┐рдВрджреБ рдкрд░ рд╡рд┐рд╕реНрддрд╛рд░ рдХрд░рдиреЗ рдореЗрдВ рдмрд╣реБрдд рдЕрдзрд┐рдХ рдЙрдкрдпреЛрдЧ рдирд╣реАрдВ рд╣реИ, рд▓реЗрдХрд┐рди рдореБрдЭреЗ рдЗрд╕рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рдХрдо рд╕реЗ рдХрдо рдХреБрдЫ рдХрд╣рдиреЗ рдФрд░ рджреЗрдЦрдиреЗ рдХреЗ рд▓рд┐рдП рдкрд░реНрдпрд╛рдкреНрдд рд░реВрдк рд╕реЗ рдкрд░реНрдпрд╛рдкреНрдд рдорд╣рд╕реВрд╕ рд╣реЛрддрд╛ рд╣реИ рдХрд┐ рдХреНрдпрд╛ рдореИрдВ рджреВрд╕рд░реЛрдВ рдХреЛ рд╕рдордЭрд╛ рдирд╣реАрдВ рд╕рдХрддрд╛ рдФрд░ рджреЗрдЦ рд╕рдХрддрд╛ рд╣реВрдВ рдЕрдЧрд░ рдЗрд╕реЗ рдареАрдХ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдХреБрдЫ рдХрд┐рдпрд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИред (рдпрд╣ рднреА рдмрд╣реБрдд рд╕рдВрднрд╡ рд╣реИ рдХрд┐ рдореИрдВ рдпрд╣рд╛рдВ рдУрд╡рд░рд░рд┐рдПрдХреНрдЯ рдХрд░ рд░рд╣рд╛ рд╣реВрдВ, рд▓реЗрдХрд┐рди рдореЗрд░реЗ рдкрд╛рд╕ рдЕрдм рддрдХ рдХреБрдЫ рд▓реЛрдЧреЛрдВ рдиреЗ рдореБрдЭрд╕реЗ рдкреВрдЫрд╛ рд╣реИ "рдЖрдк ?-in-main рдХрд╛ рдЙрдкрдпреЛрдЧ рдХреНрдпреЛрдВ рдирд╣реАрдВ рдХрд░ рд░рд╣реЗ рд╣реИрдВ?" рдореЗрд░реЗ рд╕реАрдПрд╕рд╡реА рдЙрджрд╛рд╣рд░рдгреЛрдВ рдореЗрдВ, рдФрд░ рдореЗрд░рд╛ рдЬрд╡рд╛рдм рдореВрд▓ рд░реВрдк рд╕реЗ рд░рд╣рд╛ рд╣реИ, "рдореИрдВ рдирд╣реАрдВ рджреЗрдЦрддрд╛ рдХрд┐ рдРрд╕рд╛ рдХрд░рдирд╛ рдХреИрд╕реЗ рд╕рдВрднрд╡ рд╣реЛрдЧрд╛ред" рд╣реЛ рд╕рдХрддрд╛ рд╣реИ рдХрд┐ рдпрд╣ рдХреЛрдИ рд╕рдорд╕реНрдпрд╛ рдирд╣реАрдВ рдереА рдЬрд┐рд╕реЗ ?-in-main рджреНрд╡рд╛рд░рд╛ рд╣рд▓ рдХрд░рдиреЗ рдХрд╛ рдЗрд░рд╛рджрд╛ рдерд╛, рд▓реЗрдХрд┐рди рдХреБрдЫ рд▓реЛрдЧреЛрдВ рдХреЛ рдирд┐рд╢реНрдЪрд┐рдд рд░реВрдк рд╕реЗ рд╡рд╣ рдкреНрд░рднрд╛рд╡ рдерд╛ред рдЗрд╕рдХреЗ рд╡рд░реНрддрдорд╛рди рдХрд╛рд░реНрдпрд╛рдиреНрд╡рдпрди рдХреЗ рд╕рд╛рде , рдореИрдВ рджреЗрдЦ рд╕рдХрддрд╛ рдерд╛ рдХрд┐ рдпрд╣ рдбреЙрдХреНрдЯрд░ рдкрд░реАрдХреНрд╖рдгреЛрдВ рдФрд░ рдЗрдХрд╛рдИ рдкрд░реАрдХреНрд╖рдгреЛрдВ рдореЗрдВ рдЙрдкрдпреЛрдЧреА рд╣реИ, рд▓реЗрдХрд┐рди рдореБрдЭреЗ рдЕрдиреНрдп рдкрд░рд┐рд╕реНрдерд┐рддрд┐рдпреЛрдВ рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рд╕реЛрдЪрдиреЗ рдореЗрдВ рдХрдард┐рдирд╛рдИ рд╣реЛрддреА рд╣реИ рдЬрд┐рд╕рдореЗрдВ рдореИрдВ рдЗрд╕рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░реВрдВрдЧрд╛ред)

рдореИрдВ рд╕рд╣рдордд рд╣реВрдВ рдХрд┐ Display рдХреЛ Debug $ рд╕реЗ рдЕрдзрд┐рдХ рдкреНрд░рджрд░реНрд╢рд┐рдд рдХрд░рдирд╛ рд╕реАрдПрд▓рдЖрдИ рдЕрдиреБрдкреНрд░рдпреЛрдЧреЛрдВ рдХреЗ рд▓рд┐рдП рдмреЗрд╣рддрд░ рд╣реИред рдореИрдВ рдЗрд╕ рдмрд╛рдд рд╕реЗ рд╕рд╣рдордд рдирд╣реАрдВ рд╣реВрдВ рдХрд┐ рдпрд╣ Debug рдХреЗ рдмрдЬрд╛рдп 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 рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░реВрдВрдЧрд╛ред

рдореБрдЭреЗ рд╡рд╛рд╕реНрддрд╡рд┐рдХ рд╕реАрдПрд▓рдЖрдИ рдХрд╛рд░реНрдпрдХреНрд░рдореЛрдВ рдХреЗ рд▓рд┐рдП рд╕рд╛рдорд╛рдиреНрдп рд░реВрдк рд╕реЗ @ рдмрд░реНрдирдЯрд╕реБрд╢реА рд╕реЗ рд╕рд╣рдордд рд╣реЛрдирд╛ рд╣реИ, рд▓реЗрдХрд┐рди рдпрд╛рджреГрдЪреНрдЫрд┐рдХ рд╕реНрдХреНрд░рд┐рдкреНрдЯ рдФрд░ рдЖрдВрддрд░рд┐рдХ рдЙрдкрдХрд░рдгреЛрдВ рдХреЗ рд▓рд┐рдП рдЬрд┐рдиреНрд╣реЗрдВ рдХреЗрд╡рд▓ рдореИрдВ рдЙрдкрдпреЛрдЧ рдХрд░рдиреЗ рдХреА рдпреЛрдЬрдирд╛ рдмрдирд╛ рд░рд╣рд╛ рд╣реВрдВ, рдпрд╣ рд╡рд╛рд╕реНрддрд╡ рдореЗрдВ рд╕реБрд╡рд┐рдзрд╛рдЬрдирдХ рд╣реИред рдЗрд╕рдХреЗ рдЕрд▓рд╛рд╡рд╛, рдпрд╣ рдкреНрд░реЛрдЯреЛрдЯрд╛рдЗрдк рдФрд░ рдЦрд┐рд▓реМрдиреЛрдВ рдХреЗ рд▓рд┐рдП рд╡рд╛рд╕реНрддрд╡ рдореЗрдВ рд╕реБрд╡рд┐рдзрд╛рдЬрдирдХ рд╣реИред рд╣рдо рд╡рд╛рд╕реНрддрд╡ рдореЗрдВ рдЗрд╕реЗ рдЙрддреНрдкрд╛рджрди рдХреЛрдб рдореЗрдВ рдЙрдкрдпреЛрдЧ рдХрд░рдиреЗ рд╕реЗ рд╣рдореЗрд╢рд╛ рд╣рддреЛрддреНрд╕рд╛рд╣рд┐рдд рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ, рд╣реИ рдирд╛?

?-рдЗрди-рдореЗрди рдХреЗ рд╕рд╛рде рд▓рдХреНрд╖реНрдп рдХрд╛ рдПрдХ рд╣рд┐рд╕реНрд╕рд╛ рдХреЛрдб рдЙрджрд╛рд╣рд░рдгреЛрдВ рдореЗрдВ рдпреВрдирд┐рдбрд╛рдпрдореИрдЯрд┐рдХ рдХреЛрдб рд╕реЗ рдмрдЪрдирд╛ рд╣реИ, рдЕрд░реНрдерд╛рддреН рдЕрдирдкреНрд░реЗрдкреНрд╕ред рд▓реЗрдХрд┐рди рдЕрдЧрд░?-рдЗрди-рдореЗрди рдЕрдкрдиреЗ рдЖрдк рдореЗрдВ рдПрдХ рдореБрд╣рд╛рд╡рд░реЗрджрд╛рд░ рд╣реЛ рдЬрд╛рддрд╛ рд╣реИ, рддреЛ рд╡рд╣ рдкреВрд░реА рд╡рд┐рд╢реЗрд╖рддрд╛ рдХреЛ рдХрдордЬреЛрд░ рдХрд░ рджреЗрддрд╛ рд╣реИред рдореИрдВ рджреГрдврд╝рддрд╛ рд╕реЗ рдХрд┐рд╕реА рднреА рдкрд░рд┐рдгрд╛рдо рд╕реЗ рдмрдЪрдирд╛ рдЪрд╛рд╣реВрдВрдЧрд╛ рдЬрд┐рд╕рд╕реЗ рд╣рдореЗрдВ рдЙрддреНрдкрд╛рджрди рдХреЛрдб рдореЗрдВ рдпрд╛ рдЕрдиреНрдпрдерд╛ рдЗрд╕рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдиреЗ рд╕реЗ рд╣рддреЛрддреНрд╕рд╛рд╣рд┐рдд рдХрд░рдирд╛ рдкрдбрд╝реЗред

рдореИрдВ рдореБрдЦреНрдп рд░реВрдк рд╕реЗ рдЗрд╕ рд╕реБрд╡рд┐рдзрд╛ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдиреЗ рдХреА рдХреЛрд╢рд┐рд╢ рдХрд░ рд░рд╣рд╛ рд╣реВрдВ рдФрд░ рдореБрдЭреЗ рдпрд╣ рдмрд╣реБрдд рдирд┐рд░рд╛рд╢рд╛рдЬрдирдХ рд▓рдЧрд╛ рд╣реИред рдЯрд░реНрдорд┐рдиреЗрд╢рди рд╡рд┐рд╢реЗрд╖рддрд╛ рдХреЗ рдореМрдЬреВрджрд╛ рдирд┐рд╣рд┐рддрд╛рд░реНрде рдореБрдЭреЗ рдХрдИ рдкреНрд░рдХрд╛рд░ рдХреА рддреНрд░реБрдЯрд┐рдпреЛрдВ рдХреЛ рдЖрд╕рд╛рдиреА рд╕реЗ "рд╕рдВрдЪрд┐рдд" рдХрд░рдиреЗ рдХреА рдЕрдиреБрдорддрд┐ рдирд╣реАрдВ рджреЗрддреЗ рд╣реИрдВ - рдЙрджрд╛рд╣рд░рдг рдХреЗ рд▓рд┐рдП, рдореИрдВ рд╡рд┐рдлрд▓рддрд╛ :: рд╡рд┐рдлрд▓ рдХрд╛ рдЙрдкрдпреЛрдЧ рдирд╣реАрдВ рдХрд░ рд╕рдХрддрд╛, рдХреНрдпреЛрдВрдХрд┐ рдпрд╣ рддреНрд░реБрдЯрд┐ рдХреЛ рд▓рд╛рдЧреВ рдирд╣реАрдВ рдХрд░рддрд╛ рд╣реИ; рдореИрдВ 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 рдХреЗ рдЖрд╕рдкрд╛рд╕ рд╢реБрд░реВ рд╣реЛ рд░рд╣реА рд╣реИред

@ рдмрд░реНрдирдЯрд╕реБрд╢реА рдореИрдВ рдЖрдкрд╕реЗ рд╕рд╣рдордд рд╣реВрдВред рдпрджрд┐ рдЗрд╕реЗ рдареАрдХ рдирд╣реАрдВ рдХрд┐рдпрд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИ, рддреЛ рдПрдХ рд╕рдорд╛рдзрд╛рди рд╣реЛ рд╕рдХрддрд╛ рд╣реИ:

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
}

рдореЗрд░реЗ рдкрд╛рд╕ рдЕрднреА рднреА рдирд┐рдХрдЯ рднрд╡рд┐рд╖реНрдп рдХреЗ рд▓рд┐рдП рдЗрд╕рдореЗрдВ рдФрд░ рдпреЛрдЧрджрд╛рди рдХрд░рдиреЗ рдХрд╛ рд╕рдордп рдирд╣реАрдВ рд╣реИ, рд▓реЗрдХрд┐рди рдореИрдВ рдпрд╣ рднреА рдорд╛рдирддрд╛ рд╣реВрдВ рдХрд┐ ? рдореБрдЦреНрдп рд░реВрдк рд╕реЗ рдЧрдВрднреАрд░ рд╕реАрдПрд▓рдЖрдИ рдХрд╛рд░реНрдпрдХреНрд░рдореЛрдВ рдореЗрдВ рдкреНрд░рдпреЛрдЧ рдХрд░рдиреЗ рдпреЛрдЧреНрдп рд╣реЛрдирд╛ рдЪрд╛рд╣рд┐рдП, рдФрд░ рдореВрд▓ рдорд╕реМрджреЗ рдореЗрдВ рд╡рд┐рд╢реЗрд╖рддрд╛рдПрдВ рдереАрдВ RFC рдЬрд┐рд╕рдХрд╛ рдЙрджреНрджреЗрд╢реНрдп рдЗрд╕реЗ рд╕реБрд╡рд┐рдзрд╛рдЬрдирдХ рдмрдирд╛рдирд╛ рдерд╛ред рд╡реГрджреНрдзрд┐рд╡рд╛рдж рдХреЗ рдирд╛рдо рдкрд░ рдЙрдиреНрд╣реЗрдВ рд╣рдЯрд╛ рджрд┐рдпрд╛ рдЧрдпрд╛ рд▓реЗрдХрд┐рди рд╢рд╛рдпрдж рдЙрди рдкрд░ рджреЛрдмрд╛рд░рд╛ рдЧреМрд░ рдХрд┐рдпрд╛ рдЬрд╛рдирд╛ рдЪрд╛рд╣рд┐рдПред

рдореБрдЭреЗ рд▓рдЧрддрд╛ рд╣реИ рдХрд┐ рдЗрд╕реЗ рдкреАрдЫреЗ рдХреА рдУрд░ рдЕрд╕рдВрдЧрдд рддрд░реАрдХреЗ рд╕реЗ рдареАрдХ рдХрд░рдирд╛ рдареАрдХ рд╣реИ рдпрджрд┐ рдпрд╣ рдЬрд▓реНрдж рд╣реА рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИ, рдЗрд╕рд╕реЗ рдкрд╣рд▓реЗ рдХрд┐ рдмрд╣реБрдд рдЕрдзрд┐рдХ рдХреЛрдб рд╕реНрдерд┐рд░ рдкрд░ рдЗрд╕рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░ рд░рд╣рд╛ рд╣реЛред

рдХрд┐рд╕реА рдРрд╕реЗ рд╡реНрдпрдХреНрддрд┐ рдХреЗ рд░реВрдк рдореЗрдВ рдЬреЛ рд░рд╕реНрдЯ рдореЗрдВ рдмрд╣реБрдд рд╕рд╛рд░реЗ рд╕реАрдПрд▓рдЖрдИ рдХрд╛рд░реНрдпрдХреНрд░рдо рд▓рд┐рдЦрддрд╛ рд╣реИ, рдФрд░ рдЬреЛ рдХрд╛рдо рдкрд░ рд░рд╕реНрдЯ рд╢реИрд▓реА рдХрд╛ рдкреНрд░рднрд╛рд░реА рд╣реИ, рдореИрдВ рдпрд╣рд╛рдБ @burntsushi рд╕реЗ рдмрд╣реБрдд рд╕рд╣рдордд рд╣реВрдБред рдореИрдВ рдЖрд░рдПрдлрд╕реА рдореЗрдВ рдирд┐рд░реНрджрд┐рд╖реНрдЯ рдЗрд╕ рд╕реБрд╡рд┐рдзрд╛ рдХреЗ рд╕рдВрд╕реНрдХрд░рдг рдХрд╛ рдЦреБрд╢реА-рдЦреБрд╢реА рдЙрдкрдпреЛрдЧ рдХрд░рддрд╛ред

рд▓реЗрдХрд┐рди рдореИрдВ рдПрдХ рдЙрдкрдпреЛрдЧрдХрд░реНрддрд╛ рдХреЛ рдмрдЧ рд╣реЛрдиреЗ рдХреЗ рд▓рд┐рдП Debug рдХрд╛рд░реНрдпрд╛рдиреНрд╡рдпрди рджрд┐рдЦрд╛рдиреЗ рдкрд░ рд╡рд┐рдЪрд╛рд░ рдХрд░рддрд╛ рд╣реВрдВ, рдФрд░ рд╕реАрдПрд▓рдЖрдИ рдХрд╛рд░реНрдпрдХреНрд░рдо рдореЗрдВ рд╣рд░ рдЬрдЧрд╣ рдХреЗрд╡рд▓ unwrap рдХреЛ рдХреЙрд▓ рдХрд░рдиреЗ рд╕реЗ рдмреЗрд╣рддрд░ рдирд╣реАрдВ рд╣реИред рддреЛ рдЙрджрд╛рд╣рд░рдг рдХреЛрдб рдореЗрдВ рднреА, рдореИрдВ рдХрднреА рднреА рд╕реБрд╡рд┐рдзрд╛ рдХреЗ рдЗрд╕ рд╕рдВрд╕реНрдХрд░рдг рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдиреЗ рдХреА рдХрд▓реНрдкрдирд╛ рдирд╣реАрдВ рдХрд░ рд╕рдХрддрд╛ред рдпрд╣ рдмрд╣реБрдд рдмреБрд░рд╛ рд╣реИ, рдХреНрдпреЛрдВрдХрд┐ main рд╕реЗ рдмреЙрдпрд▓рд░рдкреНрд▓реЗрдЯ рдХреЛ рд╣рдЯрд╛рдиреЗ рд╕реЗ рдХрд╛рдо рдкрд░ рдирдП рд░рд╕реНрдЯ рдбреЗрд╡рд▓рдкрд░реНрд╕ рдХреЗ рд▓рд┐рдП рд╕реАрдЦрдиреЗ рдХреЛ рд╕рд░рд▓ рдмрдирд╛ рджрд┐рдпрд╛ рд╣реЛрдЧрд╛, рдФрд░ рд╣рдореЗрдВ quick_main! рдпрд╛ рд╕рдордХрдХреНрд╖ рдХреЛ рдФрд░ рд╕рдордЭрд╛рдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рдирд╣реАрдВ рд╣реЛрдЧреАред

рдмрд╣реБрдд рд╣реА рдПрдХрдорд╛рддреНрд░ рдкрд░рд┐рд╕реНрдерд┐рддрд┐рдпрд╛рдБ рдЬрд╣рд╛рдБ рдореИрдВ рдЗрд╕рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдиреЗ рдХреА рдХрд▓реНрдкрдирд╛ рдХрд░ рд╕рдХрддрд╛ рд╣реВрдБ, рд╡рд╣ рд╣реЛрдЧреА unwrap рдХреЛ рд╕рд┐рджреНрдзрд╛рдВрддреЛрдВ рд╕реЗ рд╕рдорд╛рдкреНрдд рдХрд░рдирд╛ред рд▓реЗрдХрд┐рди рдореБрдЭреЗ рдирд╣реАрдВ рдкрддрд╛ рдХрд┐ рдпрд╣ рдЕрднреА рддрдХ рд╕рдорд░реНрдерд┐рдд рд╣реИ рдпрд╛ рдирд╣реАрдВред

рдпрджрд┐ рд╣рдо Display рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рддреЗ рд╣реИрдВ, рддреЛ рд╣рдо рдХрдИ рдкреНрд░рдХрд╛рд░ рдХреА рддреНрд░реБрдЯрд┐рдпреЛрдВ рдХреЛ рдЬрдорд╛ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП MainError рдЬреИрд╕реЗ рддреЗрдЬрд╝ рдФрд░ рдЧрдВрджреЗ рдкреНрд░рдХрд╛рд░ рдХрд╛ рдкрд░рд┐рдЪрдп рджреЗ рд╕рдХрддреЗ рд╣реИрдВ:

рд╡реНрдпрдХреНрддрд┐рдЧрдд рд░реВрдк рд╕реЗ, рдЗрд╕ рдкреНрд░рдХрд╛рд░ рдХрд╛ рд╕рдорд╛рдзрд╛рди рдкрд░реНрдпрд╛рдкреНрдд рдЬрдЯрд┐рд▓рддрд╛ рдЬреЛрдбрд╝ рджреЗрдЧрд╛ рдХрд┐ ? -in- main рдкреВрд░реА рддрд░рд╣ рд╕реЗ рдмрдЪрдирд╛ рдЖрд╕рд╛рди рд╣реИред

@Aaronepower :

рдЬрд╣рд╛рдВ рддрдХ тАЛтАЛтАЛтАЛрдореИрдВ рдХрд╣ рд╕рдХрддрд╛ рд╣реВрдВ (рдкреВрд░реА рддрд░рд╣ рд╕реЗ рдЧрд▓рдд рд╣реЛ рд╕рдХрддрд╛ рд╣реИ рдХреНрдпреЛрдВрдХрд┐ рдореЗрд░реЗ рдкрд╛рд╕ stdlib рдХреЛ рд╕рдВрдХрд▓рд┐рдд рдХрд░рдиреЗ рдХрд╛ рд╕рдордп рдирд╣реАрдВ рд╣реИ рдФрд░ рдореБрдЭреЗ рдирд╣реАрдВ рдкрддрд╛ рдХрд┐ рд╡рд┐рд╢реЗрд╖рдЬреНрдЮрддрд╛ рдЗрд╕рдореЗрдВ рд╢рд╛рдорд┐рд▓ рд╣реИ рдпрд╛ рдирд╣реАрдВ) рдХреЛрдИ рдХрд╛рд░рдг рдирд╣реАрдВ рд╣реИ рдХрд┐ рд╣рдо рдЯрд░реНрдорд┐рдиреЗрд╢рди рдХреЗ рд▓рд┐рдП рдирд┐рдореНрдирд▓рд┐рдЦрд┐рдд рдЗрдореНрдкреНрд▓рд╛рдВрдЯ рдирд╣реАрдВ рдЬреЛрдбрд╝ рд╕рдХрддреЗ рд╣реИрдВред рдпрд╣ рдЙрдкрд▓рдмреНрдз рд╣реЛрдиреЗ рдкрд░ рдбрд┐рд╕реНрдкреНрд▓реЗ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдПрдХ рдЧреИрд░-рдмреНрд░реЗрдХрд┐рдВрдЧ рддрд░реАрдХрд╛ рдкреНрд░рджрд╛рди рдХрд░реЗрдЧрд╛ рдФрд░ рдРрд╕рд╛ рдирд╣реАрдВ рд╣реЛрдиреЗ рдкрд░ рдбреАрдмрдЧ рдкрд░ рд╡рд╛рдкрд╕ рдЖ рдЬрд╛рдПрдЧрд╛ред

рдЕрдЧрд░ рдпрд╣ рдореБрдЭреЗ fn main() -> Result<(), failure::Error> рд▓рд┐рдЦрдиреЗ рдФрд░ Display рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдХреЗ рдПрдХ рдЕрдЪреНрдЫреА, рдорд╛рдирд╡-рдкрдардиреАрдп рддреНрд░реБрдЯрд┐ рдкреНрд░рд╛рдкреНрдд рдХрд░рдиреЗ рдореЗрдВ рд╕рдХреНрд╖рдо рдмрдирд╛рддрд╛ рд╣реИ, рддреЛ рдпрд╣ рдирд┐рд╢реНрдЪрд┐рдд рд░реВрдк рд╕реЗ рдореЗрд░реА рдкреНрд░рдореБрдЦ рдЪрд┐рдВрддрд╛рдУрдВ рдХреЛ рдкреВрд░рд╛ рдХрд░реЗрдЧрд╛ред рд╣рд╛рд▓рд╛рдВрдХрд┐, рдореБрдЭреЗ рд▓рдЧрддрд╛ рд╣реИ рдХрд┐ рдпрд╣ рдЕрднреА рднреА рд╡реИрдХрд▓реНрдкрд┐рдХ рд░реВрдк рд╕реЗ рдмреИрдХрдЯреНрд░реЗрд╕ рдХреЛ failure::Error рдореЗрдВ рдкреНрд░рджрд░реНрд╢рд┐рдд рдХрд░рдиреЗ рдХреЗ рд╕рд╡рд╛рд▓ рдХреЛ рдЫреЛрдбрд╝ рджреЗрдЧрд╛ рдЬрдм RUST_BACKTRACE=1 рд╕реЗрдЯ рд╣реЛ - рд▓реЗрдХрд┐рди рдпрд╣ рджрд╛рдпрд░реЗ рд╕реЗ рдмрд╛рд╣рд░ рд╣реЛ рд╕рдХрддрд╛ рд╣реИ, рд╡реИрд╕реЗ рднреА, рдпрд╛ рдХрдо рд╕реЗ рдХрдо рдПрдХ рдореБрджреНрджрд╛ рдЬреЛ рд╣реЛрдирд╛ рдЪрд╛рд╣рд┐рдП failure рдХреЗ рд╕рд╛рде рд▓рд┐рдпрд╛ рдЬрд╛рдПред

рдЗрд╕реЗ рдХреБрдЫ рд╕рдордп рдкрд╣рд▓реЗ рд╕реНрдерд┐рд░ рдХрд┐рдпрд╛ рдЧрдпрд╛ рдерд╛, рдФрд░ рдореБрдЭреЗ рдирд╣реАрдВ рд▓рдЧрддрд╛ рдХрд┐ рд╣рдо рд╡рд╛рд╕реНрддрд╡ рдореЗрдВ Result рдХреЗ рд╡реНрдпрд╡рд╣рд╛рд░ рдХреЛ рдмрджрд▓ рд╕рдХрддреЗ рд╣реИрдВред рдореИрдВ рд╡реНрдпрдХреНрддрд┐рдЧрдд рд░реВрдк рд╕реЗ рдЙрдкрдпреЛрдЧ рдХреЗ рдорд╛рдорд▓реЛрдВ рдХреЗ рд╡рд░реНрддрдорд╛рди рд╡реНрдпрд╡рд╣рд╛рд░ рд╕реЗ рдмрд╣реБрдд рдЦреБрд╢ рд╣реВрдВ рдЬреЛ рдореИрдВ рдХрд░рддрд╛ рд╣реВрдВ - рддреНрд╡рд░рд┐рдд рдФрд░ рдЧрдВрджреА рд╕реНрдХреНрд░рд┐рдкреНрдЯ рдФрд░ рдЗрд╕реА рддрд░рд╣ - рд▓реЗрдХрд┐рди рдореИрдВ рдорд╛рдирддрд╛ рд╣реВрдВ рдХрд┐ рдЕрдзрд┐рдХ рдЬрдЯрд┐рд▓ рд╕реНрдХреНрд░рд┐рдкреНрдЯ рдЗрд╕реЗ рдирд╣реАрдВ рдЪрд╛рд╣реЗрдВрдЧреАред рд╣рд╛рд▓рд╛рдБрдХрд┐, рдЪрд░реНрдЪрд╛ рдХреЗ рд╕рдордп, рд╣рдордиреЗ рдХрдИ рддрд░реАрдХреЛрдВ рдкрд░ рднреА рдЪрд░реНрдЪрд╛ рдХреА рдереА рдХрд┐ рдЖрдк рдЙрд╕ рд╡реНрдпрд╡рд╣рд╛рд░ рдХреЛ рдирд┐рдпрдВрддреНрд░рд┐рдд рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ (рдореБрдЭреЗ рдЕрдм рдЙрди рдЯрд┐рдкреНрдкрдгрд┐рдпреЛрдВ рдХреЛ рдирд╣реАрдВ рдорд┐рд▓ рд░рд╣рд╛ рд╣реИ рдХреНрдпреЛрдВрдХрд┐ рдЬреАрдердм рдореБрдЭрд╕реЗ рдЪреАрдЬреЗрдВ рдЫреБрдкрд╛ рд░рд╣рд╛ рд╣реИ)ред

рдЙрджрд╛рд╣рд░рдг рдХреЗ рд▓рд┐рдП, рдЖрдк рддреНрд░реБрдЯрд┐ рдкреНрд░рдХрд╛рд░ рдХреЗ рд▓рд┐рдП рдЕрдкрдирд╛ "рдЖрд╡рд░рдг" рдкрд░рд┐рднрд╛рд╖рд┐рдд рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ, рдФрд░ рдЗрд╕рдХреЗ рд▓рд┐рдП From рд▓рд╛рдЧреВ рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ:

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

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

рдЕрдм рдЖрдк рдХреБрдЫ рдЗрд╕ рддрд░рд╣ рд▓рд┐рдЦ рд╕рдХрддреЗ рд╣реИрдВ, рдЬрд┐рд╕рдХрд╛ рдорддрд▓рдм рд╣реИ рдХрд┐ рдЖрдк ? рдореЗрдВ main рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ:

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

рд╢рд╛рдпрдж рдЗрд╕ рддрд░рд╣ рдХрд╛ рдПрдХ рддреНрд╡рд░рд┐рдд-рдХреНрд▓реА рдпрд╛ рдХреБрдЫ рдХрд╛ рд╣рд┐рд╕реНрд╕рд╛ рд╣реЛрдирд╛ рдЪрд╛рд╣рд┐рдП?

@nikomatsakis рд╣рд╛рдБ, рдореБрдЭреЗ рдкреВрд░реА рддрд░рд╣ рд╕реЗ рд╡рд╣ рд╕рдорд╛рдзрд╛рди рдорд┐рд▓ рдЧрдпрд╛ рд╣реИ, рд▓реЗрдХрд┐рди рдореБрдЭреЗ рдРрд╕рд╛ рд▓рдЧрддрд╛ рд╣реИ рдХрд┐ ?-in-main рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдиреЗ рдХреА рд╕рдВрдХреНрд╖рд┐рдкреНрддрддрд╛ рдХреЗ рдЙрджреНрджреЗрд╢реНрдп рдХреЛ рд╣рд░рд╛ рджреЗрддрд╛ рд╣реИред рдореБрдЭреЗ рдРрд╕рд╛ рд▓рдЧрддрд╛ рд╣реИ рдХрд┐ "рдЗрд╕ рд╡рд░реНрдХрдЕрд░рд╛рдЙрдВрдб рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдХреЗ ?-in-main рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдирд╛ рд╕рдВрднрд╡ рд╣реИ" рджреБрд░реНрднрд╛рдЧреНрдп рд╕реЗ ?-in-main рдХреЛ рдХрдордЬреЛрд░ рдХрд░рддрд╛ рд╣реИред рдЙрджрд╛рд╣рд░рдг рдХреЗ рд▓рд┐рдП, рдореИрдВ рдЖрдкрдХреЗ рдХрд╛рдо рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рд╕рдВрдХреНрд╖рд┐рдкреНрдд рдЙрджрд╛рд╣рд░рдгреЛрдВ рдореЗрдВ рдирд╣реАрдВ рд▓рд┐рдЦрдиреЗ рдЬрд╛ рд░рд╣рд╛ рд╣реВрдБ рдФрд░ рдореИрдВ рдкреНрд░рддреНрдпреЗрдХ рдЙрджрд╛рд╣рд░рдг рдХреЗ рд▓рд┐рдП quicli рдкрд░ рдирд┐рд░реНрднрд░рддрд╛ рдирд╣реАрдВ рдереЛрдкрдиреЗ рдЬрд╛ рд░рд╣рд╛ рд╣реВрдБред рдореИрдВ рдирд┐рд╢реНрдЪрд┐рдд рд░реВрдк рд╕реЗ рддреНрд╡рд░рд┐рдд рдХрд╛рд░реНрдпрдХреНрд░рдореЛрдВ рдХреЗ рд▓рд┐рдП рдЗрд╕рдХрд╛ рдЙрдкрдпреЛрдЧ рдирд╣реАрдВ рдХрд░рдиреЗ рдЬрд╛ рд░рд╣рд╛ рд╣реВрдВ, рдХреНрдпреЛрдВрдХрд┐ рдореИрдВ рдореВрд▓ рд░реВрдк рд╕реЗ рдореЗрд░реЗ рджреНрд╡рд╛рд░рд╛ рд▓рд┐рдЦреЗ рдЧрдП рдкреНрд░рддреНрдпреЗрдХ рд╕реАрдПрд▓рдЖрдИ рдкреНрд░реЛрдЧреНрд░рд╛рдо рдореЗрдВ рдПрдХ рддреНрд░реБрдЯрд┐ рдХрд╛ Display рдЖрдЙрдЯрдкреБрдЯ рдЪрд╛рд╣рддрд╛ рд╣реВрдВред рдореЗрд░реА рд░рд╛рдп рд╣реИ рдХрд┐ рддреНрд░реБрдЯрд┐ рдХрд╛ рдбрд┐рдмрдЧ рдЖрдЙрдЯрдкреБрдЯ рд╕реАрдПрд▓рдЖрдИ рдХрд╛рд░реНрдпрдХреНрд░рдореЛрдВ рдореЗрдВ рдПрдХ рдмрдЧ рд╣реИ рдЬрд┐рд╕реЗ рдЖрдк рдЙрдкрдпреЛрдЧрдХрд░реНрддрд╛рдУрдВ рдХреЗ рд╕рд╛рдордиреЗ рд░рдЦрддреЗ рд╣реИрдВред

?-in-main рдХрд╛ рд╡рд┐рдХрд▓реНрдк рдПрдХ рдЕрддрд┐рд░рд┐рдХреНрдд ~4-рд▓рд╛рдЗрди рдлрд╝рдВрдХреНрд╢рди рд╣реИред рдЗрд╕рд▓рд┐рдП рдпрджрд┐ ?-in-main рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП Display рдХреЛ рдареАрдХ рдХрд░рдиреЗ рдХрд╛ рд╕рдорд╛рдзрд╛рди рдЙрд╕рд╕реЗ рдХрд╣реАрдВ рдЕрдзрд┐рдХ рд╣реИ, рддреЛ рдореБрдЭреЗ рд╡реНрдпрдХреНрддрд┐рдЧрдд рд░реВрдк рд╕реЗ рдЗрд╕рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдмрд╣реБрдд рдЕрдзрд┐рдХ рдХрд╛рд░рдг рдирд╣реАрдВ рджрд┐рдЦрддрд╛ рд╣реИ (рдбреЙрдХреНрдЯрд░ рдкрд░реАрдХреНрд╖рдгреЛрдВ рдпрд╛ рдпреВрдирд┐рдЯ рдкрд░реАрдХреНрд╖рдгреЛрдВ рдХреЗ рдмрд╛рд╣рд░, рдЬреИрд╕рд╛ рдХрд┐ рдЙрдкрд░реНрдпреБрдХреНрдд)ред

рдХреНрдпрд╛ рдпрд╣ рдХреБрдЫ рдРрд╕рд╛ рд╣реИ рдЬрд┐рд╕реЗ рд╕рдВрд╕реНрдХрд░рдг рдореЗрдВ рдмрджрд▓рд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИ?

@BurntSushi рдЖрдк std рдореЗрдВ рд╣реЛрдиреЗ рд╡рд╛рд▓реЗ рдХрд╛рдордХрд╛рдЬ рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рдХреИрд╕рд╛ рдорд╣рд╕реВрд╕ рдХрд░реЗрдВрдЧреЗ, рдЗрд╕рд▓рд┐рдП рдЖрдкрдХреЛ main() рдкрд░ рдХреЗрд╡рд▓ рдереЛрдбрд╝реА рджреЗрд░ рд╡рд╛рдкрд╕реА рдкреНрд░рдХрд╛рд░ рдХреА рдШреЛрд╖рдгрд╛ рд▓рд┐рдЦрдиреА рд╣реЛрдЧреА?

@Kixunil рдореЗрд░реА рдкреНрд░рд╛рд░рдВрднрд┐рдХ рднрд╛рд╡рдирд╛ рдпрд╣ рд╣реИ рдХрд┐ рдпрд╣ рд╕реНрд╡рд╛рджрд┐рд╖реНрдЯ рд╣реЛ рд╕рдХрддрд╛ рд╣реИред рд╣рд╛рд▓рд╛рдВрдХрд┐ рдЗрд╕ рдкрд░ рдЬреНрдпрд╛рджрд╛ рд╡рд┐рдЪрд╛рд░ рдирд╣реАрдВ рдХрд┐рдпрд╛ред

@рдмрд░реНрдирдЯрд╕реБрд╢реА

?-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 рдХреЗ рдЖрдЙрдЯрдкреБрдЯ рдХреЗ рд▓рд┐рдП рдПрдХ рдХрд╕реНрдЯрдо рдкреНрд░рдХрд╛рд░ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реИ, рдПрдХ рдмрд╣реБрдд рд╣реА рддреНрд╡рд░рд┐рдд рдЕрд╣рд╕рд╛рд╕ рд╣реЛрдЧрд╛ред

рдЬрд╣рд╛рдВ рддрдХ тАЛтАЛ"рдХреНрдпреЛрдВ" рдХреА рдмрд╛рдд рд╣реИ рддреЛ рд╣рдо ? рдореЗрдВ main рдЪрд╛рд╣рддреЗ рд╣реИрдВ, рдЕрдЪреНрдЫреА рддрд░рд╣ рд╕реЗ рд╡рд┐рдЪрд╛рд░ рдХрд░реЗрдВ рдХрд┐ рдпрд╣ рдЕрдм рдХрд┐рддрдирд╛ рдЕрдЬреАрдм рд╣реИред рдЖрдк рдЗрд╕реЗ рд╡реНрдпрд╛рд╡рд╣рд╛рд░рд┐рдХ рд░реВрдк рд╕реЗ рд╣рд░ рдЬрдЧрд╣ рдЙрдкрдпреЛрдЧ рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ (рдЪреВрдВрдХрд┐ рдЖрдкрдХреЗ рдкрд╛рд╕ рд░рд┐рдЯрд░реНрди рдкреНрд░рдХрд╛рд░ рдХрд╛ рдирд┐рдпрдВрддреНрд░рдг рд╣реИ)ред main рдлрд╝рдВрдХреНрд╢рди рддрдм рдереЛрдбрд╝реЗ рд╡рд┐рд╢реЗрд╖ рдорд╣рд╕реВрд╕ рдХрд░рддрд╛ рд╣реИ, рдЬреЛ рдЗрд╕реЗ рдирд╣реАрдВ рдХрд░рдирд╛ рдЪрд╛рд╣рд┐рдПред

.unwrap() рдПрдХ рддреНрд╡рд░рд┐рдд рдФрд░ рдЧрдВрджрд╛ рд╕рдорд╛рдзрд╛рди рд╣реИ рдЬреЛ рд░рдЪрдирд╛ рдирд╣реАрдВ рдХрд░рддрд╛ рд╣реИ, рдЗрд╕рд▓рд┐рдП рдЬрдм рдЖрдк рдХрд┐рд╕реА рдкреНрд░реЛрдЧреНрд░рд╛рдо рдХреЛ рд╕реНрдХреЗрдЪ рдХрд░ рд░рд╣реЗ рд╣реЛрдВ рддреЛ рдЖрдк main() рдХреЗ рдЕрдВрджрд░ рдФрд░ рдмрд╛рд╣рд░ рдХреЛрдб рдХрд╛ рдХрд╛рд░рдХ рдирд╣реАрдВ рдмрдирд╛ рд╕рдХрддреЗ рд╣реИрдВред

рддреБрд▓рдирд╛ рдХрд░рдХреЗ, ? рдПрдХ рддреНрд╡рд░рд┐рдд рдФрд░ рдЧрдВрджрд╛ рд╕рдорд╛рдзрд╛рди рд╣реИ рдЬреЛ рд░рдЪрдирд╛ рдХрд░рддрд╛ рд╣реИ , рдФрд░ рдЗрд╕реЗ рдЬрд▓реНрджреА-рдФрд░-рдЧрдВрджрд╛ рдирд╣реАрдВ рдмрдирд╛рдирд╛ main() рдкрд░ рд╕рд╣реА рд░рд┐рдЯрд░реНрди-рдкреНрд░рдХрд╛рд░ рдбрд╛рд▓рдиреЗ рдХрд╛ рдорд╛рдорд▓рд╛ рд╣реИ, рдирд╣реАрдВ рдХреЛрдб рдХреЛ рд╣реА рд╕рдВрд╢реЛрдзрд┐рдд рдХрд░рдиреЗ рдХрд╛ред

@ рд╕реНрдХреНрд░реВрдЯрд╛рдкреЗрд▓реЛ рдЖрд╣, рдЕрдм рдпрд╣ рдореБрдЭреЗ рд╕рдордЭ рдореЗрдВ рдЖрддрд╛ рд╣реИред рдзрдиреНрдпрд╡рд╛рдж!

рдореИрдВ рдХреЗрд╡рд▓ рдпрд╣ рд╡реНрдпрдХреНрдд рдХрд░рдирд╛ рдЪрд╛рд╣рддрд╛ рд╣реВрдВ рдХрд┐ рдореИрдВрдиреЗ рд╕реЛрдЪрд╛ рдерд╛ рдХрд┐ рдЗрд╕рдХрд╛ рдЙрджреНрджреЗрд╢реНрдп рдЕрддрд┐рд░рд┐рдХреНрдд рд░реИрдкрд░реЛрдВ рдХрд╛ рд╕рд╣рд╛рд░рд╛ рд▓рд┐рдП рдмрд┐рдирд╛ рд╕рднреА рдЕрдиреБрдкреНрд░рдпреЛрдЧреЛрдВ рдХреЗ рд▓рд┐рдП ? рдореЗрдВ main рд▓рд╛рдирд╛ рдерд╛ ... рдпрджрд┐ рдпрд╣ рдХреЗрд╡рд▓ рдкрд░реАрдХреНрд╖рдг рдХреЗ рд▓рд┐рдП рд╣реИ рддреЛ рдореИрдВ рдирд╣реАрдВ рдЗрд╕рдореЗрдВ рдмрд╣реБрдд рд▓рд╛рдн рджреЗрдЦреЗрдВ рдФрд░ рджреБрдЦ рдХреА рдмрд╛рдд рд╣реИ рдХрд┐ .unwrap() рд╕реЗ рдЪрд┐рдкрдХреЗ рд░рд╣реЗрдВрдЧреЗред

@oblitum рдпрд╣ рд╕рд┐рд░реНрдл рдкрд░реАрдХреНрд╖рдг рдХреЗ рд▓рд┐рдП рдирд╣реАрдВ рд╣реИред рдпрд╣ рд╕рд┐рд░реНрдл (рдбрд┐рдлрд╝реЙрд▓реНрдЯ рд░реВрдк рд╕реЗ) Display рдкреНрд░рд╛рд░реВрдк рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдиреЗ рд╡рд╛рд▓рд╛ рдирд╣реАрдВ рд╣реИред рдпрд╣ рд╡рд╣ рдЖрдЙрдЯрдкреБрдЯ рд╣реЛ рднреА рд╕рдХрддрд╛ рд╣реИ рдФрд░ рдирд╣реАрдВ рднреА рдЬрд┐рд╕рдХреА рдЖрдк рддрд▓рд╛рд╢ рдХрд░ рд░рд╣реЗ рд╣реИрдВ, рд▓реЗрдХрд┐рди рдпрд╣ рд▓рдЧрднрдЧ рдирд┐рд╢реНрдЪрд┐рдд рд░реВрдк рд╕реЗ .unwrap рдХреЗ рдЖрдЙрдЯрдкреБрдЯ рд╕реЗ рдмреЗрд╣рддрд░ рд╣реЛрдЧрд╛ред рдЗрд╕рдХреЗ рд╕рд╛рде рд╣реА, рдпрд╣ рдЖрдкрдХреЗ рдХреЛрдб рдХреЛ ? рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП "рдЕрдЪреНрдЫрд╛" рдмрдирд╛ рд╕рдХрддрд╛ рд╣реИред рдХрд┐рд╕реА рднреА рдорд╛рдорд▓реЗ рдореЗрдВ ? main рдЕрдиреБрдХреВрд▓рд┐рдд рдХрд░рдирд╛ рдЕрднреА рднреА рд╕рдВрднрд╡ рд╣реИ рдЬреИрд╕рд╛ рдХрд┐ @nikomatsakis рдиреЗ рдКрдкрд░ рд╡рд┐рд╕реНрддрд╛рд░ рд╕реЗ рдмрддрд╛рдпрд╛ рд╣реИред

рдХреНрдпрд╛ рдбрд┐рд╕реНрдкреНрд▓реЗ рдХреЗрд╕ рдХреЗ рд▓рд┐рдП 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 : рдЖрдкрдХреЛ рд▓рдЧрддрд╛ рд╣реИ рдХрд┐ рдкреНрд░реЛрдЧреНрд░рд╛рдорд░ рдореБрдЦреНрдп рд░реВрдк рд╕реЗ рдХрдВрд╕реЛрд▓ рдкрд░ рдПрдХ рдирд┐рдХрд╛рд╕ рд╕рдВрджреЗрд╢ рдкреНрд░рд┐рдВрдЯ рдХрд░рдирд╛ рдЪрд╛рд╣рддреЗ рд╣реИрдВред рдпрд╣ рдЧреИрд░-рддрдХрдиреАрдХреА рдбреЗрд╕реНрдХрдЯреЙрдк рдЕрдиреБрдкреНрд░рдпреЛрдЧреЛрдВ, рд▓реЙрдЧрд┐рдВрдЧ рдкреНрд▓рдВрдмрд┐рдВрдЧ рдХреЗ рд╕рд╛рде рдбреЗрдореЙрди рдЖрджрд┐ рдХреЗ рд▓рд┐рдП рдорд╛рдиреНрдп рдирд╣реАрдВ рд╣реИред рдореИрдВ рдЪрд╛рд╣рддрд╛ рд╣реВрдВ рдХрд┐ рд╣рдо рдорд╛рдирдХ рдкреБрд╕реНрддрдХрд╛рд▓рдп рдореЗрдВ 'рд╕рд╛рдорд╛рдиреНрдп рд░реВрдк рд╕реЗ рдЙрдкрдпреЛрдЧреА' рд╕рд╛рдордЧреНрд░реА рдХреЛ рдмрд┐рдирд╛ рд╕рдореНрдореЛрд╣рдХ рд╕рд╛рдХреНрд╖реНрдп (рдЬреИрд╕реЗ рд╕рдВрдЦреНрдпрд╛) рдХреЗ рдмрд┐рдирд╛ рди рдЬреЛрдбрд╝реЗрдВ, рдпрд╣ рд╡рд╣рд╛рдВ рд╣реЛрдирд╛ рдЪрд╛рд╣рд┐рдПред

рдореБрдЭреЗ рд▓рдЧрддрд╛ рд╣реИ рдХрд┐ рдкреНрд░реЛрдЧреНрд░рд╛рдорд░ рдЬреЛ Result<(), E> where E: Error рд╕реЗ main рд╡рд╛рдкрд╕ рдХрд░ рд░рд╣реЗ рд╣реИрдВ, рдХрдВрд╕реЛрд▓ рдкрд░ рдПрдХ рддреНрд░реБрдЯрд┐ рд╕рдВрджреЗрд╢ рдкреНрд░рд┐рдВрдЯ рдХрд░рдиреЗ рдореЗрдВ рд░реБрдЪрд┐ рд░рдЦрддреЗ рд╣реИрдВ, рд╣рд╛рдВред рдпрд╣рд╛рдВ рддрдХ тАЛтАЛтАЛтАЛрдХрд┐ рд╡рд░реНрддрдорд╛рди рд╡реНрдпрд╡рд╣рд╛рд░, рдЬреЛ Debug рдХреЗ рдорд╛рдзреНрдпрдо рд╕реЗ рдкреНрд░рд┐рдВрдЯ рд╣реИ, "рдХрдВрд╕реЛрд▓ рдкрд░ рдПрдХ рдирд┐рдХрд╛рд╕ рд╕рдВрджреЗрд╢ рдкреНрд░рд┐рдВрдЯ рдХрд░реЗрдВ" рд╣реИред

рдЗрд╕ рд╕реВрддреНрд░ рдореЗрдВ рд╡реНрдпрд╛рдкрдХ рд╕рд╣рдорддрд┐ рдкреНрд░рддреАрдд рд╣реЛрддреА рд╣реИ рдХрд┐ рдХреБрдЫ рдХреЛ stderr рдкрд░ рдореБрджреНрд░рд┐рдд рдХрд┐рдпрд╛ рдЬрд╛рдирд╛ рдЪрд╛рд╣рд┐рдП; рдХрд┐рдП рдЬрд╛рдиреЗ рд╡рд╛рд▓реЗ рдкреНрд░рдореБрдЦ рдирд┐рд░реНрдгрдп рд╣реИрдВ "рдХреНрдпрд╛ рдЗрд╕реЗ "{}" рдпрд╛ "{:?}" , рдпрд╛ рдХреБрдЫ рдФрд░ рдХреЗ рд╕рд╛рде рдкреНрд░рд┐рдВрдЯ рдХрд░рдирд╛ рдЪрд╛рд╣рд┐рдП, рдФрд░ рдпрд╣ рдХрд┐рддрдирд╛ рд╡рд┐рдиреНрдпрд╛рд╕ рдпреЛрдЧреНрдп рд╣реЛрдирд╛ рдЪрд╛рд╣рд┐рдП, рдпрджрд┐ рдмрд┐рд▓реНрдХреБрд▓ рднреА"ред

@Lucretiel , рдореЗрд░реЗ рд▓рд┐рдП Result рд▓реМрдЯрдиреЗ рдХрд╛ рдореВрд▓реНрдп рдмрд╛рд╣рд░ рдирд┐рдХрд▓рдиреЗ рдХреА рд╕реНрдерд┐рддрд┐ рдХреЛ рдЕрдЪреНрдЫреА рддрд░рд╣ рд╕реЗ рдирд┐рдпрдВрддреНрд░рд┐рдд рдХрд░ рд░рд╣рд╛ рд╣реИред рдХреНрдпрд╛ рдХреБрдЫ рдкреНрд░рд┐рдВрдЯ рдХрд░рдирд╛ рд╕рдмрд╕реЗ рдЕрдЪреНрдЫрд╛ рдирд╣реАрдВ рд╣реИ рдЬреЛ рдкреИрдирд┐рдХ рд╣реИрдВрдбрд▓рд░ рдкрд░ рдЫреЛрдбрд╝ рджрд┐рдпрд╛ рдЬрд╛рдП? рдХреЗрд╡рд▓ рдпрд╣ рд╕рд╡рд╛рд▓ рдирд╣реАрдВ рд╣реИ рдХрд┐ рдХреНрдпрд╛ рдХреБрдЫ рдХреЛ stderr рдкрд░ рдкреНрд░рд┐рдВрдЯ рдХрд░рдирд╛ рд╣реИ, рдпрд╣ рднреА рдХрд┐ рдХреНрдпрд╛ рдкреНрд░рд┐рдВрдЯ рдХрд░рдирд╛ рд╣реИ (рдмреИрдХрдЯреНрд░реЗрд╕, рддреНрд░реБрдЯрд┐ рд╕рдВрджреЗрд╢, рдЖрджрд┐?) рджреЗрдЦреЗрдВ https://github.com/rust-lang/rust/issues/43301#issuecomment -389099936, espред рдЕрдВрддрд┐рдо рднрд╛рдЧред

рдореИрдВрдиреЗ рд╣рд╛рд▓ рд╣реА рдореЗрдВ рдЗрд╕рдХрд╛ рдЗрд╕реНрддреЗрдорд╛рд▓ рдХрд┐рдпрд╛ рдФрд░ рдХрд╛рдордирд╛ рдХреА рдХрд┐ рдЗрд╕реЗ Display рдХрд╣рд╛ рдЬрд╛рдПред рдмрд╣реБрдд рдпрдХреАрди рд╣реИ рдХрд┐ рд╣рдордиреЗ рдпрд╣рд╛рдВ рдЧрд▓рдд рдХреЙрд▓ рдХрд┐рдпрд╛ рд╣реИред

рдПрдХ рдкреНрд░рдХреНрд░рд┐рдпрд╛ рд╡рд┐рдлрд▓рддрд╛ рдЬреЛ рдореИрдВрдиреЗ рдиреЛрдЯрд┐рд╕ рдХреА рд╣реИ рд╡рд╣ рдпрд╣ рд╣реИ рдХрд┐ рдирд┐рд░реНрдгрдп рд▓реИрдВрдЧ рдЯреАрдо (рдореБрдЦреНрдп рд░реВрдк рд╕реЗ рдирд┐рдХреЛ рдФрд░ рдЖрдИ) рджреНрд╡рд╛рд░рд╛ рдХрд┐рдпрд╛ рдЧрдпрд╛ рдерд╛, рди рдХрд┐ libs рдЯреАрдо, рд▓реЗрдХрд┐рди рдкреНрд░рд╢реНрди рдореЗрдВ рдХреЛрдб рдкреВрд░реА рддрд░рд╣ рд╕реЗ рдПрд╕рдЯреАрдбреА рдореЗрдВ рд░рд╣рддрд╛ рд╣реИред рд╕рдВрднрд╡рддрдГ libs рдиреЗ рдмреЗрд╣рддрд░ рдирд┐рд░реНрдгрдп рд▓рд┐рдпрд╛ рд╣реЛрдЧрд╛ред

@withboats рдХреНрдпрд╛ рдмрджрд▓рдиреЗ рдореЗрдВ рдмрд╣реБрдд рджреЗрд░ рд╣реЛ рдЪреБрдХреА рд╣реИ? рдореИрдВрдиреЗ рджреЗрдЦрд╛ рд╣реИ рдХрд┐ рджрд╕реНрддрд╛рд╡реЗрдЬрд╝ рдореЗрдВ рд╕реБрд╡рд┐рдзрд╛ рдХреЛ рдЕрднреА рднреА рдХреЗрд╡рд▓ рд░рд╛рддреНрд░рд┐рдХрд╛рд▓реАрди/рдкреНрд░рдпреЛрдЧрд╛рддреНрдордХ рдХреЗ рд░реВрдк рдореЗрдВ рдЯреИрдЧ рдХрд┐рдпрд╛ рдЧрдпрд╛ рд╣реИ, рд▓реЗрдХрд┐рди рдпрд╣ рд╕рдВрднрд╡ рд╣реИ рдХрд┐ рдореИрдВ рд╕реНрдерд┐рд░реАрдХрд░рдг рдкреНрд░рдХреНрд░рд┐рдпрд╛ рдХреЗ рдкреАрдЫреЗ рдХреА рдХреБрдЫ рдмрд╛рд░реАрдХрд┐рдпреЛрдВ рдХреЛ рдирд╣реАрдВ рд╕рдордЭрддрд╛ред

рдЬрдм рдЯреАрдо рдиреЗ рдореБрдЭреЗ рдХрд╛рд░реНрдпрд╛рдиреНрд╡рдпрди рдХреЛ Display рд╕реЗ Debug рдореЗрдВ рдмрджрд▓рдиреЗ рдХреЗ рд▓рд┐рдП рдХрд╣рд╛ рддреЛ рдореИрдВ рднреА рдЗрд╕ рдмрджрд▓рд╛рд╡ рдХреЛ рджреЗрдЦрдирд╛ рдЪрд╛рд╣рддрд╛ рд╣реВрдВ рдФрд░ рдЗрд╕рдХреЗ рд▓рд┐рдП рдПрдХ рдордЬрдмреВрдд рд╡рдХреАрд▓ рдирд╣реАрдВ рд╣реЛрдиреЗ рдХрд╛ рдЦреЗрдж рд╣реИред

@Lucretiel Termination рд╡рд┐рд╢реЗрд╖рддрд╛ рд░рд╛рддреНрд░рд┐рдХрд╛рд▓реАрди рд╣реИ, рд▓реЗрдХрд┐рди рд╕реБрд╡рд┐рдзрд╛ рд╣реА ( Termination рдХрд╛рд░реНрдпрд╛рдиреНрд╡рдпрди main /tests рд╕реЗ рд▓реМрдЯрд╛ рд░рд╣реА рд╣реИ) рдкрд╣рд▓реЗ рд╕реЗ рд╣реА рд╕реНрдерд┐рд░ рд╣реИред

рдХреНрдпрд╛ рд╡рд┐рд╢реЗрд╖рддрд╛ рдХреЗ рдирд╛рдо рдХреЛ рд╕реНрдерд┐рд░ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдХреЛрдИ рдЯрд┐рдХрдЯ рдпрд╛ рд╕рдордпрд░реЗрдЦрд╛ рд╣реИ?

@xfix рдЗрд╕рдХрд╛ рдорддрд▓рдм рдпрд╣ рд╣реЛрдЧрд╛ рдХрд┐ рдХрд╛рд░реНрдпрд╛рдиреНрд╡рдпрди рдХреЛ рдмрджрд▓рдирд╛ рд╕рдВрднрд╡ рд╣реИ, рд╣реИ рдирд╛? рд╡реНрдпрд╡рд╣рд╛рд░ рдирд╣реАрдВ рдмрджрд▓рддрд╛ рд╣реИ ( Termination main рд╕реЗ рд▓реМрдЯрд╛рдпрд╛ рдЧрдпрд╛), рд▓реЗрдХрд┐рди рд╡рд┐рд╢реЗрд╖рддрд╛ рд╕реНрд╡рдпрдВ рд╕реЗ рдмрджрд▓ рдЬрд╛рдПрдЧреА:

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

рдкреНрд░рддрд┐:

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

рдХрд╛рд░реНрдпрд╛рдиреНрд╡рдпрди рдХреЛ рдмрджрд▓рдирд╛ рд╕рдВрднрд╡ рд╣реИ, рд╣реИ рдирд╛?

рдкреАрдЫреЗ рдХреА рд╕рдВрдЧрддрддрд╛ рдХреЛ рддреЛрдбрд╝реЗ рдмрд┐рдирд╛ рдирд╣реАрдВред рдпрд╣ рдХреЛрдб рдЖрдЬ рдХреЗ рд╕реНрдерд┐рд░ рд░рд╕реНрдЯ рдореЗрдВ рд╕рдВрдХрд▓рд┐рдд рдХрд░рддрд╛ рд╣реИ:

#[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,
        }
    }
}

рдЦреЗрд▓ рдХрд╛ рдореИрджрд╛рди

рдпрд╣ рд╕рднреА рд╕рд╛рдорд╛рдиреНрдп рдорд╛рдорд▓реЛрдВ рдХреЛ рдХрд╡рд░ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдкрд░реНрдпрд╛рдкреНрдд рд╣реЛ рд╕рдХрддрд╛ рд╣реИ, рд▓реЗрдХрд┐рди рдпрд╣ рд╕рд╛рд░реНрд╡рдЬрдирд┐рдХ рд░реВрдк рд╕реЗ рд╡рд┐рд╢реЗрд╖рдЬреНрдЮрддрд╛ рдХреЛ рдЙрдЬрд╛рдЧрд░ рдХрд░рддрд╛ рд╣реИред

рдЖрд╣, рдореИрдВ рджреЗрдЦрддрд╛ рд╣реВрдВ рдХрд┐ рд╕реНрдерд┐рд░ рдЬрдВрдЧ рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рдЖрдкрдХрд╛ рдХреНрдпрд╛ рдорддрд▓рдм рд╣реИред рдХрд┐рд╕реА рдХрд╛рд░рдг рд╕реЗ рдореБрдЭреЗ рдкрддрд╛ рдирд╣реАрдВ рдерд╛ рдХрд┐ рдпрд╣ рд╕реНрдерд┐рд░ рдореЗрдВ рдЙрдкрд▓рдмреНрдз рдерд╛ред

рдХреНрдпрд╛ рдпрд╣ рдРрд╕рд╛ рдХреБрдЫ рд╣реИ рдЬрд┐рд╕реЗ рдХрд╛рд░реНрдЧреЛ рдзреНрд╡рдЬ рдХреЗ рд╕рд╛рде рд╕рдВрдХрд▓рди рд╕рдордп рдкрд░ рд╕реНрд╡рд┐рдЪ рдХрд┐рдпрд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИ? рдЙрд╕реА рддрд░рд╣ рдЬреИрд╕реЗ рдЕрдиреНрдп рдЪреАрдЬреЗрдВ рд╕реНрд╡рд┐рдЪ рдХрд░рдиреЗ рдпреЛрдЧреНрдп рд╣реИрдВ, рдЬреИрд╕реЗ panic = "abort" ред

рд╢рд╛рдпрдж? рдореИрдВ рджреЗрдЦ рд╕рдХрддрд╛ рдерд╛ рдХрд┐ рдПрдХ рдЕрдиреНрдп рдЬрдВрдЧ рд╕рдВрд╕реНрдХрд░рдг рдореЗрдВ ? рдореЗрдВ main рдХреЗ рд▓рд┐рдП рдПрдХ рдЕрд▓рдЧ рд╡реНрдпрд╡рд╣рд╛рд░ рдХрд░рдирд╛ рд╕рдВрднрд╡ рд╣реИред рд╢рд╛рдпрдж 2018 рдирд╣реАрдВ, рд╢рд╛рдпрдж 2021?

рдПрдХ рд╣реА рдкреНрд░реЛрдЧреНрд░рд╛рдо рдореЗрдВ рдЕрд▓рдЧ-рдЕрд▓рдЧ рдХреНрд░реЗрдЯ рдЕрд▓рдЧ-рдЕрд▓рдЧ рд╕рдВрд╕реНрдХрд░рдгреЛрдВ рдореЗрдВ рд╣реЛ рд╕рдХрддреЗ рд╣реИрдВ рд▓реЗрдХрд┐рди рдПрдХ рд╣реА std рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рддреЗ рд╣реИрдВ, рдЗрд╕рд▓рд┐рдП std рдореЗрдВ рдЙрдкрд▓рдмреНрдз рд▓рдХреНрд╖рдг рдФрд░ рдЙрдирдХреЗ рдирд┐рд╣рд┐рддрд╛рд░реНрде рд╕рднреА рд╕рдВрд╕реНрдХрд░рдгреЛрдВ рдореЗрдВ рд╕рдорд╛рди рд╣реЛрдиреЗ рдЪрд╛рд╣рд┐рдПред рд╣рдо рд╕рд┐рджреНрдзрд╛рдВрдд рд░реВрдк рдореЗрдВ рдХреНрдпрд╛ рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ (рдореИрдВ рдЗрд╕рдХреА рд╡рдХрд╛рд▓рдд рдирд╣реАрдВ рдХрд░ рд░рд╣рд╛ рд╣реВрдВ) рдореЗрдВ рджреЛ рд▓рдХреНрд╖рдг рд╣реИрдВ, Termination рдФрд░ Termination2 , рдФрд░ рдПрдХ рдпрд╛ рдПрдХ рдХреЛ рд▓рд╛рдЧреВ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП main() рдХреЗ рд░рд┐рдЯрд░реНрди рдкреНрд░рдХрд╛рд░ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реЛрддреА рд╣реИ рдЕрдиреНрдп рдЯреЛрдХрд░рд╛ рдХреЗ рд╕рдВрд╕реНрдХрд░рдг рдкрд░ рдирд┐рд░реНрднрд░ рдХрд░рддрд╛ рд╣реИ рдЬреЛ main() рдХреЛ рдкрд░рд┐рднрд╛рд╖рд┐рдд рдХрд░рддрд╛ рд╣реИред

рдореБрдЭреЗ рдирд╣реАрдВ рд▓рдЧрддрд╛ рдХрд┐ рд╣рдореЗрдВ рдХреБрдЫ рднреА рдХрдо рдХрд░рдиреЗ рдХреА рдЬрд░реВрд░рдд рд╣реИред рдореИрдВ @Aaronepower рдХреА рднрд╛рд╡рдирд╛ рдХреЛ рдкреНрд░рддрд┐рдзреНрд╡рдирд┐рдд рдХрд░реВрдВрдЧрд╛ рдХрд┐ рдХреЗрд╡рд▓ рдкреНрд░рджрд░реНрд╢рди рдкреНрд░рдХрд╛рд░реЛрдВ рдХреЛ рд╕реАрдорд┐рдд рдХрд░рдиреЗ рд╕реЗ рдХреЗрд╡рд▓ рддреНрд╡рд░рд┐рдд-рд╕реНрдХреНрд░рд┐рдкреНрдЯ рдЙрдкрдпреЛрдЧрдХрд░реНрддрд╛рдУрдВ рдХреЛ рдЕрд╕рдВрддреБрд╖реНрдЯ рдХрд┐рдпрд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИ (рдбреАрдмрдЧ рдкреНрд░рд╛рдкреНрдд рдХрд░рдирд╛ рддреБрдЪреНрдЫ рд╣реИ, рдкреНрд░рджрд░реНрд╢рди рдХреЛ рд▓рд╛рдЧреВ рдХрд░рдирд╛ рдирд╣реАрдВ рд╣реИ) рдЙрд╕реА рддрд░рд╣ рдЬреИрд╕реЗ рдХрд┐ рд╡рд░реНрддрдорд╛рди рд╕реНрдерд┐рддрд┐ рдЙрддреНрдкрд╛рджрди рдЙрдкрдпреЛрдЧрдХрд░реНрддрд╛рдУрдВ рдХреЛ рдЕрд╕рдВрддреБрд╖реНрдЯ рдХрд░рддреА рд╣реИред рдпрд╣рд╛рдВ рддрдХ тАЛтАЛрдХрд┐ рдЕрдЧрд░ рд╣рдо рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ, рддреЛ рдореБрдЭреЗ рдирд╣реАрдВ рд▓рдЧрддрд╛ рдХрд┐ рдпрд╣ рдЕрдВрддрддрдГ рдПрдХ рд▓рд╛рдн рд╣реЛрдЧрд╛ред рдореБрдЭреЗ рд▓рдЧрддрд╛ рд╣реИ рдХрд┐ @shepmaster рджреНрд╡рд╛рд░рд╛ рдирд┐рд░реНрдзрд╛рд░рд┐рдд рд╡рд┐рд╢реЗрд╖рдЬреНрдЮрддрд╛ рджреГрд╖реНрдЯрд┐рдХреЛрдг рдореЗрдВ рд╡рд╛рджрд╛ рдХрд┐рдпрд╛ рдЧрдпрд╛ рд╣реИ, рдЬрд┐рд╕рдореЗрдВ рдпрд╣ рдирд┐рдореНрдирд▓рд┐рдЦрд┐рдд рд╡реНрдпрд╡рд╣рд╛рд░ рдмрдирд╛рдПрдЧрд╛:

  1. рдПрдХ рдкреНрд░рдХрд╛рд░ рдЬрд┐рд╕рдореЗрдВ рдбреАрдмрдЧ рд╣реИ рд▓реЗрдХрд┐рди рдбрд┐рд╕реНрдкреНрд▓реЗ рдирд╣реАрдВ рд╣реИ, рдЙрд╕рдХрд╛ рдбреАрдмрдЧ рдЖрдЙрдЯрдкреБрдЯ рдбрд┐рдлрд╝реЙрд▓реНрдЯ рд░реВрдк рд╕реЗ рдореБрджреНрд░рд┐рдд рд╣реЛрдЧрд╛
  2. рдПрдХ рдкреНрд░рдХрд╛рд░ рдЬрд┐рд╕рдореЗрдВ рдбреАрдмрдЧ рдФрд░ рдбрд┐рд╕реНрдкреНрд▓реЗ рджреЛрдиреЛрдВ рд╣реЛрддреЗ рд╣реИрдВ, рдЙрд╕рдХрд╛ рдбрд┐рд╕реНрдкреНрд▓реЗ рдЖрдЙрдЯрдкреБрдЯ рдбрд┐рдлрд╝реЙрд▓реНрдЯ рд░реВрдк рд╕реЗ рдореБрджреНрд░рд┐рдд рд╣реЛрдЧрд╛
  3. рдПрдХ рдкреНрд░рдХрд╛рд░ рдЬрд┐рд╕рдореЗрдВ рдбрд┐рд╕реНрдкреНрд▓реЗ рд╣реИ рд▓реЗрдХрд┐рди рдбрд┐рдмрдЧ рдирд╣реАрдВ рд╣реИ, рдПрдХ рдХрдВрдкрд╛рдЗрд▓рд░ рддреНрд░реБрдЯрд┐ рдХрд╛ рдкрд░рд┐рдгрд╛рдо рд╣реИ

рдХрд┐рд╕реА рдХреЛ рдмрд┐рдВрджреБ 2 рдкрд░ рдЖрдкрддреНрддрд┐ рд╣реЛ рд╕рдХрддреА рд╣реИ, рдЙрд╕ рд╕реНрдерд┐рддрд┐ рдореЗрдВ рдЬрд╣рд╛рдВ рдЖрдкрдХреЗ рдкрд╛рд╕ рдбрд┐рд╕реНрдкреНрд▓реЗ рдХреЗ рд╕рд╛рде рдПрдХ рдкреНрд░рдХрд╛рд░ рд╣реИ рд▓реЗрдХрд┐рди рдЖрдк рдЪрд╛рд╣рддреЗ рд╣реИрдВ рдХрд┐ рдпрд╣ рдХрд┐рд╕реА рднреА рдХрд╛рд░рдг рд╕реЗ рдбреАрдмрдЧ рдкреНрд░рд┐рдВрдЯ рдХрд░реЗ; рдореБрдЭреЗ рд▓рдЧрддрд╛ рд╣реИ рдХрд┐ рдЗрд╕ рдорд╛рдорд▓реЗ рдХреЛ рдирд┐рдХреЛ рдХреЗ рд╡рд┐рднрд┐рдиреНрди рдкреВрд░реНрд╡рдирд┐рд░реНрдзрд╛рд░рд┐рдд рдЖрдЙрдЯрдкреБрдЯ рд╕реНрд╡рд░реВрдк рддреНрд░реБрдЯрд┐ рдкреНрд░рдХрд╛рд░реЛрдВ рдХреЗ рдкреНрд░рд╕реНрддрд╛рд╡ рджреНрд╡рд╛рд░рд╛ рд╕рдВрдмреЛрдзрд┐рдд рдХрд┐рдпрд╛ рдЬрд╛рдПрдЧрд╛ (рдЬреЛ рд╢рд╛рдпрдж рд╡рд┐рд╢реЗрд╖рдЬреНрдЮрддрд╛ рдорд╛рд░реНрдЧ рдХреЗ рд╕рд╛рде рдЬрд╛рдиреЗ рдкрд░ рднреА рдЦреЛрдЬ рдХреЗ рд▓рд╛рдпрдХ рд╣реИрдВ)ред

рдмрд┐рдВрджреБ 3 рдХреЗ рд▓рд┐рдП, рдпрд╣ рдереЛрдбрд╝рд╛ рдЬрд╛рдирджрд╛рд░ рд╣реИ (рд╣реЛ рд╕рдХрддрд╛ рд╣реИ рдХрд┐ рд╣рдореЗрдВ 1.0 рдореЗрдВ trait Display: Debug рд╡рд╛рдкрд╕ рдХрд░рдирд╛ рдЪрд╛рд╣рд┐рдП рдерд╛?), рд▓реЗрдХрд┐рди рдЕрдЧрд░ рдХрд┐рд╕реА рдХреЛ рдбрд┐рд╕реНрдкреНрд▓реЗ рдЗрдореНрдкреНрд▓рд╛рдВрдЯ рд▓рд┐рдЦрдиреЗ рдХреА рдкрд░реЗрд╢рд╛рдиреА рд╣реЛ рдЧрдИ рд╣реИ, рддреЛ рдЙрдиреНрд╣реЗрдВ рдердкреНрдкрдбрд╝ рдорд╛рд░рдиреЗ рдХреЗ рд▓рд┐рдП рдХрд╣рдиреЗ рдХреЗ рд▓рд┐рдП рдмрд╣реБрдд рдХреБрдЫ рдирд╣реАрдВ рд╣реИ рдПрдХ рдПрдХрд▓ рд╡реНрдпреБрддреНрдкрдиреНрди (рдЬреЛ, рдореБрдЭреЗ рд╕рдВрджреЗрд╣ рд╣реИ, рдЙрдирдХреЗ рдкрд╛рд╕ рд╢рд╛рдпрдж рд╡реИрд╕реЗ рднреА рд╣реИ ... рдХреНрдпрд╛ рд╡рд╣рд╛рдВ рдХреЛрдИ рд╣реИ рдЬреЛ рд╕рд┐рджреНрдзрд╛рдВрдд рдкрд░ рдЕрдкрдиреЗ рдкреНрд░рджрд░реНрд╢рди рдкреНрд░рдХрд╛рд░ рдкрд░ рдбреАрдмрдЧ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдСрдмреНрдЬреЗрдХреНрдЯ рдХрд░рддрд╛ рд╣реИ?)

рдХреЗрд╡рд▓ рдкреНрд░рджрд░реНрд╢рди рдкреНрд░рдХрд╛рд░реЛрдВ рддрдХ рд╕реАрдорд┐рдд рдХрд░рдирд╛ рддреНрд╡рд░рд┐рдд-рд╕реНрдХреНрд░рд┐рдкреНрдЯ рдЙрдкрдпреЛрдЧрдХрд░реНрддрд╛рдУрдВ рдХреЛ рдЕрд╕рдВрддреБрд╖реНрдЯ рдХрд░рдиреЗ рдХрд╛ рдХрд╛рдо рдХрд░ рд╕рдХрддрд╛ рд╣реИ (рдбреАрдмрдЧ рдкреНрд░рд╛рдкреНрдд рдХрд░рдирд╛ рддреБрдЪреНрдЫ рд╣реИ, рдкреНрд░рджрд░реНрд╢рди рдХреЛ рд▓рд╛рдЧреВ рдХрд░рдирд╛ рдирд╣реАрдВ рд╣реИ)

рдПрдХ рдорд╛рдорд▓рд╛ рдЬрд╣рд╛рдВ Display Debug рд╕реНрдХреНрд░рд┐рдкреНрдЯ рдореЗрдВ Debug рд╕реЗ рдмреЗрд╣рддрд░ рд╣реИ, рддреНрд░реБрдЯрд┐ рдкреНрд░рдХрд╛рд░ рдХреЗ рд░реВрдк рдореЗрдВ &'static str рдпрд╛ String рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░ рд░рд╣рд╛ рд╣реИред рдпрджрд┐ рдЖрдкрдХреЗ рдкрд╛рд╕ #[derive(Debug)] рдердкреНрдкрдбрд╝ рдорд╛рд░рдиреЗ рдХреЗ рд▓рд┐рдП рдПрдХ рдХрд╕реНрдЯрдо рддреНрд░реБрдЯрд┐ рдкреНрд░рдХрд╛рд░ рд╣реИ, рддреЛ рдЖрдк рдкрд╣рд▓реЗ рд╕реЗ рд╣реА рддреНрд░реБрдЯрд┐ рдкреНрд░рдмрдВрдзрди рдкрд░ рдХреБрдЫ рдЧреИрд░ рддреБрдЪреНрдЫ рдКрд░реНрдЬрд╛ рдЦрд░реНрдЪ рдХрд░ рд░рд╣реЗ рд╣реИрдВред

@SimonSapin рдореИрдВ рдпрд╣ рдирд╣реАрдВ рдХрд╣реВрдВрдЧрд╛ рдХрд┐ рдпрд╣ рдПрдХ рддреНрд╡рд░рд┐рдд рд╕реНрдХреНрд░рд┐рдкреНрдЯрд┐рдВрдЧ рд╡рд╛рддрд╛рд╡рд░рдг рдореЗрдВ рдмреЗрд╣рддрд░ рд╣реИ, рдпрд╛ рдпрд╣ рдмреЗрд╣рддрд░ рдирд╣реАрдВ рд╣реИ рдХрд┐ рдореИрдВ рдРрд╕реА рд╕реНрдерд┐рддрд┐ рдореЗрдВ рд░рд╣реВрдВрдЧрд╛ рдЬрд╣рд╛рдВ рдореИрдВ рдЪрд╛рд╣рддрд╛ рдерд╛ рдХрд┐ рд╕реНрдЯреНрд░рд┐рдВрдЧ рдХреЛ Display рдкреНрд░рд╛рд░реВрдк рдХреЗ рд░реВрдк рдореЗрдВ рдореБрджреНрд░рд┐рдд рдХрд┐рдпрд╛ рдЬрд╛рдП, рдмрд┐рдирд╛ рдкреНрд░рдпрд╛рд╕ рдХрд┐рдП рддреНрд░реБрдЯрд┐рдпреЛрдВ рдХреЛ рдареАрдХ рд╕реЗ рд╕реНрд╡рд░реВрдкрд┐рдд рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП, рдореЗрд░реЗ рд▓рд┐рдП Debug рдХреЛ рдкреНрд░рд╛рдердорд┐рдХрддрд╛ рджреА рдЬрд╛рддреА рд╣реИ рдХреНрдпреЛрдВрдХрд┐ рд╕реНрдЯреНрд░рд┐рдВрдЧ рд╣реЛрдиреЗ рдкрд░ рддреНрд░реБрдЯрд┐ рдкреНрд░рд╛рд░реВрдк рдЕрдЪреНрдЫреА рддрд░рд╣ рд╕реЗ рдЧрдард┐рдд рдирд╣реАрдВ рд╣реЛрддрд╛ рд╣реИ, рдЗрд╕рд▓рд┐рдП рдЗрд╕рдХреЗ рдЪрд╛рд░реЛрдВ рдУрд░ Err("тАж") рд╣реЛрдиреЗ рд╕реЗ рдореИрдВ рдЖрд╕рд╛рдиреА рд╕реЗ рдХрд┐рд╕реА рдЕрдиреНрдп рд╕реЗ рддреНрд░реБрдЯрд┐ рдХреЛ рдЖрд╕рд╛рдиреА рд╕реЗ рдЪреБрди рд╕рдХрддрд╛ рд╣реВрдВ рдЖрдЙрдЯрдкреБрдЯ рдЬреЛ рдЙрддреНрд╕рд░реНрдЬрд┐рдд рд╣реЛ рд╕рдХрддрд╛ рд╣реИред

FWIW рдЬреЛ рд╕реНрд╡рд░реВрдкрд┐рдд рд╣реИ рд╡рд╣ Result<_, E> рдорд╛рди рдирд╣реАрдВ рд╣реИ, рдХреЗрд╡рд▓ E рдорд╛рди рдЕрдВрджрд░ рд╣реИред рддреЛ рдЖрдк рдЖрдЙрдЯрдкреБрдЯ рдореЗрдВ Err( рдирд╣реАрдВ рджреЗрдЦреЗрдВрдЧреЗред рд╣рд╛рд▓рд╛рдВрдХрд┐ рд╡рд░реНрддрдорд╛рди рдХреЛрдб рдПрдХ Error: рдЙрдкрд╕рд░реНрдЧ рдЬреЛрдбрд╝рддрд╛ рд╣реИ, рдЬреЛ рд╕рдВрднрд╡рдд: рдпрджрд┐ Display рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИ рддреЛ рд╡рд╣ рд░рд╣реЗрдЧрд╛ред рдЙрджреНрдзрд░рдгреЛрдВ рдХреЛ рдкреНрд░рд┐рдВрдЯ рди рдХрд░рдиреЗ рдХреЗ рдЕрд▓рд╛рд╡рд╛, Display рднреА рдмреИрдХрд╕реНрд▓реИрд╢ рдирд╣реАрдВ рдХрд░реЗрдЧрд╛-рд╕реНрдЯреНрд░рд┐рдВрдЧ рдХреА рд╕рд╛рдордЧреНрд░реА рд╕реЗ рдмрдЪ рдЬрд╛рдПрдЧрд╛ рдЬреЛ рд╡рд╛рдВрдЫрдиреАрдп IMO рд╣реИ рдЬрдм рдпрд╣ рдЙрдкрдпреЛрдЧрдХрд░реНрддрд╛рдУрдВ рдХреЛ рдПрдХ (рддреНрд░реБрдЯрд┐) рд╕рдВрджреЗрд╢ рджрд┐рдЦрд╛рдиреЗ рдХреА рдмрд╛рдд рдЖрддреА рд╣реИред

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

рдореБрдЭреЗ рд▓рдЧрддрд╛ рд╣реИ рдХрд┐ рд╕реНрдерд┐рддрд┐ рдХреЛ рджреЗрдЦрддреЗ рд╣реБрдП рд╣рдо рдЬреЛ рд╕рдмрд╕реЗ рдЕрдЪреНрдЫреА рдЪреАрдЬ рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ, рд╡рд╣ рдЙрди рдкреНрд░рдХрд╛рд░реЛрдВ рдХреЗ рд▓рд┐рдП рд╡рд┐рд╢реЗрд╖рдЬреНрдЮрддрд╛ рд╣реИ рдЬреЛ Display impl рдХреЛ рдкреНрд░рд┐рдВрдЯ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП $# Display + Debug 0$#$ рд▓рд╛рдЧреВ рдХрд░рддреЗ рд╣реИрдВред рдпрд╣ рджреБрд░реНрднрд╛рдЧреНрдпрдкреВрд░реНрдг рд╣реИ рдХрд┐ Debug рдХреЛ рд▓рд╛рдЧреВ рдирд╣реАрдВ рдХрд░рдиреЗ рд╡рд╛рд▓реЗ рдкреНрд░рдХрд╛рд░реЛрдВ рдХреЛ рддреНрд░реБрдЯрд┐рдпреЛрдВ рдХреЗ рд░реВрдк рдореЗрдВ рдЙрдкрдпреЛрдЧ рдирд╣реАрдВ рдХрд┐рдпрд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИ (рдЬрдм рддрдХ рд╣рдо рдкреНрд░рддрд┐рдЪреНрдЫреЗрджрди impls рдХрд╛ рд╕рдорд░реНрдерди рдирд╣реАрдВ рдХрд░рддреЗ), рд▓реЗрдХрд┐рди рдпрд╣ рд╕рдмрд╕реЗ рдЕрдЪреНрдЫрд╛ рд╣рдо рдХрд░ рд╕рдХрддреЗ рд╣реИрдВред

рдореБрдЦреНрдп рдкреНрд░рд╢реНрди рдпрд╣ рд╣реИ рдХрд┐ рдХреНрдпрд╛ рд╡рд╣ рдЗрдореНрдкреНрд▓рд╛рдВрдЯ рдПрд╕рдЯреАрдбреА рдореЗрдВ рд╡рд┐рд╢реЗрд╖ рдЗрдореНрдкреНрд▓рд╛рдВрдЯреНрд╕ рдХреЗ рд▓рд┐рдП рд╣рдорд╛рд░реА рд╡рд░реНрддрдорд╛рди рдиреАрддрд┐ рдХреЗ рдЕрдВрддрд░реНрдЧрдд рдЖрддрд╛ рд╣реИ рдпрд╛ рдирд╣реАрдВред рд╣рдорд╛рд░реЗ рдкрд╛рд╕ рдЖрдо рддреМрд░ рдкрд░ рдПрдХ рдирд┐рдпрдо рд╣реИ рдХрд┐ рд╣рдо рдХреЗрд╡рд▓ рдПрд╕рдЯреАрдбреА рдореЗрдВ рд╡рд┐рд╢реЗрд╖рдЬреНрдЮрддрд╛ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рддреЗ рд╣реИрдВ рдЬрд╣рд╛рдВ рд╣рдо рдПрдХ рд╕реНрдерд┐рд░ рдЧрд╛рд░рдВрдЯреА рдкреНрд░рджрд╛рди рдирд╣реАрдВ рдХрд░рддреЗ рд╣реИрдВ рдХрд┐ рд╡реНрдпрд╡рд╣рд╛рд░ рдмрд╛рдж рдореЗрдВ рдирд╣реАрдВ рдмрджрд▓реЗрдЧрд╛ (рдХреНрдпреЛрдВрдХрд┐ рд╡рд┐рд╢реЗрд╖рдЬреНрдЮрддрд╛ рд╕реНрд╡рдпрдВ рдПрдХ рдЕрд╕реНрдерд┐рд░ рд╡рд┐рд╢реЗрд╖рддрд╛ рд╣реИ)ред рдХреНрдпрд╛ рд╣рдо рдЕрдм рдЗрд╕ рдЬрд╛рдЧрд░реВрдХрддрд╛ рдХреЛ рдкреНрд░рджрд╛рди рдХрд░рдиреЗ рдореЗрдВ рд╕рд╣рдЬ рд╣реИрдВ рдХрд┐ рдпрд╣ рд╕рдВрднрд╡ рд╣реИ рдХрд┐ рдХрд┐рд╕реА рджрд┐рди рдпреЗ рдкреНрд░рдХрд╛рд░ рдЕрдкрдиреЗ Debug рдЖрдЙрдЯрдкреБрдЯ рдХреЛ рдкреНрд░рд┐рдВрдЯ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рд╡рд╛рдкрд╕ рдЖ рдЬрд╛рдПрдВрдЧреЗ рдпрджрд┐ рд╣рдо рдЕрдВрддрддрдГ рдПрдХ рд╡рд┐рд╢реЗрд╖рддрд╛ рдХреЗ рд░реВрдк рдореЗрдВ рд╡рд┐рд╢реЗрд╖рдЬреНрдЮрддрд╛ рдХреЛ рд╣рдЯрд╛ рджреЗрддреЗ рд╣реИрдВ?

рд╡рд╛рд╕реНрддрд╡ рдореЗрдВ, рдореБрдЭреЗ рд▓рдЧрддрд╛ рд╣реИ рдХрд┐ рд╣рдо рдЕрднреА рдЗрд╕ рд╡рд┐рд╢реЗрд╖рдЬреНрдЮрддрд╛ рдХреА рдЕрдиреБрдорддрд┐ рдирд╣реАрдВ рджреЗ рд╕рдХрддреЗ, рдХреНрдпреЛрдВрдХрд┐ рдЗрд╕рдХрд╛ рдЙрдкрдпреЛрдЧ рдЕрд╕реНрд╡рд╕реНрдерддрд╛ рдХрд╛ рдкрд░рд┐рдЪрдп рджреЗрдиреЗ рдХреЗ рд▓рд┐рдП рдХрд┐рдпрд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИред рдпрд╣ рдирд┐рд╣рд┐рддрд╛рд░реНрде рд╡рд╛рд╕реНрддрд╡ рдореЗрдВ рдареАрдХ рдЙрд╕реА рддрд░рд╣ рдХрд╛ рд╡рд┐рд╢реЗрд╖рдЬреНрдЮрддрд╛ рд╣реИ рдЬреЛ рд╣рдореЗрдВ рдмрд╣реБрдд рд╕рд╛рд░реА рд╕рдорд╕реНрдпрд╛рдУрдВ рдХрд╛ рдХрд╛рд░рдг рдмрдирддрд╛ рд╣реИ!

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(())
    }
}

рдЬрд┐рд╕ рддрд░рд╣ рд╕реЗ рд╡рд┐рд╢реЗрд╖рдЬреНрдЮрддрд╛ рд╡рд░реНрддрдорд╛рди рдореЗрдВ рдХрд╛рдо рдХрд░рддреА рд╣реИ, рдЙрд╕рдХреЗ рдХрд╛рд░рдг рдореИрдВ report рдХреЛ Foo<'a, 'b> $ рдкрд░ рдХреЙрд▓ рдХрд░ рд╕рдХрддрд╛ рд╣реВрдВ рдЬрд╣рд╛рдВ 'b 'a рд╕реЗ рдЕрдзрд┐рдХ рдирд╣реАрдВ рд░рд╣рддрд╛ рд╣реИ, рдФрд░ рдпрд╣ рд╡рд░реНрддрдорд╛рди рдореЗрдВ рдкреВрд░реА рддрд░рд╣ рд╕реЗ рд╕рдВрднрд╡ рд╣реИ рдХрд┐ рд╕рдВрдХрд▓рдХ рдЖрдЬреАрд╡рди рдЖрд╡рд╢реНрдпрдХрддрд╛рдУрдВ рдХреЛ рдкреВрд░рд╛ рдирд╣реАрдВ рдХрд░рдиреЗ рдХреЗ рдмрд╛рд╡рдЬреВрдж Display рдЗрдВрд╕реНрдЯреЗрдВрд╕ рдореЗрдВ рдХреЙрд▓ рдХрд░рдиреЗ рд╡рд╛рд▓реЗ рдЗрдореНрдкреНрд▓рд╛рдВрдЯ рдХрд╛ рдЪрдпрди рдХрд░реЗрдЧрд╛, рдЬрд┐рд╕рд╕реЗ рдЙрдкрдпреЛрдЧрдХрд░реНрддрд╛ рдХреЛ рд╕рдВрджрд░реНрдн рдХреЗ рдЬреАрд╡рдирдХрд╛рд▓ рдХреЛ рдЕрдорд╛рдиреНрдп рд░реВрдк рд╕реЗ рд╡рд┐рд╕реНрддрд╛рд░рд┐рдд рдХрд░рдиреЗ рдХреА рдЕрдиреБрдорддрд┐ рдорд┐рд▓рддреА рд╣реИред

рдореИрдВ рдЖрдк рд▓реЛрдЧреЛрдВ рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рдирд╣реАрдВ рдЬрд╛рдирддрд╛, рд▓реЗрдХрд┐рди рдЬрдм рдореИрдВ рддреНрд╡рд░рд┐рдд "рд╕реНрдХреНрд░рд┐рдкреНрдЯ" рд▓рд┐рдЦрддрд╛ рд╣реВрдВ, рддреЛ рдореБрдЭреЗ рдмрд╕ unwrap() рд╕рдм рдХреБрдЫ рдЦрддреНрдо рд╣реЛ рдЬрд╛рддрд╛ рд╣реИред рдпрд╣ 100 рдЧреБрдирд╛ рдмреЗрд╣рддрд░ рд╣реИ, рдХреНрдпреЛрдВрдХрд┐ рдЗрд╕рдореЗрдВ рдмреИрдХрдЯреНрд░реЗрд╕ рд╣реИрдВ рдЬреЛ рдореБрдЭреЗ рдкреНрд░рд╛рд╕рдВрдЧрд┐рдХ рдЬрд╛рдирдХрд╛рд░реА рдкреНрд░рджрд╛рди рдХрд░рддреЗ рд╣реИрдВред рдЗрд╕рдХреЗ рдмрд┐рдирд╛, рдпрджрд┐ рдореЗрд░реЗ рдХреЛрдб рдореЗрдВ рдПрдХ рд╕реЗ рдЕрдзрд┐рдХ рдмрд╛рд░ let ... = File::open() рд╣реИ, рддреЛ рдореИрдВ рдкрд╣рд▓реЗ рд╕реЗ рд╣реА рдпрд╣ рдирд╣реАрдВ рдкрд╣рдЪрд╛рди рд╕рдХрддрд╛ рдХрд┐ рдХреМрди рд╕рд╛ рд╡рд┐рдлрд▓ рд╣реБрдЖред

рдореИрдВ рдЖрдк рд▓реЛрдЧреЛрдВ рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рдирд╣реАрдВ рдЬрд╛рдирддрд╛, рд▓реЗрдХрд┐рди рдЬрдм рдореИрдВ рддреНрд╡рд░рд┐рдд "рд╕реНрдХреНрд░рд┐рдкреНрдЯ" рд▓рд┐рдЦрддрд╛ рд╣реВрдВ, рддреЛ рдореБрдЭреЗ рдмрд╕ unwrap() рд╕рдм рдХреБрдЫ рдЦрддреНрдо рд╣реЛ рдЬрд╛рддрд╛ рд╣реИред рдпрд╣ 100 рдЧреБрдирд╛ рдмреЗрд╣рддрд░ рд╣реИ, рдХреНрдпреЛрдВрдХрд┐ рдЗрд╕рдореЗрдВ рдмреИрдХрдЯреНрд░реЗрд╕ рд╣реИрдВ рдЬреЛ рдореБрдЭреЗ рдкреНрд░рд╛рд╕рдВрдЧрд┐рдХ рдЬрд╛рдирдХрд╛рд░реА рдкреНрд░рджрд╛рди рдХрд░рддреЗ рд╣реИрдВред рдЗрд╕рдХреЗ рдмрд┐рдирд╛, рдпрджрд┐ рдореЗрд░реЗ рдХреЛрдб рдореЗрдВ рдПрдХ рд╕реЗ рдЕрдзрд┐рдХ рдмрд╛рд░ let ... = File::open() рд╣реИ, рддреЛ рдореИрдВ рдкрд╣рд▓реЗ рд╕реЗ рд╣реА рдпрд╣ рдирд╣реАрдВ рдкрд╣рдЪрд╛рди рд╕рдХрддрд╛ рдХрд┐ рдХреМрди рд╕рд╛ рд╡рд┐рдлрд▓ рд╣реБрдЖред

рдпрд╣реА рдХрд╛рд░рдг рд╣реИ рдХрд┐ рдореИрдВ Display рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рдмрд╣реБрдд рджреГрдврд╝рддрд╛ рд╕реЗ рдорд╣рд╕реВрд╕ рдХрд░рддрд╛ рд╣реВрдВ, рдХреНрдпреЛрдВрдХрд┐ рдЖрдо рддреМрд░ рдкрд░ рдореИрдВ рдЗрд╕ рдорд╛рдорд▓реЗ рдореЗрдВ рдЬреЛ рдХрд░рддрд╛ рд╣реВрдВ рд╡рд╣ map_err рд╣реЛрддрд╛ рд╣реИ рдЬреЛ рдлрд╝рд╛рдЗрд▓ рдирд╛рдо рдФрд░ рдЕрдиреНрдп рдкреНрд░рд╛рд╕рдВрдЧрд┐рдХ рдкреНрд░рд╛рд╕рдВрдЧрд┐рдХ рдЬрд╛рдирдХрд╛рд░реА рд╕рдВрд▓рдЧреНрди рдХрд░рддрд╛ рд╣реИред рдЖрдо рддреМрд░ рдкрд░ рдореЗрд░реЗ рдЕрдиреБрднрд╡ рдореЗрдВ, рд╡рд╛рд╕реНрддрд╡ рдореЗрдВ рдЧрд▓рдд рдХреНрдпрд╛ рд╣реБрдЖ, рдЗрд╕реЗ рдЯреНрд░реИрдХ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдбреАрдмрдЧ рдЖрдЙрдЯрдкреБрдЯ рдХрдо рд╕рд╣рд╛рдпрдХ рд╣реЛрддрд╛ рд╣реИред

@ рдХрд┐рдХреНрд╕реБрдирд┐рд▓ : рд╡реИрдХрд▓реНрдкрд┐рдХ рд░реВрдк рд╕реЗ, рдореИрдВ рдПрдХ рдЕрдзрд┐рдХ рд╡рд┐рд╕реНрддреГрдд рддреНрд░реБрдЯрд┐ рдкреНрд░рдмрдВрдзрди рд░рдгрдиреАрддрд┐ рдФрд░/рдпрд╛ рдЕрдзрд┐рдХ рд╡реНрдпрд╛рдкрдХ рд▓реЙрдЧрд┐рдВрдЧ рдФрд░/рдпрд╛ рдбрд┐рдмрдЧрд┐рдВрдЧ рдкрд╕рдВрдж рдХрд░реВрдВрдЧрд╛ред

рдореБрдЭреЗ рд▓рдЧрддрд╛ рд╣реИ рдХрд┐ "рдЖрд░рдПрдлрд╕реА рд▓рд╛рдЧреВ рдХрд░реЗрдВ" рдХреЛ рдЪреБрдирд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИ, рд╣реИ рдирд╛? рдХрдо рд╕реЗ рдХрдо рдЗрд╕рдХреЗ рдЕрдиреБрд╕рд╛рд░! :рдореБрд╕реНрдХреБрд░рд╛рдУ:

рдореБрдЭреЗ рдХреНрд╖рдорд╛ рдХрд░реЗрдВ рдпрджрд┐ рдпрд╣ рдкреВрд░реА рддрд░рд╣ рд╕реЗ рдЕрдирдЬрд╛рди рд╣реИ, рд▓реЗрдХрд┐рди рдЬрдм рд╕рдВрднрд╡ рд╣реЛ рддреЛ рддреНрд░реБрдЯрд┐ рд╢реНрд░реГрдВрдЦрд▓рд╛ рдХреА рд░рд┐рдкреЛрд░реНрдЯ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдЖрдк рд╡рд┐рд╢реЗрд╖рдЬреНрдЮрддрд╛ рдХрд╛ рдЙрдкрдпреЛрдЧ рдирд╣реАрдВ рдХрд░ рд╕рдХреЗ:

use std::error::Error;

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

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

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

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

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

рдХреНрдпрд╛ рдХреЛрдИ рдХрд╛рд░рдг рд╣реИ рдХрд┐ рдЖрд░рдПрдлрд╕реА рдХрд╛ рдпрд╣ рд╣рд┐рд╕реНрд╕рд╛ рд▓рд╛рдЧреВ рдирд╣реАрдВ рдХрд┐рдпрд╛ рдЧрдпрд╛ рдерд╛?

рд╣рдордиреЗ рдЙрдкрдпреЛрдЧ рдХрд┐рдП рдЬрд╛рдиреЗ рд╡рд╛рд▓реЗ рд▓рдХреНрд╖рдгреЛрдВ рдФрд░ рдирд┐рд╣рд┐рддрд╛рд░реНрдереЛрдВ рдХреЗ рд╕рдЯреАрдХ рд╕реЗрдЯ рдореЗрдВ рдХреБрдЫ рдмрджрд▓рд╛рд╡ рдХрд┐рдП рд╣реИрдВ, рдореБрдЭреЗ рдЗрд╕ рдмрд┐рдВрджреБ рдкрд░ рд╡рд┐рд╡рд░рдг рдпрд╛рдж рдирд╣реАрдВ рд╣реИ - рдФрд░ рдореЗрд░рд╛ рдорд╛рдирдирд╛ тАЛтАЛтАЛтАЛрд╣реИ рдХрд┐ рд╕реНрдерд┐рд░ рд╣реЛрдиреЗ рдХреЗ рд▓рд┐рдП рдХреБрдЫ рд╡рд┐рд╡рд░рдг рдмрд╛рдХреА рд╣реИрдВред рдЖрдк рдЕрдзрд┐рдХ рд╡рд┐рд╡рд░рдг рдХреЗ рд▓рд┐рдП рд╢реАрд░реНрд╖ рдореБрджреНрджреЗ рд╕реЗ рдЬреБрдбрд╝реА рд╕реНрдерд┐рд░реАрдХрд░рдг рд░рд┐рдкреЛрд░реНрдЯ рджреЗрдЦрдирд╛ рдЪрд╛рд╣ рд╕рдХрддреЗ рд╣реИрдВред

рдЗрд╕ рд╕реБрд╡рд┐рдзрд╛ рдХреА рд╕реНрдерд┐рддрд┐ рдХреНрдпрд╛ рд╣реИ? рдХреНрдпрд╛ рд╕реНрдерд┐рд░реАрдХрд░рдг рдХрд╛ рдХреЛрдИ рдкреНрд░рд╕реНрддрд╛рд╡ рд╣реИ?

@ рдЧреНрд░реЗрдЬреИрдХ рдЗрд╕ рдореБрджреНрджреЗ рдХреЛ рдмрдВрдж рдХрд░ рджрд┐рдпрд╛ рдЬрд╛рдирд╛ рдЪрд╛рд╣рд┐рдП, рдХреНрдпреЛрдВрдХрд┐ рдпрд╣ рдХрд╛рдлреА рд╕рдордп рдкрд╣рд▓реЗ рдЙрддрд░рд╛ рдерд╛ред

рд╕рдЪ рд╣реИ, рдФрд░ рдореИрдВ рдереЛрдбрд╝рд╛ рднреНрд░рдорд┐рдд рд╣реЛ рдЧрдпрд╛, рдореИрдВ Termination рд╡рд┐рд╢реЗрд╖рддрд╛ рдореЗрдВ рд▓рд┐рдВрдХ рд╕реЗ рдпрд╣рд╛рдВ рдЖрдпрд╛ рдФрд░ рдореИрдВ рдЗрд╕рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рдкреВрдЫ рд░рд╣рд╛ рдерд╛, рдХреНрдпрд╛ termination_trait_lib рдХреЗ рд▓рд┐рдП рдХреЛрдИ рдЙрдЪрд┐рдд рд╕рдорд╕реНрдпрд╛ рд╣реИ?

рдЗрд╕ рдореБрджреНрджреЗ рдХреЛ рдмрдВрдж рдХрд░ рджреЗрдирд╛ рдЪрд╛рд╣рд┐рдП

Termination рдХреЗ рд╕реНрдерд┐рд░реАрдХрд░рдг рдХреЛ рдЯреНрд░реИрдХ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдпрд╣ рд╕рдорд╕реНрдпрд╛ рдЕрднреА рднреА рдЦреБрд▓реА рд╣реИред

рдХреНрдпрд╛ рдпрд╣ рдкреГрд╖реНрда рдЙрдкрдпреЛрдЧреА рдерд╛?
0 / 5 - 0 рд░реЗрдЯрд┐рдВрдЧреНрд╕

рд╕рдВрдмрдВрдзрд┐рдд рдореБрджреНрджреЛрдВ

Robbepop picture Robbepop  ┬╖  3рдЯрд┐рдкреНрдкрдгрд┐рдпрд╛рдБ

overvenus picture overvenus  ┬╖  3рдЯрд┐рдкреНрдкрдгрд┐рдпрд╛рдБ

wthrowe picture wthrowe  ┬╖  3рдЯрд┐рдкреНрдкрдгрд┐рдпрд╛рдБ

tikue picture tikue  ┬╖  3рдЯрд┐рдкреНрдкрдгрд┐рдпрд╛рдБ

lambda-fairy picture lambda-fairy  ┬╖  3рдЯрд┐рдкреНрдкрдгрд┐рдпрд╛рдБ