Rust: TryFrom/TryInto рд▓рдХреНрд╖рдгреЛрдВ рдХреЗ рд▓рд┐рдП рдЯреНрд░реИрдХрд┐рдВрдЧ рд╕рдорд╕реНрдпрд╛

рдХреЛ рдирд┐рд░реНрдорд┐рдд 5 рдордИ 2016  ┬╖  240рдЯрд┐рдкреНрдкрдгрд┐рдпрд╛рдБ  ┬╖  рд╕реНрд░реЛрдд: rust-lang/rust

https://github.com/rust-lang/rfcs/pull/1542 . рдХреЗ рд▓рд┐рдП рдЯреНрд░реИрдХрд┐рдВрдЧ рд╕рдорд╕реНрдпрд╛


рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП:

  • [ ] рдХреНрдпрд╛ рдореМрдЬреВрджрд╛ рджрд╕реНрддрд╛рд╡реЗрдЬ рд╕рдВрддреЛрд╖рдЬрдирдХ рд╣реИрдВ?
  • [x] https://github.com/rust-lang/rust/pull/56796 TryFrom рдХреЗ рдмрдЬрд╛рдп From Into рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП TryFrom рдХрдВрдмрд▓ рдХреА рд╕реАрдорд╛ рдмрджрд▓реЗрдВ
  • [ ] (рдкреБрдирдГ) рд╕реНрдерд┐рд░реАрдХрд░рдг рдкреАрдЖрд░
B-unstable C-tracking-issue T-libs

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

рдореИрдВ ! рдХреЛ рдПрдХ рд╢рдмреНрджрд╛рд╡рд▓реА рдкреНрд░рдХрд╛рд░ рдХреЗ рд▓рд┐рдП рдкрд░реНрдпрд╛рдкреНрдд рдмрдирдирд╛ рдЪрд╛рд╣рддрд╛ рд╣реВрдВ рддрд╛рдХрд┐ Result<_, !> рдХреЛ рд╕рд╣рдЬ рд░реВрдк рд╕реЗ "рдЕрдЪреВрдХ рдкрд░рд┐рдгрд╛рдо" рдХреЗ рд░реВрдк рдореЗрдВ рдкрдврд╝рд╛ рдЬрд╛ рд╕рдХреЗ, рдпрд╛ "рдкрд░рд┐рдгрд╛рдо рдЬреЛ (рд╢рд╛рдмреНрджрд┐рдХ рд░реВрдк рд╕реЗ) рдХрднреА рдирд╣реАрдВ рд╣реБрдЖред" рдПрдХ рдЙрдкрдирд╛рдо рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдирд╛ (рдПрдХ рдЕрд▓рдЧ рдкреНрд░рдХрд╛рд░ рд╕реЗ рдХреЛрдИ рдлрд░реНрдХ рдирд╣реАрдВ рдкрдбрд╝рддрд╛!) рдореБрдЭреЗ рдереЛрдбрд╝рд╛ рдмреЗрдорд╛рдиреА рд▓рдЧрддрд╛ рд╣реИ рдФрд░ рдореИрдВ рдЗрд╕реЗ рдХрдо рд╕реЗ рдХрдо рдЕрдкрдиреЗ рд▓рд┐рдП рдПрдХ рдХреНрд╖рдгрд┐рдХ рд╡рд┐рд░рд╛рдо рдХреЗ рдХрд╛рд░рдг рджреЗрдЦ рд╕рдХрддрд╛ рд╣реВрдВ рдЬрдм рдкреНрд░рдХрд╛рд░ рдХреЗ рд╣рд╕реНрддрд╛рдХреНрд╖рд░ рдкрдврд╝рддреЗ рд╣реИрдВ- "рд░реБрдХреЛ, рдпрд╣ рдХреИрд╕реЗ рдЕрд▓рдЧ рдерд╛ ! рдлрд┐рд░ рд╕реЗ ?" рд╡рд╛рдИрдПрдордПрдорд╡реА, рдмрд┐рд▓реНрдХреБрд▓ред

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

рдХреНрдпрд╛ Clone рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рдХреЗ рдмрд┐рдирд╛ рд░реВрдкрд╛рдВрддрд░рдг рд╡рд┐рдлрд▓ рд╣реЛрдиреЗ рдкрд░ рдореВрд▓ рдореВрд▓реНрдп рдХреЗ рд╕рд╛рде рдПрдХ рддреНрд░реБрдЯрд┐ рдХреЛ рд╕рд╛рдорд╛рдиреНрдп рд░реВрдк рд╕реЗ рдореБрджреНрд░рд┐рдд рдХрд░рдиреЗ рдХрд╛ рдХреЛрдИ рддрд░реАрдХрд╛ рд╣реИ, рдЗрд╕рд▓рд┐рдП рдПрдХ рд╕рдВрдмрдВрдзрд┐рдд рд╡рд┐рдзрд┐ рдЬреЛ рд╡рд┐рдлрд▓рддрд╛ рдкрд░ рдШрдмрд░рд╛рд╣рдЯ рдореЗрдВ рдЕрдЪреНрдЫрд╛ рддреНрд░реБрдЯрд┐ рд╕рдВрджреЗрд╢ рд╣реЛ рд╕рдХрддреА рд╣реИ?

рдпрд╣ рдкреНрд░рд╕реНрддрд╛рд╡рдирд╛ рдореЗрдВ рдЬрд╛рдирд╛ рдЪрд╛рд╣рд┐рдП рдпрд╛ рдирд╣реАрдВ, рдЗрд╕ рдкрд░ рдЪрд░реНрдЪрд╛ рд▓рдВрдмрд┐рдд рд╣реИ рдЬрдм рдпрд╣ рд╕реНрдерд┐рд░ рд╣реЛ рдЬрд╛рдПрдЧрд╛ред

рдХреНрд╖рдорд╛ рдХрд░реЗрдВ рдпрджрд┐ рдЗрд╕реЗ рдХрд╣реАрдВ рдФрд░ рдХрд╡рд░ рдХрд┐рдпрд╛ рдЧрдпрд╛ рд╣реИ, рд▓реЗрдХрд┐рди рдЗрд╕реЗ рд╕реНрдерд┐рд░ рдХреЗ рд░реВрдк рдореЗрдВ рдЪрд┐рд╣реНрдирд┐рдд рдХрд░рдиреЗ рд╕реЗ рдкрд╣рд▓реЗ рд╣рдо рдХреНрдпрд╛ рджреЗрдЦрдирд╛ рдЪрд╛рд╣реЗрдВрдЧреЗ? рдореБрдЭреЗ рдкреВрд░рд╛ рдпрдХреАрди рд╣реИ рдХрд┐ рдореИрдВрдиреЗ рд╡рд┐рднрд┐рдиреНрди рдкрд░рд┐рдпреЛрдЬрдирд╛рдУрдВ рдореЗрдВ рдЗрд╕ рдХрд╛рд░реНрдпрдХреНрд╖рдорддрд╛ рдХреЛ рдХрдИ рдмрд╛рд░ рдлрд┐рд░ рд╕реЗ рд▓рд╛рдЧреВ рдХрд┐рдпрд╛ рд╣реИ, рдЗрд╕рд▓рд┐рдП рдПрдХ рд╕рд╛рдорд╛рдиреНрдп рдкреБрди: рдкреНрд░рдпреЛрдЬреНрдп рд╡рд┐рд╢реЗрд╖рддрд╛ рдореБрдЭреЗ

рд╣рдо рдЗрд╕реЗ рдЕрдЧрд▓реЗ рдЪрдХреНрд░ рдХреЗ рд▓рд┐рдП рдЪрд░реНрдЪрд╛ рдХреЗ рд▓рд┐рдП рд▓рд╛ рд╕рдХрддреЗ рд╣реИрдВред

рдпрд╣ рдореБрджреНрджрд╛ рдЕрдм рд╕реНрдерд┐рд░реАрдХрд░рдг рдХреЗ рд▓рд┐рдП рдПрдХ рдЪрдХреНрд░-рд▓рдВрдмреА рдЕрдВрддрд┐рдо рдЯрд┐рдкреНрдкрдгреА рдЕрд╡рдзрд┐ рдореЗрдВ рдкреНрд░рд╡реЗрд╢ рдХрд░ рд░рд╣рд╛ рд╣реИ ЁЯФФ

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

рдЗрди рд▓рдХреНрд╖рдгреЛрдВ рдХреЗ рдЙрджреНрджреЗрд╢реНрдп рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рдореЗрд░реЗ рдХреБрдЫ рдкреНрд░рд╢реНрди рд╣реИрдВред

  1. рдЗрдиреНрд╣реЗрдВ std рдореЗрдВ рдХрд┐рд╕ рдкреНрд░рдХрд╛рд░ рдХреЗ рд▓рд┐рдП рд▓рд╛рдЧреВ рдХрд┐рдпрд╛ рдЬрд╛рдПрдЧрд╛?
  2. impl TryFrom<T> for T рдЬреИрд╕реЗ рдХрд╛рд░реНрдпрд╛рдиреНрд╡рдпрди рдХрд┐рд╕ рдкреНрд░рдХрд╛рд░ рдкреНрд░рд╛рдкреНрдд рдХрд░рдирд╛ рдЪрд╛рд╣рд┐рдП?
  3. рдпрджрд┐ рдЙрдирдХреЗ рдкрд╛рд╕ рдкрд╣рд▓реЗ рд╕реЗ рд╣реА impl From<U> for T рд╣реИ рддреЛ рдХрд┐рд╕ рдкреНрд░рдХрд╛рд░ рдХреЗ рдХрд╛рд░реНрдпрд╛рдиреНрд╡рдпрди рдХреЛ impl TryFrom<U> for T рдорд┐рд▓рдирд╛ рдЪрд╛рд╣рд┐рдП?

cc @sfackler , рдХреНрдпрд╛ рдЖрдк рдЗрдореНрдкреНрд▓рд╕ рдХреЗ рд╡рд░реНрддрдорд╛рди рд╕реЗрдЯ рдФрд░ рдХреБрдЫ рддрд░реНрдХреЛрдВ рдкрд░ рднреА рд╡рд┐рд╕реНрддрд╛рд░ рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ?

рдореБрдЭреЗ рд▓рдЧрддрд╛ рд╣реИ рдХрд┐ рд╕рд╛рдорд╛рдиреНрдп рддреМрд░ рдкрд░ рдЕрдВрддрд░реНрдЬреНрдЮрд╛рди From / Into рдХреЗ рд▓рд┐рдП рдмрд┐рд▓реНрдХреБрд▓ рд╡реИрд╕рд╛ рд╣реА рд╣реЛрдирд╛ рдЪрд╛рд╣рд┐рдП, рд╕рд┐рд╡рд╛рдп рдЗрд╕рдХреЗ рдХрд┐ рдЬрдм рд░реВрдкрд╛рдВрддрд░рдг рд╡рд┐рдлрд▓ рд╣реЛ рд╕рдХрддрд╛ рд╣реИред рдЬреИрд╕реЗ рд╣рдо рдорд╛рдирдХ рдкреБрд╕реНрддрдХрд╛рд▓рдп рдкреНрд░рдХрд╛рд░реЛрдВ рдореЗрдВ рдзреАрд░реЗ-рдзреАрд░реЗ From рдФрд░ Into рдХреЗ рдХрд╛рд░реНрдпрд╛рдиреНрд╡рдпрди рдЬреЛрдбрд╝рддреЗ рд╣реИрдВ, рдореБрдЭреЗ рдЙрдореНрдореАрдж рд╣реИ рдХрд┐ рд╣рдо TryFrom рдФрд░ TryInto рдХреЗ рд▓рд┐рдП рднреА рдРрд╕рд╛ рд╣реА рдХрд░реЗрдВрдЧреЗред рдпрд╣рд╛рдВ рд╕рдмрд╕реЗ рдорд╣рддреНрд╡рдкреВрд░реНрдг рджрд┐рд╢рд╛рдирд┐рд░реНрджреЗрд╢ рдпрд╣ рд╣реИ рдХрд┐ рд░реВрдкрд╛рдВрддрд░рдг "рдкреНрд░рд╛рдорд╛рдгрд┐рдХ рд░реВрдк рд╕реЗ рд╕реНрдкрд╖реНрдЯ" рд╣реЛрдирд╛ рдЪрд╛рд╣рд┐рдП - рдпрджрд┐ рдПрдХ рдкреНрд░рдХрд╛рд░ рдХреЛ рджреВрд╕рд░реЗ рдкреНрд░рдХрд╛рд░ рдореЗрдВ рдмрджрд▓рдиреЗ рдХреЗ рд▓рд┐рдП рдПрдХ рд╕реЗ рдЕрдзрд┐рдХ рдЙрдЪрд┐рдд рддрд░реАрдХреЗ рд╣реИрдВ, рддреЛ TryFrom рдпрд╛ From рд╕рд╣реА рдирд╣реАрдВ рд╣реЛ рд╕рдХрддрд╛ рд╣реИ рдЙрдкрдпреЛрдЧ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдЪреАрдЬреЗрдВред

_рд╕рд╛рдорд╛рдиреНрдп рддреМрд░ рдкрд░, рдореБрдЭреЗ рдирд╣реАрдВ рд▓рдЧрддрд╛ рдХрд┐ рдпрд╣ рдЙрдореНрдореАрдж рдХреА рдЬрд╛рдиреА рдЪрд╛рд╣рд┐рдП рдХрд┐ рд╕рднреА рдкреНрд░рдХрд╛рд░ impl TryFrom<T> for T рд╣реЛрдВ рдпрд╛ рдореИрдиреНрдпреБрдЕрд▓ рд░реВрдк рд╕реЗ impl From<U> for T рдЙрдард╛рдПрдВред рд╡рд┐рд╢реЗрд╖ рд░реВрдк рд╕реЗ, рдпрд╣ рдЕрдХреНрд╕рд░ рд╕реНрдкрд╖реНрдЯ рдирд╣реАрдВ рд╣реЛрддрд╛ рд╣реИ рдХрд┐ рдХреМрди рд╕рд╛ рддреНрд░реБрдЯрд┐ рдкреНрд░рдХрд╛рд░ рдЪреБрдирдирд╛ рд╣реИред рд╣рд╛рд▓рд╛рдВрдХрд┐, рдЙрди рдкреНрд░рдХрд╛рд░ рдХреЗ рдХрд╛рд░реНрдпрд╛рдиреНрд╡рдпрди рдмрд╣реБрдд рдЕрдзрд┐рдХ рд╣реИрдВ рдЬрд┐рдиреНрд╣реЗрдВ рдПрдХ рд╡рд┐рд╢реЗрд╖ рдПрдкреАрдЖрдИ рдХрд╛рдо рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдкрд░рд┐рднрд╛рд╖рд┐рдд рдХрд┐рдпрд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИ рдФрд░ рдкрд░рд┐рднрд╛рд╖рд┐рдд рдХрд┐рдпрд╛ рдЬрд╛рдирд╛ рдЪрд╛рд╣рд┐рдПред рдЙрджрд╛рд╣рд░рдг рдХреЗ рд▓рд┐рдП, рд╣рдорд╛рд░реЗ рдкрд╛рд╕ рдЖрд░рдПрдлрд╕реА рдореЗрдВ рдЙрд▓реНрд▓рд┐рдЦрд┐рдд рдХрд╛рд░рдгреЛрдВ рдХреЗ рд▓рд┐рдП рдЖрджрд┐рдо рдкреВрд░реНрдгрд╛рдВрдХ рдкреНрд░рдХрд╛рд░реЛрдВ рдХреЗ рд╡рд┐рднрд┐рдиреНрди рд╕рдВрдпреЛрдЬрдиреЛрдВ рдХреЗ рд▓рд┐рдП рдЗрди рджреЛрдиреЛрдВ рдкреНрд░рдХрд╛рд░ рдХреЗ рдХрд╛рд░реНрдпрд╛рдиреНрд╡рдпрди рд╣реИрдВред рдПрдХ рдЕрдиреНрдп рдЙрджрд╛рд╣рд░рдг рдХреЗ рд░реВрдк рдореЗрдВ, рдПрдХ рддрджрд░реНрде рд╡рд┐рд╢реЗрд╖рддрд╛ рдЬреЛ TryFrom / TryInto рдХреЛ рдкреНрд░рддрд┐рд╕реНрдерд╛рдкрд┐рдд рдХрд░реЗрдЧреА, рд╡рд╣ рд╣реИ postgres::IntoConnectParams , рдЬрд┐рд╕рдореЗрдВ ConnectParams рдХреЛ рдЕрдкрдиреЗ рдЖрдк рдореЗрдВ рдмрджрд▓рдиреЗ рдХреЗ рд▓рд┐рдП рдПрдХ рд░рд┐рдлреНрд▓реЗрдХреНрд╕рд┐рд╡ рдХрд╛рд░реНрдпрд╛рдиреНрд╡рдпрди рд╣реИред

рд╕рд╛рдорд╛рдиреНрдп рддреМрд░ рдкрд░, рдореБрдЭреЗ рдирд╣реАрдВ рд▓рдЧрддрд╛ рдХрд┐ рдпрд╣ рдЙрдореНрдореАрдж рдХреА рдЬрд╛рдиреА рдЪрд╛рд╣рд┐рдП рдХрд┐ рд╕рднреА рдкреНрд░рдХрд╛рд░реЛрдВ рдХреЛ TryFrom<T> for T рдпрд╛ рдореИрдиреНрдпреБрдЕрд▓ рд░реВрдк рд╕реЗ рдПрдХ impl From<U> for T рдЙрдард╛рдирд╛ рдЪрд╛рд╣рд┐рдПред

рдЬрдм рдПрдХ TryFrom рд░реВрдкрд╛рдВрддрд░рдг рдЕрдЪреВрдХ рд╣реЛрддрд╛ рд╣реИ рддреЛ рддреНрд░реБрдЯрд┐ рдкреНрд░рдХрд╛рд░ enum Void {} рд╣реЛрдирд╛ рдЪрд╛рд╣рд┐рдП, рд╣реИ рдирд╛? (рдпрд╛ рдХрд┐рд╕реА рдЕрдиреНрдп рдирд╛рдо рдХреЗ рд╕рд╛рде рдПрдХ рд╕рдорд╛рди рдПрдирдоред) рдЬреЛ рдореБрдЭреЗ рдПрдХ рд╕рд╛рдорд╛рдиреНрдп рдЙрджреНрджреЗрд╢реНрдп Void рдЯрд╛рдЗрдк рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдПрдХ рдЕрдЪреНрдЫреЗ рдХрд╛рд░рдг рдХреА рддрд░рд╣ рд▓рдЧрддрд╛ рд╣реИ std ред

@SimonSapin рдЬреЛ IntoConnectParams рд╕реНрдЯрд╛рдЗрд▓ API рдФрд░ рд╕рд╛рде рд╣реА RFC рдореЗрдВ рдЙрд▓реНрд▓рд┐рдЦрд┐рдд рдкреВрд░реНрдгрд╛рдВрдХ рд░реВрдкрд╛рдВрддрд░рдг рдЙрдкрдпреЛрдЧ рдХреЗрд╕ рдХреЛ рддреЛрдбрд╝ рджреЗрдЧрд╛ рдХреНрдпреЛрдВрдХрд┐ рддреНрд░реБрдЯрд┐ рдкреНрд░рдХрд╛рд░ рдХреЗ рдЕрдЪреВрдХ рдФрд░ рдЧрд┐рд░рдиреЗ рдпреЛрдЧреНрдп рд░реВрдкрд╛рдВрддрд░рдг рдореЗрд▓ рдирд╣реАрдВ рдЦрд╛рдПрдВрдЧреЗред

@sfackler рдпрджрд┐ рдЖрдк рддреНрд░реБрдЯрд┐ рдкреНрд░рдХрд╛рд░реЛрдВ рдХреЗ рд▓рд┐рдП рд╕рд╛рджреЗ From рдХрд╛ рдЙрдкрдпреЛрдЧ рдирд╣реАрдВ рдХрд░рддреЗ рд╣реИрдВ (рдЙрджрд╛рд╣рд░рдг рдХреЗ рд▓рд┐рдП try! )! impl<T> From<!> for T рдЙрд╕ рдЙрджреНрджреЗрд╢реНрдп рдХреЗ рд▓рд┐рдП рдореМрдЬреВрдж рд╣реЛ рд╕рдХрддрд╛ рд╣реИ рдФрд░ рд╣реЛрдирд╛ рдЪрд╛рд╣рд┐рдПред

рдЬреИрд╕реЗ рд╣рдо рдорд╛рдирдХ рдкреБрд╕реНрддрдХрд╛рд▓рдп рдкреНрд░рдХрд╛рд░реЛрдВ рдореЗрдВ рдзреАрд░реЗ-рдзреАрд░реЗ From рдФрд░ Into рдХреЗ рдХрд╛рд░реНрдпрд╛рдиреНрд╡рдпрди рдЬреЛрдбрд╝рддреЗ рд╣реИрдВ, рдореБрдЭреЗ рдЙрдореНрдореАрдж рд╣реИ рдХрд┐ рд╣рдо TryFrom рдФрд░ TryInto рдХреЗ рд▓рд┐рдП рднреА рдРрд╕рд╛ рд╣реА рдХрд░реЗрдВрдЧреЗред

рдРрд╕рд╛ рд▓рдЧрддрд╛ рд╣реИ рдХрд┐ рдРрд╕рд╛ рдЕрднреА рддрдХ рдирд╣реАрдВ рд╣реБрдЖ рд╣реИ, рдЗрд╕рд▓рд┐рдП рдореБрдЭреЗ рдирд╣реАрдВ рдкрддрд╛ рдХрд┐ рдРрд╕рд╛ рдЗрд╕рд▓рд┐рдП рд╣реИ рдХреНрдпреЛрдВрдХрд┐ рдХреЛрдИ рднреА рдЗрд╕рдХреЗ рдкрд╛рд╕ рдирд╣реАрдВ рдЧрдпрд╛ рд╣реИ рдпрд╛ std рдореЗрдВ рдХреЛрдИ рд▓рд╛рдЧреВ рдкреНрд░рдХрд╛рд░ рдирд╣реАрдВ рд╣реИред рдпрджрд┐ std рдореЗрдВ рд▓рд╛рдЧреВ рдкреНрд░рдХрд╛рд░ рд╣реИрдВ рддреЛ рдЙрдирдХреЗ рд▓рд┐рдП рдХреБрдЫ рдХрд╛рд░реНрдпрд╛рдиреНрд╡рдпрди рджреЗрдЦрдирд╛ рдЕрдЪреНрдЫрд╛ рд╣реЛрдЧрд╛ред рдЙрджрд╛рд╣рд░рдг рдХреЗ рд▓рд┐рдП рдирд┐рдореНрдирд▓рд┐рдЦрд┐рдд рдореЗрдВ рд╕реЗ рдХреЛрдИ рднреА рдЕрдЪреНрдЫрд╛ рдХрд╛рд░реНрдпрд╛рдиреНрд╡рдпрди рд╣реИ?

impl TryFrom<u32> for char
impl TryFrom<char> for u8
impl TryFrom<Vec<u8>> for String
impl TryFrom<&[u8]> for &str

_рд╕рд╛рдорд╛рдиреНрдп рддреМрд░ рдкрд░, рдореБрдЭреЗ рдирд╣реАрдВ рд▓рдЧрддрд╛ рдХрд┐ рдпрд╣ рдЙрдореНрдореАрдж рдХреА рдЬрд╛рдиреА рдЪрд╛рд╣рд┐рдП рдХрд┐ рд╕рднреА рдкреНрд░рдХрд╛рд░ impl TryFrom<T> for T рд╣реЛрдВ рдпрд╛ рдореИрдиреНрдпреБрдЕрд▓ рд░реВрдк рд╕реЗ impl From<U> for T рдЙрдард╛рдПрдВред

рдореБрджреНрджрд╛ рдпрд╣ рд╣реИ рдХрд┐ рдпрджрд┐ рдЖрдк TryInto<T> рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдирд╛ рдЪрд╛рд╣рддреЗ рд╣реИрдВ рдФрд░ T рдЖрдкрдХреЗ рдЯреЛрдХрд░реЗ рдореЗрдВ рдирд╣реАрдВ рд╣реИ рддреЛ рдЖрдкрдХреЛ рдХреЗрд╡рд▓ рдпрд╣ рдЖрд╢рд╛ рдХрд░рдиреА рд╣реЛрдЧреА рдХрд┐ impl TryFrom<T> for T рд▓рд╛рдЧреВ рд╣реЛ рдЧрдпрд╛ рд╣реИред рдпрд╣ рдПрдХ рджреБрд░реНрднрд╛рдЧреНрдпрдкреВрд░реНрдг рд╕реАрдорд╛ рд╣реИ, рдЬреЛ From / Into рдХреЗ рд▓рд┐рдП рдореМрдЬреВрдж рдирд╣реАрдВ рд╣реИред

@SimonSapin рдЬреЛ IntoConnectParams рд╢реИрд▓реА API рдФрд░ рд╕рд╛рде рд╣реА RFC рдореЗрдВ рдЙрд▓реНрд▓рд┐рдЦрд┐рдд рдкреВрд░реНрдгрд╛рдВрдХ рд░реВрдкрд╛рдВрддрд░рдг рдЙрдкрдпреЛрдЧ рдХреЗ рдорд╛рдорд▓реЗ рдХреЛ рддреЛрдбрд╝ рджреЗрдЧрд╛ рдХреНрдпреЛрдВрдХрд┐ рддреНрд░реБрдЯрд┐ рдкреНрд░рдХрд╛рд░ рдХреЗ рдЕрдЪреВрдХ рдФрд░ рдЧрд┐рд░рдиреЗ рдпреЛрдЧреНрдп рд░реВрдкрд╛рдВрддрд░рдг рдореЗрд▓ рдирд╣реАрдВ рдЦрд╛рдПрдВрдЧреЗред

рдХреНрдпрд╛ рдЗрд╕рдХрд╛ рдорддрд▓рдм рдпрд╣ рд╣реИ рдХрд┐ рдЖрдк рдЬрд┐рд╕ рдкреНрд░рдХрд╛рд░ рдореЗрдВ рдХрдирд╡рд░реНрдЯ рдХрд░ рд░рд╣реЗ рд╣реИрдВ рдЙрд╕рдХреЗ рдЖрдзрд╛рд░ рдкрд░ рддреНрд░реБрдЯрд┐ рдкреНрд░рдХрд╛рд░ рдХрд┐рд╕реА рднреА рддрд░рд╣ рддрдп рдХрд┐рдпрд╛ рдЧрдпрд╛ рд╣реИ?

рдХреНрдпреЛрдВ TryFrom::Err рдФрд░ TryInto::Err std::error::Error рд╕реЗ рдмрдВрдзреЗ рдирд╣реАрдВ рд╣реИрдВ?

рдПрд╕рдЯреАрдбреА рджреНрд╡рд╛рд░рд╛ рдмрд╛рдзреНрдп рдирд╣реАрдВ :: рддреНрд░реБрдЯрд┐ :: рддреНрд░реБрдЯрд┐?

рдпрд╣ Err рдХреЛ () $ рд╣реЛрдиреЗ рд╕реЗ рд░реЛрдХреЗрдЧрд╛, рдЬреЛ рдЕрдЪреВрдХ рд░реВрдкрд╛рдВрддрд░рдгреЛрдВ рдХреЗ рд▓рд┐рдП рдПрдХ рд╡реНрдпрд╡рд╣рд╛рд░реНрдп рддреНрд░реБрдЯрд┐ рдкреНрд░рдХрд╛рд░ рд╣реИред

рдпрджрд┐ () рддреНрд░реБрдЯрд┐ рдкреНрд░рдХрд╛рд░ рд╣реИ, рддреЛ рдлрд╝рдВрдХреНрд╢рди Err(()) рд▓реМрдЯрд╛ рд╕рдХрддрд╛ рд╣реИред рдпрд╣ рдлрд╝рдВрдХреНрд╢рди рдХреЛ рдЕрдЪреВрдХ рдирд╣реАрдВ рдмрдирд╛рддрд╛ рд╣реИред рдпрд╣ рд╡рд┐рдлрд▓ рд╣реЛрдиреЗ рдкрд░ рдЙрдкрдпреЛрдЧреА рддреНрд░реБрдЯрд┐ рдкреНрд░рджрд╛рди рдХрд░рдиреЗ рдореЗрдВ рд╡рд┐рдлрд▓ рд░рд╣рддрд╛ рд╣реИред рдХреЛрдб рд▓рд┐рдЦрддреЗ рд╕рдордп рдЬреЛ рд░реВрдкрд╛рдВрддрд░рдгреЛрдВ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рддрд╛ рд╣реИ рдЬреЛ рдЧрд▓рдд рд╣реЛ рд╕рдХрддрд╛ рд╣реИ рдпрд╛ рдирд╣реАрдВ рднреА рд╣реЛ рд╕рдХрддрд╛ рд╣реИ, рдореБрдЭреЗ рд▓рдЧрддрд╛ рд╣реИ рдХрд┐ Into рд╕реЗ рдмрд╛рдзреНрдп рд╣реЛрдирд╛ рдФрд░ TryInto рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдиреЗ рд╡рд╛рд▓реА рд╡рд┐рд╢реЗрд╖рдЬреНрдЮрддрд╛ рд▓рд┐рдЦрдирд╛ рд╕рдмрд╕реЗ рдЕрдЪреНрдЫрд╛ рддрд░реАрдХрд╛ рд╣реИред

рдПрдХ рдмрд╛рд░ RFC 1216 рд▓рд╛рдЧреВ рд╣реЛ рдЬрд╛рдиреЗ рдХреЗ рдмрд╛рдж, ! рдЕрдЪреВрдХ рд░реВрдкрд╛рдВрддрд░рдгреЛрдВ рдХреЗ рд▓рд┐рдП рдЙрдкрдпреБрдХреНрдд рддреНрд░реБрдЯрд┐ рдкреНрд░рдХрд╛рд░ рд╣реЛрдЧрд╛ред рдореИрдВ _рдерд┐рдВрдХ_ рдЗрд╕рдХрд╛ рдорддрд▓рдм рдпрд╣ рд╣реЛрдЧрд╛ рдХрд┐ Error TryFrom::Err / TryInto::Err рдкрд░ рдмрд╛рдзреНрдп Error рдареАрдХ рд░рд╣реЗрдЧрд╛ред

рдореИрдВ рдирд┐рд╢реНрдЪрд┐рдд рд░реВрдк рд╕реЗ рдЗрд╕реЗ рдкрд╕рдВрдж рдХрд░реВрдВрдЧрд╛ рдпрджрд┐ From<T> рдХреЛ рд▓рд╛рдЧреВ рдХрд░рдиреЗ рд╕реЗ TryFrom<T, Err = !> рдХрд╛рд░реНрдпрд╛рдиреНрд╡рдпрди рдкреНрд░рд╛рдкреНрдд рд╣реБрдЖ (рдФрд░ рдирд┐рд╢реНрдЪрд┐рдд рд░реВрдк рд╕реЗ Into рдХреЗ рд▓рд┐рдП)ред

рдореИрдВ _рдерд┐рдВрдХ_ рдЗрд╕рдХрд╛ рдорддрд▓рдм рдпрд╣ рд╣реЛрдЧрд╛ рдХрд┐ Error рдкрд░ TryFrom::Err / TryInto::Err рдкрд░ рдмрд╛рдзреНрдп рд╣реЛрдирд╛ рдареАрдХ рд░рд╣реЗрдЧрд╛ред

рд╣рд╛рдБ, рд╣рдорд╛рд░реЗ рдкрд╛рд╕ рдирд┐рд╢реНрдЪрд┐рдд рд░реВрдк рд╕реЗ рдЗрд╕ рдкреНрд░рдХрд╛рд░ рдХреЗ рдорд╛рдорд▓реЛрдВ рдХреЗ рд▓рд┐рдП impl Error for ! { ... } рд╣реЛрдЧрд╛ред

рдореИрдВ рдкреВрд░реНрдгрд╛рдВрдХ рд░реВрдкрд╛рдВрддрд░рдгреЛрдВ рдХреЗ рдЙрдкрдпреЛрдЧ рдХреЗ рдорд╛рдорд▓реЗ рдореЗрдВ рдкреНрд░рдХрд╛рд░ рдХреЗ рдЕрдВрддрд░ рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рдереЛрдбрд╝рд╛ рдЪрд┐рдВрддрд┐рдд рд╣реВрдВ, рд▓реЗрдХрд┐рди рдРрд╕рд╛ рд▓рдЧрддрд╛ рд╣реИ рдХрд┐ рд╣рдореЗрдВ рд╢рд╛рдпрдж рдЗрд╕реЗ ! -as-a-type рднреВрдорд┐ рддрдХ рдкреНрд░рдпреЛрдЧ рдХрд░рдиреЗ рдХрд╛ рдореМрдХрд╛ рдорд┐рд▓рдиреЗ рддрдХ рдЗрд╕реЗ рд╕реНрдерд┐рд░ рдХрд░рдиреЗ рдкрд░ рдзреНрдпрд╛рди рджреЗрдирд╛ рдЪрд╛рд╣рд┐рдПред

рдореЗрд░реЗ рдкреАрдУрд╡реА рдореЗрдВ рддреНрд░реБрдЯрд┐рдпреЛрдВ рдХрд╛ рдкреНрд░рддрд┐рдирд┐рдзрд┐рддреНрд╡ рдХрд░рдиреЗ рд╡рд╛рд▓реЗ рд╕рднреА рд╕рдВрдмрджреНрдз рдкреНрд░рдХрд╛рд░реЛрдВ рдХреЛ Error рджреНрд╡рд╛рд░рд╛ рдмрд╛рдзреНрдп рдХрд┐рдпрд╛ рдЬрд╛рдирд╛ рдЪрд╛рд╣рд┐рдПред рдЕрдлрд╕реЛрд╕ рдХреА рдмрд╛рдд рд╣реИ рдХрд┐ рд╣рдордиреЗ рдЗрд╕рдХреЗ рдмрд┐рдирд╛ рдкрд╣рд▓реЗ рд╣реА рдПрдХ рдкреНрд░рдХрд╛рд░ рдЫреЛрдбрд╝ рджрд┐рдпрд╛ рд╣реИ: FromStr::Err (рдХреЗрд╡рд▓ рдЕрдиреНрдп рд╕рд╛рд░реНрд╡рдЬрдирд┐рдХ рдкреНрд░рдХрд╛рд░ TryInto рдФрд░ TryFrom рд╣реИрдВ, рдЬрд┐рдиреНрд╣реЗрдВ $#$ ack 'type Err;' рдФрд░ ack 'type Error;' рд╕реЗ рдЪреЗрдХ рдХрд┐рдпрд╛ рдЧрдпрд╛ рд╣реИред

рд╣рд╛рд▓ рд╣реА рдореЗрдВ рдЪрд░реНрдЪрд╛ рдХреА рдЧрдИ, libs рдЯреАрдо рдиреЗ ! рдкреНрд░рдХрд╛рд░ рдкрд░ рдХрд╛рдо рдХрд┐рдП рдЬрд╛рдиреЗ рддрдХ рдЗрди рд▓рдХреНрд╖рдгреЛрдВ рдХреЛ рд╕реНрдерд┐рд░ рдХрд░рдиреЗ рдХрд╛ рдкреНрд░рдпрд╛рд╕ рдХрд░рдиреЗ рдХрд╛ рдирд┐рд░реНрдгрдп рд▓рд┐рдпрд╛ред

рдореБрдЭреЗ рд▓рдЧрддрд╛ рд╣реИ рдХрд┐ рдЕрдм рдпрд╣ рдЕрд╡рд░реБрджреНрдз рдирд╣реАрдВ рд╣реИ, рд╣реИ рдирд╛?

@Sfackler рдХреЗ рд░реВрдк рдореЗрдВ рдирд╛рдорд╛рдВрдХрди рдХреЛ рд╣рдЯрд╛рдиреЗ рд╕реЗ ! рдкреНрд░рдХрд╛рд░ рдФрд░ рдЗрди рд▓рдХреНрд╖рдгреЛрдВ рдХреА рдЬрд╛рдВрдЪ рдХреА рдЬрд╛рдПрдЧреАред

рдХреНрдпрд╛ рдирд┐рдХрдЯ рднрд╡рд┐рд╖реНрдп рдореЗрдВ рд╕реНрдерд┐рд░ рд╣реЛрдиреЗ рдХреЗ рд▓рд┐рдП рдЗрд╕рдореЗрдВ рдХреЛрдИ рдмрджрд▓рд╛рд╡ рд╣реЛрдЧрд╛?

рдХреНрдпреЛрдВ TryFrom::Err рдФрд░ TryInto::Err std::error::Error рд╕реЗ рдмрд╛рдзреНрдп рдирд╣реАрдВ рд╣реИ?

std::err::Error #![no_std] рдмрд┐рд▓реНрдб рдореЗрдВ рдореМрдЬреВрдж рдирд╣реАрдВ рд╣реИред рд╕рд╛рде рд╣реА, рдХрдИ рдорд╛рдорд▓реЛрдВ рдореЗрдВ рддреНрд░реБрдЯрд┐ рдкреНрд░рдХрд╛рд░ рдХреЗ рд▓рд┐рдП рдЙрдкрд▓рдмреНрдз рд╣реЛрдиреЗ рдкрд░ рднреА std::err::Error рдХреЛ рд▓рд╛рдЧреВ рдХрд░рдиреЗ рдореЗрдВ рдХреЛрдИ рд▓рд╛рдн рдирд╣реАрдВ рд╣реЛрддрд╛ рд╣реИред рдЗрд╕ рдкреНрд░рдХрд╛рд░, рдореИрдВ рдЗрд╕ рддрд░рд╣ рдХреА рдХреЛрдИ рдмрд╛рдзреНрдпрддрд╛ рдирд╣реАрдВ рд░рдЦрдирд╛ рдкрд╕рдВрдж рдХрд░реВрдВрдЧрд╛ред

рдореИрдВрдиреЗ рдЗрд╕реЗ рд╕реНрд╡рдпрдВ рдЕрдкрдиреЗ рдкреБрд╕реНрддрдХрд╛рд▓рдп рдореЗрдВ рд▓рд╛рдЧреВ рдХрд░рдиреЗ рдХрд╛ рдкреНрд░рдпреЛрдЧ рдХрд┐рдпрд╛ рд╣реИред рдореИрдВ https://github.com/rust-lang/rfcs/pull/1542#issuecomment -206804137: try!(x.try_into()); рдореЗрдВ @SimonSapin рджреНрд╡рд╛рд░рд╛ рд╡реНрдпрдХреНрдд рдХреА рдЧрдИ рдЪрд┐рдВрддрд╛ рдХреЛ рджреЛрд╣рд░рд╛рдирд╛ рдЪрд╛рд╣рддрд╛ рд╣реВрдВ рдХреНрдпреЛрдВрдХрд┐ рдпрд╣ рднреНрд░рдорд┐рдд рдХрд░рдиреЗ рд╡рд╛рд▓рд╛ рд╣реИ рдХреНрдпреЛрдВрдХрд┐ "рдХреЛрд╢рд┐рд╢" рд╢рдмреНрдж рд╣реИ рдПрдХ рд╣реА рдХрдерди рдореЗрдВ рджреЛ рдЕрд▓рдЧ-рдЕрд▓рдЧ рддрд░реАрдХреЛрдВ рдХрд╛ рдЗрд╕реНрддреЗрдорд╛рд▓ рдХрд┐рдпрд╛ред

рдореИрдВ рд╕рдордЭрддрд╛ рд╣реВрдВ рдХрд┐ рдмрд╣реБрдд рд╕реЗ рд▓реЛрдЧ рдХрд╣рддреЗ рд╣реИрдВ рдХрд┐ рдРрд╕реА рдЪреАрдЬреЗрдВ x.try_into()?; рд▓рд┐рдЦреА рдЬрд╛рдиреА рдЪрд╛рд╣рд┐рдП, рд╣рд╛рд▓рд╛рдВрдХрд┐ рдореИрдВ рдЙрди рд▓реЛрдЧреЛрдВ рдХреА рдПрдХ рдмрдбрд╝реА рд╕рдВрдЦреНрдпрд╛ рдореЗрдВ рд╕реЗ рдПрдХ рд╣реВрдВ (рд╕рднреА рдмрд╣рд╕реЛрдВ рдХреЗ рдЖрдзрд╛рд░ рдкрд░) рдЬреЛ рджреГрдврд╝рддрд╛ рд╕реЗ ? рд╕рд┐рдВрдЯреИрдХреНрд╕ рдХрд╛ рдЙрдкрдпреЛрдЧ рдирд╣реАрдВ рдХрд░рдирд╛ рдкрд╕рдВрдж рдХрд░рддреЗ рд╣реИрдВред рд╕рднреА рдмрд╣рд╕реЛрдВ рдореЗрдВ рдЙрд▓реНрд▓рд┐рдЦрд┐рдд рд╕рднреА рдХрд╛рд░рдгреЛрдВ рдХреЗ рдХрд╛рд░рдгред

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

рдореИрдВ рдирд╛рдордХрд░рдг рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рд╡рд┐рд╢реЗрд╖ рд░реВрдк рд╕реЗ рджреГрдврд╝рддрд╛ рд╕реЗ рдорд╣рд╕реВрд╕ рдирд╣реАрдВ рдХрд░рддрд╛, рд▓реЗрдХрд┐рди рдореИрдВ рд╡реНрдпрдХреНрддрд┐рдЧрдд рд░реВрдк рд╕реЗ рдХреБрдЫ рднреА рдмреЗрд╣рддрд░ рдирд╣реАрдВ рд╕реЛрдЪ рд╕рдХрддрд╛ред

Result рд▓реМрдЯрд╛рдиреЗ рд╡рд╛рд▓реЗ рдХрд╛рд░реНрдпреЛрдВ рдХреЗ рдлреНрд▓реЗрд╡рд░ рдХреЗ рд▓рд┐рдП try_ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдирд╛ рдкрд╣рд▓реЗ рд╕реЗ рд╣реА рдЕрд░реНрдз-рдорд╛рдирдХ рдмрди рдЧрдпрд╛ рд╣реИред

рд╣рд╛рд▓рд╛рдВрдХрд┐ рдореИрдВ рдЙрди рд▓реЛрдЧреЛрдВ рдХреА рдПрдХ рдмрдбрд╝реА рд╕рдВрдЦреНрдпрд╛ рдореЗрдВ рд╕реЗ рдПрдХ рд╣реВрдВ (рд╕рднреА рдмрд╣рд╕реЛрдВ рдХреЗ рдЖрдзрд╛рд░ рдкрд░) рдЬреЛ ? рд╕рд┐рдВрдЯреИрдХреНрд╕ рдХрд╛ рдЙрдкрдпреЛрдЧ рдирд╣реАрдВ рдХрд░рдирд╛ рдкрд╕рдВрдж рдХрд░рддреЗ рд╣реИрдВ рдХреНрдпреЛрдВрдХрд┐ ... рд╕рднреА рдмрд╣рд╕реЛрдВ рдореЗрдВ рдЙрд▓реНрд▓рд┐рдЦрд┐рдд рд╕рднреА рдХрд╛рд░рдгред

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

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

рдореИрдВ @SimonSapin рджреНрд╡рд╛рд░рд╛ рд░рд╕реНрдЯ-рд▓реИрдВрдЧ/rfcs#1542 рдореЗрдВ рд╡реНрдпрдХреНрдд рдХреА рдЧрдИ рдЪрд┐рдВрддрд╛ рдХреЛ рджреЛрд╣рд░рд╛рдирд╛ рдЪрд╛рд╣рддрд╛ рд╣реВрдВ (рдЯрд┐рдкреНрдкрдгреА)

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

рдЗрд╕рдХреЗ рдЕрд▓рд╛рд╡рд╛, рдореБрдЭреЗ рд▓рдЧрддрд╛ рд╣реИ рдХрд┐ рдмрд╛рдж рдХреЗ рдмрдЬрд╛рдп рдЬрд▓реНрдж рд╣реА рд╕реНрдерд┐рд░ рд╣реЛрдирд╛ рджреВрд╕рд░реЗ рджреМрд░ рдХреЗ рдирд╛рдо рдмрд╛рдЗрдХрд╢реЗрдбрд┐рдВрдЧ рд╕реЗ рдЕрдзрд┐рдХ рдорд╣рддреНрд╡рдкреВрд░реНрдг рд╣реИред RFC рдХреЛ рд╕реНрд╡реАрдХрд╛рд░ рдХрд┐рдП рдХрдИ рдорд╣реАрдиреЗ рд╣реЛ рдЪреБрдХреЗ рд╣реИрдВ рдФрд░ рдЗрд╕реЗ #[unstable] рд▓рд╛рдЧреВ рдХрд┐рдпрд╛ рдЧрдпрд╛ рд╣реИред

рдкрд░рд┐рдгрд╛рдо рд▓реМрдЯрд╛рдиреЗ рд╡рд╛рд▓реЗ рдХрд╛рд░реНрдпреЛрдВ рдХреЗ рд╕реНрд╡рд╛рдж рдХреЗ рд▓рд┐рдП try_ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдпрд╣ рдкрд╣рд▓реЗ рд╕реЗ рд╣реА рдЕрд░реНрдз-рдорд╛рдирдХ рдмрди рдЧрдпрд╛ рд╣реИред

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

рд╕рд╛рде рд╣реА, рдореБрдЭреЗ рдЗрд╕реЗ рд▓рд┐рдЦрдиреЗ рдХрд╛ рдХреЛрдИ рд╡реНрдпрд╛рд╡рд╣рд╛рд░рд┐рдХ рд▓рд╛рдн рдирд╣реАрдВ рдорд┐рд▓рд╛ рд╣реИ:

impl TryInto<X> for Y {
    type Err = MyErrorType;

   fn try_into(self) -> Result<X, Self::Err> { ... }
}

рдЗрд╕рдХреЗ рдмрдЬрд╛рдП, рдореИрдВ рд╣рдореЗрд╢рд╛ рдЗрд╕реЗ рд▓рд┐рдЦ рд╕рдХрддрд╛ рд╣реВрдВ, рдмрд╣реБрдд рдХрдо рд╡рд╛рдХреНрдп рд░рдЪрдирд╛рддреНрдордХ рдУрд╡рд░рд╣реЗрдб:

    fn into_x(self) -> Result<X, MyErrorType> { ... }

рдореБрдЭреЗ рдмрд╣реБрдд рд╕рд╛рд░реЗ рд░реВрдкрд╛рдВрддрд░рдг рд╣реЛрдиреЗ рдХреЗ рдмрд╛рд╡рдЬреВрдж TryInto рдпрд╛ TryFrom рджреНрд╡рд╛рд░рд╛ рдорд╛рдирдХреАрдХреГрдд рдХрд┐рдпрд╛ рдЧрдпрд╛ рдЬреЗрдиреЗрд░рд┐рдХ рдХреЛрдб рдХрднреА рдирд╣реАрдВ рд▓рд┐рдЦрдирд╛ рдкрдбрд╝рд╛, рдЗрд╕рд▓рд┐рдП рдмрд╛рдж рд╡рд╛рд▓рд╛ рдлреЙрд░реНрдо рдореЗрд░реЗ рджреНрд╡рд╛рд░рд╛ рдкрд░рд┐рднрд╛рд╖рд┐рдд рдкреНрд░рдХрд╛рд░реЛрдВ рдореЗрдВ рдореЗрд░реЗ рд╕рднреА рдЙрдкрдпреЛрдЧреЛрдВ рдХреЗ рд▓рд┐рдП рдкрд░реНрдпрд╛рдкреНрдд рд╣реИред рдореБрдЭреЗ рд▓рдЧрддрд╛ рд╣реИ рдХрд┐ TryInto<...> рдпрд╛ TryFrom<...> рдкреИрд░рд╛рдореАрдЯрд░ рд╕рдВрджрд┐рдЧреНрдз рд░реВрдк рдХреА рддрд░рд╣ рд▓рдЧрддреЗ рд╣реИрдВред

рд╕рд╛рде рд╣реА, рдореИрдВрдиреЗ рдкрд╛рдпрд╛ рдХрд┐ рд╕рдВрдмрдВрдзрд┐рдд рддреНрд░реБрдЯрд┐ рдкреНрд░рдХрд╛рд░ рдХрд╛ рдирд╛рдордХрд░рдг Err рдХреЗ рдмрдЬрд╛рдп Error рддреНрд░реБрдЯрд┐-рдкреНрд░рд╡рдг рдерд╛ рдХреНрдпреЛрдВрдХрд┐ рдореИрдВрдиреЗ рд╣рдореЗрд╢рд╛ Error рдЯрд╛рдЗрдк рдХрд┐рдпрд╛ рдерд╛ред рдореИрдВрдиреЗ рджреЗрдЦрд╛ рдХрд┐ рдпрд╣ рдЧрд▓рддреА рдЖрд░рдПрдлрд╕реА рдХреЗ рдкреНрд░рд╛рд░реВрдкрдг рдХреЗ рджреМрд░рд╛рди рднреА рдХреА рдЧрдИ рдереА: https://github.com/rust-lang/rfcs/pull/1542#r60139383ред рд╕рд╛рде рд╣реА, Result рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдиреЗ рд╡рд╛рд▓рд╛ рдХреЛрдб рдкрд╣рд▓реЗ рд╕реЗ рд╣реА Err рдирд╛рдо рдХрд╛ рд╡реНрдпрд╛рдкрдХ рд░реВрдк рд╕реЗ рдЙрдкрдпреЛрдЧ рдХрд░рддрд╛ рд╣реИ рдХреНрдпреЛрдВрдХрд┐ рдпрд╣ Result рдХрдВрд╕реНрдЯреНрд░рдХреНрдЯрд░ рд╣реИред

рдПрдХ рд╡реИрдХрд▓реНрдкрд┐рдХ рдкреНрд░рд╕реНрддрд╛рд╡ рдерд╛ рдЬреЛ рд╡рд┐рд╢реЗрд╖ рд░реВрдк рд╕реЗ рдкреВрд░реНрдгрд╛рдВрдХ рдкреНрд░рдХрд╛рд░реЛрдВ рдкрд░ рдХреЗрдВрджреНрд░рд┐рдд рдерд╛ рдФрд░ "рдЪреМрдбрд╝рд╛" рдФрд░ "рд╕рдВрдХреАрд░реНрдг" рдЬреИрд╕реА рд╢рдмреНрджрд╛рд╡рд▓реА рдХрд╛ рдЗрд╕реНрддреЗрдорд╛рд▓ рдХрд░рддрд╛ рдерд╛, рдЙрджрд╛рд╣рд░рдг рдХреЗ рд▓рд┐рдП x = try!(x.narrow()); рдЬрд┐рд╕реЗ рдореИрдВрдиреЗ рднреА рд▓рд╛рдЧреВ рдХрд┐рдпрд╛ рдерд╛ред рдореИрдВрдиреЗ рдкрд╛рдпрд╛ рдХрд┐ рдореЗрд░реЗ рд╡рд╛рд╕реНрддрд╡рд┐рдХ рдЙрдкрдпреЛрдЧ рдореЗрдВ рдкреНрд░рд╕реНрддрд╛рд╡рд┐рдд рдХрд╛рд░реНрдпрдХреНрд╖рдорддрд╛ рдХреЗ рдореЗрд░реЗ рдЙрдкрдпреЛрдЧ рдХреЗ рд▓рд┐рдП рдкреНрд░рд╕реНрддрд╛рд╡ рдкрд░реНрдпрд╛рдкреНрдд рдерд╛ рдХреНрдпреЛрдВрдХрд┐ рдореИрдВрдиреЗ рдХреЗрд╡рд▓ рдЕрдВрддрд░реНрдирд┐рд░реНрдорд┐рдд рдкреВрд░реНрдгрд╛рдВрдХ рдкреНрд░рдХрд╛рд░реЛрдВ рдкрд░ рдРрд╕реЗ рд░реВрдкрд╛рдВрддрд░рдг рдХрд┐рдПред рдпрд╣ рдЙрдкрдпреЛрдЧ рдХреЗ рдорд╛рдорд▓реЛрдВ рдХреЗ рд▓рд┐рдП рдЕрдзрд┐рдХ рдПрд░реНрдЧреЛрдиреЛрдорд┐рдХ рдФрд░ рд╕реНрдкрд╖реНрдЯ (рдЖрдИрдПрдордУ) рднреА рд╣реИ рдЬреЛ рдЗрд╕рдХреЗ рд▓рд┐рдП рдкрд░реНрдпрд╛рдкреНрдд рд╣реИред

рдЗрд╕рдХреЗ рдЕрд▓рд╛рд╡рд╛, рдореБрдЭреЗ рдЗрд╕реЗ рд▓рд┐рдЦрдиреЗ рдХрд╛ рдХреЛрдИ рд╡реНрдпрд╛рд╡рд╣рд╛рд░рд┐рдХ рд▓рд╛рдн рдирд╣реАрдВ рдорд┐рд▓рд╛ рд╣реИ ...

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

impl TryInto<TcpStream> for SocketAddr {
    type Err = io::Error;
    fn try_into(self) -> Result<TcpStream, io::Error> {
        TcpStream::connect(self)
    }
}

impl<T> TryInto<MutexGuard<T>> for Mutex<T> {
    type Err = TryLockError<MutexGuard<T>>;
    fn try_into(self) -> Result<Mutex<T>, Self::Err> {
        self.try_lock()
    }
}

impl TryInto<process::Output> for process::Child {
    type Err = io::Error;
    fn try_into(self) -> Result<process::Output, io::Error> {
        self.wait_with_output()
    }
}

impl TryInto<String> for Vec<u8> {
    type Err = FromUtf8Error;
    fn try_into(self) -> Result<String, FromUtf8Error> {
        String::from_utf8(self)
    }
}

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

рдореБрдЭреЗ рд▓рдЧрддрд╛ рд╣реИ рдХрд┐ TryInto<...> рдпрд╛ TryFrom<...> рдкреИрд░рд╛рдореАрдЯрд░ рд╕рдВрджрд┐рдЧреНрдз рд░реВрдк рдХреА рддрд░рд╣ рд▓рдЧрддреЗ рд╣реИрдВред

рднреА рд╕рд╣рдордд рд╣реИрдВред рдлрд╝рдВрдХреНрд╢рди рдХреЛ рдорд╛рди рдкрд╛рд╕ рдХрд░рдиреЗ рд╕реЗ рдкрд╣рд▓реЗ рдЖрдк рдХреЗрд╡рд▓ рд░реВрдкрд╛рдВрддрд░рдг рдХреНрдпреЛрдВ рдирд╣реАрдВ рдХрд░реЗрдВрдЧреЗ рдФрд░ рддреНрд░реБрдЯрд┐ рдХреЛ рд╕рдВрднрд╛рд▓реЗрдВрдЧреЗ?

std::err::Error #![no_std] рдмрд┐рд▓реНрдб рдореЗрдВ рдореМрдЬреВрдж рдирд╣реАрдВ рд╣реИред рд╕рд╛рде рд╣реА, рдХрдИ рдорд╛рдорд▓реЛрдВ рдореЗрдВ рдЙрдкрд▓рдмреНрдз рд╣реЛрдиреЗ рдкрд░ рднреА рддреНрд░реБрдЯрд┐ рдкреНрд░рдХрд╛рд░ рдХреЗ рд▓рд┐рдП std::err::Error рд▓рд╛рдЧреВ рдХрд░рдиреЗ рдореЗрдВ рдХреЛрдИ рд▓рд╛рдн рдирд╣реАрдВ рд╣реЛрддрд╛ рд╣реИред рдЗрд╕ рдкреНрд░рдХрд╛рд░, рдореИрдВ рдЗрд╕ рддрд░рд╣ рдХреА рдХреЛрдИ рдмрд╛рдзреНрдпрддрд╛ рдирд╣реАрдВ рд░рдЦрдирд╛ рдкрд╕рдВрдж рдХрд░реВрдВрдЧрд╛ред

std::error::Error рд╕реЗ рдмрдВрдзреЗ рд╣реЛрдиреЗ рдХрд╛ рдПрдХ рд▓рд╛рдн рдпрд╣ рд╣реИ рдХрд┐ рдпрд╣ рдХрд┐рд╕реА рдЕрдиреНрдп рддреНрд░реБрдЯрд┐ рдХреЗ cause() рдХрд╛ рд╡рд╛рдкрд╕реА рдореВрд▓реНрдп рд╣реЛ рд╕рдХрддрд╛ рд╣реИред рдореИрдВ рд╡рд╛рд╕реНрддрд╡ рдореЗрдВ рдирд╣реАрдВ рдЬрд╛рдирддрд╛ рдХрд┐ core::error::Error рдХреНрдпреЛрдВ рдирд╣реАрдВ рд╣реИ, рд▓реЗрдХрд┐рди рдореИрдВрдиреЗ рдЙрд╕ рдкрд░ рдзреНрдпрд╛рди рдирд╣реАрдВ рджрд┐рдпрд╛ рд╣реИред

рд╕рд╛рде рд╣реА, рдореИрдВрдиреЗ рдкрд╛рдпрд╛ рдХрд┐ рддреНрд░реБрдЯрд┐ рдХреЗ рдмрдЬрд╛рдп рд╕рдВрдмрдВрдзрд┐рдд рддреНрд░реБрдЯрд┐ рдкреНрд░рдХрд╛рд░ Err рдХрд╛ рдирд╛рдордХрд░рдг рддреНрд░реБрдЯрд┐-рдкреНрд░рд╡рдг рдерд╛ рдХреНрдпреЛрдВрдХрд┐ рдореИрдВрдиреЗ рд╣рдореЗрд╢рд╛ рддреНрд░реБрдЯрд┐ рдЯрд╛рдЗрдк рдХреА рдереАред рдореИрдВрдиреЗ рджреЗрдЦрд╛ рдХрд┐ рдпрд╣ рдЧрд▓рддреА RFC рдХреЗ рдкреНрд░рд╛рд░реВрдкрдг рдХреЗ рджреМрд░рд╛рди рднреА рдХреА рдЧрдИ рдереА: rust-lang/rfcs#1542 (рдЯрд┐рдкреНрдкрдгреА)ред рд╕рд╛рде рд╣реА, рдкрд░рд┐рдгрд╛рдо рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдиреЗ рд╡рд╛рд▓рд╛ рдХреЛрдб рдкрд╣рд▓реЗ рд╕реЗ рд╣реА Err рдирд╛рдо рдХрд╛ рд╡реНрдпрд╛рдкрдХ рд░реВрдк рд╕реЗ рдЙрдкрдпреЛрдЧ рдХрд░рддрд╛ рд╣реИ рдХреНрдпреЛрдВрдХрд┐ рдпрд╣ рдПрдХ рдкрд░рд┐рдгрд╛рдо рдирд┐рд░реНрдорд╛рддрд╛ рд╣реИред

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

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

рд╕реБрд╕рдВрдЧрдд рдореБрджреНрджреЛрдВ рдХреЗ рдХрд╛рд░рдг Error рдХреЛ core рдореЗрдВ рд╕реНрдерд╛рдирд╛рдВрддрд░рд┐рдд рдирд╣реАрдВ рдХрд┐рдпрд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИред

рдЗрд╕рдХреЗ рдЕрд▓рд╛рд╡рд╛ рд╕рдореЗрдХрди рдореБрджреНрджреЛрдВ рдХреЗ рдХрд╛рд░рдг Box<Error> Error рд▓рд╛рдЧреВ рдирд╣реАрдВ рдХрд░рддрд╛ рд╣реИ, рдПрдХ рдФрд░ рдХрд╛рд░рдг рд╣реИ рдХрд┐ рд╣рдо Err рдкреНрд░рдХрд╛рд░ рдХреЛ рдмрд╛рдзреНрдп рдирд╣реАрдВ рдХрд░рддреЗ рд╣реИрдВред

рд╡рд╛рд╕реНрддрд╡ рдореЗрдВ рдЗрд╕реЗ рд╡рд┐рд╢реЗрд╖рддрд╛ рдкрд░рд┐рднрд╛рд╖рд╛ рдкрд░ рдмрд╛рдзреНрдп рдХрд░рдиреЗ рдХреА рдХреЛрдИ рдЖрд╡рд╢реНрдпрдХрддрд╛ рдирд╣реАрдВ рд╣реИ, рд╡реИрд╕реЗ рднреА - рдЖрдк рдмрд╛рдж рдореЗрдВ рдЙрд╕ рдмрд╛рдзреНрдпрддрд╛ рдХреЛ рд╣рдореЗрд╢рд╛ рдЬреЛрдбрд╝ рд╕рдХрддреЗ рд╣реИрдВ:

where T: TryInto<Foo>, T::Err: Error

рдореИрдВ рдЖрдорддреМрд░ рдкрд░ рдЗрди рдзрд╛рдЧреЛрдВ рдкрд░ рдЯрд┐рдкреНрдкрдгреА рдирд╣реАрдВ рдХрд░рддрд╛, рд▓реЗрдХрд┐рди рдореИрдВ рдХреБрдЫ рд╕рдордп рд╕реЗ рдЗрд╕рдХрд╛ рдЗрдВрддрдЬрд╛рд░ рдХрд░ рд░рд╣рд╛ рдерд╛ рдФрд░ рдЬреИрд╕рд╛ рдХрд┐ рдКрдкрд░ рдХрдИ рд▓реЛрдЧреЛрдВ рдиреЗ рд╡реНрдпрдХреНрдд рдХрд┐рдпрд╛ рд╣реИ, рдореБрдЭреЗ рдпрдХреАрди рдирд╣реАрдВ рд╣реИ рдХрд┐ рд╣реЛрд▓реНрдб рдЕрдк рдХреНрдпрд╛ рд╣реИ; рдореИрдВ рд╣рдореЗрд╢рд╛ рдПрдХ рдРрд╕реА рд╡рд┐рд╢реЗрд╖рддрд╛ рдЪрд╛рд╣рддрд╛ рд╣реВрдВ рдЬреЛ рд╡рд┐рдлрд▓ рд╣реЛ рд╕рдХрддреА рд╣реИред рдореЗрд░реЗ рдкрд╛рд╕ рдХреЛрдб рд╣реИ рдЬрд┐рд╕реЗ try_from рдХрд╣рд╛ рдЬрд╛рддрд╛ рд╣реИ ... рдпрд╣ рд╡рд┐рд╢реЗрд╖рддрд╛ _perfectly_ рдЙрд╕ рд╡рд┐рдЪрд╛рд░ рдХреЛ рд╕рдорд╛рд╣рд┐рдд рдХрд░рддреА рд╣реИред рдХреГрдкрдпрд╛ рдореБрдЭреЗ рдЗрд╕реЗ рд╕реНрдерд┐рд░ рдЬрдВрдЧ рдкрд░ рдЙрдкрдпреЛрдЧ рдХрд░рдиреЗ рджреЗрдВред

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

рдРрд╕рд╛ рдХрд╣рд╛ рдЬрд╛ рд░рд╣рд╛ рд╣реИ, рдореЗрд░рд╛ рдорд╛рдирдирд╛ тАЛтАЛтАЛтАЛрд╣реИ рдХрд┐ str::parse рдЗрд╕рд╕реЗ рдмрд╣реБрдд рд▓рд╛рдн рд╣реЛрдЧрд╛, рдХреНрдпреЛрдВрдХрд┐ рдпрд╣ FromStr рд╡рд┐рд╢реЗрд╖рддрд╛ рдХреЛ рдмрд╛рдзреНрдп рдХреЗ рд░реВрдк рдореЗрдВ рднреА рдорд╛рд╣рд┐рд░ рдХрд░рддрд╛ рд╣реИ - рдЬреЛ рд╡рд╛рд╕реНрддрд╡ рдореЗрдВ ( TryFrom<str> ) рд╣рд╛рде рд╡рд┐рд╢реЗрд╖ рд╣реИред

рддреЛ рдЕрдЧрд░ рдореИрдВ рдЧрд▓рдд рд╣реВрдВ рддреЛ рдореБрдЭреЗ рд╕реБрдзрд╛рд░реЗрдВ, рд▓реЗрдХрд┐рди рдореЗрд░рд╛ рдорд╛рдирдирд╛ тАЛтАЛтАЛтАЛрд╣реИ рдХрд┐ рдЗрд╕реЗ рд╕реНрдерд┐рд░ рдХрд░рдирд╛ рдФрд░ рдЗрд╕реЗ str::parse рдХреЗ рд▓рд┐рдП рдЙрдкрдпреЛрдЧ рдХрд░рдирд╛:

  1. рдмреЙрдпрд▓рд░рдкреНрд▓реЗрдЯ рдкреБрди: рдХрд╛рд░реНрдпрд╛рдиреНрд╡рдпрди рдХреЛ рд╣рдЯрд╛ рджреЗрдВ, рдФрд░ рдЗрд╕рд▓рд┐рдП рдПрдХ рдХрдо рдкрд░рд┐рдЪрд┐рдд, рдФрд░ рд╡рд┐рд╢рд┐рд╖реНрдЯ рд╡рд┐рд╢реЗрд╖рддрд╛ рдХреЛ рд╣рдЯрд╛ рджреЗрдВ
  2. рд╣рд╕реНрддрд╛рдХреНрд╖рд░ рдореЗрдВ TryFrom<str> рдЬреЛрдбрд╝реЗрдВ, рдЬреЛ рдареАрдХ рд╕реЗ рдХрдиреНрд╡рд░реНрдЯ рдореЙрдбреНрдпреВрд▓ рдореЗрдВ рд╣реИ рдФрд░ рдЕрдзрд┐рдХ рдЖрд╕рд╛рдиреА рд╕реЗ рд╕реНрдкрд╖реНрдЯ рд╣реИ рдХрд┐ рдпрд╣ рдХреНрдпрд╛ рдХрд░рддрд╛ рд╣реИ
  3. рдЕрдкрд╕реНрдЯреНрд░реАрдо рдЧреНрд░рд╛рд╣рдХреЛрдВ рдХреЛ рдЙрдирдХреЗ рдбреЗрдЯрд╛ рдкреНрд░рдХрд╛рд░реЛрдВ рдХреЗ рд▓рд┐рдП TryFrom<str> рдХреЛ рд▓рд╛рдЧреВ рдХрд░рдиреЗ рдФрд░ str.parse::<YourSweetDataType>() рдореБрдлреНрдд рдореЗрдВ рдкреНрд░рд╛рдкреНрдд рдХрд░рдиреЗ рдХреА рдЕрдиреБрдорддрд┐ рджреЗрдЧрд╛, рд╕рд╛рде рд╣реА рдЕрдиреНрдп try_from рдХреЗ рд╕рд╛рде-рд╕рд╛рде рд╡реЗ рдХрд╛рд░реНрдпрд╛рдиреНрд╡рдпрди рдХреА рддрд░рд╣ рдорд╣рд╕реВрд╕ рдХрд░рддреЗ рд╣реИрдВ, рдЬреЛ рдмреЗрд╣рддрд░ рддрд╛рд░реНрдХрд┐рдХ рдХреЛрдб рд╕рдВрдЧрдарди рдХреЗ рд▓рд┐рдП рдмрдирд╛рддрд╛ рд╣реИред

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

  1. рдореБрдЭреЗ рдПрдХ рдбрд┐рдлрд╝реЙрд▓реНрдЯ рд╕рдВрд╕реНрдХрд░рдг рдЪрд╛рд╣рд┐рдП; рдУрд╣, рдореБрдЭреЗ SomeType::default() рддрдХ рдкрд╣реБрдВрдЪрдиреЗ рджреЛ
  2. рдореИрдВ рдЗрд╕реЗ рд░реВрдкрд╛рдВрддрд░рд┐рдд рдХрд░рдирд╛ рдЪрд╛рд╣рддрд╛ рд╣реВрдВ, рдореБрдЭреЗ рдЖрд╢реНрдЪрд░реНрдп рд╣реИ рдХрд┐ SomeType::from(other) рд▓рд╛рдЧреВ рдХрд┐рдпрд╛ рдЧрдпрд╛ рд╣реИ (рдЖрдк рдЗрд╕реЗ рдХреЗрд╡рд▓ рдЯрд╛рдЗрдк рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ рдФрд░ рджреЗрдЦ рд╕рдХрддреЗ рд╣реИрдВ рдХрд┐ рдпрд╣ рджрд╕реНрддрд╛рд╡реЗрдЬрд╝реАрдХрд░рдг рддрдХ рдкрд╣реБрдВрдЪреЗ рдмрд┐рдирд╛ рд╕рдВрдХрд▓рд┐рдд рдХрд░рддрд╛ рд╣реИ рдпрд╛ рдирд╣реАрдВ)
  3. рдореИрдВ рдЗрд╕реЗ рдХреНрд▓реЛрди рдХрд░рдирд╛ рдЪрд╛рд╣рддрд╛ рд╣реВрдВ, clone()
  4. рдореИрдВ рдЗрд╕реЗ рдЗрд╕рд╕реЗ рдкреНрд░рд╛рдкреНрдд рдХрд░рдиреЗ рдХрд╛ рдкреНрд░рдпрд╛рд╕ рдХрд░рдирд╛ рдЪрд╛рд╣рддрд╛ рд╣реВрдВ, рдФрд░ рдЪреВрдВрдХрд┐ рддреНрд░реБрдЯрд┐рдпрд╛рдВ рдЬрдВрдЧ рдХрд╛ рдПрдХ рдЕрднрд┐рдиреНрди рдЕрдВрдЧ рд╣реИрдВ, рдпрд╣ рд╣рд╕реНрддрд╛рдХреНрд╖рд░ рдореЗрдВ рд╡рд┐рдлрд▓ рд╣реЛ рд╕рдХрддрд╛ рд╣реИ, рдЗрд╕рд▓рд┐рдП рдореБрдЭреЗ try_from - рдУрд╣ рд░реБрдХреЛ: рдкреА

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

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

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

рдФрд░ рдЗрд╕рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рдореБрдЭреЗ рдмрд╕ рдЗрддрдирд╛ рд╣реА рдХрд╣рдирд╛ рд╣реИ;)

рдЕрдЪреВрдХ рдкреВрд░реНрдгрд╛рдВрдХ рд░реВрдкрд╛рдВрддрд░рдгреЛрдВ рдХреЗ рд▓рд┐рдП рддреНрд░реБрдЯрд┐ рдкреНрд░рдХрд╛рд░ рдХреЗ рд░реВрдк рдореЗрдВ ! рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдиреЗ рдХреА рд╕рдВрднрд╛рд╡рдирд╛ рдХреА рдЬрд╛рдВрдЪ рдкрд░ рдЗрд╕реЗ рдкрд╣рд▓реЗ рд░реЛрдХ рджрд┐рдпрд╛ рдЧрдпрд╛ рдерд╛ред рдЪреВрдВрдХрд┐ рдпрд╣ рд╕реБрд╡рд┐рдзрд╛ рд╡рд░реНрддрдорд╛рди рдореЗрдВ рд▓рд╛рдЧреВ рд╣реИ, рдпрд╣ рд╕рдмрд╕реЗ рд╕рд╛рдзрд╛рд░рдг рдорд╛рдорд▓реЛрдВ рдореЗрдВ рднреА рд╡рд┐рдлрд▓ рд╣реЛ рдЬрд╛рддреА рд╣реИ: https://is.gd/Ws3K7Vред

рдХреНрдпрд╛ рд╣рдо рдЕрднреА рднреА рд╡рд┐рдзрд┐ рдХреЗ рдирд╛рдо рдмрджрд▓рдиреЗ рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рд╕реЛрдЪ рд░рд╣реЗ рд╣реИрдВ, рдпрд╛ рд╣рдореЗрдВ рдЗрд╕ рд╕реБрд╡рд┐рдзрд╛ рдХреЛ рдЗрд╕рдореЗрдВ рд░рдЦрдирд╛ рдЪрд╛рд╣рд┐рдП FCP?

@sfackler рд╡рд╣ рдЦреЗрд▓ рдХрд╛ рдореИрджрд╛рди рд▓рд┐рдВрдХ рдореЗрд░реЗ рд▓рд┐рдП рдХрд╛рдо рдХрд░рддрд╛ рд╣реИ рдпрджрд┐ рдореИрдВ рд▓рд╛рдЗрди 29 рдкрд░ рд░рд┐рдЯрд░реНрди рдкреНрд░рдХрд╛рд░ рдХреЛ Result<u32, ()> рд╕реЗ Result<u32, !> рдореЗрдВ рдмрджрд▓рддрд╛ рд╣реВрдВ: https://is.gd/A9pWbU рдпрд╣ рдкрд╣рдЪрд╛рдирдиреЗ рдореЗрдВ рд╡рд┐рдлрд▓ рд░рд╣рддрд╛ рд╣реИ рдХрд┐ let Ok(x) = val; рдПрдХ рдЕрдХрд╛рдЯреНрдп рдкреИрдЯрд░реНрди рд╣реИ рдЬрдм рд╡реИрд▓ рдореЗрдВ Err рдкреНрд░рдХрд╛рд░ рд╣реЛрддрд╛ рд╣реИ!, рд▓реЗрдХрд┐рди рдпрд╣ рдПрдХ рдЕрд╡рд░реБрджреНрдз рд╕рдорд╕реНрдпрд╛ рдХреА рддрд░рд╣ рдкреНрд░рддреАрдд рдирд╣реАрдВ рд╣реЛрддрд╛ рд╣реИред

@Ixrec рдЗрди рд▓рдХреНрд╖рдгреЛрдВ рдХреЗ рд▓рд┐рдП рдкреНрд░рд╛рдердорд┐рдХ рдкреНрд░реЗрд░рдгрд╛ рд╕реА рдкреВрд░реНрдгрд╛рдВрдХ рдЯрд╛рдЗрдкрдкреАрдл рд╕реЗ рдФрд░ рдЙрд╕рдХреЗ рд▓рд┐рдП рд░реВрдкрд╛рдВрддрд░рдг рдерд╛ред рдЕрдЧрд░ рдореЗрд░реЗ рдкрд╛рд╕ рдХреЛрдИ рдлрд╝рдВрдХреНрд╢рди рд╣реИ

fn foo(x: i64) -> Result<c_long, TryFromIntError> {
    x.try_into()
}

рдпрд╣ i686 рд▓рдХреНрд╖реНрдпреЛрдВ рдкрд░ рд╕рдВрдХрд▓рд┐рдд рд╣реЛрдЧрд╛ рд▓реЗрдХрд┐рди x86_64 рд▓рдХреНрд╖реНрдпреЛрдВ рдкрд░ рдирд╣реАрдВред

рдЗрд╕реА рддрд░рд╣, рдорд╛рди рд▓реЗрдВ рдХрд┐ рдореИрдВ IntoConnectParams рдкреНрд░рдХрд╛рд░ рдХреЛ рдмрджрд▓рдирд╛ рдЪрд╛рд╣рддрд╛ рд╣реВрдВ: https://docs.rs/postgres/0.13.4/postgres/params/trait.IntoConnectParams.htmlред рдореИрдВ рдпрд╣ рдХреИрд╕реЗ рдХрд░ рд╕рдХрддрд╛ рд╣реВрдБ рдЕрдЧрд░ рд╡рд╣рд╛рдБ рдПрдХ рдХрдВрдмрд▓ рд╣реИ impl<T> TryFrom<T> for T { type Error = ! } ? рдореБрдЭреЗ ConnectParams рдХреЗ рд▓рд┐рдП рд░рд┐рдлреНрд▓реЗрдХреНрд╕рд┐рд╡ рдХрд╛рд░реНрдпрд╛рдиреНрд╡рдпрди рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реИ, рд▓реЗрдХрд┐рди ! рд╕реЗ рднрд┐рдиреНрди рдареЛрд╕ рддреНрд░реБрдЯрд┐ рдкреНрд░рдХрд╛рд░ рдХреЗ рд╕рд╛рдеред

рдпрд╣ рдкрд╣рдЪрд╛рдирдиреЗ рдореЗрдВ рд╡рд┐рдлрд▓ рд░рд╣рддрд╛ рд╣реИ рдХрд┐ let Ok(x) = val; рдПрдХ рдЕрдХрд╛рдЯреНрдп рдкреИрдЯрд░реНрди рд╣реИ рдЬрдм рд╡реИрд▓ рдореЗрдВ Err рдкреНрд░рдХрд╛рд░ рд╣реЛрддрд╛ рд╣реИ!

рдзреНрдпрд╛рди рджреЗрдВ рдХрд┐ рдЙрд╕рдХреЗ рд▓рд┐рдП рдПрдХ рдкреАрдЖрд░ рдЦреБрд▓рд╛ рд╣реИ ред

рдЕрдЧрд░ рдореЗрд░реЗ рдкрд╛рд╕ рдХреЛрдИ рдлрд╝рдВрдХреНрд╢рди рд╣реИ ...

рд╣рд╛рд▓рд╛рдВрдХрд┐ рдпрд╣ рдХрд╛рдо рдХрд░рдирд╛ рдЪрд╛рд╣рд┐рдП

fn foo(x: i64) -> Result<c_long, TryFromIntError> {
    let val = x.try_into()?;
    Ok(val)
}

рдХрд╖реНрдЯрдкреНрд░рдж +1 рдЯрд┐рдкреНрдкрдгреА рд╣реЛрдиреЗ рдХреЗ рдЬреЛрдЦрд┐рдо рдкрд░, рдореИрдВ рдХреЗрд╡рд▓ рдпрд╣ рдЙрд▓реНрд▓реЗрдЦ рдХрд░рдирд╛ рдЪрд╛рд╣рддрд╛ рд╣реВрдВ рдХрд┐ рдореИрдХреНрд░реЛрдЬрд╝ 1.1 рдХреЗ рд░рд╕реНрдЯ 1.15 рдореЗрдВ рдЖрдиреЗ рдХреЗ рдмрд╛рдж, try_from рд░реВрдорд╛ рдХреЛ рд░рд╛рддреНрд░рд┐рдХрд╛рд▓реАрди рд░рд╕реНрдЯ рдкрд░ рд░рдЦрдиреЗ рд╡рд╛рд▓реА рдЕрдВрддрд┐рдо рд╡рд┐рд╢реЗрд╖рддрд╛ рд╣реЛрдЧреАред рд╕реНрдерд┐рд░ try_from рдХрд╛ рдмреЗрд╕рдмреНрд░реА рд╕реЗ рдЗрдВрддрдЬрд╛рд░ рд╣реИ!

рдЕрдзрд┐рдХ рдорд╣рддреНрд╡рдкреВрд░реНрдг рдиреЛрдЯ рдкрд░ ...

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

рдпрд╣ рдПрдХ рдЕрдЪреНрдЫрд╛ рдЕрд╡рд▓реЛрдХрди рд╣реИ, рд▓реЗрдХрд┐рди рдореБрдЭреЗ рд▓рдЧрддрд╛ рд╣реИ рдХрд┐ try_ рдЙрдкрд╕рд░реНрдЧ рдХрд╛ рдХрд╛рд░рдг рдпрд╣ рдирд╣реАрдВ рд╣реИ рдХрд┐ рд╡рд╛рдкрд╕реА рдкреНрд░рдХрд╛рд░ рдХреЛ Result рдХреЗ рд░реВрдк рдореЗрдВ рдкрд╣рдЪрд╛рдирдирд╛ рдЖрд╡рд╢реНрдпрдХ рд╣реИ, рд▓реЗрдХрд┐рди рдЗрд╕реЗ рдЧреИрд░-рдЧрд┐рд░рдиреЗ рдпреЛрдЧреНрдп рд╕рдордХрдХреНрд╖ рд╕реЗ рдЕрд▓рдЧ рдХрд░рдирд╛ рдЖрд╡рд╢реНрдпрдХ рд╣реИред

рд╕рд╛рде рд╣реА, рдореИрдВрдиреЗ рдкрд╛рдпрд╛ рдХрд┐ рддреНрд░реБрдЯрд┐ рдХреЗ рдмрдЬрд╛рдп рд╕рдВрдмрдВрдзрд┐рдд рддреНрд░реБрдЯрд┐ рдкреНрд░рдХрд╛рд░ Err рдХрд╛ рдирд╛рдордХрд░рдг рддреНрд░реБрдЯрд┐-рдкреНрд░рд╡рдг рдерд╛ рдХреНрдпреЛрдВрдХрд┐ рдореИрдВрдиреЗ рд╣рдореЗрд╢рд╛ рддреНрд░реБрдЯрд┐ рдЯрд╛рдЗрдк рдХреА рдереАред рдореИрдВрдиреЗ рджреЗрдЦрд╛ рдХрд┐ рдпрд╣ рдЧрд▓рддреА RFC рдХреЗ рдкреНрд░рд╛рд░реВрдкрдг рдХреЗ рджреМрд░рд╛рди рднреА рдХреА рдЧрдИ рдереА: rust-lang/rfcs#1542 (рдЯрд┐рдкреНрдкрдгреА)ред рд╕рд╛рде рд╣реА, рдкрд░рд┐рдгрд╛рдо рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдиреЗ рд╡рд╛рд▓рд╛ рдХреЛрдб рдкрд╣рд▓реЗ рд╕реЗ рд╣реА Err рдирд╛рдо рдХрд╛ рд╡реНрдпрд╛рдкрдХ рд░реВрдк рд╕реЗ рдЙрдкрдпреЛрдЧ рдХрд░рддрд╛ рд╣реИ рдХреНрдпреЛрдВрдХрд┐ рдпрд╣ рдПрдХ рдкрд░рд┐рдгрд╛рдо рдирд┐рд░реНрдорд╛рддрд╛ рд╣реИред

рдореИрдВ рдЗрд╕ рд╡рд╛рд▓реЗ рдкрд░ рд╕рд╣рдордд рд╣реВрдВред рдкреБрд╕реНрддрдХрд╛рд▓рдпреЛрдВ рдореЗрдВ рдореЗрд░реЗ рд╕рд╛рдордиреЗ рдЖрдП рдЕрдзрд┐рдХрд╛рдВрд╢ рдЕрдиреНрдп рддреНрд░реБрдЯрд┐ рдкреНрд░рдХрд╛рд░реЛрдВ рдХреЛ "рддреНрд░реБрдЯрд┐" рдирд╛рдо рджрд┐рдпрд╛ рдЧрдпрд╛ рд╣реИ рдФрд░ рдореБрдЭреЗ рдпрд╣ рдкрд╕рдВрдж рд╣реИ рдХрд┐ рдЕрдм рддрдХ "рдЗрд░реНрд░" рдХрд╛ рдЕрд░реНрде рдХреЗрд╡рд▓ Result::Err рд╣реИред рдРрд╕рд╛ рд▓рдЧрддрд╛ рд╣реИ рдХрд┐ рдЗрд╕реЗ "рдЗрд░реЗрдЯ" рдХреЗ рд░реВрдк рдореЗрдВ рд╕реНрдерд┐рд░ рдХрд░рдиреЗ рд╕реЗ рд▓реЛрдЧреЛрдВ рдХреЛ рд▓рдЧрд╛рддрд╛рд░ рдЧрд▓рдд рдирд╛рдо рдорд┐рд▓ рд░рд╣рд╛ рд╣реИ (рдХреЛрдИ рдЗрд░рд╛рджрд╛ рдирд╣реАрдВ рд╣реИ)ред

@canndrew рдмреЗрд╢рдХ рдХрд╛рдо рдХрд░рдирд╛ рд╕рдВрднрд╡ рд╣реИ, рд▓реЗрдХрд┐рди рдЗрд╕ рд╕реБрд╡рд┐рдзрд╛ рдХреЗ рд▓рд┐рдП рдЙрд╕ рдкреНрд░реЗрд░рдгрд╛ рдХрд╛ рдкреВрд░рд╛ рдмрд┐рдВрджреБ рдЗрд╕ рдкреНрд░рдХрд╛рд░ рдХреЗ рдкреНрд▓реЗрдЯрдлрд╝реЙрд░реНрдо рдЕрдВрддрд░реЛрдВ рдХреЛ рд╕рд╣реА рдврдВрдЧ рд╕реЗ рд╕рдВрднрд╛рд▓рдирд╛ рдЖрд╕рд╛рди рдмрдирд╛рдирд╛ рд╣реИ - рд╣рдо "x86 рдкрд░ рд╕рдВрдХрд▓рди рд▓реЗрдХрд┐рди рдПрдЖрд░рдПрдо рдирд╣реАрдВ" рдХреЗ рдкреВрд░реЗ рд╕реНрдерд╛рди рд╕реЗ рдмрдЪрдирд╛ рдЪрд╛рд╣рддреЗ рд╣реИрдВред .

рдореБрдЭреЗ рд▓рдЧрддрд╛ рд╣реИ рдХрд┐ рдореИрдВрдиреЗ Err рдХреЛ FromStr рдХреЗ рд╕рд╛рде рд╕рдВрдЧрддрд┐ рдХреЗ рд▓рд┐рдП рдЪреБрдирд╛ рд▓реЗрдХрд┐рди рдореБрдЭреЗ рд╕реНрдерд┐рд░ рд╣реЛрдиреЗ рд╕реЗ рдкрд╣рд▓реЗ Error рдкрд░ рд╕реНрд╡рд┐рдЪ рдХрд░рдиреЗ рдореЗрдВ рдмрд╣реБрдд рдЦреБрд╢реА рд╣реЛрдЧреА!

рд░реВрдорд╛ рдХреЛ рд░рд╛рддреНрд░рд┐рдХрд╛рд▓реАрди рд░рд╕реНрдд рдкрд░ рд░рдЦрддреЗ рд╣реБрдП рдЕрдВрддрд┐рдо рд╡рд┐рд╢реЗрд╖рддрд╛

рдЗрд╕реА рддрд░рд╣, рд╡реИрдХрд▓реНрдкрд┐рдХ рдЦреЗрд▓ рдХреЗ рдореИрджрд╛рди рдХреЗ рдмреИрдХрдПрдВрдб рдХреЛ рдХреЗрд╡рд▓ TryFrom рддрдХ рдкрд╣реБрдВрдЪ рдХреЗ рд▓рд┐рдП рд░рд╛рддреНрд░рд┐рдХрд╛рд▓реАрди рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реЛрддреА рд╣реИ; рдореЗрд░реА рдкрд╕рдВрдж рдХреЗ рд╣рд┐рд╕рд╛рдм рд╕реЗ рд░рд╛рдд рдХрд╛ рд╕рд░реНрдбреЗ рд╕рд╛рдорд╛рди рдмрд╣реБрдд рдЕрд╕реНрдерд┐рд░ рдерд╛, рдЗрд╕рд▓рд┐рдП рдореИрдВ рдмрд┐рд▓реНрдб рд╕реНрдХреНрд░рд┐рдкреНрдЯ рд╕реЗрдЯрдЕрдк рдореЗрдВ рдЪрд▓рд╛ рдЧрдпрд╛ред 1.15 рдХреЗ рд╕рд╛рде, рдореИрдВ рд╡рд╛рдкрд╕ #[derive] рдкрд░ рдЬрд╛рдКрдБрдЧрд╛ред рдореИрдВ рдЗрд╕ рд╕реБрд╡рд┐рдзрд╛ рдХреЗ рд╕реНрдерд┐рд░ рд╣реЛрдиреЗ рдХрд╛ рдмреЗрд╕рдмреНрд░реА рд╕реЗ рдЗрдВрддрдЬрд╝рд╛рд░ рдХрд░ рд░рд╣рд╛ рд╣реВрдБ!

@sfackler рдХреНрд╖рдорд╛ рдХрд░реЗрдВ рдореИрдВ рдЕрдиреБрд╕рд░рдг рдирд╣реАрдВ рдХрд░ рд░рд╣рд╛ рдерд╛ред рдкреВрд░реНрдгрд╛рдВрдХ рд░реВрдкрд╛рдВрддрд░рдгреЛрдВ рдХреЗ рдорд╛рдорд▓реЗ рдореЗрдВ рдРрд╕рд╛ рд▓рдЧрддрд╛ рд╣реИ рдХрд┐ рдкреНрд▓реЗрдЯрдлреЙрд░реНрдо рдХреЗ рдЖрдзрд╛рд░ рдкрд░ рд╣рдореЗрдВ рд╡рд╛рд╕реНрддрд╡ рдореЗрдВ c_ulong рдХреЛ u32 рдпрд╛ u64 рдкрд░ рдЯрд╛рдЗрдк рдХрд░рдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рдирд╣реАрдВ рд╣реИ рдмрд▓реНрдХрд┐ рдХрд┐рд╕реА рднреА рддрд░рд╣ рдЗрд╕реЗ рдПрдХ рдирдпрд╛ рдкреНрд░рдХрд╛рд░ рдмрдирд╛рдирд╛ рд╣реИред рдЗрд╕ рддрд░рд╣ TryFrom<c_ulong> impl TryFrom<u{32,64}> impl рдХреЗ рд╕рд╛рде рд╣рд╕реНрддрдХреНрд╖реЗрдк рдирд╣реАрдВ рдХрд░ рд╕рдХрддрд╛ рд╣реИред
рдЖрдЦрд┐рд░рдХрд╛рд░, рдЕрдЧрд░ рд╣рдо рдЕрд▓рдЧ-рдЕрд▓рдЧ рдкреНрд▓реЗрдЯрдлреЙрд░реНрдо рдкрд░ рдЕрд▓рдЧ-рдЕрд▓рдЧ рдкреНрд░рдХрд╛рд░реЛрдВ рдХреЛ рдкрд░рд┐рднрд╛рд╖рд┐рдд рдХрд░рддреЗ рд╣реИрдВ, рддреЛ рд╣рдо рд╣рдореЗрд╢рд╛ "рдПрдХ рдкреНрд▓реЗрдЯрдлреЙрд░реНрдо рдХреЛ рд╕рдВрдХрд▓рд┐рдд рдХрд░рддреЗ рд╣реИрдВ рд▓реЗрдХрд┐рди рджреВрд╕рд░реЗ рдХреЛ рдирд╣реАрдВ" рдХрд░рддреЗ рд╣реИрдВред рдЕрдиреНрдпрдерд╛ рдкреВрд░реА рддрд░рд╣ рд╕реЗ рддрд╛рд░реНрдХрд┐рдХ TryFrom<T> for U where U: From<T> рдирд┐рд╣рд┐рддрд╛рд░реНрде рдХрд╛ рддреНрдпрд╛рдЧ рдХрд░рдирд╛ рд╢рд░реНрдо рдХреА рдмрд╛рдд рд╣реИ рддрд╛рдХрд┐ рд╣рдо рд╕рдВрджрд┐рдЧреНрдз рдЕрднреНрдпрд╛рд╕ рдХреА рддрд░рд╣ рд▓рдЧрдиреЗ рд╡рд╛рд▓реЗ рд╕рдорд░реНрдерди рдХрд╛ рд╕рдорд░реНрдерди рдХрд░ рд╕рдХреЗрдВред

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

рдЗрд╕реА рддрд░рд╣, рдорд╛рди рд▓реЗрдВ рдХрд┐ рдореИрдВ IntoConnectParams рдкреНрд░рдХрд╛рд░ рдХреЛ рдмрджрд▓рдирд╛ рдЪрд╛рд╣рддрд╛ рд╣реВрдВ:

рд╣рд╛рд▓рд╛рдВрдХрд┐ рдпрд╣рд╛рдБ рдХреНрдпрд╛ рд╕рдорд╕реНрдпрд╛ рд╣реИ? рдЖрдк TryFrom<ConnectParams> рдХреЗ рд▓рд┐рдП рдПрдХ рддреНрд░реБрдЯрд┐ рдкреНрд░рдХрд╛рд░ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХреНрдпреЛрдВ рдирд╣реАрдВ рдХрд░реЗрдВрдЧреЗ рдФрд░ рджреВрд╕рд░рд╛ TryFrom<&'a str> рдХреЗ рд▓рд┐рдП?

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

рдХреНрдпрд╛ рдорд╛рдирдХ рдкреБрд╕реНрддрдХрд╛рд▓рдп рдореЗрдВ impl<T> From<!> for T рд╣реИ? рдореИрдВ рдЗрд╕реЗ рдбреЙрдХреНрд╕ рдореЗрдВ рдирд╣реАрдВ рджреЗрдЦрддрд╛, рд▓реЗрдХрд┐рди рдпрд╣ рд╕рд┐рд░реНрдл рдПрдХ рд░рд╕реНрдЯрдбреЙрдХ рдмрдЧ рд╣реЛ рд╕рдХрддрд╛ рд╣реИред рдпрджрд┐ рдпрд╣ рд╡рд╣рд╛рдВ рдирд╣реАрдВ рд╣реИ, рддреЛ TryFrom<ConnectParams> impl рдХреЗ ! Error рдХреЛ рд╡рд╛рд╕реНрддрд╡ рдореЗрдВ рдореЗрд░реА рдЖрд╡рд╢реНрдпрдХрддрд╛ рдореЗрдВ рдмрджрд▓рдиреЗ рдХрд╛ рдХреЛрдИ рддрд░реАрдХрд╛ рдирд╣реАрдВ рд╣реИред

рд░реИрдкрд┐рдВрдЧ рдЬреИрд╕реЗ рд╕рдорд╛рди рдкреВрд░реНрдгрд╛рдВрдХ рдиреНрдпреВрдЯрд╛рдЗрдк рд░реИрдкрд░ рд▓реЗрдиреЗ рдХреА рдХреЛрд╢рд┐рд╢ рдХрд░рдиреЗ рдФрд░ рд╡рд┐рдлрд▓ рд╣реЛрдиреЗ рдХреЗ рдмрд╛рдж, рдмрдбрд╝реЗ рдкреИрдорд╛рдиреЗ рдкрд░ рдПрд░реНрдЧреЛрдиреЛрдорд┐рдХ рд▓рд╛рдЧрддреЗрдВ рд╣реИрдВред

рдореИрдВ рдХреБрдЫ рдФрд░ рд╕реЛрдЪ рд░рд╣рд╛ рдерд╛ рдЬреИрд╕реЗ рдХрд┐ рдЕрдкрдиреЗ рд╕реНрд╡рдпрдВ рдХреЗ рдкреВрд░реНрдгрд╛рдВрдХ рдкреНрд░рдХрд╛рд░реЛрдВ рдХреЛ рдкрд░рд┐рднрд╛рд╖рд┐рдд рдХрд░рдиреЗ рдореЗрдВ рд╕рдХреНрд╖рдо рд╣реЛрдирд╛ред рд▓рд╛. рд╕реА++:

trait IntLiteral: Integer {
    const SUFFIX: &'static str;
    const fn from_bytes(is_negative: bool, bytes: &[u8]) -> Option<Self>; // or whatever
}

impl IntLiteral for c_ulong {
    const SUFFIX: &'static str = "c_ulong";
    ...
}

extern fn foo(x: c_ulong);

foo(123c_ulong); // use a c_ulong literal
foo(123); // infer the type of the integer

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

рдХреНрдпрд╛ рдорд╛рдирдХ рдкреБрд╕реНрддрдХрд╛рд▓рдп рдореЗрдВ impl<T> From<!> for T рд╣реИ?

рд╡рд░реНрддрдорд╛рди рдореЗрдВ рдЗрд╕рд▓рд┐рдП рдирд╣реАрдВ рдХрд┐ рдпрд╣ From<T> for T impl рдХреЗ рд╡рд┐рд░реЛрдз рдореЗрдВ рд╣реИред рдореЗрд░реА рд╕рдордЭ рдпрд╣ рд╣реИ рдХрд┐ рдЕрдВрддрдГрд╡рд┐рд╖рдп рд╡рд┐рд╢реЗрд╖рдЬреНрдЮрддрд╛ рдЕрдВрддрддрдГ рдЗрд╕реЗ рд╕рдВрднрд╛рд▓рдиреЗ рдореЗрдВ рд╕рдХреНрд╖рдо рд╣реЛрдиреА рдЪрд╛рд╣рд┐рдПред

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

рд╡рд┐рд╢реЗрд╖рдЬреНрдЮрддрд╛ рдФрд░ ! рдХреЗ рд╕реНрдерд┐рд░реАрдХрд░рдг рдХреА рд╕рдордп-рд╕реАрдорд╛ рдХреНрдпрд╛ рд╣реИ?

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

@canndrew рдореИрдВ рдирд┐рд╢реНрдЪрд┐рдд рд░реВрдк рд╕реЗ рд╕рд╣рдордд рд╣реВрдВ рдХрд┐ рдЗрд╕реЗ рд╣рд░ рдЪреАрдЬ рдХреЗ рд▓рд┐рдП рд▓рд╛рдЧреВ рдирд╣реАрдВ рдХрд┐рдпрд╛ рдЬрд╛рдирд╛ рдЪрд╛рд╣рд┐рдПред рджрд╕реНрддрд╛рд╡реЗрдЬрд╝ рдХрд╣рддреЗ рд╣реИрдВ рдХрд┐ _рдПрдХ рд░реВрдкрд╛рдВрддрд░рдг рдХреЗ рдорд╛рдзреНрдпрдо рд╕реЗ Self рдХрд╛ рдирд┐рд░реНрдорд╛рдг рдХрд░рдиреЗ рдХрд╛ рдкреНрд░рдпрд╛рд╕ рдХрд░реЗрдВ, рд▓реЗрдХрд┐рди рд░реВрдкрд╛рдВрддрд░рдг рдХреЗ рд░реВрдк рдореЗрдВ рдХреНрдпрд╛ рдорд╛рдпрдиреЗ рд░рдЦрддрд╛ рд╣реИ? рдПрдХ рд╣реА рдЪреАрдЬрд╝ рдХреЛ рдПрдХ рдкреНрд░рддрд┐рдирд┐рдзрд┐рддреНрд╡ рд╕реЗ рджреВрд╕рд░реЗ рдореЗрдВ рдмрджрд▓рдиреЗ, рдпрд╛ рд░реИрдкрд░ рдЬреЛрдбрд╝рдиреЗ рдпрд╛ рд╣рдЯрд╛рдиреЗ рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рдХреНрдпрд╛? рдЗрд╕рдореЗрдВ рдЖрдкрдХреЗ Vec<u8> -> String рдФрд░ Mutex<T> -> MutexGuard<T> рдХреЗ рд╕рд╛рде-рд╕рд╛рде u32 -> char рдФрд░ &str -> i64 рдЬреИрд╕реА рдЪреАрдЬрд╝реЗрдВ рд╢рд╛рдорд┐рд▓ рд╣реИрдВ; SocketAddr -> TcpStream рдФрд░ process::Child -> process::Output рдХреЛ рдЫреЛрдбрд╝рдХрд░ред

рдореБрдЭреЗ рдРрд╕рд╛ рд▓рдЧрддрд╛ рд╣реИ рдХрд┐ impl From<T> for U рдХрд╛ рдЕрд░реНрде рд╢рд╛рдпрдж TryFrom<T, Err=!> for U $ рд╣реЛрдирд╛ рдЪрд╛рд╣рд┐рдПред рдЗрд╕рдХреЗ рдмрд┐рдирд╛, TryFrom<T> s рд▓реЗрдиреЗ рд╡рд╛рд▓реЗ рдлрд╝рдВрдХреНрд╢рди рднреА From<T> s рдирд╣реАрдВ рд▓реЗ рд╕рдХрддреЗред (рдПрдХ рдареЛрд╕, рдЕрдЪреВрдХ рд░реВрдкрд╛рдВрддрд░рдг рдХреЗ рд▓рд┐рдП try_from() | try_into() рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдирд╛ рд╢рд╛рдпрдж рдПрдХ рд╡рд┐рд░реЛрдзреА рдкреИрдЯрд░реНрди рд╣реЛрдЧрд╛ред рдЖрдк рдЗрд╕реЗ рдХрд░рдиреЗ рдореЗрдВ рд╕рдХреНрд╖рдо рд╣реЛрдВрдЧреЗ, рд▓реЗрдХрд┐рди ... рдпрд╣ рдореВрд░реНрдЦрддрд╛рдкреВрд░реНрдг рд╣реЛрдЧрд╛, рдЗрд╕рд▓рд┐рдП рдмрд╕ рдРрд╕рд╛ рди рдХрд░реЗрдВ ред)

рдореБрдЭреЗ рд▓рдЧрддрд╛ рд╣реИ рдХрд┐ рдЗрдореНрдкреНрд▓рд╛рдВрдЯ FromрдпреВ рдХреЗ рд▓рд┐рдП рд╢рд╛рдпрдж рдЗрд╕рдХрд╛ рдорддрд▓рдм рд╣реЛрдирд╛ рдЪрд╛рд╣рд┐рдП TryFromрддреБрдореНрд╣рд╛рд░реЗ рд▓рд┐рдПред

рдорд╛рдирд╛ред

рдЖрдк рдЗрд╕реЗ рдХрд░рдиреЗ рдореЗрдВ рд╕рдХреНрд╖рдо рд╣реЛрдВрдЧреЗ, рд▓реЗрдХрд┐рди...рдпрд╣ рдореВрд░реНрдЦрддрд╛рдкреВрд░реНрдг рд╣реЛрдЧрд╛, рдЗрд╕рд▓рд┐рдП рдРрд╕рд╛ рди рдХрд░реЗрдВред

рдПрдХ рд╕рдВрднрд╛рд╡рд┐рдд рдХреНрд▓рд┐рдкреНрдкреА рд▓рд┐рдВрдЯ рдХреА рддрд░рд╣ рд▓рдЧрддрд╛ рд╣реИред

@BlacklightShining рдореБрдЭреЗ рд▓рдЧрддрд╛ рд╣реИ рдХрд┐ рдЗрд╕реЗ рдЙрди рдкреНрд░рдХрд╛рд░реЛрдВ рдХреЗ рд▓рд┐рдП рд▓рд╛рдЧреВ рдХрд┐рдпрд╛ рдЬрд╛рдирд╛ рдЪрд╛рд╣рд┐рдП, рдЬрд╣рд╛рдВ рдЖрдЙрдЯрдкреБрдЯ рдкреНрд░рдХрд╛рд░ рдХреЛ рджреЗрдЦрддреЗ рд╣реБрдП, "рд░реВрдкрд╛рдВрддрд░рдг" рд╕реНрдкрд╖реНрдЯ рд╣реИред рдЬреИрд╕реЗ рд╣реА рдХрдИ рд░реВрдкрд╛рдВрддрд░рдг рд╕рдВрднрд╡ рд╣реИрдВ (utf8/16/32? рдзрд╛рд░рд╛рд╡рд╛рд╣рд┐рдХ рдмрдирд╛рдо рдХрд╛рд╕реНрдЯрд┐рдВрдЧ? рдЖрджрд┐ ...), рдЗрд╕реЗ рдЯрд╛рд▓рд╛ рдЬрд╛рдирд╛ рдЪрд╛рд╣рд┐рдПред

IMHO:

рдЕрднреА, рд╣рдо FromStr рд▓рд╛рдЧреВ рдХрд░рдиреЗ рд╡рд╛рд▓реА рд╣рд░ рдЪреАрдЬрд╝ рдХреЗ рд▓рд┐рдП рдЖрд╕рд╛рдиреА рд╕реЗ TryFrom<&str> рдХрд╛ рдПрдХ рд╡реНрдпрд╛рдкрдХ рдХрд╛рд░реНрдпрд╛рдиреНрд╡рдпрди рдкреНрд░рджрд╛рди рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ:

impl<'a, T: FromStr> TryFrom<&'a str> for T {
    type Err = <T as FromStr>::Err;
    fn try_from(s: &'a s) -> Result<T, Self::Err> {
        T::from_str(s)
    }
}

рдореИрдВ try_from рд╕реНрдерд┐рд░ рд╣реЛрдиреЗ рд╕реЗ рдкрд╣рд▓реЗ, рдпрд╛ рдбреЙрдХреНрд╕ рдореЗрдВ рдЗрд╕рдХреЗ рд▓рд┐рдП рдХрдо рд╕реЗ рдХрдо рдХреБрдЫ рд╕рдВрджрд░реНрдн рдЬреЛрдбрд╝рдиреЗ рд╕реЗ рдкрд╣рд▓реЗ рдРрд╕рд╛ рдХреБрдЫ рджреЗрдЦрдирд╛ рдЪрд╛рд╣рддрд╛ рд╣реВрдВред рдЕрдиреНрдпрдерд╛, TryFrom<&'a str> рдФрд░ FromStr рдХреЗ рдХрд╛рд░реНрдпрд╛рдиреНрд╡рдпрди рдореЗрдВ рднрд┐рдиреНрдирддрд╛ рд╣реЛрдирд╛ рднреНрд░рд╛рдордХ рд╣реЛ рд╕рдХрддрд╛ рд╣реИред

рдореИрдВ рд╕рд╣рдордд рд╣реВрдВ рдХрд┐ рдпрд╣ рдПрдХ рдЕрдЪреНрдЫрд╛ рд╕рдорд╛рд╡реЗрд╢ рд╣реЛрдЧрд╛, рд▓реЗрдХрд┐рди рдпрд╣ рдкреНрд░рд╕реНрддрд╛рд╡рд┐рдд рдкреНрд░рдпрд╛рд╕ -> TryFrom impl рдХреЗ рд╕рд╛рде рд╕рдВрдШрд░реНрд╖ рдХрд░ рд╕рдХрддрд╛ рд╣реИ?

@sfackler рд╕рдВрднрд╛рд╡рд┐рдд рд░реВрдк рд╕реЗред рдпрд╣ рдкреВрд░реА рддрд░рд╣ рд╕реЗ рдареАрдХ рд╣реЛрдЧрд╛ рдпрджрд┐ TryFrom , TryInto , рдФрд░ FromStr рд╕рднреА рдПрдХ рджреВрд╕рд░реЗ рдХреЛ рдбреЙрдХреНрд╕ рдореЗрдВ рд╕рдВрджрд░реНрднрд┐рдд рдХрд░рддреЗ рд╣реИрдВ, рд▓реЗрдХрд┐рди рдореЗрд░реА рдореБрдЦреНрдп рдЪрд┐рдВрддрд╛ рдпрд╣ рд╣реИ рдХрд┐ рдХреЛрдИ рдореМрдЬреВрджрд╛ рдорд╛рдирдХ рдирд╣реАрдВ рд╣реИ рдЬреЛ рдХрд╣рддрд╛ рд╣реИ рдХрд┐ str::parse рдФрд░ str::try_into рд╕рдорд╛рди рдорд╛рди рд▓реМрдЯрд╛рддреЗ рд╣реИрдВред

рдореИрдВ рджрд╕реНрддрд╛рд╡реЗрдЬрд╝реЛрдВ рдореЗрдВ рдПрдХ рдирд░рдо рдЕрдиреБрд░реЛрдз рдХреЗ рд╕рд╛рде рдареАрдХ рд╣реВрдВ рдХрд┐ рд▓реЛрдЧреЛрдВ рдХреЛ рдЙрдиреНрд╣реЗрдВ рд╕рдорд╛рди рд╡реНрдпрд╡рд╣рд╛рд░ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рд▓рд╛рдЧреВ рдХрд░рдирд╛ рдЪрд╛рд╣рд┐рдП , рд╣рд╛рд▓рд╛рдВрдХрд┐ рдореИрдВ рдирд┐рд╢реНрдЪрд┐рдд рд░реВрдк рд╕реЗ рдРрд╕реЗ рдорд╛рдорд▓реЗ рджреЗрдЦ рд╕рдХрддрд╛ рд╣реВрдВ рдЬрд╣рд╛рдВ рдХреЛрдИ рд╕реЛрдЪ рд╕рдХрддрд╛ рд╣реИ рдХрд┐ рд╡реЗ рдЕрд▓рдЧ рд╣реЛ рд╕рдХрддреЗ рд╣реИрдВред

рдЙрджрд╛рд╣рд░рдг рдХреЗ рд▓рд┐рдП, рдорд╛рди рд▓реЗрдВ рдХрд┐ рдХреЛрдИ рд╡реНрдпрдХреНрддрд┐ рдХрд┐рд╕реА рд╡реЗрдмрд╕рд╛рдЗрдЯ рдХреЗ рд▓рд┐рдП Password рд╕рдВрд░рдЪрдирд╛ рдмрдирд╛рддрд╛ рд╣реИред рд╡реЗ рдорд╛рди рд╕рдХрддреЗ рд╣реИрдВ рдХрд┐ "password".parse() рд╡реИрдзрддрд╛ рдХреЗ рд▓рд┐рдП рдкрд╛рд╕рд╡рд░реНрдб рдХреА рдЬрд╛рдВрдЪ рдХрд░реЗрдЧрд╛, рдлрд┐рд░ рдЗрд╕реЗ рд╣реИрд╢ рдореЗрдВ рдмрджрд▓ рджреЗрдЧрд╛, рдЬрдмрдХрд┐ Password::try_from("1234abcd") рдпрд╣ рдорд╛рди рд╕рдХрддрд╛ рд╣реИ рдХрд┐ "1234abcd" рдкрд╣рд▓реЗ рд╕реЗ рд╣реА рдбреЗрдЯрд╛рдмреЗрд╕ рдореЗрдВ рд╕рдВрдЧреНрд░рд╣реАрдд рд╣реИрд╢ рд╣реИ рдФрд░ рдХреЛрд╢рд┐рд╢ рдХрд░реЗрдВ рдЗрд╕реЗ рд╕реАрдзреЗ рд╣реИрд╢ рдореЗрдВ рдкрд╛рд░реНрд╕ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдЬрд┐рд╕рдХреА рддреБрд▓рдирд╛ рдХреА рдЬрд╛ рд╕рдХрддреА рд╣реИред

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

рднрд▓реЗ рд╣реА рднрд╛рд╖рд╛ рдЯреАрдо рдиреЗ рдЕрдирд╛рдо рдкреИрд░рд╛рдореАрдЯрд░ рдХреЛ рд╣рдЯрд╛рдиреЗ рдХреЗ рд▓рд┐рдП RFC рдХреЛ рдмрдВрдж рдХрд░рдиреЗ рдХрд╛ рдкреНрд░рд╕реНрддрд╛рд╡ рджрд┐рдпрд╛ рд╣реЛ, рд▓реЗрдХрд┐рди рд╡реЗ рд╕рднреА рдЗрд╕ рдмрд╛рдд рд╕реЗ рд╕рд╣рдордд рдкреНрд░рддреАрдд рд╣реЛрддреЗ рд╣реИрдВ рдХрд┐ рдЖрджрд░реНрд╢ рд░реВрдк рд╕реЗ рд╣рдо рдЕрдирд╛рдо рдкреИрд░рд╛рдореАрдЯрд░ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдиреЗ рд╡рд╛рд▓рд╛ рдирдпрд╛ рдХреЛрдб рдмрдирд╛рдирд╛ рдмрдВрдж рдХрд░ рджреЗрдВрдЧреЗред рдЗрд╕реЗ рдзреНрдпрд╛рди рдореЗрдВ рд░рдЦрддреЗ рд╣реБрдП, рдХреНрдпрд╛ рд╣рдо рдкреИрд░рд╛рдореАрдЯрд░ рдирд╛рдо рджреЗрдиреЗ рдХреЗ рд▓рд┐рдП try_from / try_into рдХреЗ рд╣рд╕реНрддрд╛рдХреНрд╖рд░ рдХреЛ рдЕрдкрдбреЗрдЯ рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ? рдпрд╛ from / into рдХреЗ рд╕рд╛рде рд╕рдорд░реВрдкрддрд╛ рдмрдирд╛рдП рд░рдЦрдирд╛ рдЕрдзрд┐рдХ рдорд╣рддреНрд╡рдкреВрд░реНрдг рд╣реЛрдЧрд╛?

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

@jimmycuadra рдирд┐рд╢реНрдЪрд┐рдд рд░реВрдк рд╕реЗ рд╣рд╛рдБ! рдХреБрдЫ рдкреИрд░рд╛рдореАрдЯрд░ рдирд╛рдо рдЬреЛрдбрд╝рдХрд░ рдПрдХ рдкреАрдЖрд░ рднреЗрдЬрдирд╛ рдЪрд╛рд╣рддреЗ рд╣реИрдВ?

рдЪреАрдЬреЛрдВ рдХреА рд╡рд░реНрддрдорд╛рди рд╕реНрдерд┐рддрд┐ рдХреЗ рд╕рдВрдмрдВрдз рдореЗрдВ, рдореЗрд░рд╛ рдорд╛рдирдирд╛ тАЛтАЛтАЛтАЛрд╣реИ рдХрд┐ рдПрдХрдорд╛рддреНрд░ рдЕрдиреБрддреНрддрд░рд┐рдд рдкреНрд░рд╢реНрди рдпрд╣ рд╣реИ рдХрд┐ рдХреНрдпрд╛ рдХреЛрдИ рд╣реЛрдирд╛ рдЪрд╛рд╣рд┐рдП

impl<T, U> TryFrom<U> for T
    where T: From<U>
{
    type Error = !;

    fn try_from(u: U) -> Result<T, !> {
        Ok(T::from(u))
    }
}

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

рддреНрд░реБрдЯрд┐ рдЯрд╛рдЗрдк рдХрд░реЗрдВ =!;

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

@sfackler рдореБрдЭреЗ рд▓рдЧрддрд╛ рд╣реИ рдХрд┐ рдореИрдВрдиреЗ FromStr рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рдмрддрд╛рдП рдЧрдП рд╕рд╛рдорд╛рди рдореЗрдВ рднреА рдХрд╛рд░рдХ рдмрдирд╛рдирд╛ рдорд╣рддреНрд╡рдкреВрд░реНрдг рд╣реЛрдЧрд╛ред рдХреНрдпрд╛ рд╣рдорд╛рд░реЗ рдкрд╛рд╕ FromStr рдХрд╛рд░реНрдпрд╛рдиреНрд╡рдпрдирдХрд░реНрддрд╛рдУрдВ рдХреЗ рд▓рд┐рдП рдПрдХ рд╕рдорд╛рди рдирд┐рд╣рд┐рддрд╛рд░реНрде рд╣реЛрдирд╛ рдЪрд╛рд╣рд┐рдП, рдпрд╛ рдХреНрдпрд╛ рдЙрдиреНрд╣реЗрдВ рдЕрд▓рдЧ рд╣реЛрдиреЗ рдХреА рдЕрдиреБрдорддрд┐ рджреА рдЬрд╛рдиреА рдЪрд╛рд╣рд┐рдП, рдпрд╛ рдХреНрдпрд╛ рд╣рдореЗрдВ рдХреЗрд╡рд▓ рдпрд╣ рджрд╕реНрддрд╛рд╡реЗрдЬ рдХрд░рдирд╛ рдЪрд╛рд╣рд┐рдП рдХрд┐ рд╡реЗ рд╕рдорд╛рди рд╣реЛрдиреЗ рдЪрд╛рд╣рд┐рдП, рд▓реЗрдХрд┐рди рд╣реЛрдирд╛ рдирд╣реАрдВ рдЪрд╛рд╣рд┐рдП?

рдореЗрд░реА рд░рд╛рдп рд╣реИ рдХрд┐ TryFrom<str> рдФрд░ FromStr рдХрд╛рд░реНрдпрд╛рддреНрдордХ рд░реВрдк рд╕реЗ рд╕рдорд╛рди рд╣реЛрдиреЗ рдЪрд╛рд╣рд┐рдП, рдФрд░ рджрд╕реНрддрд╛рд╡реЗрдЬрд╝реАрдХрд░рдг рдХреЛ рдпрд╣ рд╕реНрдкрд╖реНрдЯ рдХрд░рдирд╛ рдЪрд╛рд╣рд┐рдП рдХрд┐ рджреЛрдиреЛрдВ рдХреЗ рдХрд╛рд░реНрдпрд╛рдиреНрд╡рдпрди рдХрд╛ рдЗрд░рд╛рджрд╛ рд╕рдорд╛рди рд╣реЛрдирд╛ рдЪрд╛рд╣рд┐рдПред рдПрдХ рдХреЛ рд▓рд╛рдЧреВ рдХрд░рдиреЗ рд╕реЗ рдЖрдкрдХреЛ рджреВрд╕рд░реЗ рдХреЛ рднреА рджреЗрдирд╛ рдЪрд╛рд╣рд┐рдП, рдХрдо рд╕реЗ рдХрдо рдЖрдкрдХреЛ str::parse рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдиреЗ рдХреА рдЕрдиреБрдорддрд┐ рджреЗрдиреЗ рдХреЗ рд╕рдВрджрд░реНрдн рдореЗрдВред рдЕрдЧрд░ рд░рд╕реНрдЯ рдХреЗ рдкрд╛рд╕ рд╢реБрд░реВ рд╕реЗ рд╣реА TryFrom рд╣реЛрддрд╛, рддреЛ FromStr рдХреА рдХрднреА рдЬрд░реВрд░рдд рдирд╣реАрдВ рдкрдбрд╝рддреАред рдЗрд╕реА рдХрд╛рд░рдг рд╕реЗ, рдореИрдВ TryFrom<str> рдХреЛ рднреА рдирдП рдХреЛрдб рдХреЗ рд▓рд┐рдП рдкрд╕рдВрджреАрджрд╛ рдлреЙрд░реНрдо рдХреЗ рд░реВрдк рдореЗрдВ рджрд╕реНрддрд╛рд╡реЗрдЬ рдХрд░реВрдВрдЧрд╛ред

@jimmycuadra рдЙрд╕ рдорд╛рдорд▓реЗ рдореЗрдВ, рд╣рдореЗрдВ parse рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП TryFrom рдХреЛ рд╕рдВрд╢реЛрдзрд┐рдд рдХрд░рдирд╛ рдЪрд╛рд╣рд┐рдП рдФрд░ рдлрд┐рд░ FromStr -> TryFrom рдХреЗ рд▓рд┐рдП рдПрдХ рдмреНрд▓реИрдВрдХреЗрдЯ рдЗрдореНрдкреНрд▓рд╛рдВрдЯ рдбрд╛рд▓рдирд╛ рдЪрд╛рд╣рд┐рдПред

рдЕрдЧрд░ рд╣рдо str::parse рдХреЛ TryFrom рдХреЗ рд╕рдВрджрд░реНрдн рдореЗрдВ рд▓рд╛рдЧреВ рдХрд░рдиреЗ рдЬрд╛ рд░рд╣реЗ рд╣реИрдВ, рддреЛ рдХреНрдпрд╛ рд╣рдореЗрдВ рдЗрд╕реА рддрд░рд╣ рдареЛрд╕ рдкреНрд░рдХрд╛рд░реЛрдВ рдХреЗ рд▓рд┐рдП FromStr рдХреЗ рдЕрдиреНрдп рдХрд╛рд░реНрдпрд╛рдиреНрд╡рдпрдиреЛрдВ рдХреЛ рднреА рдмрджрд▓рдирд╛ рдЪрд╛рд╣рд┐рдП (рдпрд╛рдиреА рдЗрд╕ рд╕реВрдЪреА рдореЗрдВ рд╕рднреА рдХрд╛рд░реНрдпрд╛рдиреНрд╡рдпрдирдХрд░реНрддрд╛ : https://doc.rust-lang.org/stable/std/str/trait.FromStr.html)? рдХреНрдпрд╛ рдЗрд╕рдХреЗ рдмрдЬрд╛рдп TryFrom рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдиреЗ рдХрд╛ рд╕реБрдЭрд╛рд╡ рджреЗрдиреЗ рдХреЗ рд▓рд┐рдП FromStr рдХреЗ рджрд╕реНрддрд╛рд╡реЗрдЬрд╝реЛрдВ рдХреЛ рдЕрджреНрдпрддрди рдХрд┐рдпрд╛ рдЬрд╛рдирд╛ рдЪрд╛рд╣рд┐рдП? рдХреНрдпрд╛ FromStr рдХреЗ рдореМрдЬреВрджрд╛ рдареЛрд╕ рдХрд╛рд░реНрдпрд╛рдиреНрд╡рдпрдиреЛрдВ рдХреЛ рдЙрдирдХреЗ рджрд╕реНрддрд╛рд╡реЗрдЬрд╝реЛрдВ рдХреЛ TryFrom рд╕рдВрд╕реНрдХрд░рдг рдореЗрдВ рд╕реНрдерд╛рдирд╛рдВрддрд░рд┐рдд рдХрд░ рджрд┐рдпрд╛ рдЬрд╛рдирд╛ рдЪрд╛рд╣рд┐рдП?

рдореБрдЭреЗ рд▓рдЧрддрд╛ рд╣реИ рдХрд┐ рдкрд╢реНрдЪрдЧрд╛рдореА рд╕рдВрдЧрддрддрд╛ рдХреЗ рд▓рд┐рдП рд╣рдо FromStr рдирд╣реАрдВ рдмрджрд▓ рд╕рдХрддреЗ рд╣реИрдВ, рд╣реИ рдирд╛?

FromStr рдХреЗ рдкрдХреНрд╖ рдореЗрдВ TryFrom<&str> рдХреЗ рдкрдХреНрд╖ рдореЗрдВ рдирд┐рдХрд╛рд▓рдирд╛ рдирд┐рд╢реНрдЪрд┐рдд рд░реВрдк рд╕реЗ рдЬрдВрдЧ 2.0 рдХреЗ рд▓рд┐рдП рдзреНрдпрд╛рди рдореЗрдВ рд░рдЦрдирд╛ рдХреБрдЫ рд╣реИред

рд╣рд╛рдВ, рдЗрд╕ рд╕реБрд╡рд┐рдзрд╛ рдХреЗ рд╕реНрдерд┐рд░ рд╣реЛ рдЬрд╛рдиреЗ рдкрд░ рд╣рдо рдПрдХ рд╕рдорд╕реНрдпрд╛ рджрд░реНрдЬ рдХрд░реЗрдВрдЧреЗ рдФрд░ рдЗрд╕реЗ 2.0-рдмреНрд░реЗрдХреЗрдЬ-рд╡рд┐рд╢рд▓рд┐рд╕реНрдЯ рдХреЗ рд╕рд╛рде рдЯреИрдЧ рдХрд░реЗрдВрдЧреЗред

рдПрдХ рдмрд╛рдд рдкрд░ рднреА рд╡рд┐рдЪрд╛рд░ рдХрд░рдирд╛ рд╣реИ parse_into рд╡рд┐рдзрд┐ рдХреЛ String рдореЗрдВ рдЬреЛрдбрд╝рдирд╛ рдЬреЛ TryFrom<String> рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рддрд╛ рд╣реИред рдпрджрд┐ рдХреЛрдИ рдкреНрд░рдХрд╛рд░ рдЖрдВрддрд░рд┐рдХ рд░реВрдк рд╕реЗ String рд╕реНрдЯреЛрд░ рдХрд░рддрд╛ рд╣реИ, рд▓реЗрдХрд┐рди рдлрд┐рд░ рднреА рд╕рддреНрдпрд╛рдкрди рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реЛрддреА рд╣реИ, рддреЛ рдореИрдВ рдЦреБрдж рдХреЛ рджреЛрдиреЛрдВ рдХреЗ рд▓рд┐рдП TryFrom рд▓рд╛рдЧреВ рдХрд░рддрд╛ рд╣реБрдЖ рдкрд╛рддрд╛ рд╣реВрдВред

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

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

рдореБрдЭреЗ рдЙрдореНрдореАрдж рд╣реИ рдХрд┐ рдкрд╣рд▓реЗ рд╕реЗ рд╣реА T : From<U> рд╣реЛрдиреЗ рд╕реЗ рдХрд╛рд░реНрдпрд╛рдиреНрд╡рдпрди рдЙрдЪрд┐рдд рд╣реЛрдиреЗ рдкрд░ " рд╕реНрдкрд╖реНрдЯ рдПрдкреАрдЖрдИ рдЫреЗрдж " рд╢реНрд░реЗрдгреА рдореЗрдВ U : TryFrom<T> рдбрд╛рд▓ рджрд┐рдпрд╛ рдЬрд╛рдПрдЧрд╛ред

рдЗрд╕рдХрд╛ рдорддрд▓рдм рд╣реИ рдХрд┐ рдХрдо рд╕реЗ рдХрдо T : TryFrom<T> рдХреЗ рд╕рд╛рде Error = ! рд╣реЛрдирд╛ рдЪрд╛рд╣рд┐рдП, рд▓реЗрдХрд┐рди рдХрд┐рд╕реА рднреА рдЕрдЪреВрдХ From рдХреЗ рд▓рд┐рдП рд╕рдВрд╕реНрдХрд░рдг рд╕реНрдкрд╖реНрдЯ рд░реВрдк рд╕реЗ рдЙрд╕рд╕реЗ рдмреЗрд╣рддрд░ рд╣реИред

рдЖрдИрдПрдордУ рд╡рд╛рд╕реНрддрд╡ рдореЗрдВ рдПрдХ рд╕реНрдкрд╖реНрдЯ рдЕрдВрддрд░ рдирд╣реАрдВ рд╣реИ рдХрд┐ рдХреНрдпрд╛ From рдХреЛ TryFrom рдХрд╛рд░реНрдпрд╛рдиреНрд╡рдпрди рдкреНрд░рджрд╛рди рдХрд░рдирд╛ рдЪрд╛рд╣рд┐рдП рдпрд╛ TryFrom рдХреЛ From рдХрд╛рд░реНрдпрд╛рдиреНрд╡рдпрди рдкреНрд░рджрд╛рди рдХрд░рдирд╛ рдЪрд╛рд╣рд┐рдП рдпрд╛ рдирд╣реАрдВред

рдХреНрдпреЛрдВрдХрд┐ рдПрдХ рдУрд░, рдЖрдк T::from(val) рдХреЛ рдХреЗрд╡рд▓ T::try_from(val).unwrap() рдорд╛рди рд╕рдХрддреЗ рд╣реИрдВ, рдФрд░ рджреВрд╕рд░реА рдУрд░, рдЖрдк T::try_from(val) рдХреЛ рдХреЗрд╡рд▓ Ok(T::from(val)) рдорд╛рди рд╕рдХрддреЗ рд╣реИрдВред рдХреМрди рд╕рд╛ рдмрд╣рддрд░ рд╣реИ? рдореБрдЭреЗ рдирд╣реАрдВ рдкрддрд╛ред

рдЖрдк T::from(val) рдХреЛ рдХреЗрд╡рд▓ T::try_from(val).unwrap() . рдорд╛рди рд╕рдХрддреЗ рд╣реИрдВ

рдореИрдВ рдЙрд╕рд╕реЗ рдЕрд╕рд╣рдордд рд╣реВрдВред From рдХрд╛рд░реНрдпрд╛рдиреНрд╡рдпрди рд╕реЗ рдХрднреА рднреА рдШрдмрд░рд╛рдиреЗ рдХреА рдЙрдореНрдореАрдж рдирд╣реАрдВ рд╣реИред рдХреЗрд╡рд▓ рджреВрд╕рд░реА рддрд░рдл рд╕рдордЭ рдореЗрдВ рдЖрддрд╛ рд╣реИред

@clarcharr рдХреНрдпреЛрдВрдХрд┐ рд╕реЗ рдШрдмрд░рд╛рдирд╛ рдирд╣реАрдВ рдЪрд╛рд╣рд┐рдП, рд╡рд┐рдХрд▓реНрдк From рдХреЗ рд╕рдВрджрд░реНрдн рдореЗрдВ TryFrom<Error=!> рдпрд╛ рджреВрд╕рд░реА рддрд░рдл рд╣реИрдВред рд▓реЗрдХрд┐рди рдореБрдЭреЗ рд╕рд╛рдорд╛рдиреНрдп рд╕рд▓рд╛рд╣ рд╕реЗ рдирдлрд░рдд рд╣реЛрдЧреА "рдЖрдкрдХреЛ TryFrom рдХреЛ type Error = ! рдХреЗ рд╕рд╛рде рд▓рд╛рдЧреВ рдХрд░рдирд╛ рдЪрд╛рд╣рд┐рдП" рдХреЗ рдмрдЬрд╛рдп "рдЖрдкрдХреЛ From рд▓рд╛рдЧреВ рдХрд░рдирд╛ рдЪрд╛рд╣рд┐рдП"ред

рдЗрд╕реЗ рд╕реНрдерд┐рд░ рдХрд░рдиреЗ рдкрд░ рдХреБрдЫ рдЖрдВрджреЛрд▓рди рдХрд░рдиреЗ рдХрд╛ рдХреЛрдИ рддрд░реАрдХрд╛? 1.18 рдХреЗ рдмреАрдЯрд╛ рдореЗрдВ рдЬрд╛рдиреЗ рд╕реЗ рдкрд╣рд▓реЗ рд╣рдорд╛рд░рд╛ рд╕рдордп рд╕рдорд╛рдкреНрдд рд╣реЛ рд░рд╣рд╛ рд╣реИред @sfackler?

@rfcbot fcp рдорд░реНрдЬ

рдЯреАрдо рдХреЗ рд╕рджрд╕реНрдп @sfackler рдиреЗ рдЗрд╕реЗ рдорд░реНрдЬ рдХрд░рдиреЗ рдХрд╛ рдкреНрд░рд╕реНрддрд╛рд╡ рджрд┐рдпрд╛ рд╣реИред рдЕрдЧрд▓рд╛ рдЪрд░рдг рдмрд╛рдХреА рдЯреИрдЧ рдХреА рдЧрдИ рдЯреАрдореЛрдВ рджреНрд╡рд╛рд░рд╛ рд╕рдореАрдХреНрд╖рд╛ рд╣реИ:

  • [x] @ рдмрд░реНрдирдЯрд╕реБрд╢реА
  • [x] @рдХрд┐рдореБрдВрдбреА
  • [рдПрдХреНрд╕] @ рдПрд▓реЗрдХреНрд╕рдХреНрд░рд┐рдЪрдЯрди
  • [x] @ рдПрдЯреНрдпреВрд░реЙрди
  • [рдПрдХреНрд╕] @ рдмреНрд░реЛрд╕рди
  • [x] @sfackler

рд╡рд░реНрддрдорд╛рди рдореЗрдВ рдХреЛрдИ рдЪрд┐рдВрддрд╛ рд╕реВрдЪреАрдмрджреНрдз рдирд╣реАрдВ рд╣реИред

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

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

@sfackler : рдмрд╕ рдЪреЗрдХ рдЗрди рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП, рдХреНрдпрд╛ рд╣рдо ! рдФрд░ рдХрдВрдмрд▓ рдЗрдореНрдкреНрд▓рд╛рдВрдЯреНрд╕ рдХреЗ рдЖрд╕рдкрд╛рд╕ рд╡рд┐рднрд┐рдиреНрди рдЪрд┐рдВрддрд╛рдУрдВ рдкрд░ рдЕрдЪреНрдЫреЗ рд╣реИрдВ? рдореБрдЭреЗ рдкрддрд╛ рд╣реИ рдХрд┐ рд╣рдордиреЗ рдЗрд╕ рдмрд╛рд░реЗ рдореЗрдВ libs рдореАрдЯрд┐рдВрдЧ рдореЗрдВ рдмрд╛рдд рдХреА рдереА, рд▓реЗрдХрд┐рди рдпрд╣рд╛рдВ рд╕рд╛рд░рд╛рдВрд╢ рдкреНрд░рд╛рдкреНрдд рдХрд░рдирд╛ рдЙрдкрдпреЛрдЧреА рд╣реЛрдЧрд╛ред

@aturon рдЗрд╕рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рдЖрдЦрд┐рд░реА рдЪрд░реНрдЪрд╛ рдереА @sfackler рд╕реЛрдЪ рд░рд╣рд╛ рдерд╛ рдХрд┐ рдХреНрдпрд╛ impl From<T> for U рдХреЛ impl TryFrom<T> for U рдкреНрд░рджрд╛рди рдХрд░рдирд╛ рдЪрд╛рд╣рд┐рдП рдЬрд╣рд╛рдВ TryFrom::Error = ! ред

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

рдХреНрдпрд╛ рдЕрдм рдЗрд╕реЗ рд╕реНрдерд┐рд░ рдХрд░рдиреЗ рдореЗрдВ рдореБрдЦреНрдп рд╕рдорд╕реНрдпрд╛ рдпрд╣ рдирд╣реАрдВ рд╣реИ рдХрд┐ рдкрд╢реНрдЪрдЧрд╛рдореА рд╕рдВрдЧрддрддрд╛ рдХреЛ рддреЛрдбрд╝реЗ рдмрд┐рдирд╛ рдРрд╕рд╛ рдкрд░рд┐рд╡рд░реНрддрди рдирд╣реАрдВ рдХрд┐рдпрд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИ? рдпрд╛ рдЙрд╕ рдмрджрд▓рд╛рд╡ рдХреЗ рд╕рд╛рде рдЖрдЧреЗ рдирд╣реАрдВ рдмрдврд╝рдиреЗ рдХрд╛ рд╕рдорд╛рдзрд╛рди рд╣реИ?

рдореБрдЭреЗ рд▓рдЧрддрд╛ рд╣реИ рдХрд┐ impls рдХрд╛ рд╡рд░реНрддрдорд╛рди рд╕реЗрдЯ рдЕрд╕реНрдерд┐рд░ рд╣реИред рдореИрдВ рдЗрдирдореЗрдВ рд╕реЗ рдХрд┐рд╕реА рднреА рд╕реНрдерд┐рддрд┐ рдХреЛ рд╕рдордЭ рд╕рдХрддрд╛ рдерд╛:

  1. TryFrom рдЧрд▓рдд рд░реВрдкрд╛рдВрддрд░рдгреЛрдВ рдХреЗ рд▓рд┐рдП рдЕрднрд┐рдкреНрд░реЗрдд рд╣реИ _only_, рдЗрд╕рд▓рд┐рдП рдЗрд╕рдореЗрдВ u8 -> u128 рдпрд╛ usize -> usize рдЬреИрд╕реА рдЪреАрдЬрд╝реЗрдВ рдирд╣реАрдВ рд╣реИрдВред
  2. TryFrom _all_ рд░реВрдкрд╛рдВрддрд░рдгреЛрдВ рдХреЗ рд▓рд┐рдП рдЕрднрд┐рдкреНрд░реЗрдд рд╣реИ, рдЬрд┐рдирдореЗрдВ рд╕реЗ рдХреБрдЫ рдЕрдЪреВрдХ рд╣реИрдВ рдФрд░ рдЗрд╕ рдкреНрд░рдХрд╛рд░ рдПрдХ рдирд┐рд░реНрдЬрди TryFrom::Error рдкреНрд░рдХрд╛рд░ рд╣реИрдВред

рд▓реЗрдХрд┐рди рдЕрднреА рдЪреАрдЬреЗрдВ рдПрдХ рд╡рд┐рд╖рдо рд╕рдВрдХрд░ рд╕реНрдерд┐рддрд┐ рдореЗрдВ рд╣реИрдВ рдЬрд╣рд╛рдВ рд╕рдВрдХрд▓рдХ i32 -> i32 рд░реВрдкрд╛рдВрддрд░рдг рдХреЗ рд▓рд┐рдП рдЪреЗрдХрд┐рдВрдЧ рдХреЛрдб рд╕рдореНрдорд┐рд▓рд┐рдд рдХрд░реЗрдЧрд╛ рдФрд░ рдлрд┐рд░ рднреА рдЖрдк String -> String рд░реВрдкрд╛рдВрддрд░рдг рдирд╣реАрдВ рдХрд░ рд╕рдХрддреЗред

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

рдХреНрдпрд╛ рдЕрдм рдЗрд╕реЗ рд╕реНрдерд┐рд░ рдХрд░рдиреЗ рдореЗрдВ рдореБрдЦреНрдп рд╕рдорд╕реНрдпрд╛ рдпрд╣ рдирд╣реАрдВ рд╣реИ рдХрд┐ рдкрд╢реНрдЪрдЧрд╛рдореА рд╕рдВрдЧрддрддрд╛ рдХреЛ рддреЛрдбрд╝реЗ рдмрд┐рдирд╛ рдРрд╕рд╛ рдкрд░рд┐рд╡рд░реНрддрди рдирд╣реАрдВ рдХрд┐рдпрд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИ? рдпрд╛ рдЙрд╕ рдмрджрд▓рд╛рд╡ рдХреЗ рд╕рд╛рде рдЖрдЧреЗ рдирд╣реАрдВ рдмрдврд╝рдиреЗ рдХрд╛ рд╕рдорд╛рдзрд╛рди рд╣реИ?

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

рдпрджрд┐ рдХрд┐рд╕реА рдорд╛рдорд▓реЗ рдХрд╛ рдЙрджрд╛рд╣рд░рдг рд╣реИ рдЬрдм рдЖрдк рдХрднреА рднреА рдПрдХ рдЕрдЪреВрдХ рд░реВрдкрд╛рдВрддрд░рдг рдХреЗ рд▓рд┐рдП from $ рдХреЗ рдмрдЬрд╛рдп try_from рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░реЗрдВрдЧреЗ, рддреЛ рдореИрдВ рдирд┐рд╢реНрдЪрд┐рдд рд░реВрдк рд╕реЗ рдЕрдкрдирд╛ рд╡рд┐рдЪрд╛рд░ рдмрджрд▓ рд╕рдХрддрд╛ рд╣реВрдВред

рдХреНрдпрд╛ рдЖрдкрддреНрддрд┐ рд╣реИ ! рддреНрд░реБрдЯрд┐ рдкреНрд░рдХрд╛рд░ рдХреЗ рд░реВрдк рдореЗрдВ?

! рд╕реНрдерд┐рд░реАрдХрд░рдг рд╕реЗ рдорд╣реАрдиреЛрдВ рджреВрд░ рд╣реИред рдирд┐рдХрдЯ рднрд╡рд┐рд╖реНрдп рдореЗрдВ TryFrom рдХреЛ рд╕реНрдерд┐рд░ рдХрд░рдиреЗ рдпрд╛ impl<T, U> TryFrom<U> for T where T: From<U> рд╡рд╛рд▓реЗ рдореЗрдВ рд╕реЗ рдХреЛрдИ рдПрдХ рдЪреБрдиреЗрдВред

рдХреНрдпрд╛ рд╣рдордиреЗ рдпрд╣рд╛рдВ рд╡рд┐рд╢реЗрд╖рддрд╛ рдЙрдкрдирд╛рдореЛрдВ (рд░рд╕реНрдЯ-рд▓реИрдВрдЧ/рдЖрд░рдПрдлрд╕реАрдПрд╕#1733) рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдиреЗ рдкрд░ рд╡рд┐рдЪрд╛рд░ рдХрд┐рдпрд╛ рд╣реИ? рдЬрдм рд╡рд╣ рднреВрдорд┐, рд╣рдо рдЙрдкрдирд╛рдо рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ From<T> рд╕реЗ TryFrom<T, Error=!> , рдЬрд┐рд╕рд╕реЗ рджреЛ рд▓рдХреНрд╖рдг рдПрдХ рдФрд░ рд╕рдорд╛рди рд╣реЛ рдЬрд╛рддреЗ рд╣реИрдВред

@lрдлреЗрдпрд░реА рдЬреЛ $#$ From $#$ рдХреЗ рдЙрдкрдпреЛрдЧрдХрд░реНрддрд╛ impl s рдХреЛ рддреЛрдбрд╝ рджреЗрдЧрд╛, рд╣рд╛рдВред

@glaebhoerl рд╣рд╛рдБ, рдЖрдк рд╕рд╣реА рдХрд╣ рд░рд╣реЗ рд╣реИрдВ рдЙрд╕ RFC рдХреЗ рдкреНрд░реЗрд░рдгрд╛ рдЦрдВрдб рдореЗрдВ impl s рдЕрд▓рд┐рдпрд╛рд╕рд┐рдВрдЧ рдХрд╛ рдЙрд▓реНрд▓реЗрдЦ рд╣реИ рд▓реЗрдХрд┐рди рд╡рд╛рд╕реНрддрд╡рд┐рдХ рдкреНрд░рд╕реНрддрд╛рд╡ рдЙрдиреНрд╣реЗрдВ рдЕрд╕реНрд╡реАрдХрд╛рд░ рдХрд░рддрд╛ рд╣реИред

(рднрд▓реЗ рд╣реА рдРрд╕рд╛ рди рд╣реЛ, рд╡рд┐рдзрд┐рдпреЛрдВ рдХреЗ рдЕрд▓рдЧ-рдЕрд▓рдЧ рдирд╛рдо рдЖрджрд┐ рд╣реИрдВ)

рдпрд╣ 2.0 рд╡рд┐рд╢рд▓рд┐рд╕реНрдЯ рдХреЗ рдЕрдВрддрд░реНрдЧрдд рдЬрд╛ рд╕рдХрддрд╛ рд╣реИ рд▓реЗрдХрд┐рди рдЗрд╕рдХреА рдкрд░рд╡рд╛рд╣ рдХрд┐рдП рдмрд┐рдирд╛ рдХреБрдЫ рднреА рддреЛрдбрд╝реЗ рдмрд┐рдирд╛ рдРрд╕рд╛ рдирд╣реАрдВ рд╣реЛрдиреЗ рд╡рд╛рд▓рд╛ рд╣реИред

рд╕рдмрд╕реЗ рдкрд╣рд▓реЗ, рдЖрдИрдЖрд░рд╕реА рдкрд░ рдЗрд╕ рдмрд╛рд░реЗ рдореЗрдВ рдПрдХ рдЕрдЪреНрдЫреА рдмрд╛рддрдЪреАрдд рдХреЗ рд▓рд┐рдП @sfackler рдХреЛ рдзрдиреНрдпрд╡рд╛рджред рдЪреАрдЬреЛрдВ рдХреЛ рдореЗрд░реЗ рджрд┐рдорд╛рдЧ рдореЗрдВ рдереЛрдбрд╝реА рджреЗрд░ рдмреИрдардиреЗ рджреЗрдиреЗ рдХреЗ рдмрд╛рдж, рдореИрдВ рдпрд╣реАрдВ рдкрд░ рд╕рдорд╛рдкреНрдд рд╣реБрдЖред

рдирд┐рдХрдЯ рднрд╡рд┐рд╖реНрдп рдореЗрдВ TryFrom рдХреЛ рд╕реНрдерд┐рд░ рдХрд░рдиреЗ рдпрд╛ impl<T, U> TryFrom<U> for T where T: From<U> рд░рдЦрдиреЗ рдореЗрдВ рд╕реЗ рдХреЛрдИ рдПрдХ рдЪреБрдиреЗрдВред

рдореБрдЭреЗ рд▓рдЧрддрд╛ рд╣реИ рдХрд┐ рдпрд╣рд╛рдВ рдореВрд▓ рдкреНрд░рд╢реНрди рдпрд╣ рд╣реИ рдХрд┐ рдХреНрдпрд╛ рдЕрдЪреВрдХ рд░реВрдкрд╛рдВрддрд░рдг рд╡рд┐рд╢реЗрд╖рддрд╛ рдореЗрдВ рд╣реИрдВред рдореБрдЭреЗ рд▓рдЧрддрд╛ рд╣реИ рдХрд┐ рд╡реЗ рдЖрд░рдПрдлрд╕реА рдореЗрдВ рдЕрдЪреВрдХ рд░реВрдкрд╛рдВрддрд░рдг рдЬреИрд╕реА рдЪреАрдЬреЛрдВ рдХреЗ рд▓рд┐рдП рдФрд░ рд╕рд╛рдорд╛рдиреНрдп рдЙрдкрдпреЛрдЧ рдХреЗ рд▓рд┐рдП рдХрд░рддреЗ рд╣реИрдВ (рдЬреИрд╕рд╛ рдХрд┐ рдкреНрд░рддреАрдд рд╣реЛрддрд╛ рд╣реИ рдХрд┐ рдмреЗрдХрд╛рд░ рдХреИрд╕реЗ рд╣реИ T:From<T> )ред рдпрд╣ рджреЗрдЦрддреЗ рд╣реБрдП, рдореИрдВ рдЬреЛ рд╕рдмрд╕реЗ рдЕрдзрд┐рдХ рдЪрд╛рд╣рддрд╛ рд╣реВрдВ рд╡рд╣ рдПрдХ рдРрд╕реА рджреБрдирд┐рдпрд╛ рд╕реЗ рдмрдЪрдиреЗ рдХреЗ рд▓рд┐рдП рд╣реИ рдЬрд╣рд╛рдВ рд╣рд░ рдкреНрд░рдХрд╛рд░ рдХреЗ рдХрд╛рд░реНрдпрд╛рдиреНрд╡рдпрдирдХрд░реНрддрд╛ рд╕реЗ impl TryFrom<MyType> for MyType рдХреА рдЕрдкреЗрдХреНрд╖рд╛ рдХреА рдЬрд╛рддреА рд╣реИ, рдФрд░ рдкреНрд░рддреНрдпреЗрдХ From impl рдХрд╛ рдкрд░рд┐рдгрд╛рдо TryFrom impl рднреА рд╣реЛрдирд╛ рдЪрд╛рд╣рд┐рдПред (рдпрд╛ рдмрд╛рдж рдореЗрдВ рдмрдЧ рдлрд╛рдЗрд▓ рди рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдЙрдиреНрд╣реЗрдВ рдлрд╛рдЗрд▓ рдХрд░рд╡рд╛рдПрдВред)

рддреЛ рдХреНрдпрд╛ рд╣рдорд╛рд░реЗ рдкрд╛рд╕ ! рдХреЛ рд╕реНрдерд┐рд░ рдХрд┐рдП рдмрд┐рдирд╛ рдмреНрд▓реИрдВрдХреЗрдЯ рдЗрдореНрдкреНрд▓рд╛рдВрдЯ рд╣реЛ рд╕рдХрддрд╛ рд╣реИ? рдореБрдЭреЗ рд▓рдЧрддрд╛ рд╣реИ рдХрд┐ рдПрдХ рддрд░реАрдХрд╛ рд╣реИ, рдХреНрдпреЛрдВрдХрд┐ рд╣рдорд╛рд░реЗ рдкрд╛рд╕ рдкрд╣рд▓реЗ рд╕реЗ рд╣реА рдкреБрд╕реНрддрдХрд╛рд▓рдп рдореЗрдВ ! рдЬреИрд╕реЗ рдкреНрд░рдХрд╛рд░ рд╣реИрдВ, рдЬреИрд╕реЗ рдХрд┐ std::string::ParseError ред (" рдпрд╣ рдПрдирдо рдереЛрдбрд╝рд╛ рдЕрдЬреАрдм рд╣реИ: рдпрд╣ рд╡рд╛рд╕реНрддрд╡ рдореЗрдВ рдХрднреА рдореМрдЬреВрдж рдирд╣реАрдВ рд╣реЛрдЧрд╛ред ")

рдпрд╣ рдХреИрд╕реЗ рдХрд╛рдо рдХрд░ рд╕рдХрддрд╛ рд╣реИ рдЗрд╕рдХрд╛ рдПрдХ рд╕реНрдХреЗрдЪ:

  • рдПрдХ рдирдпрд╛ рдкреНрд░рдХрд╛рд░, core::convert::Infallible , рдмрд┐рд▓реНрдХреБрд▓ std::string::ParseError рдХреА рддрд░рд╣ рд▓рд╛рдЧреВ рдХрд┐рдпрд╛ рдЧрдпрд╛ред (рд╣реЛ рд╕рдХрддрд╛ рд╣реИ рдХрд┐ рдмрд╛рдж рд╡рд╛рд▓реЗ рдХреЛ рдкреВрд░реНрд╡ рдХреЗ рд▓рд┐рдП рдПрдХ рдкреНрд░рдХрд╛рд░ рдХреЗ рдЙрдкрдирд╛рдо рдореЗрдВ рднреА рдмрджрд▓ рджреЗрдВред)
  • impl<T> From<Infallible> for T рддрд╛рдХрд┐ рдпрд╣ рдХрд┐рд╕реА рднреА рддреНрд░реБрдЯрд┐ рдкреНрд░рдХрд╛рд░ рдХреЗ рд╕рд╛рде ? рдореЗрдВ рд╕рдВрдЧрдд рд╣реЛ (рдмрд╛рдж рдореЗрдВ c_foo рд╕рд╛рдорд╛рди рджреЗрдЦреЗрдВ)
  • рдХрдВрдмрд▓ рдореЗрдВ Infallible Error рдкреНрд░рдХрд╛рд░ рдХреЗ рд░реВрдк рдореЗрдВ рдХрд░реЗрдВ
  • рдмрд╛рдж рдореЗрдВ, type Infallible = !; рдХреЛ рдиреЗрд╡рд░ рдЯрд╛рдЗрдк рдХреЛ рд╕реНрдерд┐рд░ рдХрд░рдиреЗ рдХреЗ рд╣рд┐рд╕реНрд╕реЗ рдХреЗ рд░реВрдк рдореЗрдВ рджреЗрдЦреЗрдВ

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

рдЬрд╣рд╛рдВ рддрдХ c_foo рдХрд╛ рд╕рд╡рд╛рд▓ рд╣реИ : рдЙрдкрд░реЛрдХреНрдд рдЗрд╕ рддрд░рд╣ рдХреЗ рдХреЛрдб рдХреА рдЕрдиреБрдорддрд┐ рджреЗрдирд╛ рдЬрд╛рд░реА рд░рдЦреЗрдЧрд╛:

fn foo(x: c_int) -> Result<i32, TryFromIntError> { Ok(x.try_into()?) }

рд▓реЗрдХрд┐рди рдпрд╣ рд╡рд┐рднрд┐рдиреНрди рдкреНрд░рдХрд╛рд░ рдХреА рддреНрд░реБрдЯрд┐ рдХреЗ рдХрд╛рд░рдг рдЗрд╕ рддрд░рд╣ рдХреЗ рдХреЛрдб рдХреЛ рдкреЛрд░реНрдЯреЗрдмрд┐рд▓рд┐рдЯреА "рдлреБрдЯрдЧрди" рдмрдирд╛ рджреЗрдЧрд╛

fn foo(x: c_int) -> Result<i32, TryFromIntError> { x.try_into() }

рд╡реНрдпрдХреНрддрд┐рдЧрдд рд░реВрдк рд╕реЗ, рдореИрдВ рдЙрд╕ рдЕрдВрддрд░ рд╕реЗ рдЪрд┐рдВрддрд┐рдд рдирд╣реАрдВ рд╣реВрдВ рдХреНрдпреЛрдВрдХрд┐ рдЬрдм рддрдХ c_int рдПрдХ рдкреНрд░рдХрд╛рд░ рдХрд╛ рдЙрдкрдирд╛рдо рд╣реИ, рддрдм рддрдХ рдПрдХ "рдкреВрд░реНрдг-рдСрдЯреЛ" рдлрд╝реБрдЯрдЧрди рд╣реИ:

fn foo(x: c_int) -> i32 { x }

рдФрд░ рд╕рд╛рдорд╛рдиреНрдп рддреМрд░ рдкрд░, рдЕрд▓рдЧ-рдЕрд▓рдЧ рдЗрдореНрдкреНрд▓рд╛рдВрдЯреНрд╕ рдХреЗ рд▓рд┐рдП рдПрдХ рд╡рд┐рд╢реЗрд╖рддрд╛ рдкрд░ рд╕рдВрдмрдВрдзрд┐рдд рдкреНрд░рдХрд╛рд░ рдХреА рдЕрдкреЗрдХреНрд╖рд╛ рдХрд░рдиреЗ рд╡рд╛рд▓рд╛ рдХреЛрдб рдореЗрд░реЗ рд▓рд┐рдП рдПрдХ рдХреЛрдб рдЧрдВрдз рдХреА рддрд░рд╣ рд▓рдЧрддрд╛ рд╣реИред рдореИрдВрдиреЗ TryFrom рдХреЛ "рд╕рд╛рдорд╛рдиреНрдпреАрдХрд░рдг From " рдХреЗ рд░реВрдк рдореЗрдВ рдкрдврд╝рд╛; рдпрджрд┐ рд▓рдХреНрд╖реНрдп "рдкреВрд░реНрдгрд╛рдВрдХ рдЙрдкрд╕рдореБрдЪреНрдЪрдп рдХреЗ рдмреАрдЪ рдмреЗрд╣рддрд░ рд░реВрдкрд╛рдВрддрд░рдг" рдерд╛ - рдЬреЛ рдЙрдкрдпреЛрдЧреА рднреА рд▓рдЧрддрд╛ рд╣реИ - рддреЛ "рд╣рдореЗрд╢рд╛ рдПрдХ рд╣реА рддреНрд░реБрдЯрд┐ рдкреНрд░рдХрд╛рд░" рддрд╛рд░реНрдХрд┐рдХ рд╣реИ, рд▓реЗрдХрд┐рди рдореИрдВ рдЗрд╕рдХреЗ рдмрдЬрд╛рдп std::num рдореЗрдВ рд▓рдХреНрд╖рд┐рдд рдХреБрдЫ рдХреА рдЕрдкреЗрдХреНрд╖рд╛ рдХрд░рддрд╛ рд╣реВрдВ, рд╢рд╛рдпрдж num::cast::NumCast (рдпрд╛ boost::numeric_cast )ред

(рдЗрд╕рдХреЗ рдЕрд▓рд╛рд╡рд╛: #[repr(transparent)] рдореЗрдВ FCP рдорд░реНрдЬ рдХреЗ рд╕рд╛рде, рд╢рд╛рдпрдж c_foo рдкреНрд░рдХрд╛рд░ рдирдП рдкреНрд░рдХрд╛рд░ рдмрди рд╕рдХрддреЗ рд╣реИрдВ, рдЬрд┐рд╕ рдмрд┐рдВрджреБ рдкрд░ рдпреЗ рд░реВрдкрд╛рдВрддрд░рдг рдЕрдзрд┐рдХ рд╕реБрд╕рдВрдЧрдд рд╣реЛ рд╕рдХрддреЗ рд╣реИрдВред From&TryFrom impls C "char <= short < рдХреЛ рдХреВрдЯрдмрджреНрдз рдХрд░ рд╕рдХрддрд╛ рд╣реИред = int <= long" рдирд┐рдпрдо, рд╕рд╛рде рд╣реА рдЙрдирдХреЗ рд▓рд┐рдП рдорд╛рдирдХ-рдЖрд╡рд╢реНрдпрдХ рдиреНрдпреВрдирддрдо рдЖрдХрд╛рд░ рдЬреИрд╕реЗ c_int:From<i16> рдпрд╛ c_long:TryFrom<i64> ред рддрдм рдЙрдкрд░реЛрдХреНрдд рд░реВрдкрд╛рдВрддрд░рдг рд╕рднреА рдкрд░ i32:TryFrom<c_int> рд╣реЛрдЧрд╛ рдкреНрд▓реЗрдЯрдлрд╝реЙрд░реНрдо, рд╣рдореЗрд╢рд╛ рд╕рдорд╛рди Error рдкреНрд░рдХрд╛рд░ рдХреЗ рд╕рд╛рде, рдФрд░ рд╕рдорд╕реНрдпрд╛ рджреВрд░ рд╣реЛ рдЬрд╛рддреА рд╣реИред)

"рдпрд╣ рдПрдирдо рдереЛрдбрд╝рд╛ рдЕрдЬреАрдм рд╣реИ: рдпрд╣ рд╡рд╛рд╕реНрддрд╡ рдореЗрдВ рдХрднреА рдореМрдЬреВрдж рдирд╣реАрдВ рд╣реЛрдЧрд╛ред"

рдХреНрдпрд╛ рдХреЛрдИ рдХрд╛рд░рдг рд╣реИ рдХрд┐ рддреНрд░реБрдЯрд┐ рдкреНрд░рдХрд╛рд░ рд╕рд┐рд░реНрдл рдЗрдХрд╛рдИ рдирд╣реАрдВ рд╣реЛ рд╕рдХрддрд╛ рд╣реИ? рдЕрджреНрд╡рд┐рддреАрдп ParseError рд╕рдВрд░рдЪрдирд╛ рд╕реЗ рдкрд░реЗрд╢рд╛рди рдХреНрдпреЛрдВ рд╣реИрдВ рдпрджрд┐ рдмрд╛рддрдЪреАрдд рдХрднреА рддреНрд░реБрдЯрд┐ рдирд╣реАрдВ рдХрд░ рд╕рдХрддреА рд╣реИ?

@sunjay () "рдРрд╕рд╛ рд╣реЛ рд╕рдХрддрд╛ рд╣реИ, рд▓реЗрдХрд┐рди рдРрд╕рд╛ рд╣реЛрдиреЗ рдкрд░ рдЖрдкрдХреЛ рдмрддрд╛рдиреЗ рдХреЗ рд▓рд┐рдП рдХреБрдЫ рднреА рджрд┐рд▓рдЪрд╕реНрдк рдирд╣реАрдВ рд╣реИ" рдХрд╛ рдкреНрд░рдХрд╛рд░ рд╕рд┐рд╕реНрдЯрдо рдкреНрд░рддрд┐рдирд┐рдзрд┐рддреНрд╡ рд╣реИред рдирд┐рд░реНрдЬрди рдкреНрд░рдХрд╛рд░ (рдЬреИрд╕реЗ ! рдФрд░ std::string::ParseError ) рдЗрд╕рдХреЗ рд╡рд┐рдкрд░реАрдд рд╣реИрдВ, рдЬрд┐рд╕ рддрд░рд╣ рд╕реЗ рдЯрд╛рдЗрдк рд╕рд┐рд╕реНрдЯрдо рдХрд╣рддрд╛ рд╣реИ "рдпрд╣ рд╕реНрдерд┐рддрд┐ рдХрднреА рдирд╣реАрдВ рд╣реЛ рд╕рдХрддреА рд╣реИ, рдЗрд╕рд▓рд┐рдП рдЖрдкрдХреЛ рдЗрд╕рд╕реЗ рдирд┐рдкрдЯрдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рдирд╣реАрдВ рд╣реИред"

@jimmycuadra

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

@scottmcm

рдореБрдЭреЗ рд▓рдЧрддрд╛ рд╣реИ рдХрд┐ рдпрд╣рд╛рдВ рдореВрд▓ рдкреНрд░рд╢реНрди рдпрд╣ рд╣реИ рдХрд┐ рдХреНрдпрд╛ рдЕрдЪреВрдХ рд░реВрдкрд╛рдВрддрд░рдг рд╡рд┐рд╢реЗрд╖рддрд╛ рдореЗрдВ рд╣реИрдВред

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

let cfg = config![
    BoolOpt::SomeCfgKey => true,
    "SomeOtherCfgKey" => 77,
];

рд▓рдВрдмреА рдХрд╣рд╛рдиреА рд╕рдВрдХреНрд╖реЗрдк рдореЗрдВ, рдореИрдХреНрд░реЛ рдХрд╛ рд╡рд┐рд╕реНрддрд╛рд░ ($k, $v).into() рдХреЙрд▓ рдХреА рд╕реВрдЪреА рдореЗрдВ рд╣реЛрддрд╛ рд╣реИред рдореИрдВ рдпрд╣ рд╕реБрдирд┐рд╢реНрдЪрд┐рдд рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рд╕реНрдЯреНрд░рд┐рдВрдЧ рдХреБрдВрдЬрд┐рдпреЛрдВ рдХреЗ рд░реВрдкрд╛рдВрддрд░рдг рдореЗрдВ рдПрдХ рдЬрд╛рдВрдЪ рдХрд░рдирд╛ рдЪрд╛рд╣рддрд╛ рд╣реВрдВ рдХрд┐ рд╡реЗ рдПрдХ рд╡реИрдз рдХреЙрдиреНрдлрд╝рд┐рдЧрд░реЗрд╢рди рд╡рд┐рдХрд▓реНрдк рдХрд╛ рдирд╛рдо рджреЗрдВ, рдпрд╛рдиреА TryFrom<(String, ???)> рдХреЛ рд▓рд╛рдЧреВ рдХрд░рдирд╛ рдФрд░ рдореИрдХреНрд░реЛ рдХреЛ ($k, $v).try_into() рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдмрджрд▓рдирд╛ред рдпрджрд┐ рд╕рднреА рд░реВрдкрд╛рдВрддрд░рдгреЛрдВ рдХреЗ рд▓рд┐рдП рдореИрдХреНрд░реЛ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдПрдХ рднреА рд╡рд┐рдзрд┐ рдирд╛рдо рдирд╣реАрдВ рд╣реЛрддрд╛ рддреЛ рдпрд╣ рд╕рдм рдХрд░рдирд╛ рдХрдард┐рди рд╣реЛ рдЬрд╛рддрд╛ред

:рдШрдВрдЯреА: рдЙрдкрд░реЛрдХреНрдд рд╕рдореАрдХреНрд╖рд╛ рдХреЗ рдЕрдиреБрд╕рд╛рд░, рдпрд╣ рдЕрдм рдЕрдкрдиреА рдЕрдВрддрд┐рдо рдЯрд┐рдкреНрдкрдгреА рдЕрд╡рдзрд┐ рдореЗрдВ рдкреНрд░рд╡реЗрд╢ рдХрд░ рд░рд╣рд╛ рд╣реИред рдШрдВрдЯреА:

рдореБрдЭреЗ рд╡рд╛рд╕реНрддрд╡ рдореЗрдВ рдпрд╣ рд╡рд┐рдЪрд╛рд░ рдкрд╕рдВрдж рд╣реИ:

impl<U: TryFrom<T, Error=!>> From<T> for U {
    fn from(val: T) -> U {
        val.unwrap()
    }
}

рдХреНрдпреЛрдВрдХрд┐ рдЬреЛ рдХреЛрдИ рднреА TryFrom<Error=!> рдЪрд╛рд╣рддрд╛ рд╣реИ рд╡рд╣ рдЗрд╕реЗ рд▓рд╛рдЧреВ рдХрд░ рд╕рдХрддрд╛ рд╣реИ, рд▓реЗрдХрд┐рди рд▓реЛрдЧ рдЕрднреА рднреА From рдХреЛ рд▓рд╛рдЧреВ рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ рдпрджрд┐ рд╡реЗ рдЪрд╛рд╣реЗрдВред рд╢рд╛рдпрдж рд╣рдо рдЕрдВрддрддрдГ From рдХреЛ рдкрджрд╛рд╡рдирдд рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ рд▓реЗрдХрд┐рди рд╣рдореЗрдВ рдРрд╕рд╛ рдХрд░рдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рдирд╣реАрдВ рд╣реИред

@scottmcm рдПрдХ рдЦрд╛рд▓реА рдПрдирдо рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдиреЗ рдХреА рдпреЛрдЬрдирд╛ рдореБрдЭреЗ рдмрд╣реБрдд рдЕрдЪреНрдЫреА рд▓рдЧрддреА рд╣реИред

@ Ericson2314 рдЖрдкрдиреЗ рд▓рд┐рдЦрд╛ :

рдпрджрд┐ рдЖрдк рддреНрд░реБрдЯрд┐ рдкреНрд░рдХрд╛рд░реЛрдВ рдХреЗ рд▓рд┐рдП рд╕рд╛рджреЗ From рдХрд╛ рдЙрдкрдпреЛрдЧ рдирд╣реАрдВ рдХрд░рддреЗ рд╣реИрдВ (рдЬреИрд╕реЗ try! )! impl<T> From<!> for T рдЙрд╕ рдЙрджреНрджреЗрд╢реНрдп рдХреЗ рд▓рд┐рдП рдореМрдЬреВрдж рд╣реЛ рд╕рдХрддрд╛ рд╣реИ рдФрд░ рд╣реЛрдирд╛ рдЪрд╛рд╣рд┐рдПред

рдпрд╣ рд╡реНрдпрд╡рд╣рд╛рд░ рдореЗрдВ рдХреИрд╕реЗ рдХрд╛рдо рдХрд░реЗрдЧрд╛? рдХрд╣реЛ рдХрд┐ рдореИрдВ рдЗрд╕ рддрд░рд╣ рдПрдХ рд╕рдорд╛рд░реЛрд╣ рд▓рд┐рдЦрдиреЗ рдХреА рдХреЛрд╢рд┐рд╢ рдХрд░ рд░рд╣рд╛ рд╣реВрдБ:

fn myfn<P: TryInto<MyType>>(p: P) -> Result<(), MyError>

рд╕рд┐рд╡рд╛рдп рдЗрд╕рдХреЗ рдХрд┐ рдпрд╣ рдХрд╛рдо рдирд╣реАрдВ рдХрд░рддрд╛ рд╣реИ, рдореБрдЭреЗ TryInto рдкрд░ TryInto Error= рдирд┐рд░реНрджрд┐рд╖реНрдЯ рдХрд░рдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реИред рд▓реЗрдХрд┐рди рдореБрдЭреЗ рд╡рд╣рд╛рдВ рдХрд┐рд╕ рддрд░рд╣ рдХрд╛ рд▓рд┐рдЦрдирд╛ рдЪрд╛рд╣рд┐рдП? MyError рд╕реНрдкрд╖реНрдЯ рд▓рдЧрддрд╛ рд╣реИ рд▓реЗрдХрд┐рди рдлрд┐рд░ рдореИрдВ рдХрдВрдмрд▓ рдХреЗ рд╕рд╛рде MyType рдХрд╛ рдЙрдкрдпреЛрдЧ рдирд╣реАрдВ рдХрд░ рд╕рдХрддрд╛ TryFrom implред

рдХреНрдпрд╛ рдЖрдк рдирд┐рдореНрдирд▓рд┐рдЦрд┐рдд рд╕реБрдЭрд╛рд╡ рджреЗ рд░рд╣реЗ рд╣реИрдВ?

fn myfn<E: Into<MyError>, P: TryInto<MyType, Error=E>>(p: P) -> Result<(), MyError>

рдпрд╣ рдХрд╛рдлреА рд╡рд░реНрдмреЛрдЬрд╝ рд▓рдЧрддрд╛ рд╣реИред

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

рд╢рд╛рдпрдж TryFrom рдкрд░рд┐рднрд╛рд╖рд╛ рдХреЛ рдирд┐рдореНрдирд▓рд┐рдЦрд┐рдд рдореЗрдВ рдмрджрд▓рд╛ рдЬрд╛рдирд╛ рдЪрд╛рд╣рд┐рдП:

pub trait TryFrom<T, E>: Sized {
    type Error: Into<E>;

    fn try_from(t: T) -> Result<Self, E>;
}

рдЖрдк рддреНрд░реБрдЯрд┐ рдХреЛ рд╕реНрдкрд╖реНрдЯ рдирд╛рдо рджрд┐рдП рдмрд┐рдирд╛ MyError рдореЗрдВ рдкрд░рд┐рд╡рд░реНрддрдиреАрдп рд╣реЛрдиреЗ рдХреЗ рд▓рд┐рдП рд╡рд┐рд╡рд╢ рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ, рдЬреИрд╕реЗ

fn myfn<P: TryInto<MyType>>(p: P) -> Result<(), MyError> where MyError: From<P::Error>

рдпрд╣ рдЕрднреА рднреА рдереЛрдбрд╝рд╛ рд╡рд░реНрдмреЛрдЬрд╝ рд╣реИ, рд▓реЗрдХрд┐рди рд╡рд╛рд╕реНрддрд╡ рдореЗрдВ рдлрд╝рдВрдХреНрд╢рди рдХреЛ рдЕрдЪреНрдЫреА рддрд░рд╣ рд╕реЗ рдХреЙрд▓ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдмрд╛рдзрд╛рдУрдВ рдХреЛ рдмрддрд╛рддрд╛ рд╣реИ (рдЦреЗрд▓ рдХрд╛ рдореИрджрд╛рди )

рд╕рдВрдкрд╛рджрд┐рдд рдХрд░реЗрдВ: рдФрд░ P::Error: Into<MyError> рдЬреИрд╕реЗ рд╕рдВрд╕реНрдХрд░рдг рдХреЗ рд╕рд╛рде рдкреНрд░рдпрд╛рд╕ рдХрд░рдирд╛ рд╡рд╛рд╕реНрддрд╡ рдореЗрдВ ? рдХреЗ рд╕рд╛рде рдХрд╛рдо рдирд╣реАрдВ рдХрд░рддрд╛ рд╣реИ рдХреНрдпреЛрдВрдХрд┐ Into рдХреЗ рд▓рд┐рдП Into From рдХрд╛ рдХреЛрдИ рдХрдВрдмрд▓ рдХрд╛рд░реНрдпрд╛рдиреНрд╡рдпрди рдирд╣реАрдВ рд╣реИред рдЬреИрд╕рд╛ рдЖрдкрдиреЗ рджрд┐рдЦрд╛рдпрд╛ рд╣реИ TryFrom рдХреЛ рдмрджрд▓рдирд╛ рдореИрдВ рдЙрд╕реА рдореБрджреНрджреЗ рдкрд░ рдЪрд▓рдиреЗ рдХреА рдЙрдореНрдореАрдж рдХрд░реВрдВрдЧрд╛ред

рдЕрдВрддрд┐рдо рдЯрд┐рдкреНрдкрдгреА рдЕрд╡рдзрд┐ рдЕрдм рдкреВрд░реА рд╣реЛ рдЧрдИ рд╣реИред

@jethrogb рд╣реЗ рдЖрдкрдиреЗ рдореБрдЭреЗ рдПрдХ рд╕рд╛рд▓ рдкрд╣рд▓реЗ рдЙрджреНрдзреГрдд рдХрд┐рдпрд╛ рдерд╛ рдЗрд╕рд▓рд┐рдП рдореБрдЭреЗ рдереЛрдбрд╝рд╛ рд╕реЛрдЪрдирд╛ рдкрдбрд╝рд╛ред @ Nemo157 рдмрд┐рд▓реНрдХреБрд▓ рд╕рд╣реА рд╣реИ рдФрд░ рдпрд╣ рдЙрдЪрд┐рдд рд▓рдЧрддрд╛ рд╣реИред

! рдХреЗ рд╡рд┐рд╢рд┐рд╖реНрдЯ рдорд╛рдорд▓реЗ рдореЗрдВ рд╣рдорд╛рд░реЗ рдкрд╛рд╕ рдПрдХ рдмреНрд▓реИрдВрдХреЗрдЯ рдЗрдореНрдкреНрд▓рд╛рдВрдЯ рд╣реЛрдирд╛ рдЪрд╛рд╣рд┐рдП , рд▓реЗрдХрд┐рди рдореБрдЭреЗ рдпрд╛рдж рд╣реИ рдХрд┐ рдпрд╣ рджреВрд╕рд░реЗ рдХреЛ рдУрд╡рд░рд▓реИрдк рдХрд░рддрд╛ рд╣реИред рдпрд╣ рдПрдХ рдХрд╖реНрдЯрдкреНрд░рдж рдУрд╡рд░рд▓реИрдк рд╣реИ рдХреНрдпреЛрдВрдХрд┐ рджреЛрдиреЛрдВ рдХрд╛рд░реНрдпрд╛рдиреНрд╡рдпрди рдХрд╛рд░реНрдпрд╛рдиреНрд╡рдпрди рдкрд░ рд╕рд╣рдордд рд╣реИрдВ --- рдЕрдкрд░рд┐рднрд╛рд╖рд┐рдд рд╡реНрдпрд╡рд╣рд╛рд░/рдореГрдд рдХреЛрдбред

рдПрдХ рдЕрдиреНрдп рдореБрджреНрджреЗ рд╕реЗ рдЗрд╕ рдкрд░ рдПрдХ рдЯрд┐рдкреНрдкрдгреА: https://github.com/rust-lang/rust/pull/41904#issuecomment -300908910

libs рдЯреАрдо рдореЗрдВ рд╕реЗ рдХрд┐рд╕реА рдХреЗ рдкрд╛рд╕ scottmcm рдХреЗ рд╡рд┐рдЪрд╛рд░ рдкрд░ рд╡рд┐рдЪрд╛рд░ рд╣реИрдВ? рдпрд╣ рдореЗрд░реЗ рд▓рд┐рдП рдПрдХ рдорд╣рд╛рди рджреГрд╖реНрдЯрд┐рдХреЛрдг рдХреА рддрд░рд╣ рд▓рдЧрддрд╛ рд╣реИ, рдФрд░ рдореИрдВ рдПрдХ рдФрд░ рд░рд┐рд▓реАрдЬ рдЪрдХреНрд░ рдХреЛ рдпрд╛рдж рдХрд░рдиреЗ рдХреЗ рдмрд╛рдж рдЗрд╕ рд╕реБрд╡рд┐рдзрд╛ рдХреЛ рдЖрдЧреЗ рдмрдврд╝рд╛рдирд╛ рдЬрд╛рд░реА рд░рдЦрдирд╛ рдЪрд╛рд╣рддрд╛ рд╣реВрдВред

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

рдЗрд╕рд▓рд┐рдП, рдХрд╛рд░реНрд░рд╡рд╛рдИ рдХреА рдореВрд▓ рдпреЛрдЬрдирд╛ impl<T, U> TryFrom<T> for U where U: From<T> рдХреЛ рдЬреЛрдбрд╝рдирд╛ рдФрд░ рдЕрдЪреВрдХ рдкреВрд░реНрдгрд╛рдВрдХ рд░реВрдкрд╛рдВрддрд░рдгреЛрдВ рдХреЗ рд▓рд┐рдП рд╕реНрдкрд╖реНрдЯ рдирд┐рд╣рд┐рддрд╛рд░реНрдереЛрдВ рдХреЛ рд╣рдЯрд╛рдирд╛ рд╣реИред рдПрдлрдПрдлрдЖрдИ рдЙрдкрдпреЛрдЧ рдХреЗ рдорд╛рдорд▓реЗ рдХреЛ рд╕рдВрднрд╛рд▓рдиреЗ рдХреЗ рд▓рд┐рдП рд╣рдо рдПрдХ рдЕрд▓рдЧ рдПрдкреАрдЖрдИ рдмрдирд╛рдПрдВрдЧреЗред

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

рдореИрдВрдиреЗ рдЕрднрд┐рдиреНрди рдкреНрд░рдХрд╛рд░реЛрдВ рдХреЗ рд▓рд┐рдП "рдЕрд▓рдЧ рдПрдкреАрдЖрдИ" рдХреЗ рд▓рд┐рдП рдПрдХ рдкреАрдЖрд░ рдЦреЛрд▓рд╛ рд╣реИ: https://github.com/rust-lang/rust/pull/42456

рдореБрдЭреЗ рдмрд╣реБрдд рд╕рд╛рд░реЗ рд░реВрдкрд╛рдВрддрд░рдг рд╣реЛрдиреЗ рдХреЗ рдмрд╛рд╡рдЬреВрдж TryInto рдпрд╛ TryFrom рджреНрд╡рд╛рд░рд╛ рдорд╛рдирдХреАрдХреГрдд рдХрд┐рдпрд╛ рдЧрдпрд╛ рдЬреЗрдиреЗрд░рд┐рдХ рдХреЛрдб рдХрднреА рдирд╣реАрдВ рд▓рд┐рдЦрдирд╛ рдкрдбрд╝рд╛, рдЗрд╕рд▓рд┐рдП рдмрд╛рдж рд╡рд╛рд▓рд╛ рдлреЙрд░реНрдо рдореЗрд░реЗ рджреНрд╡рд╛рд░рд╛ рдкрд░рд┐рднрд╛рд╖рд┐рдд рдкреНрд░рдХрд╛рд░реЛрдВ рдореЗрдВ рдореЗрд░реЗ рд╕рднреА рдЙрдкрдпреЛрдЧреЛрдВ рдХреЗ рд▓рд┐рдП рдкрд░реНрдпрд╛рдкреНрдд рд╣реИред рдореБрдЭреЗ рд▓рдЧрддрд╛ рд╣реИ рдХрд┐ TryInto<...> рдпрд╛ TryFrom<...> рдкреИрд░рд╛рдореАрдЯрд░ рд╕рдВрджрд┐рдЧреНрдз рд░реВрдк рдХреА рддрд░рд╣ рд▓рдЧрддреЗ рд╣реИрдВред

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

рдХреГрдкрдпрд╛ рдЗрд╕реЗ рди рд╣рдЯрд╛рдПрдВред

рдореБрдЭреЗ рдХрднреА рднреА рд╕рд╛рдорд╛рдиреНрдп рдХреЛрдб рдирд╣реАрдВ рд▓рд┐рдЦрдирд╛ рдкрдбрд╝рд╛ рдЬреЛ рдХрд┐ TryInto рдпрд╛ TryFrom . рджреНрд╡рд╛рд░рд╛ рдкрд░рд┐рдЪрд╛рд▓рд┐рдд рдХрд┐рдпрд╛ рдЧрдпрд╛ рдерд╛

рдЕрдЧрд░ рдРрд╕рд╛ рд╣реИ рднреА, рддреЛ рдореБрдЭреЗ рдирд╣реАрдВ рд▓рдЧрддрд╛ рдХрд┐ рдпрд╣ TryInto рдФрд░ TryFrom рдмрд╣реБрдд рдХрдо рдЙрдкрдпреЛрдЧреА рдмрдирд╛рддрд╛ рд╣реИред рдореИрдВ рдЧреИрд░-рд╕рд╛рдорд╛рдиреНрдп рд╕рдВрджрд░реНрднреЛрдВ рдореЗрдВ рд╕рднреА рдЬрдЧрд╣ Into рдФрд░ From рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рддрд╛ рд╣реВрдВред impl s рдорд╛рдирдХ рдкреБрд╕реНрддрдХрд╛рд▓рдп рд▓рдХреНрд╖рдгреЛрдВ рдХреЛ рдЬреЛрдбрд╝рдиреЗ рд╕реЗ рддрджрд░реНрде рдЕрдВрддрд░реНрдирд┐рд╣рд┐рдд рд░реВрдкрд╛рдВрддрд░рдг рд╡рд┐рдзрд┐рдпреЛрдВ рдХреЗ рд╕рдореВрд╣ рдХреА рддреБрд▓рдирд╛ рдореЗрдВ рдмрд╣реБрдд рдЕрдзрд┐рдХ "рд╕рд╛рдорд╛рдиреНрдп" рдФрд░ "рдЕрдкреЗрдХреНрд╖рд┐рдд" рд▓рдЧрддрд╛ рд╣реИред

рдореБрдЭреЗ рдХрднреА рднреА рд╕рд╛рдорд╛рдиреНрдп рдХреЛрдб рдирд╣реАрдВ рд▓рд┐рдЦрдирд╛ рдкрдбрд╝рд╛ рдЬреЛ рдХрд┐ TryInto рдпрд╛ TryFrom . рджреНрд╡рд╛рд░рд╛ рдкрд░рд┐рдЪрд╛рд▓рд┐рдд рдХрд┐рдпрд╛ рдЧрдпрд╛ рдерд╛

рдореЗрд░реА рдкрд░рд┐рдпреЛрдЬрдирд╛рдУрдВ рдореЗрдВ рд╕реЗ рдПрдХ рд╕реЗ:

pub fn put_str_lossy<C, S> (&self, s: S)
    where C: TryInto<ascii::Char>,
          S: IntoIterator<Item = C>
{
    for c in s.into_iter() {
        self.put_char(match c.try_into() {
            Ok(c) => c,
            Err(_) => ascii::QUESTION_MARK,
        });
    }
}

рдХреНрдпрд╛ рдпрд╣ рдЙрдореНрдореАрдж рдХреА рдЬрд╛рддреА рд╣реИ рдХрд┐ рдЗрди рд▓рдХреНрд╖рдгреЛрдВ рдХрд╛ рдХрд╛рд░реНрдпрд╛рдиреНрд╡рдпрди рдХрд┐рд╕реА рд╡рд┐рд╢реЗрд╖ рдХрд╛рдиреВрди рдХрд╛ рдкрд╛рд▓рди рдХрд░реЗрдЧрд╛? рдЙрджрд╛рд╣рд░рдг рдХреЗ рд▓рд┐рдП, рдпрджрд┐ рд╣рдо рдП рдХреЛ рдмреА рдФрд░ рдмреА рдХреЛ рдП рдореЗрдВ рдкрд░рд┐рд╡рд░реНрддрд┐рдд рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ, рддреЛ рдХреНрдпрд╛ рдпрд╣ рдЖрд╡рд╢реНрдпрдХ рд╣реИ рдХрд┐ рд░реВрдкрд╛рдВрддрд░рдг рд╕рдлрд▓ рд╣реЛрдиреЗ рдкрд░ рдЙрд▓рдЯрд╛ рд╣реЛ?:

#![feature(try_from)]

use std::convert::{TryFrom, TryInto};

fn invertible<'a, A, B, E>(a: &'a A) -> Result<(), E>
    where A: 'a + TryFrom<&'a B>,
          A: PartialEq,
          B: 'a + TryFrom<&'a A>,
          E: From<<A as TryFrom<&'a B>>::Error>,
          E: From<<B as TryFrom<&'a A>>::Error>,
{
    let b = B::try_from(a)?;
    let a2 = A::try_from(&b)?;
    assert!(a == &a2);
    Ok(())
}

рд╕рдВрдкрд╛рджрд┐рдд рдХрд░реЗрдВ: рдПрд╕/рд░рд┐рдлреНрд▓реЗрдХреНрд╕рд┐рд╡/рдЙрд▓рдЯрд╛/

@briansmith рдпрд╣ рджреЗрдЦрддреЗ рд╣реБрдП рдХрд┐ From рдХреИрд╕реЗ рдХрд╛рдо рдХрд░рддрд╛ рд╣реИ, рдореИрдВ рдХрд╣реВрдВрдЧрд╛ рдХрд┐ рдпрд╣ рдЗрд╕ рддрд░рд╣ рд╕реЗ рдЙрд▓рдЯрд╛ рдирд╣реАрдВ рд╣реИред

use std::collections::BinaryHeap;

fn main() {
    let a = vec![1, 2];
    let b = BinaryHeap::from(a.clone());
    let c = Vec::from(b);
    assert_ne!(a, c);
}

рддреЛ рдореИрдВ рдЗрд╕ рд╡рд┐рд╢реЗрд╖рддрд╛ рдХреЗ рд╡рд░реНрддрдорд╛рди рдХрд╛рд░реНрдпрд╛рдиреНрд╡рдпрди рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рд╕реЛрдЪ рд░рд╣рд╛ рд╣реВрдВред рдЬреИрд╕рд╛ рдХрд┐ #43127 рдореЗрдВ рдЖрдпрд╛ рдерд╛ (#43064 рднреА рджреЗрдЦреЗрдВ), рдореБрдЭреЗ рдирд╣реАрдВ рдкрддрд╛ рдХрд┐ рдпрд╣ рдкреВрд░реА рддрд░рд╣ рд╕реЗ рд╣реИ рдХреНрдпреЛрдВрдХрд┐ рдХрд╛рд░реНрдпрд╛рдиреНрд╡рдпрди i/u128 рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рддрд╛ рд╣реИ, рд▓реЗрдХрд┐рди рдРрд╕рд╛ рд▓рдЧрддрд╛ рд╣реИ рдХрд┐ рдХреЙрд▓ TryInto рдЗрдирд▓рд╛рдЗрди рдирд╣реАрдВ рд╣реИрдВред рдпрд╣ рдмрд╣реБрдд рдЗрд╖реНрдЯрддрдо рдирд╣реАрдВ рд╣реИ, рдФрд░ рд╡рд╛рд╕реНрддрд╡ рдореЗрдВ рд╢реВрдиреНрдп-рд▓рд╛рдЧрдд рдЕрдореВрд░реНрддрддрд╛ рдХреА рднрд╛рд╡рдирд╛ рдореЗрдВ рдирд╣реАрдВ рд╣реИред рдЙрджрд╛рд╣рд░рдг рдХреЗ рд▓рд┐рдП <u32>::try_into<u64>() рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдХреЗ рдЕрдВрддрд┐рдо рдЕрд╕реЗрдВрдмрд▓реА рдореЗрдВ рдПрдХ рд╕рд╛рдзрд╛рд░рдг рд╕рд╛рдЗрди рд╡рд┐рд╕реНрддрд╛рд░ рдХреЗ рд▓рд┐рдП рдЕрдиреБрдХреВрд▓рд┐рдд рдХрд░рдирд╛ рдЪрд╛рд╣рд┐рдП (рдмрд╢рд░реНрддреЗ рдкреНрд▓реЗрдЯрдлреЙрд░реНрдо 64-рдмрд┐рдЯ рд╣реИ), рд▓реЗрдХрд┐рди рдЗрд╕рдХреЗ рдкрд░рд┐рдгрд╛рдорд╕реНрд╡рд░реВрдк рдЗрд╕рдХрд╛ рдкрд░рд┐рдгрд╛рдо рдлрд╝рдВрдХреНрд╢рди рдХреЙрд▓ рд╣реЛрддрд╛ рд╣реИред

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

#42456 рдХреЗ рдЕрдиреБрд╕рд╛рд░ рд╢рд╛рдпрдж рд╣рдорд╛рд░реЗ рдкрд╛рд╕ рдкреВрд░реНрдгрд╛рдВрдХ рдкреНрд░рдХрд╛рд░реЛрдВ рдкрд░ рд╕реАрдзреЗ impl TryFrom рдирд╣реАрдВ рд╣реЛрдЧрд╛, рд▓реЗрдХрд┐рди рдпрд╣ рдХреИрд╕реЗ рджрд┐рдЦрддрд╛ рд╣реИ рдХрд┐ "NumCast" рд╡рд┐рд╢реЗрд╖рддрд╛ (рдЬрд┐рд╕реЗ # 43127 рдкрд░ рд╕реНрд╡рд┐рдЪ рдХрд░рдирд╛ рдЪрд╛рд╣рд┐рдП) рдЕрднреА рднреА рддреИрдпрд╛рд░ рдХрд┐рдпрд╛ рдЬрд╛ рд░рд╣рд╛ рд╣реИред

рднрд▓реЗ рд╣реА рд╡реЗ рдЕрдВрдд рдореЗрдВ рдХрд┐рд╕реА рдЕрдиреНрдп рд╡рд┐рд╢реЗрд╖рддрд╛ рдХреА рдУрд░ рдмрдврд╝ рд░рд╣реЗ рд╣реЛрдВ, рдЗрди рд░реВрдкрд╛рдВрддрд░рдгреЛрдВ рдХреЛ рдЖрдЬ рд▓рд┐рдмрдХреЛрд░ рдореЗрдВ рд▓рд╛рдЧреВ рдХрд┐рдпрд╛ рдЧрдпрд╛ рд╣реИ рдФрд░ рдЗрдирдХрд╛ рдЙрдкрдпреЛрдЧ рд▓рд┐рдмрдХреЛрд░ рдореЗрдВ рдХрд┐рдпрд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИред рдореБрдЭреЗ рд▓рдЧрддрд╛ рд╣реИ рдХрд┐ рд╕рднреА рдкреВрд░реНрдгрд╛рдВрдХ рд░реВрдкрд╛рдВрддрд░рдгреЛрдВ рдХреЗ рд▓рд┐рдП u128 / i128 рдХрд╛ рдЙрдкрдпреЛрдЧ рд╕реНрд░реЛрдд рдХреЛрдб рд╕рд╛рджрдЧреА рдХреЗ рд▓рд┐рдП рдХрд┐рдпрд╛ рдЧрдпрд╛ рдерд╛ред рд╕реНрд░реЛрдд рдкреНрд░рдХрд╛рд░ рд╡реНрдпрд╛рдкрдХ рд╣реИ рдпрд╛ рдЧрдВрддрд╡реНрдп рдХреА рддреБрд▓рдирд╛ рдореЗрдВ рд╕рдВрдХрд░рд╛ рд╣реИ, рдЗрд╕ рдкрд░ рдирд┐рд░реНрднрд░ рдХрд░рддреЗ рд╣реБрдП рд╣рдореЗрдВ рд╢рд╛рдпрдж рдЗрд╕рдХреЗ рдмрдЬрд╛рдп рдЕрд▓рдЧ рдХреЛрдб рд╣реЛрдирд╛ рдЪрд╛рд╣рд┐рдПред (рд╕рдВрднрд╡рддрдГ #[cfg(target_pointer_width = "64")] рдмрдирд╛рдо #[cfg(target_pointer_width = "32")] рдмрдирд╛рдо #[cfg(target_pointer_width = "16")] рдкрд░ рдЖрдзрд╛рд░рд┐рдд рд╡рд┐рднрд┐рдиреНрди рдореИрдХреНрд░реЛ рдХреЙрд▓ рдХреЗ рд╕рд╛рдеред)

рд░рд┐рдорд╛рдЗрдВрдбрд░: рдЗрд╕реЗ рдЕрдирд╡рд░реЛрдзрд┐рдд рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдЕрдзрд┐рдХ рдЖрд╡рд╢реНрдпрдХрддрд╛ рдирд╣реАрдВ рд╣реИ! рдпрджрд┐ рдЖрдк рдЗрд╕рдХреЗ рд▓рд┐рдП рддреИрдпрд╛рд░ рд╣реИрдВ, рддреЛ @sfackler рдХреЗ рд╕рд╛рд░рд╛рдВрд╢ рдкрд░ рдПрдХ рдирдЬрд╝рд░ рдбрд╛рд▓реЗрдВ рдФрд░ рдорд╛рд░реНрдЧрджрд░реНрд╢рди рдХреЗ рд▓рд┐рдП рдореБрдЭреЗ рдпрд╛ рдЕрдиреНрдп libs рдЯреАрдо рдХреЗ рд╕рджрд╕реНрдпреЛрдВ рдХреЛ рдкрд┐рдВрдЧ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рд╕реНрд╡рддрдВрддреНрд░ рдорд╣рд╕реВрд╕ рдХрд░реЗрдВред

рдореБрдЭреЗ рдирд╣реАрдВ рдкрддрд╛ рдерд╛ рдХрд┐ libs рдЯреАрдо рд╕реЗ рдЦрд░реАрдж-рдлрд░реЛрдЦреНрдд рдереА рдХрд┐ рд╣рдо @scottmcm рдХреЗ рд╡рд┐рдЪрд╛рд░ рдХрд╛ рдЙрдкрдпреЛрдЧ рдзрдорд╛рдХреЗ рдХреЗ рдкреНрд░рдХрд╛рд░ рдХреЗ рдЕрд╕реНрдерд┐рд░ рд╣реЛрдиреЗ рдХреЗ рд▓рд┐рдП рдПрдХ рд╕рдорд╛рдзрд╛рди рдХреЗ рд░реВрдк рдореЗрдВ рдХрд░ рд╕рдХрддреЗ рд╣реИрдВред рд╡рд░реНрдХрдЕрд░рд╛рдЙрдВрдб рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдХреЗ рдЙрд▓реНрд▓рд┐рдЦрд┐рдд @sfackler рдкрд░рд┐рд╡рд░реНрддрди рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдореИрдВ рдкреАрдЖрд░ рдкрд░ рдХрд╛рдо рдХрд░ рд╕рдХрддрд╛ рд╣реВрдВред

рдмрд╣реБрдд рдмрдврд╝рд┐рдпрд╛, рдзрдиреНрдпрд╡рд╛рдж @jimmycuadra!

рдЗрд╕ рдЪрд░реНрдЪрд╛ рдХрд╛ рдЕрдзрд┐рдХрд╛рдВрд╢ рднрд╛рдЧ рдкреВрд░реНрдгрд╛рдВрдХ рдкреНрд░рдХрд╛рд░реЛрдВ рдХреЗ рд▓рд┐рдП TryFrom рдХреЛ рд▓рд╛рдЧреВ рдХрд░рдиреЗ рдХреЗ рдЗрд░реНрдж-рдЧрд┐рд░реНрдж рдШреВрдорддрд╛ рдкреНрд░рддреАрдд рд╣реЛрддрд╛ рд╣реИред рдореЗрд░реА рд░рд╛рдп рдореЗрдВ, TryFrom рд╕реНрдерд┐рд░ рд╣реЛ рдЬрд╛рддрд╛ рд╣реИ рдпрд╛ рдирд╣реАрдВ, рдХреЗрд╡рд▓ рдЗрди рдкреНрд░рдХрд╛рд░реЛрдВ рдХреЗ рдХрд╛рд░рдг рдирд╣реАрдВ рд╣реЛрдирд╛ рдЪрд╛рд╣рд┐рдПред

рдЕрдиреНрдп рд╕рд╛рдл-рд╕реБрдерд░реЗ рд░реВрдкрд╛рдВрддрд░рдг рд╣реИрдВ рдЬреЛ рдЗрди рд▓рдХреНрд╖рдгреЛрдВ рд╕реЗ рд▓рд╛рднрд╛рдиреНрд╡рд┐рдд рд╣реЛрдВрдЧреЗ рдЬреИрд╕реЗ рдХрд┐ TryFrom<&[T]> рдХреЗ рд▓рд┐рдП &[T; N] ред рдореИрдВрдиреЗ рд╣рд╛рд▓ рд╣реА рдореЗрдВ рдЗрд╕реЗ рд▓рд╛рдЧреВ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдПрдХ рдкреАрдЖрд░ рд╕рдмрдорд┐рдЯ рдХрд┐рдпрд╛ рд╣реИ: https://github.com/rust-lang/rust/pull/44764ред

TryFrom рдХреЛ рд╕реНрдерд┐рд░ рд░рдЦрдиреЗ рдХреЗ рд▓рд┐рдП рдЗрд╕ рддрд░рд╣ рдХреЗ рд░реВрдкрд╛рдВрддрд░рдг рдореЗрд░реЗ рд▓рд┐рдП рдХрд╛рдлреА рдорд╣рддреНрд╡рдкреВрд░реНрдг рд╣реИрдВред

#44174 рд╡рд┐рд▓рдп рдХреЗ рд╕рд╛рде, рдореЗрд░рд╛ рдорд╛рдирдирд╛ тАЛтАЛрд╣реИ рдХрд┐ рдпрд╣ рдЕрдм рдЕрдирдмреНрд▓реЙрдХ рд╣реЛ рдЧрдпрд╛ рд╣реИред

рдЙрд╕ рдкреАрдЖрд░ рдиреЗ рдХрд┐рд╕реА рднреА рдкреНрд░рдХрд╛рд░ рдХреЗ рд▓рд┐рдП FromStr рдХреЗ рд╕реНрд╡рдЪрд╛рд▓рд┐рдд рдХрд╛рд░реНрдпрд╛рдиреНрд╡рдпрди рдХреЛ рд╣рдЯрд╛ рджрд┐рдпрд╛ рдЬреЛ $#$1 TryFrom<&str> #$ рдХреЛ рд▓рд╛рдЧреВ рдХрд░рддрд╛ рд╣реИ рдХреНрдпреЛрдВрдХрд┐ рдЯрд╛рдЗрдк рд╕рд┐рд╕реНрдЯрдо рд╡рд░реНрддрдорд╛рди рдореЗрдВ рд╡рд┐рд╢реЗрд╖рдЬреНрдЮрддрд╛ рдХреЗ рд╕рд╛рде рднреА рдЗрд╕рдХрд╛ рд╕рдорд░реНрдерди рдирд╣реАрдВ рдХрд░ рд╕рдХрддрд╛ рд╣реИред рдЖрд╢рдп рдпрд╣ рд╣реИ рдХрд┐ рдЗрд╕ рд╕реБрд╡рд┐рдзрд╛ рдХреЗ рд╕реНрдерд┐рд░ рд╣реЛ рдЬрд╛рдиреЗ рдкрд░ FromStr рдФрд░ parse рдХреЛ TryFrom<&str> рдФрд░ try_into рдХреЗ рдкрдХреНрд╖ рдореЗрдВ рд╣рдЯрд╛ рджрд┐рдпрд╛ рдЬрд╛рдПред рджреЛрдиреЛрдВ рдХреЗ рдмреАрдЪ рдЕрдВрддрд░рд┐рдо рдЕрдиреБрдХреВрд▓рддрд╛ рдЦреЛрдирд╛ рджреБрд░реНрднрд╛рдЧреНрдпрдкреВрд░реНрдг рд╣реИ - рдЕрдЧрд░ рдХрд┐рд╕реА рдХреЗ рдкрд╛рд╕ рд╕реНрдЯреЙрдкрдЧреИрдк рдХреЗ рд▓рд┐рдП рд╡рд┐рдЪрд╛рд░ рд╣реИрдВ, рддреЛ рдХреГрдкрдпрд╛ рдмреЛрд▓реЗрдВред

рдЕрдЧрд░ рдХреЛрдИ рдФрд░ рдмрджрд▓рд╛рд╡ рдирд╣реАрдВ рдХрд┐рдпрд╛ рдЬрд╛рдирд╛ рд╣реИ рдФрд░ libs рдЯреАрдо рдореЗрдВ рдХреЛрдИ рд╕реНрдерд┐рд░реАрдХрд░рдг рдХреЗ рд▓рд┐рдП рд╣рд░реА рд░реЛрд╢рдиреА рдХрд░рддрд╛ рд╣реИ, рддреЛ рдореИрдВ FromStr / parse рдХреЛ рд╣рдЯрд╛рдиреЗ рдХреЗ рд▓рд┐рдП рд╕реНрдерд┐рд░реАрдХрд░рдг рдкреАрдЖрд░ рдФрд░ рдкреАрдЖрд░ рдХрд░ рд╕рдХрддрд╛ рд╣реВрдВред

рдФрд░ FromStr/parse рдХреЛ рд╣рдЯрд╛рдиреЗ рдХреЗ рд▓рд┐рдП рдПрдХ рдкреАрдЖрд░ред

рд╕реНрдерд┐рд░ рдкрд░ рдкреНрд░рддрд┐рд╕реНрдерд╛рдкрди рдЙрдкрд▓рдмреНрдз рд╣реЛрдиреЗ рддрдХ (рдпрд╛ рдЬрдм рддрдХ https://github.com/rust-lang/rust/issues/30785 рд▓рд╛рдЧреВ рдирд╣реАрдВ рд╣реЛ рдЬрд╛рддрд╛), рддрдм рддрдХ рдореВрд▓реНрдпрд╣реНрд░рд╛рд╕ рдЪреЗрддрд╛рд╡рдирд┐рдпреЛрдВ рдХреЛ рдирд╛рдЗрдЯрд▓реА рдореЗрдВ рдирд╣реАрдВ рдЬреЛрдбрд╝рд╛ рдЬрд╛рдирд╛ рдЪрд╛рд╣рд┐рдП, рддрд╛рдХрд┐ рдХрд┐рд╕реА рднреА рд╕рдордп рдПрдХ рдмрдирд╛рдирд╛ рд╕рдВрднрд╡ рд╣реЛ рд╕рдХреЗред рддреАрдиреЛрдВ рд░рд┐рд▓реАрдЬ рдЪреИрдирд▓реЛрдВ рдкрд░ рдЪреЗрддрд╛рд╡рдиреА рдХреЗ рдмрд┐рдирд╛ рдХреНрд░реЗрдЯ рдмрд┐рд▓реНрдбред

рдореИрдВ рдЕрдиреНрдп рдкреАрдЖрд░ рд╕реЗ рдЪреВрдХ рдЧрдпрд╛ рдХреНрдпреЛрдВрдХрд┐ рд╕рдВрджрд░реНрдн рдИрдореЗрд▓ рд╕реВрдЪрдирд╛рдУрдВ рдореЗрдВ рдкрд░рд┐рдгрдд рдирд╣реАрдВ рд╣реЛрддреЗ рд╣реИрдВред рдореИрдВрдиреЗ рджреЗрдЦрд╛ рдХрд┐ рдПрдХ рд╡рд┐рд╢рд┐рд╖реНрдЯ impl From<Infallible> for TryFromIntError рд╣реИред рдХреНрдпрд╛ рдпрд╣ рдЪрд░реНрдЪрд╛ рдХреЗ рдЕрдиреБрд╕рд╛рд░ impl<T> From<Infallible> for T рдирд╣реАрдВ рд╣реЛрдирд╛ рдЪрд╛рд╣рд┐рдП?

@jethrogb рдЕрдлрд╕реЛрд╕ рдХреА рдмрд╛рдд рд╣реИ рдХрд┐, рдпрд╣ impl<T> From<T> for T рдХреЗ рд╕рд╛рде рд╕рдВрдШрд░реНрд╖ рдХрд░рддрд╛ рд╣реИ, рдЗрд╕рд▓рд┐рдП рдРрд╕рд╛ рдирд╣реАрдВ рдХрд┐рдпрд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИ (рдЬрдм рддрдХ рд╣рдореЗрдВ рдЪреМрд░рд╛рд╣реЗ рдХреЗ рд╕рдВрдХреЗрдд рдирд╣реАрдВ рдорд┐рд▓рддреЗ? - рдФрд░ ! рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдирд╛ рд╡рд╣рд╛рдВ рдХрд╛рдо рдирд╣реАрдВ рдХрд░рддрд╛ рд╣реИ)ред

@scottmcm рдЖрд╣ рдмрд┐рд▓реНрдХреБрд▓ред

рдореБрдЭреЗ рдирд╣реАрдВ рд▓рдЧрддрд╛ рдХрд┐ рдЖрдкрдХреЛ рдкреНрд░рддрд┐рдЪреНрдЫреЗрджрди рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реИ? рдХреНрдпрд╛ рдпрд╣ рд╕рд┐рд░реНрдл рд╕реАрдзреЗ рд╡рд┐рд╢реЗрд╖рдЬреНрдЮрддрд╛ рдирд╣реАрдВ рд╣реИ?

рдореИрдВрдиреЗ рдЕрдиреНрдп рдЯрд┐рдкреНрдкрдгрд┐рдпреЛрдВ рдХреЛ рдирд╣реАрдВ рдкрдврд╝рд╛ рд╣реИ, рд▓реЗрдХрд┐рди рдЕрднреА рдореЗрд░реЗ рд▓рд┐рдП TryFrom рдЯреВрдЯрд╛ рд╣реБрдЖ рд╣реИ (рдпрд╣ рдкрд╣рд▓реЗ рдареАрдХ рдХрд╛рдо рдХрд░рддрд╛ рдерд╛)ред

рд░рд╕реНрдЯрд╕реА рд╕рдВрд╕реНрдХрд░рдг:

rustc 1.22.0-nightly (d6d711dd8 2017-10-10)
binary: rustc
commit-hash: d6d711dd8f7ad5885294b8e1f0009a23dc1f8b1f
commit-date: 2017-10-10
host: x86_64-unknown-linux-gnu
release: 1.22.0-nightly
LLVM version: 4.0

рдкреНрд░рд╛рд╕рдВрдЧрд┐рдХ рдХреЛрдб рдЕрдиреБрднрд╛рдЧ рдЬрд┐рд╕рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рдЬрдВрдЧ рд╢рд┐рдХрд╛рдпрдд рдХрд░рддрд╛ рд╣реИ рд╡рд╣ рдпрд╣рд╛рдВ рд╣реИ: https://github.com/fschutt/printpdf/blob/master/src/types/plugins/graphics/two_Dimension/image.rs#L29 -L39 рдФрд░ https://github .com/fschutt/printpdf/blob/master/src/types/plugins/graphics/xobject.rs#L170 -L200 - рдпрд╣ рдХреБрдЫ рд╣рдлреНрддреЗ рдкрд╣рд▓реЗ рдареАрдХ рд╕рдВрдХрд▓рд┐рдд рд╣реБрдЖ, рдпрд╣реА рдХрд╛рд░рдг рд╣реИ рдХрд┐ рдкреБрд╕реНрддрдХрд╛рд▓рдп рдореЗрдВ рдЕрднреА рднреА "рдмрд┐рд▓реНрдб рдкрд╛рд╕рд┐рдВрдЧ" рдмреИрдЬ рд╣реИред

рд╣рд╛рд▓рд╛рдВрдХрд┐, рдирд╡реАрдирддрдо рд░рд╛рддреНрд░рд┐рдХрд╛рд▓реАрди рдирд┐рд░реНрдорд╛рдг рдкрд░, TryFrom рдЯреВрдЯрддрд╛ рдкреНрд░рддреАрдд рд╣реЛрддрд╛ рд╣реИ:

error[E0119]: conflicting implementations of trait `std::convert::TryFrom<_>` for type `types::plugins::graphics::two_dimensional::image::Image`:
  --> src/types/plugins/graphics/two_dimensional/image.rs:29:1
   |
29 | / impl<T: ImageDecoder> TryFrom<T> for Image {
30 | |     type Error = image::ImageError;
31 | |     fn try_from(image: T)
32 | |     -> std::result::Result<Self, Self::Error>
...  |
38 | |     }
39 | | }
   | |_^
   |
   = note: conflicting implementation in crate `core`

error[E0119]: conflicting implementations of trait `std::convert::TryFrom<_>` for type `types::plugins::graphics::xobject::ImageXObject`:
   --> src/types/plugins/graphics/xobject.rs:170:1
    |
170 | / impl<T: image::ImageDecoder> TryFrom<T> for ImageXObject {
171 | |     type Error = image::ImageError;
172 | |     fn try_from(mut image: T)
173 | |     -> std::result::Result<Self, Self::Error>
...   |
199 | |     }
200 | | }
    | |_^
    |
    = note: conflicting implementation in crate `core`

error: aborting due to 2 previous errors

error: Could not compile `printpdf`.

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

@fschutt рдкрд░рд╕реНрдкрд░ рд╡рд┐рд░реЛрдзреА рдирд┐рд╣рд┐рддрд╛рд░реНрде рд╢рд╛рдпрдж impl<T, U> TryFrom<T> for U where U: From<T> рд╣реИ, рдЬрд┐рд╕реЗ https://github.com/rust-lang/rust/pull/44174 рдореЗрдВ рдЬреЛрдбрд╝рд╛ рдЧрдпрд╛ рд╣реИред T рдореМрдЬреВрдж рд╣реЛ рд╕рдХрддрд╛ рд╣реИ рдЬреИрд╕реЗ T: ImageDecoder рдФрд░ Image: From<T> рджреЛрдиреЛрдВред

рдХреНрдпрд╛ рдЗрд╕рдХреЗ рд▓рд┐рдП рдлреАрдЪрд░ рдЧреЗрдЯ рдХреЛ рдЫреЛрдбрд╝рдиреЗ рдХреЗ рд▓рд┐рдП рдЕрднреА рднреА рдХреБрдЫ рдЖрд╡рд╢реНрдпрдХ рд╣реИ?

рдЕрдЧрд░ https://github.com/rust-lang/rust/issues/35121 рдХреЛ рдкрд╣рд▓реЗ рд╕реНрдерд┐рд░ рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИ рддреЛ рд╣рдо https://github.com/rust-lang/rust/pull/ рдореЗрдВ рдкреЗрд╢ рдХрд┐рдП рдЧрдП Infallible рдкреНрд░рдХрд╛рд░ рдХреЛ рд╣рдЯрд╛ рд╕рдХрддреЗ рд╣реИрдВред 44174 рдФрд░ рдЗрд╕рдХреЗ рдмрдЬрд╛рдп ! рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░реЗрдВред рдореБрдЭреЗ рдирд╣реАрдВ рдкрддрд╛ рдХрд┐ рдХреНрдпрд╛ рдЗрд╕реЗ рдПрдХ рдЖрд╡рд╢реНрдпрдХрддрд╛ рдорд╛рдирд╛ рдЬрд╛рддрд╛ рд╣реИред

рдореБрдЭреЗ рд▓рдЧрддрд╛ рд╣реИ рдХрд┐ рдпрд╣рд╛рдВ рдореБрдЦреНрдп рдЕрд╡рд░реЛрдзрдХ рдЕрднреА рднреА рдкреВрд░реНрдгрд╛рдВрдХ рдкреНрд░рдХрд╛рд░ рд╣реИред рдпрд╛ рддреЛ рд╣рдо рдкреВрд░реНрдгрд╛рдВрдХ рдкреНрд░рдХрд╛рд░реЛрдВ рдХреЗ рд▓рд┐рдП рдПрдХ рдЕрд▓рдЧ Cast рд╡рд┐рд╢реЗрд╖рддрд╛ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рддреЗ рд╣реИрдВ https://github.com/rust-lang/rust/pull/42456#issuecomment -326159595, рдпрд╛ рдкреЛрд░реНрдЯреЗрдмрд┐рд▓рд┐рдЯреА рд▓рд┐рдВрдЯ #41619 рдХреЛ рдкрд╣рд▓реЗ рдХрд░реЗрдВред

рдЗрд╕рд▓рд┐рдП рдореЗрд░реЗ рдкрд╛рд╕ рдПрдХ рдПрдирдо рд╣реБрдЖ рдХрд░рддрд╛ рдерд╛ рдЬреЛ TryFrom рдХреЗ рд▓рд┐рдП AsRef<str> рд▓рд╛рдЧреВ рдХрд░рддрд╛ рдерд╛, рд▓реЗрдХрд┐рди рдпрд╣ рдХреБрдЫ рдорд╣реАрдиреЗ рдкрд╣рд▓реЗ рдЯреВрдЯ рдЧрдпрд╛ред рдореИрдВрдиреЗ рд╕реЛрдЪрд╛ рдерд╛ рдХрд┐ рдпрд╣ рд░рд╛рдд рдореЗрдВ рдкреЗрд╢ рдХрд┐рдпрд╛ рдЧрдпрд╛ рдПрдХ рдмрдЧ рдерд╛ рдЬреЛ рд╕рдордп рдХреЗ рд╕рд╛рде рджреВрд░ рд╣реЛ рдЬрд╛рдПрдЧрд╛, рд▓реЗрдХрд┐рди рдРрд╕рд╛ рдкреНрд░рддреАрдд рд╣реЛрддрд╛ рд╣реИ рдХрд┐ рдРрд╕рд╛ рдирд╣реАрдВ рд╣реИред рдХреНрдпрд╛ рдпрд╣ рдЕрдм TryFrom рдХреЗ рд▓рд┐рдП рд╕рдорд░реНрдерд┐рдд рдкреИрдЯрд░реНрди рдирд╣реАрдВ рд╣реИ?

impl<S: AsRef<str>> TryFrom<S> for MyEnum {
    type Error = &'static str;

    fn try_from(string: S) -> Result<Self, Self::Error> {
        // Impl here
    }
}
...

&str рдФрд░ String рджреЛрдиреЛрдВ рд╕реЗ рдХрдирд╡рд░реНрдЯ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдЕрдиреНрдп рд╡рд┐рдХрд▓реНрдк рдХреНрдпрд╛ рд╣реИрдВ?

@kybishop MyEnum рд▓рд╛рдЧреВ рдХрд░рддрд╛ рд╣реИ FromStr ? рдпрд╣ рдЖрдкрдХреЗ рдЯреВрдЯрдиреЗ рдХрд╛ рд╕реНрд░реЛрдд рд╣реЛ рд╕рдХрддрд╛ рд╣реИред

@nvzqz рдРрд╕рд╛ рдирд╣реАрдВ рд╣реИ, рд╣рд╛рд▓рд╛рдВрдХрд┐ рдореБрдЭреЗ рдЬрдВрдЧ рдЖрдИрдЖрд░рд╕реА рдХреЗ рдорд╛рдзреНрдпрдо рд╕реЗ TryFrom рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдиреЗ рдХреА рдЕрдиреБрд╢рдВрд╕рд╛ рдХреА рдЧрдИ рдереА рдХреНрдпреЛрдВрдХрд┐ рдпрд╣ рдПрдХ рдЕрдзрд┐рдХ рд╕рд╛рдорд╛рдиреНрдпреАрдХреГрдд рд╕рдорд╛рдзрд╛рди рд╣реИред TryFrom рдиреЗ рд╢реБрд░реБрдЖрдд рдореЗрдВ рдмрд╣реБрдд рдЕрдЪреНрдЫрд╛ рдХрд╛рдо рдХрд┐рдпрд╛ рдЬрдм рддрдХ рдХрд┐ рдХреБрдЫ рдорд╣реАрдиреЗ рдкрд╣рд▓реЗ рд░рд╛рдд рдореЗрдВ w/e рдмреНрд░реЗрдХрд┐рдВрдЧ рдкрд░рд┐рд╡рд░реНрддрди рдирд╣реАрдВ рд╣реБрдЖред

рд╕рдВрдкрд╛рджрд┐рдд рдХрд░реЗрдВ: рдХреНрдпрд╛ рдЖрдкрдХрд╛ рдорддрд▓рдм рд╣реИ рдХрд┐ рдореБрдЭреЗ FromStr рдХреЛ рд▓рд╛рдЧреВ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рд╕реНрд╡рд┐рдЪ рдХрд░рдирд╛ рдЪрд╛рд╣рд┐рдП, рдпрд╛ рдпрджрд┐ рдпрд╣ _did_ impl FromStr рд╣реИ, рддреЛ рдЗрд╕рд╕реЗ рдЯреВрдЯ-рдлреВрдЯ рд╣реЛ рд╕рдХрддреА рд╣реИ?

рд╕рдВрдкрд╛рджрд┐рдд рдХрд░реЗрдВ 2: рдпрд╣рд╛рдВ рдЙрди рдЬрд┐рдЬреНрдЮрд╛рд╕реБ рд▓реЛрдЧреЛрдВ рдХреЗ рд▓рд┐рдП рдкреВрд░реНрдг, рдмрд▓реНрдХрд┐ рд╕рдВрдХреНрд╖рд┐рдкреНрдд рдФрд░ рд╕рд░рд▓ рд╣реИ: https://gist.github.com/kybishop/2fa9e9d32728167bed5b1bc0b9becd97

@kybishop рдХреНрдпрд╛ рдХреЛрдИ рд╡рд┐рд╢реЗрд╖ рдХрд╛рд░рдг рд╣реИ рдХрд┐ рдЖрдк $#$ &str $#$ рдХреЗ рдмрдЬрд╛рдп AsRef<str> рдХреЗ рд▓рд┐рдП рдХрд╛рд░реНрдпрд╛рдиреНрд╡рдпрди рдЪрд╛рд╣рддреЗ рд╣реИрдВ?

@sfackler рдореИрдВ рдЗрд╕ рдзрд╛рд░рдгрд╛ рдХреЗ рддрд╣рдд рдерд╛ рдХрд┐ рдпрд╣ &str рдФрд░ String рджреЛрдиреЛрдВ рд╕реЗ рд░реВрдкрд╛рдВрддрд░рдг рдХреА рдЕрдиреБрдорддрд┐ рджреЗрддрд╛ рд╣реИ, рд╣рд╛рд▓рд╛рдВрдХрд┐ рдореИрдВ рдЕрднреА рднреА рдПрдХ рдЬрдВрдЧ рдиреМрд╕рд┐рдЦрд┐рдпрд╛ рд╣реВрдВ, рдЗрд╕рд▓рд┐рдП рд╢рд╛рдпрдж рдореИрдВ рдЧрд▓рдд рд╕рдордЭ рд░рд╣рд╛ рд╣реВрдВ рдХрд┐ рдХреИрд╕реЗ AsRef<str> рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИред рдореИрдВ &str рд╕реЗ рджреВрд░ рдЬрд╛рдиреЗ рдХреА рдХреЛрд╢рд┐рд╢ рдХрд░реВрдВрдЧрд╛ рдФрд░ рджреЗрдЦреВрдВрдЧрд╛ рдХрд┐ рдХреНрдпрд╛ AsRef рдХреБрдЫ &str рдХреА рдЕрдиреБрдорддрд┐ рджреЗ рд░рд╣рд╛ рдерд╛ред

@kybishop https://github.com/rust-lang/rust/issues/33417#issuecomment -335815206 рдХреЗ рд╕рдорд╛рди рд╣реИ, рдФрд░ рдЬреИрд╕рд╛ рдХрд┐ рдХрдВрдкрд╛рдЗрд▓рд░ рддреНрд░реБрдЯрд┐ рд╕рдВрджреЗрд╢ рдХрд╣рддрд╛ рд╣реИ, рдпрд╣ impl<T, U> std::convert::TryFrom<U> for T where T: std::convert::From<U> impl рдХреЗ рд╕рд╛рде рдПрдХ рд╡рд╛рд╕реНрддрд╡рд┐рдХ рд╕рдВрдШрд░реНрд╖ рд╣реИ рдЬреЛ рдерд╛ libcore рдореЗрдВ рдЬреЛрдбрд╝рд╛ рдЧрдпрд╛ред

рдПрдХ рдкреНрд░рдХрд╛рд░ T (рд╕рдВрднрд╡рддрдГ рдбрд╛рдЙрдирд╕реНрдЯреНрд░реАрдо рдХреНрд░реЗрдЯ рдореЗрдВ) рд╣реЛ рд╕рдХрддрд╛ рд╣реИ рдЬреЛ рджреЛрдиреЛрдВ рдХреЛ рд▓рд╛рдЧреВ рдХрд░рддрд╛ рд╣реИFrom<MyEnum> рдФрд░ AsRef<str>рдФрд░ MyEnum: From<T> рд╣реИ . рдЙрд╕ рд╕реНрдерд┐рддрд┐ рдореЗрдВ, рджреЛрдиреЛрдВ рдирд┐рд╣рд┐рддрд╛рд░реНрде рд▓рд╛рдЧреВ рд╣реЛрдВрдЧреЗ, рдЗрд╕рд▓рд┐рдП рджреЛрдиреЛрдВ рдирд┐рд╣рд┐рддрд╛рд░реНрдереЛрдВ рдХреЛ рдПрдХ рд╕рд╛рде рдореМрдЬреВрдж рд░рд╣рдиреЗ рдХреА рдЕрдиреБрдорддрд┐ рдирд╣реАрдВ рд╣реИред

@SimonSapin рд╕рдордЭ рдЧрдпрд╛ред рддреЛ &str рдФрд░ &String рджреЛрдиреЛрдВ рд╕реЗ рд░реВрдкрд╛рдВрддрд░рд┐рдд рд╣реЛрдиреЗ рдХреЗ рдЗрдЪреНрдЫреБрдХ рд▓реЛрдЧреЛрдВ рдХреЗ рд▓рд┐рдП рдХреНрдпрд╛ рд╡рд┐рдХрд▓реНрдк рд╣реИрдВ? рдмрд╕ рджреЛрдиреЛрдВ рдХреЗ рд▓рд┐рдП TryFrom рд▓рдЧрд╛рдирд╛ рд╣реИ?

рд╕рдВрдкрд╛рджрд┐рдд рдХрд░реЗрдВ: рдореБрдЭреЗ рд▓рдЧрддрд╛ рд╣реИ рдХрд┐ рдореИрдВ рд╕рд┐рд░реНрдл рдЕрддрд┐рд░рд┐рдХреНрдд рдХрд╛рдо рдЦрд╛ рд╕рдХрддрд╛ рд╣реВрдВ рдФрд░ .as_ref() рдкрд░ String s рдкрд░ рдХреЙрд▓ рдХрд░ рд╕рдХрддрд╛ рд╣реВрдВред рдлрд┐рд░ рдореЗрд░реЗ рдкрд╛рд╕ $ str рдХреЗ рд▓рд┐рдП рдХреЗрд╡рд▓ рдПрдХ TryFrom impl рд╣реЛ рд╕рдХрддрд╛ рд╣реИред

рд╣рд╛рдВ, рджреЛ рдЗрдореНрдкреНрд▓рд╛рдВрдЯреНрд╕ (рд╕рдВрднрд╡рддрдГ рдПрдХ рджреВрд╕рд░реЗ рдХреЗ рдЖрдзрд╛рд░ рдкрд░, рдЬреИрд╕рд╛ рдХрд┐ рдЖрдкрдиреЗ рдмрддрд╛рдпрд╛) рддрдм рддрдХ рдХрд╛рдо рдХрд░рдирд╛ рдЪрд╛рд╣рд┐рдП рдЬрдм рддрдХ MyEnum From<&str> рдпрд╛ From<String> рдХреЛ рд▓рд╛рдЧреВ рдирд╣реАрдВ рдХрд░рддрд╛ рд╣реИред

@kybishop String рд▓рд╛рдЧреВ рдХрд░рддрд╛ рд╣реИ Deref<str> , рдЗрд╕рд▓рд┐рдП рдЯрд╛рдЗрдк рдЕрдиреБрдорд╛рди рдХреЛ &String рдХреЛ TryFrom impl рдореЗрдВ рдкрд╛рд╕ рдХрд░рддреЗ рд╕рдордп &str рдореЗрдВ рдЬрдмрд░рджрд╕реНрддреА рдХрд░рдиреЗ рдХреА рдЕрдиреБрдорддрд┐ рджреЗрдиреА рдЪрд╛рд╣рд┐рдПред as_ref рдкрд░ рдХреЙрд▓ рдХрд░рдиреЗ рдХреА рд╣рдореЗрд╢рд╛ рдЖрд╡рд╢реНрдпрдХрддрд╛ рдирд╣реАрдВ рд╣реЛ рд╕рдХрддреА рд╣реИред

рдЕрдЧрд░ рдХреЛрдИ рдЗрд╕рдХрд╛ рддреНрд╡рд░рд┐рдд рдЙрджрд╛рд╣рд░рдг рдвреВрдВрдв рд░рд╣рд╛ рд╣реИ: https://play.rust-lang.org/?gist=bfc3de0696cbee0ed9640a3f60b33f5b&version=nightly

! рдХреЛ рд╕реНрдерд┐рд░ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП https://github.com/rust-lang/rust/pull/47630 рдХреЗ рд╕рд╛рде, рдХреНрдпрд╛ рдкреАрдЖрд░ рдХреЗ рд▓рд┐рдП Infallible рдХреЛ ! рд╕реЗ рдмрджрд▓рдиреЗ рдХреА рднреВрдЦ рд╣реИ ?

рдЕрдиреБрд╕рд░рдг рдХрд░рдиреЗ рдХрд╛ рдПрдХ рдмреЗрд╣рддрд░ рдорд╛рд░реНрдЧ рдЙрдкрдирд╛рдо рдмрдирд╛рдирд╛ рд╣реЛрдЧрд╛ред рдпрд╣ рдЕрднрд┐рд╡реНрдпрдХреНрддрд┐ рдХреЛ рд╕рдВрд░рдХреНрд╖рд┐рдд рдХрд░рддрд╛ рд╣реИ рдФрд░ рдЕрдиреБрдХреВрд▓рд┐рдд рднрд╛рд╖рд╛ рд╕реБрд╡рд┐рдзрд╛ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рддрд╛ рд╣реИред

type Infallible = !;

рдмрд╕ рдЕрдВрджрд░ рдХреВрдж рд░рд╣рд╛ рд╣реВрдВред рдореИрдВ рдЙрд╕ рдкрд░ @scottmcm рдХреЗ рд╕рд╛рде рд╣реВрдВред

рд╣рд╛рд▓рд╛рдВрдХрд┐, рдпрд╣ рдЕрддрд┐рд░рд┐рдХреНрдд рдУрд╡рд░рд╣реЗрдб рдЬреЛрдбрд╝рддрд╛ рд╣реИ рдХрд┐ рдпрд╣ рд╕реБрд╡рд┐рдзрд╛ ( TryInto / TryFrom ) рдЕрдм рдПрдХ рдЕрдиреНрдп рдЕрд╕реНрдерд┐рд░ рд╕реБрд╡рд┐рдзрд╛ рдкрд░ рдирд┐рд░реНрднрд░ рдХрд░рддреА рд╣реИ - never_type ред

рд╕рд╛рде рд╣реА, Infallible рдХрд╛ рдпрд╣ рдлрд╛рдпрджрд╛ рд╣реИ рдХрд┐ рдпрд╣ рдЗрд╕ рдмрд╛рд░реЗ рдореЗрдВ рдЕрдзрд┐рдХ рдЬрд╛рдирдХрд╛рд░реА / рдЕрд░реНрде рджреЗрддрд╛ рд╣реИ рдХрд┐ рдЗрд╕ рдкреНрд░рдХрд╛рд░ рдХрд╛ рдирд┐рд░реНрдорд╛рдг рдХреНрдпреЛрдВ рдирд╣реАрдВ рдХрд┐рдпрд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИред рдореИрдВ рдЕрднреА рдЕрдкрдиреЗ рдЖрдк рд╕реЗ рд░рд╛рдп рд░рдЦрддрд╛ рд╣реВрдВред

рдореИрдВ ! рдХреЛ рдПрдХ рд╢рдмреНрджрд╛рд╡рд▓реА рдкреНрд░рдХрд╛рд░ рдХреЗ рд▓рд┐рдП рдкрд░реНрдпрд╛рдкреНрдд рдмрдирдирд╛ рдЪрд╛рд╣рддрд╛ рд╣реВрдВ рддрд╛рдХрд┐ Result<_, !> рдХреЛ рд╕рд╣рдЬ рд░реВрдк рд╕реЗ "рдЕрдЪреВрдХ рдкрд░рд┐рдгрд╛рдо" рдХреЗ рд░реВрдк рдореЗрдВ рдкрдврд╝рд╛ рдЬрд╛ рд╕рдХреЗ, рдпрд╛ "рдкрд░рд┐рдгрд╛рдо рдЬреЛ (рд╢рд╛рдмреНрджрд┐рдХ рд░реВрдк рд╕реЗ) рдХрднреА рдирд╣реАрдВ рд╣реБрдЖред" рдПрдХ рдЙрдкрдирд╛рдо рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдирд╛ (рдПрдХ рдЕрд▓рдЧ рдкреНрд░рдХрд╛рд░ рд╕реЗ рдХреЛрдИ рдлрд░реНрдХ рдирд╣реАрдВ рдкрдбрд╝рддрд╛!) рдореБрдЭреЗ рдереЛрдбрд╝рд╛ рдмреЗрдорд╛рдиреА рд▓рдЧрддрд╛ рд╣реИ рдФрд░ рдореИрдВ рдЗрд╕реЗ рдХрдо рд╕реЗ рдХрдо рдЕрдкрдиреЗ рд▓рд┐рдП рдПрдХ рдХреНрд╖рдгрд┐рдХ рд╡рд┐рд░рд╛рдо рдХреЗ рдХрд╛рд░рдг рджреЗрдЦ рд╕рдХрддрд╛ рд╣реВрдВ рдЬрдм рдкреНрд░рдХрд╛рд░ рдХреЗ рд╣рд╕реНрддрд╛рдХреНрд╖рд░ рдкрдврд╝рддреЗ рд╣реИрдВ- "рд░реБрдХреЛ, рдпрд╣ рдХреИрд╕реЗ рдЕрд▓рдЧ рдерд╛ ! рдлрд┐рд░ рд╕реЗ ?" рд╡рд╛рдИрдПрдордПрдорд╡реА, рдмрд┐рд▓реНрдХреБрд▓ред

@jdahlstrom рдореИрдВ рдкреВрд░реА рддрд░рд╣ рд╕реЗ рд╕рд╣рдордд рд╣реВрдБред рд╣рдореЗрдВ рдЗрд╕реЗ рд░рд╕реНрдЯ рдмреБрдХ рдпрд╛ рдиреЛрдорд┐рдХреЙрди рдореЗрдВ рдкреЗрд╢ рдХрд░рдирд╛ рд╣реЛрдЧрд╛ рддрд╛рдХрд┐ рдпрд╣ "рдЬрдореАрдиреА рд╕рдЪреНрдЪрд╛рдИ" рдФрд░ рдореИрддреНрд░реАрдкреВрд░реНрдг рд╣реЛред

рдЗрд╕ API рдХреЗ рд▓рд┐рдП RFC рдХреЛ рд╕рдмрдорд┐рдЯ рдХрд┐рдП рд╣реБрдП рдЕрдм рджреЛ рд╕рд╛рд▓ рд╣реЛ рдЪреБрдХреЗ рд╣реИрдВред

~ @ рдмреНрд░рд╛рдпрдирд╕реНрдорд┐рде : рдПрдХ рд╕реНрдерд┐рд░реАрдХрд░рдг рдкреАрдЖрд░ рдкреНрд░рдЧрддрд┐ рдкрд░ рд╣реИред ~

рд╕рдВрдкрд╛рджрд┐рдд рдХрд░реЗрдВ : рдпрд╛ рд╢рд╛рдпрдж рдореИрдВ рдмрд╣реБрдд рдердХ рдЧрдпрд╛ рд╣реВрдБ ...

рдЖрдкрдиреЗ ! рдкреНрд░рдХрд╛рд░ рдХреЗ рд╕реНрдерд┐рд░реАрдХрд░рдг рдХреЗ рдкреАрдЖрд░ рдХреЛ рд▓рд┐рдВрдХ рдХрд┐рдпрд╛ рд╣реИред

рдЪреВрдВрдХрд┐ ! рд╕реНрдерд┐рд░реАрдХрд░рдг рдкреАрдЖрд░ рдЕрднреА рд╡рд┐рд▓рдп рд╣реБрдЖ рд╣реИ, рдЗрд╕рд▓рд┐рдП рдореИрдВрдиреЗ convert::Infallible рдХреЛ ! рд╕реЗ рдмрджрд▓рдиреЗ рдХреЗ рд▓рд┐рдП рдПрдХ рдкреАрдЖрд░ рд╕рдмрдорд┐рдЯ рдХрд┐рдпрд╛ рд╣реИ: #49038

https://github.com/rust-lang/rust/pull/49038 рдорд░реНрдЬ рд╣реЛ рдЧрдпрд╛ рд╣реИред рдореЗрд░рд╛ рдорд╛рдирдирд╛ тАЛтАЛрд╣реИ рдХрд┐ рдпрд╣ рд╕реНрдерд┐рд░реАрдХрд░рдг рдХреЗ рд▓рд┐рдП рдЖрдЦрд┐рд░реА рдЕрд╡рд░реЛрдзрдХ рдерд╛, рдХреГрдкрдпрд╛ рдореБрдЭреЗ рдмрддрд╛рдПрдВ рдХрд┐ рдХреНрдпрд╛ рдореИрдВ рдПрдХ рдЕрдирд╕реБрд▓рдЭреЗ рдореБрджреНрджреЗ рд╕реЗ рдЪреВрдХ рдЧрдпрд╛ рд╣реВрдВред

@rfcbot fcp рдорд░реНрдЬ

rfcbot рдкреНрд░рддрд┐рд╕рд╛рдж рдирд╣реАрдВ рджреЗ рд░рд╣рд╛ рд╣реИ рдХреНрдпреЛрдВрдХрд┐ рдПрдХ рдФрд░ FCP рдкрд╣рд▓реЗ рд╣реА https://github.com/rust-lang/rust/issues/33417#issuecomment -302817297 рдкрд░ рдкреВрд░рд╛ рд╣реЛ рдЪреБрдХрд╛ рд╣реИред

рдЙрдореНрдо, рдХреБрдЫ рдирд┐рд╣рд┐рддрд╛рд░реНрде рд╣реИрдВ рдЬрд┐рди рдкрд░ рджреЛрдмрд╛рд░рд╛ рдЧреМрд░ рдХрд┐рдпрд╛ рдЬрд╛рдирд╛ рдЪрд╛рд╣рд┐рдПред рдЕрдм рдЬрдм рд╣рдорд╛рд░реЗ рдкрд╛рд╕ impl<T, U> TryFrom<U> for T where T: From<U> рдХреЗ рд╢реЗрд╖ рдЗрдореНрдкреНрд▓рд╛рдВрдЯреНрд╕ рдЬрд┐рдирдореЗрдВ TryFrom type Error = ! рд╣реИрдВ, рдЙрдиреНрд╣реЗрдВ рдпрд╛ рддреЛ From рдХреЗ рдЗрдореНрдкреНрд▓рд╛рдВрдЯреНрд╕ рд╕реЗ рдмрджрд▓ рджрд┐рдпрд╛ рдЬрд╛рдирд╛ рдЪрд╛рд╣рд┐рдП, рд╣рдЯрд╛ рджрд┐рдпрд╛ рдЬрд╛рдирд╛ рдЪрд╛рд╣рд┐рдП, рдпрд╛ рдЧрд▓рдд рдмрдирд╛рдпрд╛ рдЬрд╛рдирд╛ рдЪрд╛рд╣рд┐рдП ( рддреНрд░реБрдЯрд┐ рдкреНрд░рдХрд╛рд░ рдХреЛ рдХреБрдЫ рдЧреИрд░-рдирд┐рд░реНрд╡рд╛рд╕рд┐рдд рдкреНрд░рдХрд╛рд░ рдореЗрдВ рдмрджрд▓рдирд╛)ред

рдЙрд╕ рдорд╛рдорд▓реЗ рдореЗрдВ рдЬреЛ рдореБрдЭреЗ рдорд┐рд▓ рд╕рдХрддреЗ рд╣реИрдВ рдЙрдирдореЗрдВ usize рдпрд╛ isize рд╢рд╛рдорд┐рд▓ рд╣реИрдВред рдореБрдЭреЗ рд▓рдЧрддрд╛ рд╣реИ рдХрд┐ рд╕рдВрдмрдВрдзрд┐рдд From impls рдореМрдЬреВрдж рдирд╣реАрдВ рд╣реИрдВ рдХреНрдпреЛрдВрдХрд┐ рдЙрдирдХреА рдЧрд┐рд░рд╛рд╡рдЯ рд▓рдХреНрд╖реНрдп рд╕реВрдЪрдХ рдЖрдХрд╛рд░ рдкрд░ рдирд┐рд░реНрднрд░ рдХрд░рддреА рд╣реИред рд╡рд╛рд╕реНрддрд╡ рдореЗрдВ TryFrom рдЗрдореНрдкреНрд▓рд╛рдВрдЯ рдЕрд▓рдЧ-рдЕрд▓рдЧ рд▓рдХреНрд╖реНрдпреЛрдВ рдХреЗ рд▓рд┐рдП рдЕрд▓рдЧ-рдЕрд▓рдЧ рдЙрддреНрдкрдиреНрди рд╣реЛрддреЗ рд╣реИрдВ: https://github.com/rust-lang/rust/blob/1.24.1/src/libcore/num/mod.rs#L3103 -L3179 тАЛтАЛрдпрд╣ рд╢рд╛рдпрдж рдПрдХ рдкреЛрд░реНрдЯреЗрдмрд┐рд▓рд┐рдЯреА рдЦрддрд░рд╛ рд╣реИред

рдЕрд▓рдЧ-рдЕрд▓рдЧ рд▓рдХреНрд╖реНрдпреЛрдВ рдХреЗ рд▓рд┐рдП рдЕрд▓рдЧ-рдЕрд▓рдЧ рдЬреЗрдирд░реЗрдЯ рдХрд┐рдпрд╛ рдЧрдпрд╛

рд╕реНрдкрд╖реНрдЯ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП: рдПрдХ рд╣реА impl рдореЗрдВ рдЕрд▓рдЧ-рдЕрд▓рдЧ target_pointer_width рдХреЗ рд▓рд┐рдП рдЕрд▓рдЧ-рдЕрд▓рдЧ рд╡рд┐рдзрд┐ рдирд┐рдХрд╛рдп рдареАрдХ рд╣реИрдВ (рдФрд░ рд╕рдВрднрд╛рд╡рд┐рдд рд░реВрдк рд╕реЗ рдЖрд╡рд╢реНрдпрдХ), рдЕрд▓рдЧ-рдЕрд▓рдЧ рдПрдкреАрдЖрдИ (рддреНрд░реБрдЯрд┐ рдкреНрд░рдХрд╛рд░) рдирд╣реАрдВ рд╣реИрдВред

рд╕реНрдерд┐рд░реАрдХрд░рдг рдкреАрдЖрд░: #49305ред рд╡рд╣рд╛рдВ рдХреБрдЫ рдЪрд░реНрдЪрд╛ рдХреЗ рдмрд╛рдж, рдпрд╣ рдкреАрдЖрд░ рдХреБрдЫ TryFrom рдЗрдореНрдкреНрд▓рд╛рдВрдЯреНрд╕ рдХреЛ рднреА рд╣рдЯрд╛ рджреЗрддрд╛ рд╣реИ рдЬрд┐рд╕рдореЗрдВ usize рдпрд╛ isize рд╢рд╛рдорд┐рд▓ рд╣реИрдВ рдХреНрдпреЛрдВрдХрд┐ рд╣рдордиреЗ рдЙрдиреНрд╣реЗрдВ рд▓рд╛рдЧреВ рдХрд░рдиреЗ рдХреЗ рджреЛ рдЕрд▓рдЧ-рдЕрд▓рдЧ рддрд░реАрдХреЛрдВ рдХреЗ рдмреАрдЪ рдлреИрд╕рд▓рд╛ рдирд╣реАрдВ рдХрд┐рдпрд╛ рд╣реИред (рдФрд░ рд╣рдо рдирд┐рд╢реНрдЪрд┐рдд рд░реВрдк рд╕реЗ рдХреЗрд╡рд▓ рдПрдХ рд╣реА рд╣реЛ рд╕рдХрддреЗ рд╣реИрдВред)

рдЙрдирдХреЗ рд▓рд┐рдП рд╕рдорд░реНрдкрд┐рдд рдЯреНрд░реИрдХрд┐рдВрдЧ рд╕рдорд╕реНрдпрд╛: https://github.com/rust-lang/rust/issues/49415

TryFrom рдиреЗ рдмрд┐рдирд╛ рдХрд┐рд╕реА рдлреАрдЪрд░ рдЧреЗрдЯрд┐рдВрдЧ рдХреЗ rustc 1.27.0-nightly (ac3c2288f 2018-04-18) рдкрд░ рдкреВрд░реА рддрд░рд╣ рд╕реЗ рдХрд╛рдо рдХрд┐рдпрд╛ рд▓реЗрдХрд┐рди rustc 1.27.0-nightly (66363b288 2018-04-28) рдХреЗ рд╕рд╛рде рд╕рдВрдХрд▓рд┐рдд рд╣реЛрдиреЗ рдкрд░ рдЯреВрдЯ рдЧрдпрд╛ред

рдХреНрдпрд╛ рдкрд┐рдЫрд▓реЗ 10 рджрд┐рдиреЛрдВ рдореЗрдВ рдЗрд╕ рд╕реБрд╡рд┐рдзрд╛ рдХреЗ рд╕реНрдерд┐рд░реАрдХрд░рдг рдореЗрдВ рдХреЛрдИ рдХрдореА рдЖрдИ рд╣реИ?

@kjetilkjeka рдЗрд╕ рд╕реБрд╡рд┐рдзрд╛ рдХреЛ рд╣рд╛рд▓ рд╣реА рдореЗрдВ рдЕрд╕реНрдерд┐рд░ рдХрд┐рдпрд╛ рдЧрдпрд╛ рд╣реИ: #50121ред

(рд╕реНрдерд┐рд░реАрдХрд░рдг рдкреВрд░реНрд╡рд╡рдд рдХрд┐рдП рдЬрд╛рдиреЗ рдХреЗ рдмрд╛рдж рд╕реЗ рдлрд┐рд░ рд╕реЗ рдЦреЛрд▓рдирд╛)

@kjetilkjeka TryFrom рдХреЗ рд╕реНрдерд┐рд░реАрдХрд░рдг рдХреЛ https://github.com/rust-lang/rust/pull/50121 рдореЗрдВ ! рдкреНрд░рдХрд╛рд░ рдХреЗ рд╕реНрдерд┐рд░реАрдХрд░рдг рдХреЗ рд╕рд╛рде рд╡рд╛рдкрд╕ рдХрд░ рджрд┐рдпрд╛ рдЧрдпрд╛ рд╣реИ, рдХреНрдпреЛрдВрдХрд┐ TryFrom<U, Error=!> for T where T: From<U> ! рдкреНрд░рдХрд╛рд░ https://github.com/rust-lang/rust/issues/49593 рдХреЗ рдХрд╛рд░рдг рдЕрд╕реНрдерд┐рд░ рдерд╛ред

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

рдХреНрдпрд╛ рдХреЛрдИ рдореМрд▓рд┐рдХ рдХрд╛рд░рдг рд╣реИ рдХрд┐ рд╣рдо рдЖрдЧреЗ рдирд╣реАрдВ рдмрдврд╝ рд╕рдХреЗ рдФрд░ TryFrom рд╡рд┐рд╢реЗрд╖рддрд╛ рдХреЛ рд╕реНрдерд┐рд░ рдирд╣реАрдВ рдХрд░ рд╕рдХреЗ, рдФрд░ рдХреЛрдИ рднреА рдЕрд░реНрде рдЬрд┐рд╕рдореЗрдВ ! рд╢рд╛рдорд┐рд▓ рдирд╣реАрдВ рд╣реИ, рдФрд░ рдХреЗрд╡рд▓ ! рд╕реЗ рдЬреБрдбрд╝реЗ рд╕реНрдерд┐рд░реАрдХрд░рдг рдХреЛ рд╕реНрдердЧрд┐рдд рдХрд░реЗрдВ ! рдХреЗ рд╕рдВрднрд╛рд╡рд┐рдд рд╕реНрдерд┐рд░реАрдХрд░рдг рдХреЗ рдмрд╛рдж рддрдХ?

https://github.com/rust-lang/rust/pull/49305#issuecomment -376293243 рд╡рд┐рднрд┐рдиреНрди рд╕рдВрднрд╛рд╡рд┐рдд рд╡рд┐рд╢реЗрд╖рддрд╛ рдХрд╛рд░реНрдпрд╛рдиреНрд╡рдпрдиреЛрдВ рдХреЛ рд╡рд░реНрдЧреАрдХреГрдд рдХрд░рддрд╛ рд╣реИред

@joshtriplett рдЬрд╣рд╛рдВ рддрдХ тАЛтАЛтАЛтАЛрдореИрдВ рд╕рдордЭрддрд╛ рд╣реВрдВ, рд╡рд┐рд╢реЗрд╖ рд░реВрдк рд╕реЗ impl<T, U> TryFrom<T> for U where U: From<T> { type Err = !; } рдкрд┐рдЫрдбрд╝рд╛-рд╕рдВрдЧрдд рдирд╣реАрдВ рд╣реИ рдпрджрд┐ TryFrom рдкрд╣рд▓реЗ рд╕реЗ рд╣реА рд╕реНрдерд┐рд░ рд╣реИред

@SimonSapin
рд╡рд╣ рдЬреЛрдбрд╝рдиреЗ рдХреЗ рд▓рд┐рдП рдкрд┐рдЫрдбрд╝рд╛-рд╕рдВрдЧрдд рдХреНрдпреЛрдВ рдирд╣реАрдВ рд╣реИ?

(рдФрд░ рдХреНрдпрд╛ рд╣рдореЗрдВ рд╡рд╛рд╕реНрддрд╡ рдореЗрдВ рдХрдВрдмрд▓ рдХреА рдЬрд░реВрд░рдд рд╣реИ?)

рд╡рд╣ рдЬреЛрдбрд╝рдиреЗ рдХреЗ рд▓рд┐рдП рдкрд┐рдЫрдбрд╝рд╛-рд╕рдВрдЧрдд рдХреНрдпреЛрдВ рдирд╣реАрдВ рд╣реИ?

рдореБрдЭреЗ рд▓рдЧрддрд╛ рд╣реИ рдХрд┐ рдпрд╣ рдкрд┐рдЫрдбрд╝рд╛ рд╕рдВрдЧрдд рдирд╣реАрдВ рд╣реИ рдХреНрдпреЛрдВрдХрд┐ TryFrom рдХреЛ рдореИрдиреНрдпреБрдЕрд▓ рд░реВрдк рд╕реЗ TryFrom рдХреЗ рдмреАрдЪ рд╕реНрдерд┐рд░ рдХрд┐рдпрд╛ рдЬрд╛ рд╕рдХрддрд╛ рдерд╛ рдФрд░ ! рдХреЛ рд╕реНрдерд┐рд░ рдХрд┐рдпрд╛ рдЧрдпрд╛ рдерд╛ред рдЬрдм рдХрдВрдмрд▓ рдХрд╛рд░реНрдпрд╛рдиреНрд╡рдпрди рдЬреЛрдбрд╝рд╛ рдЧрдпрд╛ рдерд╛ рддреЛ рдпрд╣ рдореИрдиреНрдпреБрдЕрд▓ рдХрд╛рд░реНрдпрд╛рдиреНрд╡рдпрди рдХреЗ рд╕рд╛рде рд╡рд┐рд░реЛрдзрд╛рднрд╛рд╕реА рд╣реЛрдЧрд╛ред

(рдФрд░ рдХреНрдпрд╛ рд╣рдореЗрдВ рд╡рд╛рд╕реНрддрд╡ рдореЗрдВ рдХрдВрдмрд▓ рдХреА рдЬрд░реВрд░рдд рд╣реИ?)

рдореБрдЭреЗ рд▓рдЧрддрд╛ рд╣реИ рдХрд┐ TryFrom рд╕реЗ рдЕрдзрд┐рдХ рдЬреЗрдиреЗрд░рд┐рдХ рдХреЛрдб рд▓рд┐рдЦрддреЗ рд╕рдордп рдХрдВрдмрд▓ рдХрд╛ рдЕрд░реНрде рд╡рд╛рд╕реНрддрд╡ рдореЗрдВ рд╕рдордЭ рдореЗрдВ рдЖрддрд╛ рд╣реИред T рдореЗрдВ рд░реВрдкрд╛рдВрддрд░рдг рдХреА рд╕рдВрднрд╛рд╡рдирд╛ рд╡рд╛рд▓реЗ рд╕рднреА рдкреНрд░рдХрд╛рд░реЛрдВ рдХрд╛ рдЬрд┐рдХреНрд░ рдХрд░рддреЗ рд╕рдордп рдЖрдк рдЕрдзрд┐рдХрддрд░ рдЙрди рд╕рднреА рдкреНрд░рдХрд╛рд░реЛрдВ рдХреЛ рднреА рд╢рд╛рдорд┐рд▓ рдХрд░рдирд╛ рдЪрд╛рд╣реЗрдВрдЧреЗ рдЬрд┐рдиреНрд╣реЗрдВ рдирд┐рд╢реНрдЪрд┐рдд рд░реВрдк рд╕реЗ T рдореЗрдВ рдкрд░рд┐рд╡рд░реНрддрд┐рдд рдХрд┐рдпрд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИред рдореБрдЭреЗ рд▓рдЧрддрд╛ рд╣реИ рдХрд┐ рдПрдХ рд╡рд┐рдХрд▓реНрдк рдпрд╣ рд╣реЛ рд╕рдХрддрд╛ рд╣реИ рдХрд┐ рд╕рднреА рдХреЛ TryFrom рдХреЛ рд▓рд╛рдЧреВ рдХрд░рдиреЗ рд╡рд╛рд▓реЗ рд╕рднреА рдкреНрд░рдХрд╛рд░реЛрдВ рдХреЗ рд▓рд┐рдП From рд▓рд╛рдЧреВ рдХрд░рдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реЛ рдФрд░ рдХрдВрдмрд▓ рдЗрдореНрдкреНрд▓рд╛рдВрдЯ рдмрдирд╛рдиреЗ рд╕реЗ рдкрд╣рд▓реЗ рд╡рд┐рд╢реЗрд╖рдЬреНрдЮрддрд╛ рдХреА рдкреНрд░рддреАрдХреНрд╖рд╛ рдХрд░реЗрдВред рдЖрдкрдХреЛ рдЕрднреА рднреА рд╕рдорд╕реНрдпрд╛ рд╣реЛрдЧреА рдХрд┐ Err рдХреЛ Result рдЬреЗрдиреЗрд░рд┐рдХ рдУрд╡рд░ рдмрдирд╛рдиреЗ рдХреЗ рд▓рд┐рдП рдХреНрдпрд╛ рдХрд┐рдпрд╛ рдЬрд╛рдПред ! рд░реВрдкрд╛рдВрддрд░рдг рдХреА рдЕрдЪреВрдХрддрд╛ рдХреЛ рд╡реНрдпрдХреНрдд рдХрд░рдиреЗ рдФрд░ рдкреНрд░реЛрдЧреНрд░рд╛рдорд┐рдХ рд░реВрдк рд╕реЗ рд▓рд╛рдЧреВ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдПрдХ рдЕрдЪреНрдЫрд╛ рддрд░реАрдХрд╛ рд▓рдЧрддрд╛ рд╣реИ, рдФрд░ рдЙрдореНрдореАрдж рд╣реИ рдХрд┐ рдкреНрд░рддреАрдХреНрд╖рд╛ рдХреЗ рд▓рд╛рдпрдХ рд╣реИред

рд╣рдо рддрдм рддрдХ рдкреНрд░рддреАрдХреНрд╖рд╛ рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ рдЬрдм рддрдХ рдХрд┐ рдмреНрд▓реИрдВрдХреЗрдЯ рдЗрдореНрдкреНрд▓рд╛рдВрдЯ рдкреНрд░рджрд╛рди рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рд╡рд┐рд╢реЗрд╖рдЬреНрдЮрддрд╛ рдЙрдкрд▓рдмреНрдз рди рд╣реЛ, рдФрд░ рдЕрдВрддрд░рд┐рдо рдореЗрдВ рд╡рд┐рднрд┐рдиреНрди рд╕рдВрдЦреНрдпрд╛рддреНрдордХ рд░реВрдкрд╛рдВрддрд░рдгреЛрдВ рдХреЛ рд╕реНрдерд┐рд░ рдХрд░реЗрдВред

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

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

рдЬрдм рднреА рдЗрд╕реЗ рд╕реНрдерд┐рд░ рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИ: _рдХреГрдкрдпрд╛_ рдкреНрд░рд╕реНрддрд╛рд╡рдирд╛ рдореЗрдВ TryFrom рдФрд░ TryInto рдЬреЛрдбрд╝реЗрдВред

@SergioBenitez рд╣рдордиреЗ рдХреБрдЫ рд╕рдордп рдХреЗ рд▓рд┐рдП рдирд╛рдЗрдЯрд▓реА рдкрд░ рдРрд╕рд╛ рдХрд┐рдпрд╛ рд╣реИ, рдФрд░ рджреБрд░реНрднрд╛рдЧреНрдп рд╕реЗ рдпрд╣ рдХреНрд░реЗрдЯ рдХреЗ рд▓рд┐рдП рдПрдХ рдмреНрд░реЗрдХрд┐рдВрдЧ рдкрд░рд┐рд╡рд░реНрддрди рдерд╛ рдЬреЛ рдЙрдирдХреЗ рдЕрдкрдиреЗ TryFrom рдпрд╛ TryInto рд╡рд┐рд╢реЗрд╖рддрд╛ рдХреЛ рдкрд░рд┐рднрд╛рд╖рд┐рдд рдХрд░рддрд╛ рд╣реИ ( std рдХреЗ рдЙрдкрдпреЛрдЧ рдХреЗ рд▓рд┐рдП)

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

TryFrom рдФрд░ TryInto рдХреЗ рд▓рд┐рдП рд╣рд╛рд▓рд╛рдВрдХрд┐, 2018 рд╕рдВрд╕реНрдХрд░рдг рдХреЗ рд▓рд┐рдП рдПрдХ рдЕрд▓рдЧ рдкреНрд░рд╕реНрддрд╛рд╡рдирд╛ рдПрдХ рд╕рдорд╛рдзрд╛рди рд╣реЛрдЧрд╛ред рдЗрд╕ рдкрд░ рдкрд╣рд▓реЗ рднреА рдЕрдиреМрдкрдЪрд╛рд░рд┐рдХ рд░реВрдк рд╕реЗ рдЪрд░реНрдЪрд╛ рдХреА рдЬрд╛ рдЪреБрдХреА рд╣реИ рд▓реЗрдХрд┐рди рдореБрдЭреЗ рдпрд╣ рдлрд╛рдЗрд▓ рдирд╣реАрдВ рдорд┐рд▓реА, рдЗрд╕рд▓рд┐рдП рдореИрдВрдиреЗ https://github.com/rust-lang/rust/issues/51418 рдЦреЛрд▓рд╛ред

рдЗрд╕реА рддрд░рд╣ рдХреА рд╕рдорд╕реНрдпрд╛ рдХрд╛ рдПрдХ рд╕рд╛рдорд╛рдиреНрдп рд╕рдорд╛рдзрд╛рди рд╡рд┐рд╕реНрддрд╛рд░ рдХреЗ рд▓рд┐рдП рд▓рд╛рдЧреВ рдХрд┐рдпрд╛ рдЧрдпрд╛ рдерд╛
https://github.com/rust-lang/rust/issues/48919 рдореЗрдВ рд╡рд┐рдзрд┐рдпрд╛рдВ, рдЬрд┐рд╕рд╕реЗ рдЕрд╕реНрдерд┐рд░
рдЬрдм рд╕реНрдерд┐рд░ рдХреЛрдб рдЯрдХрд░рд╛рддрд╛ рд╣реИ рддреЛ рдПрдХреНрд╕рдЯреЗрдВрд╢рди рд╡рд┐рдзрд┐рдпрд╛рдВ рдЪреЗрддрд╛рд╡рдирд┐рдпрд╛рдВ рдЬрд╛рд░реА рдХрд░рддреА рд╣реИрдВред

рдРрд╕рд╛ рд▓рдЧрддрд╛ рд╣реИ рдХрд┐ рдЖрдк рдЗрд╕рдореЗрдВ рдЬреЛрдбрд╝реЗ рдЧрдП рдирдП рд╢рдмреНрджреЛрдВ рдХреЗ рд╕рд╛рде рдХреБрдЫ рдРрд╕рд╛ рд╣реА рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ
рдкреНрд░рд╕реНрддрд╛рд╡рдирд╛?

рдЧреБрд░реБ, рдЬреВрди 7, 2018, 11:47 AM рдкрд░ рд╕рд╛рдЗрдорди рд╕реИрдкрд┐рди рд╕реВрдЪрдирд╛рдПрдВ @github.com рдиреЗ рд▓рд┐рдЦрд╛:

@SergioBenitez https://github.com/SergioBenitez рд╣рдордиреЗ рд╡рд╣ рдХрд┐рдпрд╛ рд╣реИ
рд░рд╛рдд рдореЗрдВ рдереЛрдбрд╝реА рджреЗрд░ рдХреЗ рд▓рд┐рдП, рдФрд░ рджреБрд░реНрднрд╛рдЧреНрдп рд╕реЗ рдпрд╣ рдмрдХреНрд╕реЗ рдХреЗ рд▓рд┐рдП рдПрдХ рдмреНрд░реЗрдХрд┐рдВрдЧ рдмрджрд▓рд╛рд╡ рдерд╛
рдЬреЛ рдЕрдкрдиреЗ рд╕реНрд╡рдпрдВ рдХреЗ TryFrom рдпрд╛ TryInto рд╡рд┐рд╢реЗрд╖рддрд╛ рдХреЛ рдкрд░рд┐рднрд╛рд╖рд┐рдд рдХрд░рддреЗ рд╣реИрдВ (рдЙрдкрдпреЛрдЧ рдХреЗ рд▓рд┐рдП рдЬрдмрдХрд┐ std
рд╡рд╛рд▓реЗ рдЕрд╕реНрдерд┐рд░ рд╣реИрдВ), рдкрд░реНрдпрд╛рдкреНрдд рд╣реИ рдХрд┐ рд╣рдордиреЗ рдЗрд╕реЗ рд╡рд╛рдкрд╕ рдХрд░ рджрд┐рдпрд╛ рд╣реИред

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

рд╣рд╛рд▓рд╛рдВрдХрд┐, TryFrom рдФрд░ TryInto рдХреЗ рд▓рд┐рдП, рдПрдХ рд╕рдорд╛рдзрд╛рди рдЕрд▓рдЧ рд╣реЛрдирд╛ рдЪрд╛рд╣рд┐рдП
2018 рд╕рдВрд╕реНрдХрд░рдг рдХреЗ рд▓рд┐рдП рдкреНрд░рд╕реНрддрд╛рд╡рдирд╛ред рдЗрд╕ рдкрд░ рдкрд╣рд▓реЗ рдЕрдиреМрдкрдЪрд╛рд░рд┐рдХ рд░реВрдк рд╕реЗ рдЪрд░реНрдЪрд╛ рдХреА рдЧрдИ рд╣реИ рд▓реЗрдХрд┐рди
рдореБрдЭреЗ рдпрд╣ рджрд░реНрдЬ рдирд╣реАрдВ рдорд┐рд▓рд╛, рдЗрд╕рд▓рд┐рдП рдореИрдВрдиреЗ #51418 рдЦреЛрд▓рд╛
https://github.com/rust-lang/rust/issues/51418 ред

-
рдЖрдк рдЗрд╕реЗ рдкреНрд░рд╛рдкреНрдд рдХрд░ рд░рд╣реЗ рд╣реИрдВ рдХреНрдпреЛрдВрдХрд┐ рдЖрдкрдиреЗ рдЗрд╕ рдереНрд░реЗрдб рдХреА рд╕рджрд╕реНрдпрддрд╛ рд▓реА рд╣реИред
рдЗрд╕ рдИрдореЗрд▓ рдХрд╛ рд╕реАрдзреЗ рдЙрддреНрддрд░ рджреЗрдВ, рдЗрд╕реЗ GitHub рдкрд░ рджреЗрдЦреЗрдВ
https://github.com/rust-lang/rust/issues/33417#issuecomment-395525170 ,
рдпрд╛ рдереНрд░реЗрдб рдХреЛ рдореНрдпреВрдЯ рдХрд░реЗрдВ
https://github.com/notifications/unsubscribe-auth/AAC2lNbHvgBjWBk48-1UO311-LuUY5lPks5t6XUvgaJpZM4IXpys
.

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

@SimonSapin TryFrom/TryInto рд╕реНрдерд┐рд░реАрдХрд░рдг рдХреЗ рд▓рд┐рдП рд╡рд░реНрддрдорд╛рди рдпреЛрдЬрдирд╛ рдХреНрдпрд╛ рд╣реИ? рдореБрдЭреЗ 29 рдЕрдкреНрд░реИрд▓ рдХреЛ рдЗрд╕реЗ рд╡рд╛рдкрд╕ рдХрд┐рдП рдЬрд╛рдиреЗ рдХреЗ рдЕрд▓рд╛рд╡рд╛ рдХреБрдЫ рднреА рдареЛрд╕ рдирд╣реАрдВ рдорд┐рд▓рд╛ред

@nayato рдпрд╣ рдХрднреА рднреА рдЯрд╛рдЗрдк рдирд╣реАрдВ рдХрд░рдиреЗ рд╡рд╛рд▓реЗ https://github.com/rust-lang/rust/issues/35121 рдХреЛ рд╕реНрдерд┐рд░ (рдлрд┐рд░ рд╕реЗ) рдХрд░рдиреЗ рдкрд░ рдЕрд╡рд░реБрджреНрдз рд╣реИ, рдЬреЛ рд╕реНрд╡рдпрдВ https://github.com/rust-lang/rust/ рдкрд░ рдЕрд╡рд░реБрджреНрдз рд╣реИред

@SimonSapin рдиреЗрд╡рд░ рдЯрд╛рдЗрдк рдХрд╛ рдЗрд╕реНрддреЗрдорд╛рд▓ рдХреЗрд╡рд▓ рдпрд╣рд╛рдВ рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИред рдХреНрдпрд╛ рд╣рдо рдЙрд╕ рдХрд╛рд░реНрдпрд╛рдиреНрд╡рдпрди рдХреЗ рдмрд┐рдирд╛ TryFrom рдХреЛ рд╕реНрдерд┐рд░ рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ рдФрд░ рдЬрдм рдХрднреА рд╕реНрдерд┐рд░ рдирд╣реАрдВ рд╣реЛрддреЗ рд╣реИрдВ рддреЛ рдЗрд╕реЗ рдЬрдореАрди рдкрд░ рдЙрддрд╛рд░ рд╕рдХрддреЗ рд╣реИрдВ? TryFrom Try рдмрд╣реБрдд рд╣реА рдорд╣рддреНрд╡рдкреВрд░реНрдг рдЗрдВрдЯрд░рдлрд╝реЗрд╕ рд╣реИред

рджреБрд░реНрднрд╛рдЧреНрдп рд╕реЗ рдирд╣реАрдВред рд╡рд┐рд╢реЗрд╖рддрд╛ рдХреЗ рд╕реНрдерд┐рд░ рд╣реЛ рдЬрд╛рдиреЗ рдХреЗ рдмрд╛рдж рдЗрд╕ рдмреНрд▓реИрдВрдХреЗрдЯ рдЗрдореНрдкреНрд▓рд╛рдВрдЯ рдХреЛ рдЬреЛрдбрд╝рдирд╛ рдПрдХ рдорд╣рддреНрд╡рдкреВрд░реНрдг рдмрджрд▓рд╛рд╡ рд╣реЛрдЧрд╛ рдФрд░ рдЙрджрд╛рд╣рд░рдг рдХреЗ рд▓рд┐рдП, рдЙрджрд╛рд╣рд░рдг рдХреЗ рд▓рд┐рдП, рдХреНрд░реЗрдЯреНрд╕.io рдкреБрд╕реНрддрдХрд╛рд▓рдпреЛрдВ рдХреЛ TryFrom<Foo> for Bar рд▓рд╛рдЧреВ рдХрд░рдиреЗ рдХрд╛ рдореМрдХрд╛ рдорд┐рд▓рд╛ рд╣реИ, рдЬрдмрдХрд┐ рдЙрдирдХреЗ рдкрд╛рд╕ From<Foo> for Bar рднреА рд╣реИ, рдЬреИрд╕рд╛ рдХрд┐ рдЗрдореНрдкреНрд▓рд╕ рдХреЗ рд░реВрдк рдореЗрдВ рд╣реИред рдУрд╡рд░рд▓реИрдк рд╣реЛрдЧрд╛ред

рдЕрдм рддрдХ рдХрд╛ рдирд┐рд░реНрдгрдп рдпрд╣ рд░рд╣рд╛ рд╣реИ рдХрд┐ TryFrom рдХреЛ From рдХреЗ рд╕рд╛рде рдЗрд╕ рддрд░рд╣ рд╕реЗ "рд╕рдВрдЧрдд" рдмрдирд╛рдирд╛ рд╕реНрдерд┐рд░реАрдХрд░рдг рдХреЛ рдЕрд╡рд░реБрджреНрдз рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдХрд╛рдлреА рдорд╣рддреНрд╡рдкреВрд░реНрдг рдерд╛ред

рд╢рд╛рдпрдж рднреЛрд▓рд╛ рдФрд░ рдореВрд░реНрдЦрддрд╛рдкреВрд░реНрдг рд╡рд┐рдЪрд╛рд░:

рдХреНрдпрд╛ рд╣реЛрдЧрд╛ рдЕрдЧрд░ rustc рдХреЛ рдЗрд╕ рдмреАрдЪ рдПрдХ рд╣рдореЗрд╢рд╛ рдЪрд╛рд▓реВ рддреНрд░реБрдЯрд┐ рд▓рд┐рдВрдЯ рдорд┐рд▓ рдЧрдпрд╛ рдЬреЛ Error<_, !> рдХреЗ рд▓рд┐рдП рдЯреНрд░рд┐рдЧрд░ рд╣реБрдЖ, рдЙрдкрдпреЛрдЧрдХрд░реНрддрд╛рд▓реИрдВрдб рдореЗрдВ рдХрд┐рд╕реА рднреА рдирд┐рд╣рд┐рддрд╛рд░реНрде рдХреЛ рд░реЛрдХрдиреЗ, рдмрд╛рдж рдореЗрдВ impl s рдХреЛ рдЬреЛрдбрд╝рдиреЗ рдХреА рдЕрдиреБрдорддрд┐ рджреЗрддрд╛ рд╣реИ?

рдпрд╛ рдХрд┐рд╕реА рдкреНрд░рдХрд╛рд░ рдХреА рддреНрд░реБрдЯрд┐ рдХреЗ рд╕рд╛рде рдЕрд╕реНрдерд┐рд░ impl<T: From<U>, U> TryFrom<U> for T ред рдХреНрдпрд╛ рд╡рд┐рд╢реЗрд╖рддрд╛ рдирд┐рд╣рд┐рддрд╛рд░реНрде рдЕрд╕реНрдерд┐рд░ рд╣реЛ рд╕рдХрддреЗ рд╣реИрдВ?

@рдЬреЗрдереНрд░реЛрдЧрдм рдирд╣реАрдВ

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

рдЗрд╕ рдирд┐рд╣рд┐рддрд╛рд░реНрде рдХреЗ рдХрд╛рд░рдг рдЗрд╕реЗ рдЕрд╡рд░реБрджреНрдз рдХрд┐рдпрд╛ рдЧрдпрд╛ рд╣реИ:

impl<T, U> TryFrom<U> for T where T: From<U> {
    type Error = !;

    fn try_from(value: U) -> Result<Self, Self::Error> {
        Ok(T::from(value))
    }
}

@rust-lang/libs рдЕрдирдмреНрд▓реЙрдХ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП, рдХрднреА рднреА рдЯрд╛рдЗрдк рди рдХрд░рдиреЗ рдХреЗ рдмрдЬрд╛рдп enum Infallible {} рдкрд░ рд╡рд╛рдкрд╕ рдЬрд╛рдиреЗ рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рдЖрдк рдХреНрдпрд╛ рд╕реЛрдЪрддреЗ рд╣реИрдВ?

рдореБрдЭреЗ рд╡реНрдпрдХреНрддрд┐рдЧрдд рд░реВрдк рд╕реЗ enum Infalliable {} рд╣реЛрдиреЗ рдФрд░ рдлрд┐рд░ рдмрд╛рдж рдореЗрдВ рдЗрд╕реЗ type Infalliable = ! рдореЗрдВ рдмрджрд▓рдиреЗ рд╕реЗ рдХреЛрдИ рдлрд░реНрдХ рдирд╣реАрдВ рдкрдбрд╝рддрд╛ред

рд╣рдордиреЗ рдХрд▓ рдХреА рд▓рд┐рдмреНрд╕ рдЯреНрд░рд╛рдЗрдПрдЬ рдореАрдЯрд┐рдВрдЧ рдореЗрдВ рдЗрд╕ рдкрд░ рдЪрд░реНрдЪрд╛ рдХреА, рд▓реЗрдХрд┐рди рдпрд╣ рдпрд╛рдж рдирд╣реАрдВ рдХрд░ рд╕рдХрд╛ рдХрд┐ рдХреНрдпрд╛ рд╕реНрдерд┐рд░реАрдХрд░рдг рдХреЗ рдмрд╛рдж рдРрд╕рд╛ рдкрд░рд┐рд╡рд░реНрддрди рдареАрдХ рд╣реЛрдЧрд╛ рдпрд╛ рдпрджрд┐ рд╣рдордиреЗ рд╕рдВрднрд╛рд╡рд┐рдд рдЯреВрдЯрдиреЗ рдХреЗ рдХрд╛рд░рдг рдЙрд╕ рд╡рд┐рдЪрд╛рд░ рдХреЛ рдкрд╣рд▓реЗ рд╣реА рдЦрд╛рд░рд┐рдЬ рдХрд░ рджрд┐рдпрд╛ рдерд╛, рдпрд╛ рд╡рд╣ рдЯреВрдЯрдирд╛ рдХреНрдпрд╛ рд╣реЛрдЧрд╛ред

рд╣рдордиреЗ рдЬреЛ рдпрд╛рдж рдХрд┐рдпрд╛ рд╡рд╣ рдпрд╣ рд╣реИ рдХрд┐ рд╣рдореЗрдВ рдХреЗрд╡рд▓ рдПрдХ рдРрд╕рд╛ рдкреНрд░рддрд┐рд╕реНрдерд╛рдкрди рдХрд░рдиреЗ рдХреЛ рдорд┐рд▓рддрд╛ рд╣реИ: рдпрджрд┐ рджреЛ рдЕрдпрд╕реНрдХ рдЕрдзрд┐рдХ рд╕реНрдерд┐рд░ рдорд╛рдирдХ рдкреБрд╕реНрддрдХрд╛рд▓рдп рдЦрд╛рд▓реА рдПрдирдо (рдЕрд▓рдЧ рдкреНрд░рдХрд╛рд░) рдмрд╛рдж рдореЗрдВ рдПрдХ рд╣реА рдкреНрд░рдХрд╛рд░ рдХреЗ рд╣реЛ рдЬрд╛рддреЗ рд╣реИрдВ, рддреЛ рдПрдХ рдЯреЛрдХрд░рд╛ рдЬрд┐рд╕рдореЗрдВ рджреЛрдиреЛрдВ рдХреЗ рд▓рд┐рдП рдХреБрдЫ impl s рд╣реЛрддрд╛ рд╣реИ, рдЯреВрдЯ рдЬрд╛рдПрдЧрд╛ рдЬреИрд╕реЗ-рдЬреИрд╕реЗ рдирд┐рд╣рд┐рддрд╛рд░реНрде рдЕрддрд┐рд╡реНрдпрд╛рдкреА (рдпрд╛ рд╕рдорд╛рди) рд╣реЛ рдЬрд╛рддреЗ рд╣реИрдВред рдЙрджрд╛рд╣рд░рдг рдХреЗ рд▓рд┐рдП impl From<std::convert::Invallible> for MyError рдФрд░ impl From<std::string::ParseError> for MyError ред

рд╡реИрд╕реЗ, рд╣рдорд╛рд░реЗ рдкрд╛рд╕ std::string::ParseError рд╣реИ, рдЬрд╣рд╛рдВ рддрдХ тАЛтАЛтАЛтАЛрдореИрдВ рдмрддрд╛ рд╕рдХрддрд╛ рд╣реВрдВ рдХрд┐ 1.30.0 рдорд╛рдирдХ рдкреБрд╕реНрддрдХрд╛рд▓рдп рдореЗрдВ рдПрдХрдорд╛рддреНрд░ рдЦрд╛рд▓реА рдПрдирдо рд╣реИред рдЗрд╕рд▓рд┐рдП рдпрджрд┐ рд╣рдо рдЖрд╢реНрд╡рд╕реНрдд рд╣реЛ рд╕рдХрддреЗ рд╣реИрдВ рдХрд┐ рдЗрд╕ рдпреЛрдЬрдирд╛ рдХреЗ рд╕рд╛рде рдХреЛрдИ рдЕрдиреНрдп рд╕рдорд╕реНрдпрд╛ рдирд╣реАрдВ рд╣реИ, рддреЛ рд╣рдо рдпрд╣ рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ:

  • string::ParseError рдХреЛ convert::Infallible . рдкрд░ рд▓реЗ рдЬрд╛рдПрдВ
  • рдЗрд╕реЗ рдЕрдкрдиреЗ рдкреБрд░рд╛рдиреЗ рд╕реНрдерд╛рди рдкрд░ pub use рдпрд╛ pub type рдХреЗ рд╕рд╛рде рдкреБрдирдГ рдирд┐рд░реНрдпрд╛рдд рдХрд░реЗрдВ (рдХреНрдпрд╛ рдЗрд╕рд╕реЗ рдХреЛрдИ рдлрд░реНрдХ рдкрдбрд╝рддрд╛ рд╣реИ?)
  • рдЗрд╕реЗ TryFrom рдмреНрд▓реИрдВрдХреЗрдЯ рдЗрдореНрдкреНрд▓рд╛рдВрдЯ рдореЗрдВ рдЗрд╕реНрддреЗрдорд╛рд▓ рдХрд░реЗрдВ
  • рдмрд╛рдж рдореЗрдВ, рдЙрд╕реА рд░рд┐рд▓реАрдЬ рдореЗрдВ рдЬрдм рдХрднреА рднреА рдкреНрд░рдХрд╛рд░ рд╕реНрдерд┐рд░ рдирд╣реАрдВ рд╣реЛрддрд╛ рд╣реИ, рддреЛ string::ParseError рдФрд░ convert::Infallible рджреЛрдиреЛрдВ рдХреЛ $#$ type _ = ! $#$ рд╕реЗ рдмрджрд▓реЗрдВ рдФрд░ ! рд╕реАрдзреЗ рдЙрдкрдпреЛрдЧ рдХрд░реЗрдВ рдЬрд╣рд╛рдВ рдЙрдирдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд┐рдпрд╛ рдЧрдпрд╛ рдерд╛ред
  • (рд╡реИрдХрд▓реНрдкрд┐рдХ) рдмрд╛рдж рдореЗрдВ, рдкреБрд░рд╛рдиреЗ рдЙрдкрдирд╛рдореЛрдВ рдХреЗ рд▓рд┐рдП рдмрд╣рд┐рд╖реНрдХрд░рдг рдЪреЗрддрд╛рд╡рдирд┐рдпрд╛рдВ рдЬрд╛рд░реА рдХрд░реЗрдВ

рдмрд╕ рдФрд░ рдЕрдирд┐рдЪреНрдЫрд╛ рд╕реЗ рдореЗрд░реЗ рдЕрдкрдиреЗ рдЯреЛрдХрд░реЗ рдореЗрдВ рдПрдХ TryFrom рдкреНрд▓реЗрд╕рд╣реЛрд▓реНрдбрд░ рд╡рд┐рд╢реЗрд╖рддрд╛ рдЬреЛрдбрд╝рдиреЗ рдХреЗ рдмрд╛рдж, рдФрд░ рдирд┐рд╢реНрдЪрд┐рдд рд░реВрдк рд╕реЗ RFC рдФрд░ рд╕реНрдерд┐рд░реАрдХрд░рдг рдкреНрд░рдпрд╛рд╕реЛрдВ рдХреЗ рдирд┐рд╣рд┐рддрд╛рд░реНрдереЛрдВ рдХреЛ рдкреВрд░реА рддрд░рд╣ рд╕реЗ рд╕рдордЭреЗ рдмрд┐рдирд╛, рдореБрдЭреЗ рдЖрд╢реНрдЪрд░реНрдп рд╣реИ рдХрд┐ From рдХреЗ рд▓рд┐рдП рдПрдХ рдХрдВрдмрд▓ TryFrom From Infallible / ! рддреНрд░реБрдЯрд┐ рдкреНрд░рдХрд╛рд░ рдХреЗ рд╕рд╛рде рдпрд╣ рдХреНрдпрд╛ рд░реЛрдХ рд░рд╣рд╛ рд╣реИ? рд╕реНрдерд┐рд░ рдПрд╕рдЯреАрдбреА TryFrom рдФрд░ рдХрдВрдмрд▓ TryInto рд▓рдХреНрд╖рдг рд╕реНрдерд╛рдкрд┐рдд рдХрд░рдиреЗ рдХреЗ рдмрд╛рдж рдХреНрдпрд╛ рдпреЗ рджреНрд╡рд┐рддреАрдпрдХ рд▓рдХреНрд╖реНрдп рдирд╣реАрдВ рд╣реИрдВ? рдореЗрд░рд╛ рдорддрд▓рдм рд╣реИ, рдпрд╣рд╛рдВ рддрдХ тАЛтАЛтАЛтАЛрдХрд┐ From рд╕реЗ TryFrom (рдЬрд┐рд╕рдХрд╛ рдЙрджреНрджреЗрд╢реНрдп рдореБрдЭреЗ рдкреВрд░реА рддрд░рд╣ рд╕реЗ рд╕рдордЭ рдореЗрдВ рдирд╣реАрдВ рдЖрддрд╛) рдХреЗ рдЙрддреНрдерд╛рди рдХреА рдХрдореА рд╣реИ, рдХреНрдпрд╛ рдпрд╣ рдХрдо рдордВрдерди рдирд╣реАрдВ рд╣реЛрдЧрд╛ рдпрджрд┐ рд╣рд░ рдЯреЛрдХрд░рд╛ рдЬрд┐рд╕реЗ рдЗрд╕рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реИ рд╡рд╣ рдирд╣реАрдВ рдЬреЛрдбрд╝рддрд╛ рд╣реИ рдЗрд╕рдХрд╛ рдЕрдкрдирд╛ TryFrom ?

рд╕реНрдкрд╖реНрдЯ рд╕рдорд╕реНрдпрд╛ рдЕрдЧрд░ TryFrom рдХреЛ рдХрдВрдмрд▓ рдХреЗ рдмрд┐рдирд╛ From рдХреЗ рд▓рд┐рдП рднреЗрдЬ рджрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИ, рддреЛ рдпрд╣ рд╣реИ рдХрд┐ рдХреНрд░реЗрдЯ рдПрдХ рд╣реА рдкреНрд░рдХрд╛рд░ рдХреЗ рд▓рд┐рдП TryFrom рдФрд░ From рдХреЛ рд▓рд╛рдЧреВ рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ (рд╕рдВрднрд╡рддрдГ рдареАрдХ рдЗрд╕рд▓рд┐рдП рдХрд┐ рдХрдВрдмрд▓ рдЗрдореНрдкреНрд▓рд╛рдВрдЯ рдирд╣реАрдВ рд╣реИ), рдФрд░ рдЬрдм рдХрдВрдмрд▓ рдЗрдВрдк рдХреЛ libstd рдореЗрдВ рдЬреЛрдбрд╝рд╛ рдЬрд╛рддрд╛ рд╣реИ рддреЛ рд╡реЗ рдЯреВрдЯ рдЬрд╛рддреЗ рд╣реИрдВред

рд╣рд╛рд▓рд╛рдБрдХрд┐, рдЗрд╕рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рд╕реЛрдЪреЗрдВ, рд╢рд╛рдпрдж рдпрд╣ рд╡рд┐рд╢реЗрд╖рдЬреНрдЮрддрд╛ рдХреЗ рд╕рд╛рде рдПрдХ рдмреНрд░реЗрдХрд┐рдВрдЧ рдмрджрд▓рд╛рд╡ рдирд╣реАрдВ рд╣реЛрдЧрд╛?

рд╣рдореНрдо, рдЕрдЧрд░ рдореБрдЭреЗ рд╕реНрдкрд╖реНрдЯ рдпрд╛рдж рдЖ рд░рд╣реА рд╣реИ рддреЛ рдХреГрдкрдпрд╛ рдореБрдЭреЗ рдлрд┐рд░ рд╕реЗ рдХреНрд╖рдорд╛ рдХрд░реЗрдВред рдпрд╣ рд▓рдЧрднрдЧ рдЗрди 1.5 рд╡рд░реНрд╖реЛрдВ рдХреА рддрд░рд╣ RFC/рдЯреНрд░реИрдХрд┐рдВрдЧ рдУрдбрд┐рд╕реА рдХреЛ рддрд░реНрдХ рдкреНрд░рдЧрддрд┐ рдХреЛ рд╕рдордЭрдиреЗ рдХреЗ рд▓рд┐рдП рдПрдХ рд░рдирд┐рдВрдЧ рдПрдлрдПрдХреНрдпреВ рд╕реЗрдХреНрд╢рди рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реИред рдХреНрдпрд╛ рд╣реЛрдЧрд╛ рдпрджрд┐ рдорд╛рд░реНрдЧрджрд░реНрд╢рди рдХреЗрд╡рд▓ From рдХреЗрд╡рд▓ рдЕрдЪреВрдХ рд░реВрдкрд╛рдВрддрд░рдгреЛрдВ рдХреЗ рд▓рд┐рдП рд▓рд╛рдЧреВ рдХрд░рдирд╛ рдерд╛, рдФрд░ TryFrom рдХреЗрд╡рд▓ рдЧрд▓рдд рд░реВрдкрд╛рдВрддрд░рдгреЛрдВ рдХреЗ рд▓рд┐рдП? рдХреНрдпрд╛ рдпрд╣ рд╕рдорд╛рди рд╡реНрдпрд╛рд╡рд╣рд╛рд░рд┐рдХ рдЕрдВрддрд┐рдо рдкрд░рд┐рдгрд╛рдо рдирд╣реАрдВ рджреЗрддрд╛ рд╣реИ, рдЬрдмрдХрд┐ рдЗрд╕реЗ рдПрд╕рдЯреАрдбреА рдореЗрдВ рд╢рд┐рдкрд┐рдВрдЧ рдХрд░рдиреЗ рдФрд░ рдХреНрд░реЗрдЯ рдХреЛ рд╕рдорд╛рдпреЛрдЬрд┐рдд рдХрд░рдиреЗ рдореЗрдВ рдХрдо рдмрд╛рдзрд╛ рдкреНрд░рджрд╛рди рдХрд░рддрд╛ рд╣реИ?

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

рдорд╛рд░реНрдЧрджрд░реНрд╢рди рдкреНрд░рджрд╛рди рдХрд░рдирд╛ (рджрд╕реНрддрд╛рд╡реЗрдЬрд╝?) рдЬреЛ рдХрд╣рддреЗ рд╣реИрдВ рдХрд┐ рдРрд╕реЗ рдкреНрд░реЛрдЧреНрд░рд╛рдо рди рд▓рд┐рдЦреЗрдВ рдЬреЛ рдЯреВрдЯ рдЬрд╛рдПрдВрдЧреЗ, рдмреНрд░реЗрдХрд┐рдВрдЧ рдкрд░рд┐рд╡рд░реНрддрдиреЛрдВ рдХреЛ рдЙрдЪрд┐рдд рдард╣рд░рд╛рдиреЗ рдХреЗ рд▓рд┐рдП рдкрд░реНрдпрд╛рдкреНрдд рдирд╣реАрдВ рд╣реИред рдЯреВрдЯрдирд╛ рдирд┐рд╢реНрдЪрд┐рдд рд░реВрдк рд╕реЗ рдЕрднреА рднреА рд╣реЛрдЧрд╛ред

https://github.com/rust-lang/rust/issues/33417#issuecomment -423073898 рдореЗрдВ рдЙрд▓реНрд▓рд┐рдЦрд┐рдд рдпреЛрдЬрдирд╛ рдХреЗ рд╢реБрд░реВ рд╣реЛрдиреЗ рдХреЗ рд▓рд┐рдП рдХреНрдпрд╛ рдЖрд╡рд╢реНрдпрдХ рд╣реИ? рдорджрдж рдХреЗ рд▓рд┐рдП рдХреНрдпрд╛ рдХрд┐рдпрд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИ?

рдпрд╣ рдПрдХ рдзрдиреНрдпрд╡рд╛рджрд╣реАрди рдХрд╛рд░реНрдп рд╣реИ, рд▓реЗрдХрд┐рди рдпрд╣ рдорджрдж рдХрд░реЗрдЧрд╛ рдпрджрд┐ рдХреЛрдИ рдЗрд╕ рдЯреНрд░реИрдХрд┐рдВрдЧ рд╕рдорд╕реНрдпрд╛ рдХреЗ рдорд╛рдзреНрдпрдо рд╕реЗ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИ рдФрд░ https://github.com/rust-lang/rust/issues/35121 рдпрд╣ рдЬрд╛рдВрдЪрдиреЗ рдХреЗ рд▓рд┐рдП рдХрд┐ рдХреНрдпрд╛ рдЙрд╕ рдпреЛрдЬрдирд╛ рдореЗрдВ рдХреЛрдИ рд╕рдорд╕реНрдпрд╛ рд╣реИ рдХрд┐ рд╣рдо ' рдореИрдВрдиреЗ рдкрд╣рд▓реЗ рдЪрд░реНрдЪрд╛ рдХреА рдереА рдФрд░ рднреВрд▓ рдЧрдП рдереЗ, рд╡рд┐рд╢реЗрд╖ рд░реВрдк рд╕реЗ enum Infallible рдХреЛ type Infallible = !; рдХреЗ рд╕рд╛рде рдмрджрд▓рдиреЗ рдХреЗ рдмрд╛рдж рдкрд┐рдЫрд▓реЗ рд░рд┐рд▓реАрдЬ рдореЗрдВ рдПрдирдо рд╕реНрдерд┐рд░ рд╣реЛрдиреЗ рдХреЗ рдмрд╛рдж рдПрдХ рдмреНрд░реЗрдХрд┐рдВрдЧ рдмрджрд▓рд╛рд╡ рд╣реЛ рд╕рдХрддрд╛ рд╣реИред

рдХреНрдпрд╛ рд╡рд┐рд╢реЗрд╖рддрд╛ рдХреЗ рд╕рд╛рде Infallible рдПрдирдо рдХреЛ рд╕реНрдерд┐рд░ рдХрд░рдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реИ? рдпрджрд┐ рдЗрд╕реЗ рдЕрд╕реНрдерд┐рд░ рд░рдЦрд╛ рдЬрд╛рддрд╛ рд╣реИ, рддреЛ рдХреЛрдИ рднреА рдЗрд╕рдХрд╛ рдирд╛рдо рдирд╣реАрдВ рд▓реЗ рд╕рдХрддрд╛ рд╣реИ, рдФрд░ рдЗрд╕рд▓рд┐рдП рдЗрд╕реЗ рдмрд╛рдж рдореЗрдВ ! рдХреЗ рд▓рд┐рдП рд╕реНрд╡реИрдк рдХрд░рдирд╛ рдареАрдХ рд╣реЛрдирд╛ рдЪрд╛рд╣рд┐рдП?

@seanmonstar рдирд╣реАрдВ, рдЖрдк рдЗрд╕реЗ <u16 as TryFrom<u8>>::Error рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдХреЗ рд╕рдВрджрд░реНрднрд┐рдд рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ рдФрд░ рдЗрд╕реЗ рдПрдХ рд╕реНрдерд┐рд░ рдирд╛рдо рдорд╛рдирд╛ рдЬрд╛рддрд╛ рд╣реИред рд╕рд╛рдХреНрд╖реА:

// src/lib.rs
#![feature(staged_api)]
#![stable(since = "1.0.0", feature = "a")]

#[stable(since = "1.0.0", feature = "a")]
pub trait T1 {
    #[stable(since = "1.0.0", feature = "a")]
    type A;
}

#[unstable(issue = "12345", feature = "b")]
pub struct E;

#[stable(since = "1.0.0", feature = "a")]
impl T1 for u8 {
    type A = E;
}
// src/bin/b.rs
extern crate a;

trait T3 {}

impl T3 for <u8 as a::T1>::A {}
impl T3 for a::E {}

fn main() {}

рдкрд╣рд▓рд╛ T3 impl рдХреЛрдИ рддреНрд░реБрдЯрд┐ рдЙрддреНрдкрдиреНрди рдирд╣реАрдВ рдХрд░рддрд╛ рд╣реИред рдХреЗрд╡рд▓ рджреВрд╕рд░рд╛ T3 impl E0658 "рдЕрд╕реНрдерд┐рд░ рдкреБрд╕реНрддрдХрд╛рд▓рдп рд╕реБрд╡рд┐рдзрд╛ рдХрд╛ рдЙрдкрдпреЛрдЧ" рддреНрд░реБрдЯрд┐ рдХрд╛ рдХрд╛рд░рдг рдмрдирддрд╛ рд╣реИред

рдпрд╛рдиреА.... рд╡рд╛рд╣, рдмрд╕ рдХрд╛рдЯрдиреЗ рдХреЗ рд▓рд┐рдП рдХрд╣ рд░рд╣рд╛ рд╣реВрдБ >_<

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

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

рдЗрд╕ рд╕рдм рд╕реЗ рдЕрд╕рдВрдмрдВрдзрд┐рдд, рдЧреИрд░- Copy рдкреНрд░рдХрд╛рд░ рдкрд░ рдПрдХ рдЧрд▓рдд рд░реВрдкрд╛рдВрддрд░рдг рдХреЗ рд▓рд┐рдП рдбрд┐рдЬрд╝рд╛рдЗрди рд╡рд┐рдХрд▓реНрдк рдХреНрдпрд╛ рд╣реИ? рджрд┐рдП рдЧрдП рдЗрдирдкреБрдЯ рдХреЛ рдЫреЛрдбрд╝рдиреЗ рд╕реЗ рдмрдЪрдиреЗ рдХреЗ рд▓рд┐рдП рдзреНрдпрд╛рди рджрд┐рдпрд╛ рдЬрд╛рдирд╛ рдЪрд╛рд╣рд┐рдП, рддрд╛рдХрд┐ рд╡рд┐рдлрд▓рддрд╛ рдХреЗ рдорд╛рдорд▓реЗ рдореЗрдВ рдЗрд╕реЗ рд╡рд╛рдкрд╕ рд▓рд┐рдпрд╛ рдЬрд╛ рд╕рдХреЗред

рдЙрджрд╛рд╣рд░рдг рдХреЗ рд▓рд┐рдП, String::from_utf8 рдХреЗ рд╕рд╛рде, рд╣рдо рджреЗрдЦ рд╕рдХрддреЗ рд╣реИрдВ рдХрд┐ рддреНрд░реБрдЯрд┐ рдкреНрд░рдХрд╛рд░ рдореЗрдВ рд╕реНрд╡рд╛рдорд┐рддреНрд╡ рдЗрдирдкреБрдЯ Vec<u8> рд╣реИ рддрд╛рдХрд┐ рдЗрд╕реЗ рд╡рд╛рдкрд╕ рджреЗрдиреЗ рдореЗрдВ рд╕рдХреНрд╖рдо рд╣реЛ :

// some invalid bytes, in a vector
let sparkle_heart = vec![0, 159, 146, 150];

match String::from_utf8(sparkle_heart) {
    Ok(string) => {
        // owned String binding in this scope
        let _: String = string;
    },
    Err(err) => {
        let vec: Vec<u8> = err.into_bytes(); // we got the owned vec back !
        assert_eq!(vec, vec![0, 159, 146, 150]);
    },
};

рдЗрд╕рд▓рд┐рдП, рдЕрдЧрд░ рд╣рдореЗрдВ String: TryFrom<Vec<u8>> рдХрд╛ рдХрд╛рд░реНрдпрд╛рдиреНрд╡рдпрди рдкреНрд░рд╛рдкреНрдд рдХрд░рдирд╛ рдерд╛, рддреЛ рдпрд╣ рдЙрдореНрдореАрдж рдХреА рдЬрд╛рдПрдЧреА рдХрд┐ <String as TryFrom<Vec<u8>>>::Error FromUtf8Error рд╕рд╣реА рд╣реЛрдЧрд╛?

рд╣рд╛рдВ, рддреНрд░реБрдЯрд┐ рдкреНрд░рдХрд╛рд░ рдореЗрдВ рдЗрдирдкреБрдЯ рдорд╛рди "рдмреИрдХ" рджреЗрдирд╛ рдПрдХ рд╡реИрдз рд╡рд┐рдХрд▓реНрдк рд╣реИред impl<'a> TryFrom<&'a Foo> for Bar рдХреЗ рд╕рд╛рде рдПрдХ рд╕рдВрджрд░реНрдн рд▓реЗрдирд╛ рдПрдХ рдФрд░ рдмрд╛рдд рд╣реИред

рдЗрд╕ рд╡рд┐рд╢рд┐рд╖реНрдЯ рдЙрджрд╛рд╣рд░рдг рдореЗрдВ рд╣рд╛рд▓рд╛рдВрдХрд┐ рдореБрдЭреЗ рдпрдХреАрди рдирд╣реАрдВ рд╣реИ рдХрд┐ TryFrom impl рдЙрдкрдпреБрдХреНрдд рд╣реИред рдпреВрдЯреАрдПрдл -8 рдпреВрдирд┐рдХреЛрдб рдореЗрдВ рдмрд╛рдЗрдЯреНрд╕ рдХреЗ рд╕рдВрднрд╛рд╡рд┐рдд рдбрд┐рдХреЛрдбрд┐рдВрдЧ рдореЗрдВ рд╕реЗ рдХреЗрд╡рд▓ рдПрдХ рд╣реИ, рдФрд░ from_utf8 рдЗрд╕рдХреЗ рдирд╛рдо рдкрд░ рджрд░реНрд╢рд╛рддрд╛ рд╣реИред

рдпрд╣ рдПрдХ рдзрдиреНрдпрд╡рд╛рджрд╣реАрди рдХрд╛рд░реНрдп рд╣реИ, рд▓реЗрдХрд┐рди рдпрд╣ рдорджрдж рдХрд░реЗрдЧрд╛ рдпрджрд┐ рдХреЛрдИ рдЗрд╕ рдЯреНрд░реИрдХрд┐рдВрдЧ рд╕рдорд╕реНрдпрд╛ рд╕реЗ рдЧреБрдЬрд░ рд╕рдХрддрд╛ рд╣реИ рдФрд░ #35121 рдпрд╣ рдЬрд╛рдВрдЪрдиреЗ рдХреЗ рд▓рд┐рдП рдХрд┐ рдХреНрдпрд╛ рдЙрд╕ рдпреЛрдЬрдирд╛ рдореЗрдВ рдХреЛрдИ рд╕рдорд╕реНрдпрд╛ рд╣реИ рдЬрд┐рд╕рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рд╣рдордиреЗ рдкрд╣рд▓реЗ рдЪрд░реНрдЪрд╛ рдХреА рд╣реИ рдФрд░ рднреВрд▓ рдЧрдП рд╣реИрдВ, рд╡рд┐рд╢реЗрд╖ рд░реВрдк рд╕реЗ enum Infallible рдХреА рдЬрдЧрд╣ рд▓реЗ рд░рд╣реЗ рд╣реИрдВ рдпрд╛ рдирд╣реАрдВ рдкрд┐рдЫрд▓реЗ рд░рд┐рд▓реАрдЬ рдореЗрдВ рдПрдирдо рд╕реНрдерд┐рд░ рд╣реЛрдиреЗ рдХреЗ рдмрд╛рдж # type Infallible = !; рдХреЗ рд╕рд╛рде рдПрдХ рдмреНрд░реЗрдХрд┐рдВрдЧ рдмрджрд▓рд╛рд╡ рд╣реЛ рд╕рдХрддрд╛ рд╣реИред

рдЗрд╕ рдореБрджреНрджреЗ рдпрд╛ #35121 рдореЗрдВ рдЗрд╕рдХреЗ рд╕рд╛рде рдХреЛрдИ рдареЛрд╕ рд╕рдорд╕реНрдпрд╛ рдирд╣реАрдВ рдмрддрд╛рдИ рдЧрдИ рдереАред ! рдХреЗ рд╡рд┐рд╢реЗрд╖ рд╣реЛрдиреЗ рдХреА рд╕рдВрднрд╛рд╡рдирд╛ рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рдПрдХ рдЪрд┐рдВрддрд╛ рдереА рдХрд┐ рдХрд┐рд╕реА рддрд░рд╣ рд╕реЗ рдирд┐рд░реНрдЬрди рдкреНрд░рдХрд╛рд░ рдирд╣реАрдВ рд╣реИрдВред рд▓реЗрдХрд┐рди рдкреАрдЖрд░ рдореЗрдВ рдХреЛрдИ рдЪрд┐рдВрддрд╛ рдирд╣реАрдВ рд╣реИ рдФрд░ рдХреЛрдб рд╕рдореАрдХреНрд╖рд╛ рдЯрд┐рдкреНрдкрдгрд┐рдпреЛрдВ рд╕реЗ рдпрд╣ рд╕реНрдкрд╖реНрдЯ рд╣реИ рдХрд┐ рдПрдирдо рд╕реНрдерд┐рд░ рд╣реЛрдирд╛ рдПрдХ рд╕рдВрднрд╛рд╡рдирд╛ рдереА (рд╣рд╛рд▓рд╛рдВрдХрд┐ рдРрд╕рд╛ рдХрднреА рдирд╣реАрдВ рд╣реБрдЖ)ред рдореИрдВрдиреЗ рдЬреЛ рдкрд╛рдпрд╛ рдЙрд╕рдХреЗ рд▓рд┐рдВрдХ рдпрд╣рд╛рдВ рджрд┐рдП рдЧрдП рд╣реИрдВред

рдореВрд▓ рдЕрд╡рдзрд╛рд░рдгрд╛
рдПрдХ рд╕рд╛рд░ рдЪрд┐рдВрддрд╛
lib рдЯреАрдо рд╕реЗ рдЖрдЧреЗ рдмрдврд╝реЗрдВ

рдХреЗ рдмрд╛рдж:

44174 рд╕рд┐рддрдореНрдмрд░ 29: рдЕрдЪреВрдХ рдкреНрд░рдХрд╛рд░ рдЬреЛрдбрд╝рд╛ рдЧрдпрд╛

47630 рдорд╛рд░реНрдЪ 14: рдиреЗрд╡рд░ рдЯрд╛рдЗрдк рдХреЛ рд╕реНрдерд┐рд░ рдХрд░реЗрдВ!

49038 рдорд╛рд░реНрдЪ 22: рдЕрдЪреВрдХ рдХреЛ рдиреЗрд╡рд░ рдЯрд╛рдЗрдк рдореЗрдВ рдкрд░рд┐рд╡рд░реНрддрд┐рдд рдХрд┐рдпрд╛!

49305 рдорд╛рд░реНрдЪ 27: рдЯреНрд░рд╛рдИрдлреНрд░реЙрдо рдХреЛ рд╕реНрдерд┐рд░ рдХрд┐рдпрд╛ рдЧрдпрд╛

49518 рдорд╛рд░реНрдЪ 30: рдкреНрд░рд╕реНрддрд╛рд╡рдирд╛ рд╕реЗ рд╣рдЯрд╛рдпрд╛ рдЧрдпрд╛

50121 рдЕрдкреНрд░реИрд▓ 21: рдЕрд╕реНрдерд┐рд░

рдЬрдм ! рд╕реНрдерд┐рд░ рд╣реЛ рдЬрд╛рдП,

рдХреНрдпрд╛ рдпрд╣ рдХрд╛рдо рдХрд░реЗрдЧрд╛?

impl<T, U> TryFrom<U> for T
where U: Into<T> {
    type Err = !;

    fn try_from(u: U) -> Result<Self, !> { Ok(u.into()) }
}

impl<T, U> TryInto<U> for T
where U: TryFrom<T> {
    type Err = U::Err;

    fn try_into(self) -> Result<U, !> { U::try_from(self) }
}

рдЗрд╕ рддрд░рд╣ рд╕рднреА рдЕрдЪреВрдХ рд░реВрдкрд╛рдВрддрд░рдг ( From рдФрд░ Into рдХреЗ рд╕рд╛рде) рдХреЛ рдПрдХ рд╕рдорд╛рди TryFrom рдФрд░ TryInto рдкреНрд░рд╛рдкреНрдд рд╣реЛрддрд╛ рд╣реИ рдЬрд╣рд╛рдВ Err ! рд╣реИ TryFrom impl рдХреЗ рд▓рд┐рдП рдПрдХ TryInto impl рдкреНрд░рд╛рдкреНрдд рд╣реЛрддрд╛ рд╣реИ рдЬреИрд╕реЗ рдХрд┐ рд╣рдо рдкреНрд░рддреНрдпреЗрдХ From impl рдХреЗ рд▓рд┐рдП Into impl рдХреИрд╕реЗ рдкреНрд░рд╛рдкреНрдд рдХрд░рддреЗ рд╣реИрдВред

рдЗрд╕ рддрд░рд╣ рдпрджрд┐ рдЖрдк рдПрдХ рдЗрдореНрдкреНрд▓рд╛рдВрдЯ рд▓рд┐рдЦрдирд╛ рдЪрд╛рд╣рддреЗ рд╣реИрдВ, рддреЛ рдЖрдк рдХреЛрд╢рд┐рд╢ рдХрд░реЗрдВрдЧреЗ From рдлрд┐рд░ Into рдлрд┐рд░ TryFrom рдлрд┐рд░ TryInto , рдФрд░ рдЗрдирдореЗрдВ рд╕реЗ рдПрдХ рдЖрдкрдХреЗ рдкрд░рд┐рджреГрд╢реНрдп рдХреЗ рд▓рд┐рдП рдХрд╛рдо рдХрд░реЗрдЧрд╛ , рдпрджрд┐ рдЖрдкрдХреЛ рдЕрдЪреВрдХ рд░реВрдкрд╛рдВрддрд░рдгреЛрдВ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реИ рддреЛ рдЖрдк From рдпрд╛ Into (рд╕реБрд╕рдВрдЧрдд рдирд┐рдпрдореЛрдВ рдХреЗ рдЖрдзрд╛рд░ рдкрд░) рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░реЗрдВрдЧреЗ рдФрд░ рдпрджрд┐ рдЖрдкрдХреЛ рдЧрд▓рдд рд░реВрдкрд╛рдВрддрд░рдгреЛрдВ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реИ рддреЛ рдЖрдк TryFrom рдпрд╛ TryInto рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░реЗрдВрдЧреЗ (рд╕реБрд╕рдВрдЧрддрддрд╛ рдирд┐рдпрдореЛрдВ рдХреЗ рдЖрдзрд╛рд░ рдкрд░)ред рдпрджрд┐ рдЖрдкрдХреЛ рдмрд╛рдзрд╛рдУрдВ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реИ, рддреЛ рдЖрдк рдЗрд╕ рдЖрдзрд╛рд░ рдкрд░ TryInto рдпрд╛ Into рдЪреБрди рд╕рдХрддреЗ рд╣реИрдВ рдХрд┐ рдЖрдк рдЧрд▓рдд рд░реВрдкрд╛рдВрддрд░рдгреЛрдВ рдХреЛ рд╕рдВрднрд╛рд▓ рд╕рдХрддреЗ рд╣реИрдВ рдпрд╛ рдирд╣реАрдВред TryInto рд╕рднреА рд░реВрдкрд╛рдВрддрд░рдг рд╣реЛрдВрдЧреЗ, рдФрд░ Into рд╕рднреА рдЕрдЪреВрдХ рд░реВрдкрд╛рдВрддрд░рдг рд╣реЛрдВрдЧреЗред

рдлрд┐рд░ рд╣рдо impl TryFrom<T, Err = !> impl TryInto<T, Err = !> impl From<T> impl Into<T> рдХрд░рдиреЗ рдХреЗ рд╕рдВрдХреЗрдд рдХреЗ рд╕рд╛рде рд▓рд┐рдВрдЯ рдХрд░ рд╕рдХрддреЗ рд╣реИрдВред

рд╣рдорд╛рд░реЗ рдкрд╛рд╕ рдкрд╣рд▓реЗ рд╕реЗ рд╣реА рдпреЗ рджреЛрдиреЛрдВ рдирд┐рд╣рд┐рддрд╛рд░реНрде рд╣реИрдВ:

https://doc.rust-lang.org/1.31.0/std/convert/trait.TryFrom.html#impl -TryFrom%3CU%3E
https://doc.rust-lang.org/1.31.0/std/convert/trait.TryInto.html#impl -TryInto%3CU%3E

рдЖрд╣, рдЙрдиреНрд╣реЗрдВ рдирд╣реАрдВ рджреЗрдЦрд╛ (рдмрд╣реБрдд рд╕реЗ рдЕрдиреНрдп рдЗрдореНрдкреНрд▓рд╛рдВрдЯреНрд╕ рдиреЗ рджрд╕реНрддрд╛рд╡реЗрдЬрд╝реЛрдВ рдХреЛ рдЕрд╡реНрдпрд╡рд╕реНрдерд┐рдд рдХрд░ рджрд┐рдпрд╛)ред рдХреНрдпрд╛ рд╣рдо рдмрджрд▓ рд╕рдХрддреЗ рд╣реИрдВ

impl<T, U> TryFrom<U> for T where┬а┬а┬а┬аT: From<U>,

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

impl<T, U> TryFrom<U> for T where┬а┬а┬а┬аU: Into<T>,

рдХреНрдпреЛрдВрдХрд┐ рдпрд╣ рд╕рдЦреНрддреА рд╕реЗ рдЕрдзрд┐рдХ рдЗрдореНрдкреНрд▓рд╛рдВрдЯ рдХреА рдЕрдиреБрдорддрд┐ рджреЗрдЧрд╛, рдФрд░ рдЙрди рд▓реЛрдЧреЛрдВ рдХреЛ рджрдВрдбрд┐рдд рдирд╣реАрдВ рдХрд░реЗрдЧрд╛ рдЬреЛ рдХреЗрд╡рд▓ Into рдХреЛ рд╕реБрд╕рдВрдЧрдд рдХрд╛рд░рдгреЛрдВ рд╕реЗ рд▓рд╛рдЧреВ рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ, рдЗрд╕ рддрд░рд╣ рдЙрдиреНрд╣реЗрдВ TryFrom рдФрд░ From рдХреЗ рд▓рд┐рдП рд╕реНрд╡рдЪрд╛рд▓рд┐рдд рдЗрдореНрдкреНрд▓рд╛рдВрдЯ рднреА рдорд┐рд▓рддрд╛ рд╣реИ Into рдХреЗ рд▓рд┐рдП рдмреНрд▓реИрдВрдХреЗрдЯ рдЗрдВрдкреИрдХреНрдЯ рдХреЗ рдХрд╛рд░рдг From impl рдХреЛ рд╕рдВрдХреНрд░рдордгреАрдп рд░реВрдк рд╕реЗ рд▓рд╛рдЧреВ рдХрд┐рдпрд╛ рдЬрд╛рдПрдЧрд╛ред

рдХреНрдпрд╛ рдЖрдк рдЗрд╕реЗ рдЖрдЬрд╝рдорд╛рдирд╛ рдЪрд╛рд╣реЗрдВрдЧреЗ, рджреЗрдЦреЗрдВ рдХрд┐ рдХреНрдпрд╛ рдпрд╣ рд╕рдВрдХрд▓рд┐рдд рдХрд░рддрд╛ рд╣реИ, рдФрд░ рдПрдХ рдкреБрд▓ рдЕрдиреБрд░реЛрдз рднреЗрдЬреЗрдВ?

рд╣рд╛рдБ рдореИрдВ рдХреЛрд╢рд┐рд╢ рдХрд░рдирд╛ рдЪрд╛рд╣реВрдВрдЧрд╛ред

рдХреНрдпрд╛ рдРрд╕рд╛ рдХреЛрдИ рдорд╛рдорд▓рд╛ рд╣реИ рдЬрд╣рд╛рдВ From<U> for T рд▓рд╛рдЧреВ рдирд╣реАрдВ рдХрд┐рдпрд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИ, рд▓реЗрдХрд┐рди Into<T> for U рдФрд░ TryFrom<U> for T рд╣реЛ рд╕рдХрддрд╛ рд╣реИ?

рд╣рд╛рдБ, рдЙрджрд╛рд╣рд░рдг рдХреЗ рд▓рд┐рдП

use other_crate::OtherType;

struct MyType;

// this impl will fail to compile
impl From<MyType> for OtherType {
    fn from(my_type: MyType) -> OtherType {
        // impl details that don't matter
    }
}

// this impl will not fail to compile
impl Into<OtherType> for MyType {
    fn into(self) -> OtherType {
        // impl details that don't matter
    }
}

рдпрд╣ рдЕрдирд╛рде рдирд┐рдпрдореЛрдВ рдХреЗ рдХрд╛рд░рдг рд╣реИред
TryFrom рдФрд░ From рдЕрдирд╛рде рдирд┐рдпрдореЛрдВ рдХреЗ рд╕рдВрджрд░реНрдн рдореЗрдВ рд╕рдорд╛рди рд╣реИрдВ, рдФрд░ рдЗрд╕реА рддрд░рд╣ TryInto рдФрд░ Into рдЕрдирд╛рде рдирд┐рдпрдореЛрдВ рдХреЗ рд╕рдВрджрд░реНрдн рдореЗрдВ рд╕рдорд╛рди рд╣реИрдВ

@KrishnaSannasi рдЖрдкрдХрд╛ рдЙрджрд╛рд╣рд░рдг рд╕рдВрдХрд▓рд┐рдд рдХрд░реЗрдЧрд╛, рдмрд╕ рдЗрд╕ рдЦреЗрд▓ рдХреЗ рдореИрджрд╛рди рдХрд╛ рдЙрджрд╛рд╣рд░рдг рджреЗрдЦреЗрдВ

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

struct MyType<T>(T);

impl<T> From<MyType<T>> for (T,) {
    fn from(my_type: MyType<T>) -> Self {
        unimplemented!()
    }
}

impl<T> Into<(T,)> for MyType<T> {
    fn into(self) -> (T,) {
        unimplemented!()
    }
}

рдЦреЗрд▓ рдХрд╛ рдореИрджрд╛рди
рдЖрд╣ рд╣рд╛рдБ, рд▓реЗрдХрд┐рди рдЬреИрд╕реЗ рд╣реА рдЖрдк рд╕рд╛рдорд╛рдиреНрдп рдкреИрд░рд╛рдореАрдЯрд░ рдЬреЛрдбрд╝рддреЗ рд╣реИрдВ, рдпрд╣ рдЦрддреНрдо рд╣реЛ рдЬрд╛рддрд╛ рд╣реИред рдпрджрд┐ рдЖрдк рдкреНрд░рддреНрдпреЗрдХ рдЗрдВрдк рдХреЛ рд╡реНрдпрдХреНрддрд┐рдЧрдд рд░реВрдк рд╕реЗ рд╕рдВрдХрд▓рд┐рдд рдХрд░рдиреЗ рдХрд╛ рдкреНрд░рдпрд╛рд╕ рдХрд░рддреЗ рд╣реИрдВ рдФрд░ рд╕рдВрдХрд▓рд┐рдд рдХрд░рддреЗ рд╣реИрдВ рддреЛ From рдПрдХ рд╕рдВрдХрд▓рд┐рдд рдХрд░рдиреЗ рдореЗрдВ рд╡рд┐рдлрд▓ рд╣реЛ рдЬрд╛рдПрдЧрд╛, рдЬрдмрдХрд┐ Into рдПрдХ рд╕рдВрдХрд▓рд┐рдд рд╣реЛрдЧрд╛ред


рдПрдХ рдФрд░ рдХрд╛рд░рдг рд╣реИ рдХрд┐ рдореИрдВ рдпрд╣ рдкрд░рд┐рд╡рд░реНрддрди рдЪрд╛рд╣рддрд╛ рд╣реВрдВ рдХреНрдпреЛрдВрдХрд┐ рд╡рд░реНрддрдорд╛рди рдореЗрдВ, рдпрджрд┐ рдЖрдк Into impl рд▓рд┐рдЦрддреЗ рд╣реИрдВ, рддреЛ рдЖрдк рдирд╣реАрдВ рдХрд░рддреЗ рд╣реИрдВ, рдФрд░ рд╕реНрд╡рдЪрд╛рд▓рд┐рдд рд░реВрдк рд╕реЗ TryInto impl рдкреНрд░рд╛рдкреНрдд рдирд╣реАрдВ рдХрд░ рд╕рдХрддреЗ рд╣реИрдВред рдореИрдВ рдЗрд╕реЗ рдПрдХ рдЦрд░рд╛рдм рдбрд┐рдЬрд╝рд╛рдЗрди рдХреЗ рд░реВрдк рдореЗрдВ рджреЗрдЦрддрд╛ рд╣реВрдВ рдХреНрдпреЛрдВрдХрд┐ рдпрд╣ From рдФрд░ TryFrom рдХреЗ рд╕рд╛рде рдЕрд╕рдВрдЧрдд рд╣реИред

рдореИрдВ рдФрд░ рдЕрдзрд┐рдХ рдкреВрдЫ рд░рд╣рд╛ рд╣реВрдВ рдХрд┐ рдХреНрдпрд╛ рдХрднреА рдРрд╕рд╛ рдХреЛрдИ рдорд╛рдорд▓рд╛ рд╣реИ рдЬрд╣рд╛рдВ рдЖрдк TryFrom<U> for T рдХреЛ Into<T> for U рд╕реЗ рдСрдЯреЛ-рд╡реНрдпреБрддреНрдкрдиреНрди рдХрд░рдирд╛ рдЪрд╛рд╣рддреЗ рд╣реИрдВ, рд▓реЗрдХрд┐рди рдЬрд╣рд╛рдВ From<U> for T рд▓рд╛рдЧреВ рдирд╣реАрдВ рдХрд┐рдпрд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИред рдпрд╣ рдореБрдЭреЗ рдмреЗрдорд╛рдиреА рд▓рдЧрддрд╛ рд╣реИред

рдореИрдВ рдирд┐рд╢реНрдЪрд┐рдд рд░реВрдк рд╕реЗ Into рд╕реЗ TryInto рдмреНрд▓реИрдВрдХреЗрдЯ рдЗрдореНрдкреНрд▓рд╛рдВрдЯ рдЪрд╛рд╣рддрд╛ рд╣реВрдВ, рд▓реЗрдХрд┐рди рджреБрд░реНрднрд╛рдЧреНрдп рд╕реЗ рдЯрд╛рдЗрдк рд╕рд┐рд╕реНрдЯрдо рд╡рд░реНрддрдорд╛рди рдореЗрдВ рдЗрд╕ рддрд░рд╣ рдХреЗ рдмреНрд▓реИрдВрдХреЗрдЯ рдЗрдореНрдкреНрд▓рд╛рдВрдЯ рдХреА рдЕрдиреБрдорддрд┐ рдирд╣реАрдВ рджреЗрддрд╛ рд╣реИ рдХреНрдпреЛрдВрдХрд┐ рдпрд╣ рдЕрдиреНрдп From рд╕реЗ TryFrom рдХреЗ рд╕рд╛рде рд╕рдВрдШрд░реНрд╖ рдХрд░рддрд╛ рд╣реИ From рд╕реЗ Into рдХрдВрдмрд▓ рдирд┐рд╣рд┐рддрд╛рд░реНрде (рдпрд╛, рдХрдо рд╕реЗ рдХрдо, рдпрд╣ рдореЗрд░реА рд╕рдордЭ рд╣реИ)ред

рдореБрдЭреЗ рдкреВрд░рд╛ рдпрдХреАрди рд╣реИ рдХрд┐ рдпреЗ рдЙрдкрдпреЛрдЧ рдХреЗ рдорд╛рдорд▓реЗ рдареАрдХ рд╡рд╣реА рдереЗ рдЬреЛ RFC @kjetilkjeka рд╕реЗ рдЬреБрдбрд╝реЗ рдереЗ рдЬрд┐рдиреНрд╣реЗрдВ рдареАрдХ рдХрд░рдирд╛ рдерд╛ред рдЗрд╕рдХреЗ рд▓рд╛рдЧреВ рд╣реЛрдиреЗ рдХреЗ рдмрд╛рдж рдРрд╕рд╛ рдХреЛрдИ рдорд╛рдорд▓рд╛ рдирд╣реАрдВ рд╣реЛрдирд╛ рдЪрд╛рд╣рд┐рдП рдЬрд╣рд╛рдВ рдЖрдк Into рд▓рд╛рдЧреВ рдХрд░ рд╕рдХреЗрдВ рд▓реЗрдХрд┐рди From рдирд╣реАрдВред

@scottjmaddox рдореИрдВ рдЬрд░реВрд░реА рдирд╣реАрдВ рдЪрд╛рд╣рддрд╛ рдХрд┐ Into рдХрд╛ рдЕрд░реНрде TryFrom рд╣реЛ рдЬрд┐рддрдирд╛ рдореИрдВ Into рдХрд╛ рдЕрд░реНрде TryInto рдХреЗ рд▓рд┐рдП рдЪрд╛рд╣рддрд╛ рд╣реВрдВред рдЗрд╕рдХреЗ рдЕрд▓рд╛рд╡рд╛ From рдФрд░ Into рд╢рдмреНрджрд╛рд░реНрде рд░реВрдк рд╕реЗ рд╕рдордХрдХреНрд╖ рд╣реИрдВ, рд╕рд┐рд░реНрдл рдЗрд╕рд▓рд┐рдП рдХрд┐ рд╣рдо рдпрд╣ рд╡реНрдпрдХреНрдд рдирд╣реАрдВ рдХрд░ рд╕рдХрддреЗ рдХрд┐ рд╣рдорд╛рд░реЗ рд╡рд┐рд╢реЗрд╖рддрд╛ рдкреНрд░рдгрд╛рд▓реА рдореЗрдВ рдЗрд╕рдХрд╛ рдорддрд▓рдм рдпрд╣ рдирд╣реАрдВ рд╣реИ

TryFrom<U> for T рдХреЛ Into<T> for U рд╕реЗ рдСрдЯреЛ-рд╡реНрдпреБрддреНрдкрдиреНрди рдХрд┐рдпрд╛ рдЬрд╛рдирд╛ рд╣реИ, рд▓реЗрдХрд┐рди where From<U> for T рдХреЛ рд▓рд╛рдЧреВ рдирд╣реАрдВ рдХрд┐рдпрд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИред

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

@clarcharr рднрд▓реЗ рд╣реА рдРрд╕рд╛ рд╣реЛ, рдлрд┐рд░ рднреА Into рджреЛрдиреЛрдВ рдХрд╛ рдорддрд▓рдм TryInto рдФрд░ TryFrom TryInto рджреЛрдиреЛрдВ рдХреЛ рджреЛ рдХрдВрдмрд▓ рдХреЗ рд░реВрдк рдореЗрдВ рд░рдЦрдиреЗ рдХрд╛ рдХреЛрдИ рддрд░реАрдХрд╛ рдирд╣реАрдВ рд╣реИред рдирд┐рд╣рд┐рддрд╛рд░реНрде рд╕рдВрдШрд░реНрд╖ рдХрд░реЗрдВрдЧреЗред рдореИрдВ рдЪрд╛рд╣рддрд╛ рд╣реВрдВ рдХрд┐ Into рдХрд╛ рдЕрд░реНрде TryInto рд╣реЛ, рдФрд░ TryFrom рдХрд╛ рдЕрд░реНрде TryInto рд╣реЛред рдЬрд┐рд╕ рддрд░рд╣ рд╕реЗ рдореИрдВ рдкреНрд░рд╕реНрддрд╛рд╡ рдХрд░рддрд╛ рд╣реВрдВ, рд╡рд╣ рдЕрдкреНрд░рддреНрдпрдХреНрд╖ рд░реВрдк рд╕реЗ рд╣реА рд╣реЛрдЧрд╛ред


рдореИрдВрдиреЗ рдЕрдкрдиреЗ рдкреБрд▓ рдЕрдиреБрд░реЛрдз рдкрд░ рдПрдХ рдЯрд┐рдкреНрдкрдгреА рдХреА, рдЬрд╣рд╛рдВ рдореИрдВрдиреЗ рдЗрд╕ рдмрджрд▓рд╛рд╡ рдХреЗ рд▓рд┐рдП рдЕрдкрдиреЗ рдкреНрд░рдореБрдЦ рдХрд╛рд░рдг рдпрд╣рд╛рдВ рджрд┐рдП рд╣реИрдВ


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

рд╕реНрдкрд╖реНрдЯ рд╣реЛрдиреЗ рдХреЗ рд▓рд┐рдП, рдореБрдЭреЗ рдпреЗ рдЪрд╛рд░ рдЕрд░реНрде рдЪрд╛рд╣рд┐рдП

  • From рдХрд╛ рдЕрд░реНрде рд╣реИ Into (рд╕реНрдерд┐рд░рддрд╛ рдХреЗ рд▓рд┐рдП)
  • TryFrom рдХрд╛ рдЕрд░реНрде рд╣реИ TryInto рдпрд╛ TryInto рдХрд╛ рдЕрд░реНрде рд╣реИ TryFrom (рдХреНрдпреЛрдВрдХрд┐ рд╡реЗ рд╢рдмреНрджрд╛рд░реНрде рд╕рдордХрдХреНрд╖ рд╣реИрдВ)
  • From рдХрд╛ рдЕрд░реНрде рд╣реИ TryFrom
  • Into рдХрд╛ рдЕрд░реНрде рд╣реИ TryInto

рдореБрдЭреЗ рдкрд░рд╡рд╛рд╣ рдирд╣реАрдВ рд╣реИ рдХрд┐ рд╡реЗ рдкреНрд░рддреНрдпрдХреНрд╖ рдпрд╛ рдЕрдкреНрд░рддреНрдпрдХреНрд╖ рд░реВрдк рд╕реЗ рдХрд┐рдП рдЬрд╛рддреЗ рд╣реИрдВред

рдпрд╛, рд╣рдо TryInto рдПрдХ рдЙрдкрдирд╛рдо рдмрдирд╛ рд╕рдХрддреЗ рд╣реИрдВ:

trait TryInto<T> = where T: TryFrom<Self>;

рдореБрдЭреЗ рдирд╣реАрдВ рдкрддрд╛ рдХрд┐ рдпрд╣ рд╡рд╛рд╕реНрддрд╡ рдореЗрдВ рдХрд╛рдо рдХрд░реЗрдЧрд╛ рдпрд╛ рдирд╣реАрдВ, рд▓реЗрдХрд┐рди рдпрд╣ рдХрд╛рдлреА рдЖрд╕рд╛рди рд▓рдЧрддрд╛ рд╣реИред

into рдкрджреНрдзрддрд┐ рдХреЛ рдХрд╣рд╛рдБ рдкрд░рд┐рднрд╛рд╖рд┐рдд рдХрд┐рдпрд╛ рдЬрд╛рдПрдЧрд╛?

@clarcharr @SimonSapin рдХреА рддрд░рд╣ рдХрд╣рд╛, рд╡рд┐рдзрд┐ рдореЗрдВ рдХрд╣рд╛рдВ рдкрд░рд┐рднрд╛рд╖рд┐рдд рдХрд┐рдпрд╛ рдЬрд╛рдПрдЧрд╛ред рд╣рдорд╛рд░реЗ рдкрд╛рд╕ рд╡рд┐рд╢реЗрд╖рддрд╛ рдЙрдкрдирд╛рдо рдирд╣реАрдВ рд╣реИрдВред рдЗрд╕рдХреЗ рд▓рд┐рдП рдПрдХ рдФрд░ RFC рд╣реЛрдирд╛ рдЪрд╛рд╣рд┐рдПред рдФрд░ рд╣рдореЗрдВ рдЗрд╕реЗ рдЙрд╕ RFC рдкрд░ рдмреНрд▓реЙрдХ рдХрд░рдирд╛ рд╣реЛрдЧрд╛, рдЬреЛ рдЕрд╡рд╛рдВрдЫрдиреАрдп рд╣реИред

@KrishnaSannasi рд╡рд░реНрддрдорд╛рди рдореЗрдВ From => Into , From => TryFrom , TryFrom => TryInto , рдФрд░ Into => TryInto рдХреЗ рд╕рднреА рдЪрд╛рд░ рд╣реЛрдирд╛ рдЕрд╕рдВрднрд╡ рд╣реИ, рдХреНрдпреЛрдВрдХрд┐ From рдХреЛ рд▓рд╛рдЧреВ рдХрд░рдиреЗ рд╡рд╛рд▓реА рд╣рд░ рдЪреАрдЬ TryInto (рдПрдХ From => Into => TryInto , рдФрд░ рджреВрд╕рд░рд╛ From => TryFrom => TryInto ) рдХреЗ рд▓рд┐рдП рджреЛ рдкреНрд░рддрд┐рд╕реНрдкрд░реНрдзреА рдЗрдореНрдкреНрд▓рд╛рдВрдЯ рд╣реИрдВред

рдЪреВрдВрдХрд┐ From => Into рдФрд░ TryFrom => TryInto рджреЛрдиреЛрдВ рд╣реА рдорд╣рддреНрд╡рдкреВрд░реНрдг рд╣реИрдВ, Into => TryInto рдХрд╛ рддреНрдпрд╛рдЧ рдХрд░рдирд╛ рд╣реЛрдЧрд╛ред рдпрд╛ рдХрдо рд╕реЗ рдХрдо рдореЗрд░реА рд╕рдордЭ рддреЛ рдпрд╣реА рд╣реИред

рд╣рд╛рдБ, рдореБрдЭреЗ рдирд╣реАрдВ рд▓рдЧрд╛ рдХрд┐ TryInto рдЙрдкрдирд╛рдо рдареАрдХ рд╕реЗ рдирд┐рдХрд▓ рдЧрдпрд╛ рд╣реИ, рдЗрд╕рд▓рд┐рдП рдореБрдЭреЗ рдЕрдирджреЗрдЦрд╛ рдХрд░реЗрдВ> <

рд╣рд╛рд▓рд╛рдВрдХрд┐ рдореИрдВ @scottjmadox рдЬреЛ рдХрд╣рддрд╛ рд╣реВрдВ рдЙрд╕рд╕реЗ рд╕рд╣рдордд рд╣реВрдВред

@scottjmadox

рдмрд╕ рдПрдХ рд╕рдВрднрд╛рд╡рд┐рдд рдЧрд▓рддрдлрд╣рдореА рдХреЛ рджреВрд░ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП, рдореИрдВ From рдСрдЯреЛ рдЗрдореНрдкреНрд▓рд╛рдВрдЯреНрд╕ TryFrom рдХреЛ рд╣рдЯрд╛ рд░рд╣рд╛ рд╣реВрдВ рдФрд░ рдЗрд╕реЗ Into рдСрдЯреЛ рдЗрдореНрдкреНрд▓рд╕ TryFrom рд╕реЗ рдмрджрд▓ рд░рд╣рд╛ рд╣реВрдВред

рд╡рд░реНрддрдорд╛рди рдореЗрдВ рд╕рднреА рдЪрд╛рд░ рд╕реЗ => рдЗрдирдЯреВ, рдлреНрд░реЙрдо => рдЯреНрд░рд╛рдИрдлреНрд░реЙрдо, рдЯреНрд░рд╛рдИрдлреНрд░реЙрдо => рдЯреНрд░рд╛рдИрдЗрдиреНрдЯреЛ, рдФрд░ рдЗрдирдЯреВ => рдЯреНрд░рд╛рдИрдЗрдиреНрдЯреЛ рд╣реЛрдирд╛ рдЕрд╕рдВрднрд╡ рд╣реИред

рдпрд╣ рд╕рд┐рд░реНрдл рдЧрд▓рдд рд╣реИ, рдмрд╕ рдкреНрд░рд╕реНрддрд╛рд╡рд┐рдд рдХрд╛рд░реНрдпрд╛рдиреНрд╡рдпрди рдХреЛ рджреЗрдЦреЗрдВред

рдпрд╣ рд╡рд╛рд▓рд╛:
From -> Into -> TryFrom -> TryInto

From рдСрдЯреЛ-рдЗрдореНрдкреНрд▓реНрд╕ Into
Into рдСрдЯреЛ-рдЗрдореНрдкреНрд▓реНрд╕ TryFrom
TryFrom рдСрдЯреЛ-рдЗрдореНрдкреНрд▓реНрд╕ TryInto

рд╡рд┐рд╕реНрддрд╛рд░ рд╕реЗ, рдЯреНрд░рд╛рдВрдЬрд┐рдЯрд┐рд╡ рдСрдЯреЛ-рдЗрдореНрдкрд▓реНрд╕ рдХреЗ рдХрд╛рд░рдг рд╣рдореЗрдВ рдорд┐рд▓рддрд╛ рд╣реИ
From рдХрд╛ рдЕрд░реНрде рд╣реИ TryFrom (рдХреНрдпреЛрдВрдХрд┐ From рдСрдЯреЛ рдХрд╛ рдЕрд░реНрде рд╣реИ Into рдФрд░ Into рдСрдЯреЛ рдХрд╛ рдЕрд░реНрде рд╣реИ TryFrom )
Into рдХрд╛ рдЕрд░реНрде рд╣реИ TryInto (рдХреНрдпреЛрдВрдХрд┐ Into рдСрдЯреЛ рдХрд╛ рдЕрд░реНрде рд╣реИ TryFrom рдФрд░ TryFrom рдСрдЯреЛ рдХрд╛ рдЕрд░реНрде рд╣реИ TryInto )
рдкреНрд░рддреНрдпреЗрдХ 1 рд╕реНрддрд░ рдХреЗ рд╕рдВрдХреЗрдд рдХреЗ рд╕рд╛рде (рдореБрдЭреЗ рд▓рдЧрддрд╛ рд╣реИ рдХрд┐ рдпрд╣ рдареАрдХ рд╣реИ)

рддреЛ рдореЗрд░реА рд╕рднреА рд╢рд░реНрддреЗрдВ рдкреВрд░реА рд╣реЛ рдЧрдИ рд╣реИрдВред
рд╣рдорд╛рд░реЗ рдкрд╛рд╕ рд╕рдм рд╣реЛ рд╕рдХрддрд╛ рд╣реИ

рдЗрдореНрдкрд▓ | рдЕрдкреНрд░рддреНрдпрдХреНрд╖ рд╕реНрддрд░
-----------------------|---------------------
From рдХрд╛ рдЕрд░реНрде рд╣реИ Into | рдХреЛрдИ рд╕рдВрдХреЗрдд рдирд╣реАрдВ
TryFrom рдХрд╛ рдЕрд░реНрде рд╣реИ TryInto | рдХреЛрдИ рд╕рдВрдХреЗрдд рдирд╣реАрдВ
From рдХрд╛ рдЕрд░реНрде рд╣реИ TryFrom | рдЕрдкреНрд░рддреНрдпрдХреНрд╖ рдХрд╛ 1 рд╕реНрддрд░
Into рдХрд╛ рдЕрд░реНрде рд╣реИ TryInto | рдЕрдкреНрд░рддреНрдпрдХреНрд╖ рдХрд╛ 1 рд╕реНрддрд░


From -> Into -> TryInto -> TryFrom
рднреА рдХрд╛рдо рдХрд░реЗрдЧрд╛, рд▓реЗрдХрд┐рди рдореИрдВ рдирд┐рд░рдВрддрд░рддрд╛ рдмрдирд╛рдП рд░рдЦрдирд╛ рдЪрд╛рд╣рддрд╛ рд╣реВрдВ рдФрд░ рдореВрд▓ рд╕рдВрд╕реНрдХрд░рдг (рдКрдкрд░ рджреЗрдЦрд╛ рдЧрдпрд╛) рдЗрд╕ рд╕рдВрд╕реНрдХрд░рдг рдХреА рддреБрд▓рдирд╛ рдореЗрдВ рдЕрдзрд┐рдХ рд╕реБрд╕рдВрдЧрдд рд╣реИ


рд╢рдмреНрджрд╛рд╡рд▓реА рдкрд░ рдзреНрдпрд╛рди рджреЗрдВ: (рдЬрдм рдореИрдВ рдЙрдирдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рддрд╛ рд╣реВрдВ)

-> рдХрд╛ рдЕрд░реНрде рд╣реИ рдСрдЯреЛ рдЗрдореНрдкреНрд▓рд╛рдВрдЯ
рдСрдЯреЛ рдЗрдореНрдкреНрд▓рд╛рдВрдЯ рдЙрд╕ рд╡рд╛рд╕реНрддрд╡рд┐рдХ рдЗрдореНрдкреНрд▓рд╛рдВрдЯ рдХреЛ рд╕рдВрджрд░реНрднрд┐рдд рдХрд░рддрд╛ рд╣реИ рдЬрд┐рд╕рдореЗрдВ рдЯрд╛рдЗрдк рдХрд┐рдпрд╛ рдЧрдпрд╛ рд╣реИред
рдЗрд╕рдХрд╛ рдорддрд▓рдм рд╣реИ рдХрд┐ рдЕрдЧрд░ рдореЗрд░реЗ рдкрд╛рд╕ рдпрд╣ рдЗрдореНрдкреНрд▓рд╛рдВрдЯ рд╣реИ рддреЛ рдореБрдЭреЗ рд╡рд╣ рдЗрдореНрдкреНрд▓рд╛рдВрдЯ рднреА рдорд┐рд▓реЗрдЧрд╛


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

рдкреБрд▓ рдЕрдиреБрд░реЛрдз

@ рдХреГрд╖реНрдгрд╛рд╕рдирд╕реА рдЖрд╣, рдЕрдм рдореИрдВ рддреБрдореНрд╣рд╛рд░рд╛ рдмрд┐рдВрджреБ рджреЗрдЦрддрд╛ рд╣реВрдВред рд╣рд╛рдВ, рдпрд╣ рд╕рдордЭ рдореЗрдВ рдЖрддрд╛ рд╣реИ рдФрд░ рдЕрдм рдореИрдВ рджреЗрдЦрддрд╛ рд╣реВрдВ рдХрд┐ рдЖрдкрдХрд╛ рдкреНрд░рд╕реНрддрд╛рд╡рд┐рдд рдкрд░рд┐рд╡рд░реНрддрди рд╕рдорд╕реНрдпрд╛ рдХреЛ рдХреИрд╕реЗ рд╣рд▓ рдХрд░рддрд╛ рд╣реИ рдФрд░ рд╡рд╛рдВрдЫрд┐рдд рд╡реНрдпрд╡рд╣рд╛рд░ рдкреНрд░рджрд╛рди рдХрд░рддрд╛ рд╣реИред рд╡рд┐рд╕реНрддреГрдд рд╡реНрдпрд╛рдЦреНрдпрд╛ рдХреЗ рд▓рд┐рдП рдзрдиреНрдпрд╡рд╛рдж!

рд╕рдВрдкрд╛рджрд┐рдд рдХрд░реЗрдВ : рдареАрдХ рд╣реИ, рд░реБрдХреЛ, рд╣рд╛рд▓рд╛рдВрдХрд┐... рдореБрдЭреЗ рдЕрднреА рднреА рд╕рдордЭ рдореЗрдВ рдирд╣реАрдВ рдЖрддрд╛ рдХрд┐ рд╡рд░реНрддрдорд╛рди рдХрдВрдмрд▓ рдЗрдореНрдкреНрд▓рд╛рдВрдЯ рдкрд░реНрдпрд╛рдкреНрдд рдХреНрдпреЛрдВ рдирд╣реАрдВ рд╣реИрдВред рд╕рдВрднрд╛рд╡рд┐рдд рд░реВрдк рд╕реЗ рдПрдХ рдРрд╕рд╛ рдорд╛рдорд▓рд╛ рд╣реИ рдЬрд╣рд╛рдВ рдЖрдк Into рд▓рд╛рдЧреВ рдХрд░рдиреЗ рдореЗрдВ рд╕рдХреНрд╖рдо рд╣реЛрдВрдЧреЗ рд▓реЗрдХрд┐рди From рдирд╣реАрдВ? рдФрд░ рдлрд┐рд░ рднреА TryFrom рдХреЛ рд╕реНрд╡рддрдГ рдкреНрд░рд╛рдкреНрдд рдХрд░рдирд╛ рд╕рдВрднрд╡ рд╣реИ?

рд╕рдВрдкрд╛рджрд┐рдд рдХрд░реЗрдВ 2 : рдареАрдХ рд╣реИ, рдореИрдВ рдЕрднреА рд╡рд╛рдкрд╕ рдЧрдпрд╛ рдФрд░ рдЖрдкрдХреЗ рд╕реНрдкрд╖реНрдЯреАрдХрд░рдг рдХреЛ рдкрдврд╝рд╛ рдХрд┐ рдХреИрд╕реЗ рдЕрдирд╛рде рдирд┐рдпрдо From рдХреЗ рдХрд╛рд░реНрдпрд╛рдиреНрд╡рдпрди рдХреЛ рд░реЛрдХ рд╕рдХрддрд╛ рд╣реИред рдЕрдм рд╕рдм рд╕рдордЭ рдЖ рд░рд╣рд╛ рд╣реИред рдореИрдВ рдЗрд╕ рдмрджрд▓рд╛рд╡ рдХрд╛ рдкреВрд░рд╛ рд╕рдорд░реНрдерди рдХрд░рддрд╛ рд╣реВрдВред рдпрд╣ рдЕрднреА рднреА рдереЛрдбрд╝рд╛ рдирд┐рд░рд╛рд╢рд╛рдЬрдирдХ рд╣реИ рдХрд┐ рдЕрдирд╛рде рд╢рд╛рд╕рди рдХреЗ рдЗрддрдиреЗ рд╕рд╛рд░реЗ рдЕрдирдкреЗрдХреНрд╖рд┐рдд рдкрд░рд┐рдгрд╛рдо рд╣реИрдВ, рд▓реЗрдХрд┐рди рд╣рдо рдЗрд╕реЗ рдпрд╣рд╛рдВ рдареАрдХ рдирд╣реАрдВ рдХрд░рдиреЗ рдЬрд╛ рд░рд╣реЗ рд╣реИрдВ, рдЗрд╕рд▓рд┐рдП рдпрд╣ рд╕рд░реНрд╡реЛрддреНрддрдо рдЪреАрдЬреЛрдВ рдХреЛ рдмрдирд╛рдиреЗ рдХреЗ рд▓рд┐рдП рд╕рдордЭ рдореЗрдВ рдЖрддрд╛ рд╣реИред

рдХреНрдпрд╛ рдХреЛрдИ @rust-lang/libs рд╕реЗ рд╢реБрд░реВ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рддреИрдпрд╛рд░ рд╣реЛрдЧрд╛ FCP рдЗрд╕ рдкрд░ рдЕрдм https://github.com/rust-lang/rust/issues/49593 рддрдп рдХрд░ рджрд┐рдпрд╛ рдЧрдпрд╛ рд╣реИ рдФрд░ never_type рд╕реНрдерд┐рд░реАрдХрд░рдг рдХреЗ рд▓рд┐рдП рдПрдХ рдЙрдореНрдореАрджрд╡рд╛рд░ рд╣реИ рдПрдХ рдмрд╛рд░ рдлрд┐рд░?

рдЗрд╕ рд╕реБрд╡рд┐рдзрд╛ рдХреЗ рдорд╛рдзреНрдпрдо рд╕реЗ рдкрд╣рд▓реЗ рд╕реЗ рд╣реА рдЪрд▓рд╛ рдЧрдпрд╛ рд╣реИ FCP рд╕реНрдерд┐рд░реАрдХрд░рдг рдХреЗ рд▓рд┐рдП. ( рдкреНрд░рд╕реНрддрд╛рд╡ , рдкреВрд░реНрдгрддрд╛ ред) рдореБрдЭреЗ рд▓рдЧрддрд╛ рд╣реИ рдХрд┐ 10 рджрд┐рдиреЛрдВ рдХреА рдЯрд┐рдкреНрдкрдгреА рдЕрд╡рдзрд┐ рдХреЗ рдорд╛рдзреНрдпрдо рд╕реЗ рдЬрд╛рдирд╛ рдЬрд░реВрд░реА рдирд╣реАрдВ рд╣реИред

рд╕реНрдерд┐рд░реАрдХрд░рдг рдкреАрдЖрд░ рдХреЗ рдмрд╛рдж рдХрднреА рдирд╣реАрдВ рдЙрддрд░рд╛ рд╣реИ, рд╣рдо TryFrom / TryInto рдХреЗ рд▓рд┐рдП рдПрдХ (рдирдпрд╛) рд╕реНрдерд┐рд░реАрдХрд░рдг рдкреАрдЖрд░ рдмрдирд╛ рд╕рдХрддреЗ рд╣реИрдВ рдФрд░ рдпрд╣ рд╕реБрдирд┐рд╢реНрдЪрд┐рдд рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП rfcbot рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ рдХрд┐ рдЯреАрдо рдХреЗ рд╕рджрд╕реНрдп рдЗрд╕реЗ рджреЗрдЦреЗрдВред

рдХреНрдпрд╛ рдореМрдЬреВрджрд╛ рдЦрд╛рд▓реА рдПрдирдо рдкреНрд░рдХрд╛рд░реЛрдВ рдЬреИрд╕реЗ FromStringError рдХреЛ рдЙрдкрдирд╛рдо рд╕реЗ ! рдореЗрдВ рд╕реНрдерд┐рд░реАрдХрд░рдг рдХреЗ рд╕рд╛рде рдмрджрд▓рдирд╛ рд╕рдВрднрд╡ рд╣реЛрдЧрд╛?

@clarcharr рд╣рд╛рдБред рд╡рд┐рд╢реЗрд╖рддрд╛ рдирд┐рд╣рд┐рдд рд╕реБрд╕рдВрдЧрддрддрд╛ рдХреЗ рдХрд╛рд░рдг, рд╣рдо рдХреЗрд╡рд▓ рдПрдХ рдкреНрд░рдХрд╛рд░ рдХреЗ рд▓рд┐рдП рдРрд╕рд╛ рдХрд░ рдкрд╛рддреЗ рд╣реИрдВред рд╕реМрднрд╛рдЧреНрдп рд╕реЗ, рд╣рдорд╛рд░реЗ рдкрд╛рд╕ рдХреЗрд╡рд▓ std::string::ParseError рд╣реИред (рдФрд░ рдпрд╣реА рдХрд╛рд░рдг рд╣реИ рдХрд┐ рд╣рдордиреЗ https://github.com/rust-lang/rust/pull/55148 рдореЗрдВ impl FromString for PathBuf рдХреЗ рд▓рд┐рдП рдПрдХ рдирдпрд╛ рдкреНрд░рдХрд╛рд░ рдЬреЛрдбрд╝рдиреЗ рдХреЗ рдмрдЬрд╛рдп рдЗрд╕рдХрд╛ рдЗрд╕реНрддреЗрдорд╛рд▓ рдХрд┐рдпрд╛ред)

рд╣рд╛рд▓рд╛рдВрдХрд┐ рдпрд╣ TryFrom / TryInto рд╕реЗ рдЕрд╕рдВрдмрдВрдзрд┐рдд рд╣реИред рдпрд╣ https://github.com/rust-lang/rust/issues/49691 / https://github.com/rust-lang/rust/issues/57012 рдХреЗ рд▓рд┐рдП рдПрдХ рд╡рд┐рд╖рдп рд╣реИ, рдХреНрдпреЛрдВрдХрд┐ рдЗрд╕реЗ рдЙрд╕реА рд░рд┐рд▓реАрдЬ рдЪрдХреНрд░ рдореЗрдВ рд╣реЛрдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реИ ! рдХреЗ рд╕реНрдерд┐рд░реАрдХрд░рдг рдХреЗ рд░реВрдк рдореЗрдВред

@SimonSapin рдХреНрдпрд╛ рдпрд╣ рд╕реНрдерд┐рд░ рд╣реЛрдиреЗ рд╕реЗ рдкрд╣рд▓реЗ рдореЗрд░реЗ рдкреБрд▓ рдЕрдиреБрд░реЛрдз (# 56796) рдХреЛ рдорд░реНрдЬ рдХрд░рдирд╛ рд╕рдВрднрд╡ рд╣реЛрдЧрд╛?

рдЬрд╝рд░реВрд░, рдореИрдВрдиреЗ рдЗрд╕реЗ рд╕рдорд╕реНрдпрд╛ рд╡рд┐рд╡рд░рдг рдореЗрдВ рдЬреЛрдбрд╝ рджрд┐рдпрд╛ рд╣реИ рддрд╛рдХрд┐ рд╣рдо рдЯреНрд░реИрдХ рди рдЦреЛрдПрдВред

рдзрдиреНрдпрд╡рд╛рдж!

рдХреНрдпрд╛ рдЗрд╕реЗ рд╕реНрдерд┐рд░ рдореЗрдВ рдПрдХреАрдХреГрдд рдХрд┐рдпрд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИ? рдпрд╣ CloudABI рдХреЗ рд▓рд┐рдП argdata рдХреА рдирд┐рд░реНрднрд░рддрд╛ рд╣реИред

@mcandre рд╣рд╛рдБред рдпрд╣ рд╡рд░реНрддрдорд╛рди рдореЗрдВ https://github.com/rust-lang/rust/issues/57012 рдкрд░ рдкреНрд░рддреАрдХреНрд╖рд╛ рдХрд░ рд░рд╣рд╛ рд╣реИ, рдЬрд┐рд╕реЗ рд╣рд╛рд▓ рд╣реА рдореЗрдВ рдЕрдирдмреНрд▓реЙрдХ рдХрд┐рдпрд╛ рдЧрдпрд╛ рдерд╛ред рдореБрдЭреЗ рдЙрдореНрдореАрдж рд╣реИ рдХрд┐ TryFrom рдЗрд╕реЗ рдЬрдВрдЧ 1.33 рдпрд╛ 1.34 рдореЗрдВ рдмрдирд╛ рджреЗрдЧрд╛ред

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

56796 рдХрд╛ рд╡рд┐рд▓рдп рдХрд░ рджрд┐рдпрд╛ рдЧрдпрд╛ рд╣реИред рддреЛ рд╣рдо рдЗрд╕реЗ рдЪреЗрдХ рдХрд░ рд╕рдХрддреЗ рд╣реИрдВред

@icefoxen рдореБрдЭреЗ рд▓рдЧрддрд╛ рд╣реИ рдХрд┐ рдЕрднреА рдЖрдк рдЗрди рд▓рдХреНрд╖рдгреЛрдВ рдХреЗ рджрд╕реНрддрд╛рд╡реЗрдЬрд╝реЛрдВ рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рдлреАрдбрдмреИрдХ (рдФрд░ рдкрд░рд┐рд╡рд░реНрддрди) рдкреНрд░рджрд╛рди рдХрд░рдирд╛ рд╕рдмрд╕реЗ рдЕрдЪреНрдЫрд╛ рдХрд░ рд╕рдХрддреЗ рд╣реИрдВред рдЕрднреА рдореИрдВ рдЙрдиреНрд╣реЗрдВ From рдФрд░ Into рд▓рдХреНрд╖рдгреЛрдВ рдХреА рддреБрд▓рдирд╛ рдореЗрдВ рдереЛрдбрд╝рд╛ рдХрдо рдкрд╛рддрд╛ рд╣реВрдВред

рджрд╕реНрддрд╛рд╡реЗрдЬ рдкрд░ рдХрд╛рдо рдХрд░ рд░рд╣реЗ рд╣реИрдВред рдорд╛рдореВрд▓реА рд╕рдбрд╝рдХ-рдЯрдХреНрдХрд░: рдореИрдВ assert_eq!(some_value, std::num::TryFromIntError(())); рдЪрд╛рд╣рддрд╛ рд╣реВрдВред рд╣рд╛рд▓рд╛рдВрдХрд┐, рдЪреВрдВрдХрд┐ TryFromIntError рдореЗрдВ рдХреЛрдИ рдХрдВрд╕реНрдЯреНрд░рдХреНрдЯрд░ рдирд╣реАрдВ рд╣реИ рдФрд░ рдХреЛрдИ рд╕рд╛рд░реНрд╡рдЬрдирд┐рдХ рдХреНрд╖реЗрддреНрд░ рдирд╣реАрдВ рд╣реИ, рдореИрдВ рдЗрд╕рдХрд╛ рдЙрджрд╛рд╣рд░рдг рдирд╣реАрдВ рдмрдирд╛ рд╕рдХрддрд╛ред рдЖрдЧреЗ рдмрдврд╝рдиреЗ рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рдХреЛрдИ рд╕рд▓рд╛рд╣? рдЕрднреА рдХреЗ рд▓рд┐рдП рдореИрдВ рд╕рд┐рд░реНрдл assert!(some_value_result.is_err()); рдХрд░ рд░рд╣рд╛ рд╣реВрдВред

рдХреНрд╖рдорд╛ рдХрд░реЗрдВ рдЕрдЧрд░ рдпрд╣ рдЧрд▓рдд рдЬрдЧрд╣ рд╣реИ, рд▓реЗрдХрд┐рди рдРрд╕рд╛ рд▓рдЧрддрд╛ рд╣реИ рдХрд┐ TryFromIntError рдХреЗ рджрд╕реНрддрд╛рд╡реЗрдЬрд╝реЛрдВ рдореЗрдВ рдХреЛрдИ рдЧрд▓рддреА рд╣реИ - рдпрд╣ impl Debug for TryFromIntError рд╕реВрдЪреАрдмрджреНрдз рдХрд░рддрд╛ рд╣реИ, рдЬрдм рд╡рд╛рд╕реНрддрд╡ рдореЗрдВ рдЗрд╕рдХреЗ рд▓рд┐рдП рдХреЛрдИ рдХреЛрдб рдирд╣реАрдВ рд╣реЛрддрд╛ рд╣реИред рдПрдХ TryFrom рдЙрдкрдпреЛрдЧ рд╕реЗ рдкрд░рд┐рдгрд╛рдо рдХреЛ рдЦреЛрд▓рдиреЗ рдХрд╛ рдкреНрд░рдпрд╛рд╕ рдХрд░рддреЗ рд╕рдордп рд╕рдВрдХрд▓рдХ рд╡рд░реНрддрдорд╛рди рдореЗрдВ рдПрдХ рддреНрд░реБрдЯрд┐ рдЙрддреНрдкрдиреНрди рдХрд░рддрд╛ рд╣реИред

рдХреНрдпрд╛ рдЗрд╕ рдкрд░ fmt::Debug рд▓рд╛рдЧреВ рд╣реЛрдиреЗ рдХрд╛ рдорддрд▓рдм рд╣реИ?

@marco9999

#[derive(Debug, Copy, Clone, PartialEq, Eq)]
pub struct TryFromIntError(());

рдЗрд╕рдореЗрдВ #[derive(Debug)] рд╡рд┐рд╢реЗрд╖рддрд╛ рд╣реИред

рд╣рдореНрдо рд╣рд╛рдБ рд╣реИ... рдХреНрдпрд╛ рдХреБрдЫ рдареАрдХ рд╕реЗ рдХрд╛рдо рдирд╣реАрдВ рдХрд░ рд░рд╣рд╛ рд╣реИ?

error[E0599]: no method named `unwrap` found for type `std::result::Result<usize, <T as std::convert::TryInto<usize>>::Error>` in the current scope
  --> src\types\b8_memory_mapper.rs:67:51
   |
67 |         let address: usize = T::try_into(address).unwrap();
   |                                                   ^^^^^^
   |
   = note: the method `unwrap` exists but the following trait bounds were not satisfied:
           `<T as std::convert::TryInto<usize>>::Error : std::fmt::Debug`

@ marco9999 рдЖрдк рд╢рд╛рдпрдж рдПрдХ рд╕рд╛рдорд╛рдиреНрдп рдмрд╛рдзрд╛ рдЦреЛ рд░рд╣реЗ рд╣реИрдВред TryFromIntError рдХреЗрд╡рд▓ рдХреБрдЫ рдкреНрд░рдХрд╛рд░реЛрдВ рджреНрд╡рд╛рд░рд╛ рдЙрдкрдпреЛрдЧ рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИ, рд▓реЗрдХрд┐рди рдЖрдкрдХрд╛ рдЯреА рдХреБрдЫ рднреА рд╣реЛ рд╕рдХрддрд╛ рд╣реИ:

fn foo<T: TryInto<u8>>(x: T) -> u8
where
    <T as TryInto<u8>>::Error: Debug,
{
    x.try_into().unwrap()
}

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

рдореБрдЭреЗ assert_eq!(some_value, std::num::TryFromIntError(())); рдЪрд╛рд╣рд┐рдП

@icefoxen TryFromIntError рд╕реЗ рдЬреБрдбрд╝рд╛ рдХреЛрдИ рдЙрдкрдпреЛрдЧреА рдореВрд▓реНрдп рдирд╣реАрдВ рд╣реИ, рдЗрд╕рд▓рд┐рдП рдЗрд╕ рддрд░рд╣ рдХреЗ рджрд╛рд╡реЗ рдХрд╛ рдЕрдзрд┐рдХ рдореВрд▓реНрдп рдирд╣реАрдВ рд▓рдЧрддрд╛ рд╣реИред рдпрджрд┐ рдЖрдкрдХреЗ рдкрд╛рд╕ Result<_, TryFromIntError> рд╣реИ рдФрд░ рдпрд╣ Err рд╣реИ, рддреЛ рдЗрд╕рдХрд╛ рдХреЛрдИ рдЕрдиреНрдп рдореВрд▓реНрдп рдирд╣реАрдВ рд╣реЛ рд╕рдХрддрд╛ рд╣реИред

assert!(some_value_result.is_err());

рдпрд╣ рдореБрдЭреЗ рдЙрдЪрд┐рдд рд▓рдЧрддрд╛ рд╣реИред

рдХреНрд░реЙрд╕-рд░реЗрдлрд╝рд░реЗрдВрд╕рд┐рдВрдЧ: https://github.com/rust-lang/rust/pull/58302

рдзрдиреНрдпрд╡рд╛рдж @glaebhoerlред

рдПрдХ рдЕрд╡рд░реБрджреНрдз рдмрдЧ рдХреЗ рдареАрдХ рд╣реЛрдиреЗ рдХреЗ рдХрд╛рд░рдг (https://github.com/rust-lang/rust/issues/49593) рдореИрдВ рдЙрдореНрдореАрдж рдХрд░ рд░рд╣рд╛ рдерд╛ рдХрд┐ рдХрднреА рднреА рдкреНрд░рдХрд╛рд░ рдХреЛ рдЬрд▓реНрдж рд╣реА рд╕реНрдерд┐рд░ рдирд╣реАрдВ рдХрд┐рдпрд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИ https://github.com/rust-lang/ рдЬрдВрдЧ/рдореБрджреНрджреЛрдВ/57012 рдФрд░ рдЗрд╕реЗ рдЕрдирдмреНрд▓реЙрдХ рдХрд░реЗрдВред рд╣рд╛рд▓рд╛рдБрдХрд┐ рдПрдХ рдирдпрд╛ рдореБрджреНрджрд╛ (https://github.com/rust-lang/rust/issues/57012#issuecomment-460740678) рд╕рд╛рдордиреЗ рдЖрдпрд╛ рд╣реИ, рдФрд░ рд╣рдо рдПрдХ рджреВрд╕рд░реЗ рдкрд░ рднреА рдЖрдо рд╕рд╣рдорддрд┐ рдирд╣реАрдВ рд░рдЦрддреЗ рд╣реИрдВ (https://github.com /рдЬрдВрдЧ-рд▓рдВрдЧ/рдЬрдВрдЧ/рдореБрджреНрджреЗ/57012#рдЗрд╢реНрдпреВ рдХрдореЗрдВрдЯ-449098855)ред

рддреЛ рдкрд┐рдЫрд▓реЗ рд╣рдлреНрддреЗ рдПрдХ libs рдмреИрдардХ рдореЗрдВ рдореИрдВрдиреЗ рдлрд┐рд░ рд╕реЗ рд╡рд┐рдЪрд╛рд░ рд▓рд╛рдпрд╛, рдореЗрд░рд╛ рдорд╛рдирдирд╛ тАЛтАЛтАЛтАЛрд╣реИ рдХрд┐ рдкрд╣рд▓реЗ @scottmcm рджреНрд╡рд╛рд░рд╛ рдкреНрд░рд╕реНрддрд╛рд╡рд┐рдд https://github.com/rust-lang/rust/issues/33417#issuecomment -299124605, TryFrom рдХреЛ рд╕реНрдерд┐рд░ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП TryInto рдмрд┐рдирд╛ рдХрд┐рд╕реА рдкреНрд░рдХрд╛рд░ рдХреЗ, рдФрд░ рдЗрд╕рдХреЗ рдмрдЬрд╛рдп рдПрдХ рдЦрд╛рд▓реА рдПрдирдо рд╣реИ рдЬрд┐рд╕реЗ рдмрд╛рдж рдореЗрдВ рдПрдХ рдЙрдкрдирд╛рдо рдмрдирд╛рдпрд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИ ! ред

рдкрд┐рдЫрд▓реА рдмрд╛рд░ рд╣рдордиреЗ рдЗрд╕ рдкрд░ рдЪрд░реНрдЪрд╛ рдХреА рдереА (https://github.com/rust-lang/rust/issues/33417#issuecomment-423069246), рд╣рдореЗрдВ рдпрд╛рдж рдирд╣реАрдВ рдЖрдпрд╛ рдХрд┐ рд╣рдордиреЗ рдкрд┐рдЫрд▓реА рдмрд╛рд░ рдРрд╕рд╛ рдХреНрдпреЛрдВ рдирд╣реАрдВ рдХрд┐рдпрд╛ рдерд╛ред

рдкрд┐рдЫрд▓реЗ рд╣рдлреНрддреЗ @dtolnay рдиреЗ рд╣рдореЗрдВ рдЗрд╕ рдореБрджреНрджреЗ рдХреА рдпрд╛рдж рджрд┐рд▓рд╛ рджреА: ! рдПрдХ рдкреВрд░реНрдг рдкреНрд░рдХрд╛рд░ рдмрдирдиреЗ рд╕реЗ рдкрд╣рд▓реЗ, рдпрд╣ рдкрд╣рд▓реЗ рд╕реЗ рд╣реА рдлрд╝рдВрдХреНрд╢рди рдХреЗ рд░рд┐рдЯрд░реНрди рдкреНрд░рдХрд╛рд░ рдХреЗ рд╕реНрдерд╛рди рдкрд░ рдЙрдкрдпреЛрдЧ рдХрд┐рдпрд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИ рдпрд╣ рдЗрдВрдЧрд┐рдд рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдХрд┐ рдпрд╣ рдХрднреА рд╡рд╛рдкрд╕ рдирд╣реАрдВ рдЖрддрд╛ рд╣реИред рдЗрд╕рдореЗрдВ рдлрд╝рдВрдХреНрд╢рди рдкреЙрдЗрдВрдЯрд░ рдкреНрд░рдХрд╛рд░ рд╢рд╛рдорд┐рд▓ рд╣реИрдВред рддреЛ, рдЗрд╕ рдЪрдХреНрд░ рдореЗрдВ https://github.com/rust-lang/rust/pull/58302 рднреВрдорд┐ рдорд╛рдирддреЗ рд╣реБрдП, рдЗрд╕ рддрд░рд╣ рдХрд╛ рдХреЛрдб рдЬрдВрдЧ 1.34.0 рдореЗрдВ рдорд╛рдиреНрдп рд╣реЛрдЧрд╛:

use std::convert::Infallible;
trait MyTrait {}
impl MyTrait for fn() -> ! {}
impl MyTrait for fn() -> Infallible {}

рдЪреВрдВрдХрд┐ fn() -> ! рдФрд░ fn() -> Infallible рджреЛ рдЕрд▓рдЧ-рдЕрд▓рдЧ (рд╕реВрдЪрдХ) рдкреНрд░рдХрд╛рд░ рд╣реИрдВ, рдЗрд╕рд▓рд┐рдП рджреЛ рдЗрдореНрдкреНрд▓рд╛рдВрдЯ рдУрд╡рд░рд▓реИрдк рдирд╣реАрдВ рд╣реЛрддреЗ рд╣реИрдВред рд▓реЗрдХрд┐рди рдЕрдЧрд░ рд╣рдо рдЦрд╛рд▓реА рдПрдирдо рдХреЛ pub type Infallible = !; рдкреНрд░рдХрд╛рд░ рдХреЗ рдЙрдкрдирд╛рдо рд╕реЗ рдмрджрд▓ рджреЗрддреЗ рд╣реИрдВ (рдЬрдм ! рдПрдХ рдкреВрд░реНрдг рдкреНрд░рдХрд╛рд░ рдмрди рдЬрд╛рддрд╛ рд╣реИ), рддреЛ рджреЛ рдЗрдореНрдкреНрд▓рд╛рдВрдЯ рдУрд╡рд░рд▓реИрдк рд╣реЛрдиреЗ рд▓рдЧреЗрдВрдЧреЗ рдФрд░ рдЙрдкрд░реЛрдХреНрдд рдЬреИрд╕рд╛ рдХреЛрдб рдЯреВрдЯ рдЬрд╛рдПрдЧрд╛ред

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

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

рдЗрд╕ рдЪрд░реНрдЪрд╛ рдХреЗ рдЖрдзрд╛рд░ рдкрд░, рдореИрдВрдиреЗ https://github.com/rust-lang/rust/pull/58302 рд╕рдмрдорд┐рдЯ рдХрд┐рдпрд╛ рдЬреЛ рдЕрдм рдЕрдВрддрд┐рдо рдЯрд┐рдкреНрдкрдгреА рдЕрд╡рдзрд┐ рдореЗрдВ рд╣реИред

58015 рдЕрдм рд╕рдореАрдХреНрд╖рд╛/рд╡рд┐рд▓рдп рдХреЗ рд▓рд┐рдП рддреИрдпрд╛рд░ рд╣реЛрдирд╛ рдЪрд╛рд╣рд┐рдПред

@kennytm рдХреНрдпрд╛ рдкрд╣рд▓реЗ рд╕реЗ рд╣реА рд╕реНрдерд┐рд░ рдореЗрдВ ! рдХреЛ рд╕рдВрджрд░реНрднрд┐рдд рдХрд░рдирд╛ рд╕рдВрднрд╡ рдирд╣реАрдВ рд╣реИ? рдЙрджрд╛рд╣рд░рдг рдХреЗ рд▓рд┐рдП, рдирд┐рдореНрдирд▓рд┐рдЦрд┐рдд рдкрд░ рд╡рд┐рдЪрд╛рд░ рдХрд░реЗрдВ:

trait MyTrait {
    type Output;
}

impl<T> MyTrait for fn() -> T {
    type Output = T;
}

type Void = <fn() -> ! as MyTrait>::Output;

рдРрд╕рд╛ рдХрд░рдиреЗ рдХреЗ рдмрд╛рдж, Void ! рдкреНрд░рдХрд╛рд░ рдХреЛ рд╕рдВрджрд░реНрднрд┐рдд рдХрд░рддрд╛ рд╣реИред

рдпрд╣ рдПрдХ рдмрдЧ рдЬреИрд╕рд╛ рджрд┐рдЦрддрд╛ рд╣реИ, рдЬрд┐рд╕рдХрд╛ рдЕрд░реНрде рд╣реИ рдХрд┐ рд╕реНрдерд┐рд░рддрд╛ рдХреА рдЧрд╛рд░рдВрдЯреА рдЗрд╕рдХрд╛ рд╡рд┐рд╕реНрддрд╛рд░ рдирд╣реАрдВ рдХрд░рддреА рд╣реИред рдиреЗрд╡рд░ рдЯрд╛рдЗрдк ( ! ) рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд┐рд╕реА рднреА рдХреНрд╖рдорддрд╛ рдореЗрдВ рдПрдХ рдкреНрд░рдХрд╛рд░ рдХреЗ рд░реВрдк рдореЗрдВ рдЕрднреА рднреА рдЕрд╕реНрдерд┐рд░ рд╣реИ, рдХрдо рд╕реЗ рдХрдо #57012 рд╡рд┐рд▓рдп рд╣реЛрдиреЗ рддрдХред

рдореИрдВ рджрд╕реНрддрд╛рд╡реЗрдЬрд╝реАрдХрд░рдг рдореЗрдВ рдХреИрд╕реЗ рдорджрдж рдХрд░ рд╕рдХрддрд╛ рд╣реВрдБ? :-)

рдУрд╣, рдореИрдВрдиреЗ рд╕реЛрдЪрд╛ рдерд╛ рдХрд┐ https://github.com/rust-lang/rust/pull/58015 рдЙрддрд░рд╛ рдерд╛, рд▓реЗрдХрд┐рди рдпрд╣ рдЕрднреА рддрдХ рдирд╣реАрдВ рдЖрдпрд╛ рд╣реИ... рдЖрдЗрдП рдЗрд╕рдХреА рдЪрд░реНрдЪрд╛ рдХрд░реЗрдВред

рдХреНрдпрд╛ TryFrom рд╡рд┐рд╢реЗрд╖рддрд╛ рдореЗрдВ рдпрд╣ рдЬрд╛рдВрдЪрдиреЗ рдХрд╛ рдПрдХ рддрд░реАрдХрд╛ рд╣реЛ рд╕рдХрддрд╛ рд╣реИ рдХрд┐ рдХреНрдпрд╛ рддрд░реНрдХ рдХреЛ рдмрд┐рдирд╛ рдЙрдкрднреЛрдЧ рдХрд┐рдП рдкрд░рд┐рд╡рд░реНрддрд┐рдд рдХрд┐рдпрд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИ?

fn check(value: &T) -> bool

рдЧреИрд░-рдЙрдкрднреЛрдЧ рдЕрд╕рдВрднрд╡ рд░реВрдкрд╛рдВрддрд░рдг рдХреЗ рд╕рд╛рде рдХрд╛рдо рдХрд░рдиреЗ рдХрд╛ рдПрдХ рддрд░реАрдХрд╛ рд╕рдВрдмрдВрдзрд┐рдд рддреНрд░реБрдЯрд┐ рдХреЗ рд╕рд╛рде рдЙрдкрднреЛрдЧ рдХрд┐рдП рдЧрдП рдЧреИрд░-рдкрд░рд┐рд╡рд░реНрддрдиреАрдп рдореВрд▓реНрдп рдХреЛ рд╡рд╛рдкрд╕ рдХрд░рдирд╛ рд╣реЛ рд╕рдХрддрд╛ рд╣реИред

рдЙрдлрд╝ рдЗрд╕реЗ https://github.com/rust-lang/rust/pull/58302 рджреНрд╡рд╛рд░рд╛ рдмрдВрдж рдХрд░ рджрд┐рдпрд╛ рдЬрд╛рдирд╛ рдЪрд╛рд╣рд┐рдП рдерд╛ред рдЕрдм рдмрдВрдж рд╣реЛ рд░рд╣рд╛ рд╣реИред


@ o01eg рдЧреИрд░-рдЦрдкрдд рд░реВрдкрд╛рдВрддрд░рдг рдХрд░рдиреЗ рдХрд╛ рд╕рд╛рдорд╛рдиреНрдп рддрд░реАрдХрд╛ рд▓рд╛рдЧреВ рдХрд░рдирд╛ рд╣реИ рдЬреИрд╕реЗ TryFrom<&'_ Foo> рдХреЗ рдмрдЬрд╛рдп TryFrom<Foo> ред

рд░реБрдХреЛ...рдпрд╣ рд╡рд╛рд╕реНрддрд╡ рдореЗрдВ рд╕реНрдерд┐рд░ рдЧреБрд░реБрд╡рд╛рд░ рдХреЛ рдЙрддрд░рдиреЗ рддрдХ рдмрдВрдж рдирд╣реАрдВ рд╣реЛрдирд╛ рдЪрд╛рд╣рд┐рдП, рд╣реИ рдирд╛?

рдирд╣реАрдВ, рдЬрдм рдкреАрдЖрд░ рдлреАрдЪрд░ рдХреЛ рд╕реНрдерд┐рд░ рдХрд░рддрд╛ рд╣реИ рддреЛ рд╣рдо рдЯреНрд░реИрдХрд┐рдВрдЧ рдореБрджреНрджреЛрдВ рдХреЛ рдмрдВрдж рдХрд░ рджреЗрддреЗ рд╣реИрдВред

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

рдЯреНрд░реИрдХрд┐рдВрдЧ рдореБрджреНрджреЛрдВ рдХреЛ рдкреАрдЖрд░ рджреНрд╡рд╛рд░рд╛ рдмрдВрдж рдХрд░ рджрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИ рдЬреЛ рдЙрдиреНрд╣реЗрдВ рд╕реНрдерд┐рд░ рдХрд░рддрд╛ рд╣реИред рд░рд┐рд▓реАрдЬ рдЪрдХреНрд░ рдХреЗ рдЖрдзрд╛рд░ рдкрд░, рд╕реНрдерд┐рд░ рд░рд┐рд▓реАрдЬ рд╣реЛрдиреЗ рд╕реЗ рдкрд╣рд▓реЗ рдпрд╣ 12 рд╕рдкреНрддрд╛рд╣ рддрдХ рд╣реЛ рд╕рдХрддрд╛ рд╣реИред

рд╕рдордЭ рд▓рд┐рдпрд╛ред рд╕реНрдкрд╖реНрдЯреАрдХрд░рдг рдХреЗ рд▓рд┐рдП рдзрдиреНрдпрд╡рд╛рдж, рд╕рдм рд▓реЛрдЧ! :)

@gregdegruy рдЬрдВрдЧ рдХреЗ рдЕрдкрдиреЗ рд╕рдВрд╕реНрдХрд░рдг рдХреЛ 1.34 рдпрд╛ рдЙрдЪреНрдЪрддрд░ рдкрд░ рдЕрдкрдбреЗрдЯ рдХрд░реЗрдВред

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

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

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

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

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

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

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