Rust: рд╡рд┐рд╢реЗрд╖рдЬреНрдЮрддрд╛ рдХреЗ рд▓рд┐рдП рдЯреНрд░реИрдХрд┐рдВрдЧ рдореБрджреНрджрд╛ (RFC 1210)

рдХреЛ рдирд┐рд░реНрдорд┐рдд 23 рдлрд╝рд░ре░ 2016  ┬╖  236рдЯрд┐рдкреНрдкрдгрд┐рдпрд╛рдБ  ┬╖  рд╕реНрд░реЛрдд: rust-lang/rust

рдпрд╣ рд╡рд┐рд╢реЗрд╖рдЬреНрдЮрддрд╛ рдХреЗ рд▓рд┐рдП рдПрдХ рдЯреНрд░реИрдХрд┐рдВрдЧ рдореБрджреНрджрд╛ рд╣реИ (рдЬрдВрдЧ-рд▓рдВрдЧ / rfcs # 1210)ред

рдкреНрд░рдореБрдЦ рдХрд╛рд░реНрдпрд╛рдиреНрд╡рдпрди рдХрджрдо:

  • [x] рднреВрдорд┐ https://github.com/rust-lang/rust/pull/30652 =)
  • [] рдЬреАрд╡рди рднрд░ рдкреНрд░реЗрд╖рдг рдкрд░ рдкреНрд░рддрд┐рдмрдВрдз (рд╡рд░реНрддрдорд╛рди рдореЗрдВ рдПрдХ рдзреНрд╡рдирд┐ рдЫреЗрдж )
  • [] default impl (https://github.com/rust-lang/rust/issues/37653)
  • [] рдЬреБрдбрд╝реЗ рд╣реБрдП const рдХреЗ рд╕рд╛рде рдПрдХреАрдХрд░рдг
  • [] рд╕реАрдорд╛рдПрдВ рд╣рдореЗрд╢рд╛ рдареАрдХ рд╕реЗ рд▓рд╛рдЧреВ рдирд╣реАрдВ рд╣реЛрддреА рд╣реИрдВ (https://github.com/rust-lang/rust/issues/33017)
  • [] рдХреНрдпрд╛ рдорд╛рддрд╛-рдкрд┐рддрд╛ рдХреЗ рдкрд╛рд╕ default рд╕рджрд╕реНрдп рдирд╣реАрдВ рд╣реЛрдиреЗ рдкрд░ рд╣рдореЗрдВ рдЦрд╛рд▓реА рдЗрдореНрдкреНрд▓рд╛рдВрдЯ рдХреА рдЕрдиреБрдорддрд┐ рджреЗрдиреА рдЪрд╛рд╣рд┐рдП? https://github.com/rust-lang/rust/issues/48444
  • [] рд▓рд╛рдЧреВ рдХрд░реЗрдВ "рд╣рдореЗрд╢рд╛ рд▓рд╛рдЧреВ" рдХрд╛ рдЕрд░реНрде рд╣реИ https://github.com/rust-lang/rust/issues/48538
  • [] рд╡рд┐рд╢реЗрд╖рдЬреНрдЮрддрд╛ рдЧреНрд░рд╛рдл рдмрдирд╛рдиреЗ рдХреЗ рдЖрд╕рдкрд╛рд╕ рдХреА рд╕рдЯреАрдХ рдЪрдХреНрд░ рд╕реНрдерд┐рддрд┐рдпреЛрдВ рдХрд╛ рд╡рд░реНрдгрди рдФрд░ рдкрд░реАрдХреНрд╖рдг рдХрд░реЗрдВ (рдЙрджрд╛рд╣рд░рдг рдХреЗ рд▓рд┐рдП рдЗрд╕ рдЯрд┐рдкреНрдкрдгреА рдХреЛ рджреЗрдЦреЗрдВ, рдЬрд┐рд╕рдореЗрдВ рдЙрд▓реНрд▓реЗрдЦ рдХрд┐рдпрд╛ рдЧрдпрд╛ рд╣реИ рдХрд┐ рд╣рдорд╛рд░реЗ рдпрд╣рд╛рдБ рдХреБрдЫ рдмрд╣реБрдд рд╕рд╛рд╡рдзрд╛рдирд┐рдпрд╛рдБ рд╣реИрдВ)

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

  • рдХреНрдпрд╛ рд╕рдВрдмрджреНрдз рдкреНрд░рдХрд╛рд░ рд╡рд┐рд╢рд┐рд╖реНрдЯ рд╣реЛрдирд╛ рдЪрд╛рд╣рд┐рдП?
  • рдкреНрд░рдХреНрд╖реЗрдкрдг рдХреЛ default type рдХрдм рдкреНрд░рдХрдЯ рдХрд░рдирд╛ рдЪрд╛рд╣рд┐рдП? рдЯрд╛рдЗрдкрдХ рдХреЗ рджреМрд░рд╛рди рдХрднреА рдирд╣реАрдВ? рдпрд╛ рдЬрдм рдореЛрдиреЛрдореЛрд░реНрдлрд┐рдХ?
  • рдХреНрдпрд╛ рдбрд┐рдлрд╝реЙрд▓реНрдЯ рд╡рд┐рд╢реЗрд╖рддрд╛ рдЖрдЗрдЯрдо рдХреЛ default (рдЕрд░реНрдерд╛рдд рд╡рд┐рд╢реЗрд╖) рдорд╛рдирд╛ рдЬрд╛рдирд╛ рдЪрд╛рд╣рд┐рдП?
  • рдХреНрдпрд╛ рд╣рдорд╛рд░реЗ рдкрд╛рд╕ default impl (рдЬрд╣рд╛рдВ рд╕рднреА рдЖрдЗрдЯрдо default ) рдпрд╛ partial impl (рдЬрд╣рд╛рдВ default рдСрдкреНрдЯ-рдЗрди рд╣реИ); рджреЗрдЦрд┐рдП https://github.com/rust-lang/rust/issues/37653#issuecomment -616116577 рдХреЗ рдХреБрдЫ рдкреНрд░рд╛рд╕рдВрдЧрд┐рдХ рдЙрджрд╛рд╣рд░рдгреЛрдВ рдХреЗ рд▓рд┐рдП рдЬрд╣рд╛рдВ default impl рд╕реАрдорд┐рдд рд╣реИред
  • рд╣рдореЗрдВ рдЬреАрд╡рди рднрд░ рдХреА рд╡реИрдордирд╕реНрдпрддрд╛ рд╕реЗ рдХреИрд╕реЗ рдирд┐рдкрдЯрдирд╛ рдЪрд╛рд╣рд┐рдП?

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

A-specialization A-traits B-RFC-approved B-RFC-implemented B-unstable C-tracking-issue F-specialization T-lang

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

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

#![feature(rustc_attrs, min_specialization)]

рддрдм рдпрджрд┐ рдЖрдкрдХреЛ рдПрдХ _specialization predicate_ рд▓рдХреНрд╖рдг рдмрдирд╛рдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реИ рдЬреИрд╕рд╛ рдХрд┐ рдЕрдзрд┐рдХрддрдо рдиреНрдпреВрдирддрдо рд╡рд┐рд╢реЗрд╖рдЬреНрдЮрддрд╛ рдореЗрдВ рд╕рдордЭрд╛рдпрд╛ рдЧрдпрд╛ рд╣реИ рддреЛ рдЖрдк #[rustc_specialization_trait] рд╕рд╛рде рд╡рд┐рд╢реЗрд╖рддрд╛ рдШреЛрд╖рдгрд╛ рдХреЛ рдЪрд┐рд╣реНрдирд┐рдд рдХрд░рддреЗ рд╣реИрдВред

рдЗрд╕ рдлрд╛рдЗрд▓ рдореЗрдВ рдореЗрд░рд╛ рд╕рд╛рд░рд╛ рд╕реНрдкреЗрд╢рд▓рд╛рдЗрдЬреЗрд╢рди рдХрд┐рдпрд╛ рдЧрдпрд╛ рд╣реИ рдФрд░ рдпрд╣рд╛рдБ рдПрдХ рд╡рд┐рд╢реЗрд╖рдЬреНрдЮрддрд╛ рдХреЗ

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

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

https://github.com/LLFourn/secp256kfun/blob/6766b60c02c99ca24f816801fe876fed79643c3a/secp25kkfun/src/op.rs#L196 -L206

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

рдРрд╕рд╛ рд▓рдЧрддрд╛ рд╣реИ рдХрд┐ рдпрд╣ рд╕рдм рдХреБрдЫ рд╕рд░рд▓ рдерд╛ рдпрджрд┐ рдЖрдк рдХреБрдЫ рд╡рд┐рд╢реЗрд╖ рдХрд░рдиреЗ рдпреЛрдЧреНрдп рдереЗ рдФрд░ рдЬрдм рдЖрдк рдХреБрдЫ рдРрд╕рд╛ рдХрд░рддреЗ рд╣реИрдВ рддреЛ рдЖрдк рдареАрдХ-рдареАрдХ рдШреЛрд╖рдгрд╛ рдХрд░рддреЗ рд╣реИрдВ, рдЬреЛ рдЖрдкрдХреЛ рд╡рд┐рд╢реЗрд╖рдЬреНрдЮрддрд╛ рдкреНрд░рджрд╛рди рдХрд░рддреЗ рд╣реИрдВред RFC рдореЗрдВ рдЙрджрд╛рд╣рд░рдг рдкреНрд░рд╕реНрддреБрдд рдХрд░рдирд╛ рдХрд┐ рдореЗрд░реЗ рдорди рдореЗрдВ рдХреНрдпрд╛ рдерд╛:

impl<A, T> Extend<A, T> for Vec<A> where T: IntoIterator<Item=A>
{
    // no need for default
    fn extend(&mut self, iterable: T) {
        ...
    }
}

// We declare explicitly which impl we are specializing repeating all type bounds etc
specialize impl<A, T> Extend<A, T> for Vec<A> where T: IntoIterator<Item=A>
    // And then we declare explicitly how we are making this impl narrower with тАШwhenтАЩ.
    // i.e. This impl is like the first except replace all occurances of тАШTтАЩ with тАШ&'a [A]тАЩ
    when<'a> T = &'a [A]
{
    fn extend(&mut self, iterable: &'a [A]) {
        ...
    }
}

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

рдХреБрдЫ рдЕрддрд┐рд░рд┐рдХреНрдд рдЦреБрд▓реЗ рдкреНрд░рд╢реНрди:

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

рдореБрдЭреЗ рдпрдХреАрди рдирд╣реАрдВ рд╣реИ рдХрд┐ рд╡рд┐рд╢реЗрд╖рдЬреНрдЮрддрд╛ рдЕрдирд╛рде рдирд┐рдпрдореЛрдВ рдХреЛ рдмрджрд▓ рджреЗрддреА рд╣реИ:

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

рдЗрд╕рд╕реЗ рднреА рдмрджрддрд░, "рднрд╡рд┐рд╖реНрдп рдХреА рдЕрдиреБрдХреВрд▓рддрд╛" рдЕрдирд╛рде рдирд┐рдпрдо рдмрд╣реБрдд рднрд╛рд░реА рдирд┐рдпрдВрддреНрд░рдг рдореЗрдВ рдХреНрд░реЙрд╕-рдЯреЛрдХрд░рд╛ рд╡рд┐рд╢реЗрд╖рдЬреНрдЮрддрд╛ рд░рдЦрддреЗ рд╣реИрдВред рдЙрдирдХреЗ рдмрд┐рдирд╛, рдЙрдирдХреЗ рддрд░реАрдХреЛрдВ рдХреЛ рдЦреБрд▓рд╛ рдЫреЛрдбрд╝рдиреЗ рдХреЗ рдбрд┐рдлрд╝реЙрд▓реНрдЯ-рдмрд╣реБрдд рдЕрдзрд┐рдХ рдмреБрд░реЗ рд╣реЛ рдЬрд╛рддреЗ рд╣реИрдВред

рдореБрдЭреЗ рд╕реНрдкрд╖реНрдЯ рдирдХрд╛рд░рд╛рддреНрдордХ рддрд░реНрдХ рдкрд╕рдВрдж рдирд╣реАрдВ рдЖрдпрд╛ред рдореБрдЭреЗ рд▓рдЧрддрд╛ рд╣реИ рдХрд┐ рдХреБрд▓ рдирдХрд╛рд░рд╛рддреНрдордХ рддрд░реНрдХ рд╡рд┐рд╢реЗрд╖рдЬреНрдЮрддрд╛ рдкреНрд░рджрд╛рди рдХрд░рддрд╛ рд╣реИ рдПрдХ рдЕрдЪреНрдЫрд╛ рд╕рдордЭреМрддрд╛ рд╣реИред

рдХреНрдпрд╛ рдЗрд╕ рдирд┐рд╣рд┐рддрд╛рд░реНрде рдХреЛ рд╡рд┐рд╢реЗрд╖рдЬреНрдЮрддрд╛ рдХреЗ рд╕рд╛рде рд▓рд╛рдЧреВ рдХрд┐рдпрд╛ рдЬрд╛рдирд╛ рдЪрд╛рд╣рд┐рдП? рдпрд╛ рдХреНрдпрд╛ рдореИрдВ рдХреБрдЫ рди рдХреБрдЫ рднреВрд▓ рд░рд╣рд╛ рд╣реВрдВ?
http://is.gd/3Ul0pe

рдЗрд╕ рдПрдХ рдХреЗ рд╕рд╛рде рднреА, рдпрд╣ рд╕рдВрдХрд▓рди рдХрд░рдиреЗ рдХреА рдЙрдореНрдореАрдж рдХреА рд╣реЛрдЧреА: http://is.gd/RyFIEl

рд▓рдЧрддрд╛ рд╣реИ рдХрд┐ рдЬрдм рд╕рдВрдмрдВрдзрд┐рдд рдкреНрд░рдХрд╛рд░ рд╢рд╛рдорд┐рд▓ рд╣реЛрддреЗ рд╣реИрдВ рддреЛ рдУрд╡рд░рд▓реИрдк рдХрд╛ рдирд┐рд░реНрдзрд╛рд░рдг рдХрд░рдиреЗ рдореЗрдВ рдХреБрдЫ рд╡рд┐рдЪрд┐рддреНрд░рддрд╛рдПрдБ рд╣реЛрддреА рд╣реИрдВред рдпрд╣ рд╕рдВрдХрд▓рд┐рдд рдХрд░рддрд╛ рд╣реИ: http://is.gd/JBPzIX , рдЬрдмрдХрд┐ рдпрд╣ рдкреНрд░рднрд╛рд╡реА рд░реВрдк рд╕реЗ рд╕рдорд╛рди рдХреЛрдб рдирд╣реАрдВ рд╣реИ: http://is.gd/0JLLX

рдпрд╣рд╛рдБ рд╡рд┐рд╢реЗрд╖рдЬреНрдЮрддрд╛ рдХреЗ рд╕рд╛рде рд╕рдВрдХрд▓рди рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдЕрдкреЗрдХреНрд╖рд┐рдд рдХреЛрдб рдХрд╛ рдПрдХ рдЯреБрдХрдбрд╝рд╛ рд╣реИ:

http://is.gd/3BNbfK

#![feature(specialization)]

use std::str::FromStr;

struct Error;

trait Simple<'a> {
    fn do_something(s: &'a str) -> Result<Self, Error>;
}

impl<'a> Simple<'a> for &'a str {
     fn do_something(s: &'a str) -> Result<Self, Error> {
        Ok(s)
    }
}

impl<'a, T: FromStr> Simple<'a> for T {
    fn do_something(s: &'a str) -> Result<Self, Error> {
        T::from_str(s).map_err(|_| Error)
    }
}

fn main() {
    // Do nothing. Just type check.
}

рдХрдВрдкрд╛рдЗрд▓рд░ рдХрд╛рд░реНрдпрд╛рдиреНрд╡рдпрди рд╕рдВрдШрд░реНрд╖реЛрдВ рдХрд╛ рд╣рд╡рд╛рд▓рд╛ рджреЗрддреЗ рд╣реБрдП рдХрдВрдкрд╛рдЗрд▓рд░ рдХреЗ рд╕рд╛рде рд╡рд┐рдлрд▓ рд╣реЛ рдЬрд╛рддрд╛ рд╣реИред рдзреНрдпрд╛рди рджреЗрдВ рдХрд┐ &str FromStr рд▓рд╛рдЧреВ рдирд╣реАрдВ рд╣реЛрддрд╛ рд╣реИ, рдЗрд╕рд▓рд┐рдП рд╡рд┐рд░реЛрдз рдирд╣реАрдВ рд╣реЛрдирд╛ рдЪрд╛рд╣рд┐рдПред

@sgrif

рдореЗрд░реЗ рдкрд╛рд╕ рдкрд╣рд▓реЗ рджреЛ рдЙрджрд╛рд╣рд░рдгреЛрдВ рдХреЛ рджреЗрдЦрдиреЗ рдХрд╛ рд╕рдордп рдерд╛ред рдпрд╣рд╛рдБ рдореЗрд░реЗ рдиреЛрдЯреНрд╕ рд╣реИрдВред

рдЙрджрд╛рд╣рд░рдг 1

рдкрд╣рд▓рд╛ рдорд╛рдорд▓рд╛, рдЖрдкрдХреЗ рдкрд╛рд╕ рд╣реИ:

  • FromSqlRow<ST, DB> for T where T: FromSql<ST, DB>
  • FromSqlRow<(ST, SU), DB> for (T, U) where T: FromSqlRow<ST, DB>, U: FromSqlRow<SU, DB>,

рд╕рдорд╕реНрдпрд╛ рдпрд╣ рд╣реИ рдХрд┐ рдпреЗ рдУрд╡рд░рд▓реИрдк рдХрд░рддреЗ рд╣реИрдВ рд▓реЗрдХрд┐рди рди рддреЛ рдЕрдиреНрдп рдХреА рддреБрд▓рдирд╛ рдореЗрдВ рдЕрдзрд┐рдХ рд╡рд┐рд╢рд┐рд╖реНрдЯ рд╣реИрдВ:

  • рдЖрдкрдХреЗ рдкрд╛рд╕ рд╕рдВрднрд╛рд╡рд┐рдд рд░реВрдк рд╕реЗ T: FromSql<ST, DB> рдЬрд╣рд╛рдБ T рдПрдХ рдЬреЛрдбрд╝реА рдирд╣реАрдВ рд╣реИ (рдЗрд╕рд▓рд┐рдП рдпрд╣ рдкрд╣рд▓реА рдмрд╛рд░ рдХреЗ рдирд┐рд╣рд┐рддрд╛рд░реНрде рд╕реЗ рдореЗрд▓ рдЦрд╛рддрд╛ рд╣реИ, рд▓реЗрдХрд┐рди рджреВрд╕рд░реЗ рд╕реЗ рдирд╣реАрдВ)ред
  • рдЖрдкрдХреЗ рдкрд╛рд╕ рд╕рдВрднрд╛рд╡рд┐рдд рд░реВрдк рд╕реЗ (T, U) :

    • T: FromSqlRow<ST, DB> ,

    • U: FromSqlRow<SU, DB> , рд▓реЗрдХрд┐рди _not_

    • (T, U): FromSql<(ST, SU), DB>

    • (рдЗрд╕рд▓рд┐рдП рджреВрд╕рд░рд╛ рдЕрдВрддрд░реНрдирд┐рд╣рд┐рдд рдореИрдЪ, рд▓реЗрдХрд┐рди рдкрд╣рд▓реЗ рдирд╣реАрдВ)

  • рджреЛ рдУрд╡рд░рд▓реИрдк рд╣реЛрддреЗ рд╣реИрдВ рдХреНрдпреЛрдВрдХрд┐ рдЖрдкрдХреЗ рдкрд╛рд╕ (T, U) рдРрд╕реЗ рд╣реЛ рд╕рдХрддреЗ рд╣реИрдВ:

    • T: FromSqlRow<ST, DB>

    • U: FromSqlRow<SU, DB>

    • (T, U): FromSql<(ST, SU), DB>

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

рдЙрджрд╛рд╣рд░рдг 2

рдЖрдкрдХреЗ рдкрд╛рд╕:

  • Queryable<ST, DB> for T where T: FromSqlRow<ST, DB>
  • Queryable<Nullable<ST>, DB> for Option<T> where T: Queryable<ST, DB>

рдпреЗ рдУрд╡рд░рд▓реИрдк рдХреНрдпреЛрдВрдХрд┐ рдЖрдкрдХреЗ рдкрд╛рд╕ Option<T> рд╣реЛ рд╕рдХрддреЗ рд╣реИрдВ:

  • T: Queryable<ST, DB>
  • Option<T>: FromSqlRow<Nullable<ST>, DB>

рд▓реЗрдХрд┐рди рди рддреЛ рдирд┐рд╣рд┐рдд рдЕрдзрд┐рдХ рд╡рд┐рд╢рд┐рд╖реНрдЯ рд╣реИ:

  • рдЖрдкрдХреЗ рдкрд╛рд╕ T рдРрд╕реЗ рд╣реЛ рд╕рдХрддреЗ рд╣реИрдВ, рдЬреЛ T: FromSqlRow<ST, DB> рд▓реЗрдХрд┐рди T Option<U> (рдорд┐рд▓рд╛рди рдкрд╣рд▓реЗ рдирд┐рд╣рд┐рдд рд▓реЗрдХрд┐рди рджреВрд╕рд░реЗ рдирд╣реАрдВ)
  • рдЖрдкрдХреЗ рдкрд╛рд╕ Option<T> рдРрд╕реЗ рд╣реЛ рд╕рдХрддреЗ рд╣реИрдВ, рдЬреЛ T: Queryable<ST, DB> рд▓реЗрдХрд┐рди Option<T>: FromSqlRow<Nullable<ST>, DB>

@SergioBenitez

рдХрдВрдкрд╛рдЗрд▓рд░ рдХрд╛рд░реНрдпрд╛рдиреНрд╡рдпрди рд╕рдВрдШрд░реНрд╖реЛрдВ рдХрд╛ рд╣рд╡рд╛рд▓рд╛ рджреЗрддреЗ рд╣реБрдП рдХрдВрдкрд╛рдЗрд▓рд░ рдХреЗ рд╕рд╛рде рд╡рд┐рдлрд▓ рд╣реЛ рдЬрд╛рддрд╛ рд╣реИред рдзреНрдпрд╛рди рджреЗрдВ рдХрд┐ &str FromStr рд▓рд╛рдЧреВ рдирд╣реАрдВ рд╣реЛрддрд╛ рд╣реИ, рдЗрд╕рд▓рд┐рдП рд╡рд┐рд░реЛрдз рдирд╣реАрдВ рд╣реЛрдирд╛ рдЪрд╛рд╣рд┐рдПред

рд╕рдорд╕реНрдпрд╛ рдпрд╣ рд╣реИ рдХрд┐ рд╕рдВрдХрд▓рдХ рд░реВрдврд╝рд┐рд╡рд╛рджреА рд░реВрдк рд╕реЗ рдпрд╣ рдорд╛рди рд░рд╣рд╛ рд╣реИ рдХрд┐ &str рднрд╡рд┐рд╖реНрдп рдореЗрдВ FromStr рд▓рд╛рдЧреВ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдЖ рд╕рдХрддрд╛ рд╣реИред рдпрд╣ рдЗрд╕ рдЙрджрд╛рд╣рд░рдг рдХреЗ рд▓рд┐рдП рдореВрд░реНрдЦрддрд╛рдкреВрд░реНрдг рд▓рдЧ рд╕рдХрддрд╛ рд╣реИ, рд▓реЗрдХрд┐рди рд╕рд╛рдорд╛рдиреНрдп рддреМрд░ рдкрд░, рд╣рдо рд╣рд░ рд╕рдордп рдирдП рдЗрдореНрдкреНрд▓реЙрдЗрдЬ рдЬреЛрдбрд╝рддреЗ рд╣реИрдВ, рдФрд░ рдЬрдм рд╣рдо рдЙрди рдЗрдореНрдкреНрд▓рд╛рдВрдЯреНрд╕ рдХреЛ рдЬреЛрдбрд╝рддреЗ рд╣реИрдВ рддреЛ рд╣рдо рдбрд╛рдЙрдирд╕реНрдЯреНрд░реАрдо рдХреЛрдб рдХреЛ рдЯреВрдЯрдиреЗ рд╕реЗ рдмрдЪрд╛рдирд╛ рдЪрд╛рд╣рддреЗ рд╣реИрдВред

рдпрд╣ рдПрдХ рд░реВрдврд╝рд┐рд╡рд╛рджреА рд╡рд┐рдХрд▓реНрдк рд╣реИ, рдФрд░ рдХреБрдЫ рдРрд╕рд╛ рд╣реИ рдЬрд┐рд╕реЗ рд╣рдо рд╕рдордп рдХреЗ рд╕рд╛рде рдЖрд░рд╛рдо рдХрд░рдирд╛ рдЪрд╛рд╣рддреЗ рд╣реИрдВред рдЖрдк рдпрд╣рд╛рдБ рдкреГрд╖реНрдарднреВрдорд┐ рдкреНрд░рд╛рдкреНрдд рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ:

рдЙрди рджреЛ рдорд╛рдорд▓реЛрдВ рдХреЛ рд╕реНрдкрд╖реНрдЯ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдзрдиреНрдпрд╡рд╛рджред рдпрд╣ рдЕрдм рдкреВрд░реНрдг рд╕рдордЭ рдореЗрдВ рдЖрддрд╛ рд╣реИ

Tue, Mar 22, 2016 рдХреЛ, 6:34 рдЕрдкрд░рд╛рд╣реНрди рдЖрд░реЛрди рддреБрд░реЙрди рд╕реВрдЪрдирд╛рдПрдБ @ithub.com рдиреЗ рд▓рд┐рдЦрд╛:

@SergioBenitez https://github.com/SergioBenitez

рдХрдВрдкрд╛рдЗрд▓рд░ рдХрд╛рд░реНрдпрд╛рдиреНрд╡рдпрди рд╕рдВрдШрд░реНрд╖реЛрдВ рдХрд╛ рд╣рд╡рд╛рд▓рд╛ рджреЗрддреЗ рд╣реБрдП рдХрдВрдкрд╛рдЗрд▓рд░ рдХреЗ рд╕рд╛рде рд╡рд┐рдлрд▓ рд╣реЛ рдЬрд╛рддрд╛ рд╣реИред рдзреНрдпрд╛рди рджреЗрдВ
рд╡рд╣ рдФрд░ рд╕реНрдЯреНрд░рд┐рдВрдЧ FromStr рдХреЛ рд▓рд╛рдЧреВ рдирд╣реАрдВ рдХрд░рддрд╛ рд╣реИ, рдЗрд╕рд▓рд┐рдП рдХреЛрдИ рд╡рд┐рд░реЛрдз рдирд╣реАрдВ рд╣реЛрдирд╛ рдЪрд╛рд╣рд┐рдПред

рд╕рдорд╕реНрдпрд╛ рдпрд╣ рд╣реИ рдХрд┐ рд╕рдВрдХрд▓рдХ рд░реВрдврд╝рд┐рд╡рд╛рджреА рд░реВрдк рд╕реЗ рдпрд╣ рдорд╛рди рд░рд╣рд╛ рд╣реИ рдХрд┐ str
рднрд╡рд┐рд╖реНрдп рдореЗрдВ FromStr рдХреЛ рд▓рд╛рдЧреВ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдЖ рд╕рдХрддрд╛ рд╣реИред рдпрд╣ рдореВрд░реНрдЦрддрд╛рдкреВрд░реНрдг рд▓рдЧ рд╕рдХрддрд╛ рд╣реИ
рдпрд╣ рдЙрджрд╛рд╣рд░рдг рд╣реИ, рд▓реЗрдХрд┐рди рд╕рд╛рдорд╛рдиреНрдп рддреМрд░ рдкрд░, рд╣рдо рд╣рд░ рд╕рдордп рдирдП рдЗрдореНрдкреНрд▓рд╛рдВрдЯ рдЬреЛрдбрд╝рддреЗ рд╣реИрдВ, рдФрд░ рд╣рдо рдЪрд╛рд╣рддреЗ рд╣реИрдВ
рдЬрдм рд╣рдо рдЙрди рдЖрдХреГрддрд┐рдпреЛрдВ рдХреЛ рдЬреЛрдбрд╝рддреЗ рд╣реИрдВ рддреЛ рдбрд╛рдЙрдирд╕реНрдЯреНрд░реАрдо рдХреЛрдб рдХреЛ рдЯреВрдЯрдиреЗ рд╕реЗ рдмрдЪрд╛рддреЗ рд╣реИрдВред

рдпрд╣ рдПрдХ рд░реВрдврд╝рд┐рд╡рд╛рджреА рд╡рд┐рдХрд▓реНрдк рд╣реИ, рдФрд░ рдХреБрдЫ рдРрд╕рд╛ рд╣реИ рдЬрд┐рд╕реЗ рд╣рдо рдЖрд░рд╛рдо рдХрд░рдирд╛ рдЪрд╛рд╣рддреЗ рд╣реИрдВ
рдЕрдзрд┐рдХ рд╕рдордп рддрдХред рдЖрдк рдпрд╣рд╛рдБ рдкреГрд╖реНрдарднреВрдорд┐ рдкреНрд░рд╛рдкреНрдд рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ:

-
http://smallcultfollowing.com/babysteps/blog/2015/01/14/little-orphan-impls/

-
рдЖрдк рдЗрд╕реЗ рдкреНрд░рд╛рдкреНрдд рдХрд░ рд░рд╣реЗ рд╣реИрдВ рдХреНрдпреЛрдВрдХрд┐ рдЖрдкрдХрд╛ рдЙрд▓реНрд▓реЗрдЦ рдХрд┐рдпрд╛ рдЧрдпрд╛ рдерд╛ред
рдЗрд╕ рдИрдореЗрд▓ рдХрд╛ рдЙрддреНрддрд░ рд╕реАрдзреЗ рджреЗрдВ рдпрд╛ рдЗрд╕реЗ GitHub рдкрд░ рджреЗрдЦреЗрдВ
https://github.com/rust-lang/rust/issues/31844#issuecomment -200093757

@aturon

рд╕рдорд╕реНрдпрд╛ рдпрд╣ рд╣реИ рдХрд┐ рд╕рдВрдХрд▓рдХ рд░реВрдврд╝рд┐рд╡рд╛рджреА рд░реВрдк рд╕реЗ рдпрд╣ рдорд╛рдирдХрд░ рдЪрд▓ рд░рд╣рд╛ рд╣реИ рдХрд┐ рднрд╡рд┐рд╖реНрдп рдореЗрдВ FromStr рдХреЛ рд▓рд╛рдЧреВ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП str рдЖ рд╕рдХрддрд╛ рд╣реИред рдпрд╣ рдЗрд╕ рдЙрджрд╛рд╣рд░рдг рдХреЗ рд▓рд┐рдП рдореВрд░реНрдЦрддрд╛рдкреВрд░реНрдг рд▓рдЧ рд╕рдХрддрд╛ рд╣реИ, рд▓реЗрдХрд┐рди рд╕рд╛рдорд╛рдиреНрдп рддреМрд░ рдкрд░, рд╣рдо рд╣рд░ рд╕рдордп рдирдП рдЗрдореНрдкреНрд▓реЙрдЗрдЬ рдЬреЛрдбрд╝рддреЗ рд╣реИрдВ, рдФрд░ рдЬрдм рд╣рдо рдЙрди рдЗрдореНрдкреНрд▓рд╛рдВрдЯреНрд╕ рдХреЛ рдЬреЛрдбрд╝рддреЗ рд╣реИрдВ рддреЛ рд╣рдо рдбрд╛рдЙрдирд╕реНрдЯреНрд░реАрдо рдХреЛрдб рдХреЛ рдЯреВрдЯрдиреЗ рд╕реЗ рдмрдЪрд╛рдирд╛ рдЪрд╛рд╣рддреЗ рд╣реИрдВред

рдХреНрдпрд╛ рдпрд╣ рд╡рд╛рд╕реНрддрд╡ рдореЗрдВ рдХреНрдпрд╛ рд╡рд┐рд╢реЗрд╖рдЬреНрдЮрддрд╛ рдХреЛ рд╕рдВрдмреЛрдзрд┐рдд рдХрд░рдиреЗ рдХреА рдХреЛрд╢рд┐рд╢ рдирд╣реАрдВ рд╣реИ? рд╡рд┐рд╢реЗрд╖рдЬреНрдЮрддрд╛ рдХреЗ рд╕рд╛рде, рдореИрдВ рдЙрдореНрдореАрдж рдХрд░реВрдВрдЧрд╛ рдХрд┐ рднрд╡рд┐рд╖реНрдп рдореЗрдВ FromStr &str рдХрд╛ рдХрд╛рд░реНрдпрд╛рдиреНрд╡рдпрди рд╣реЛрдиреЗ рдкрд░ рднреА, Simple &str рд▓рд┐рдП Simple рдХрд╛ рдкреНрд░рддреНрдпрдХреНрд╖ рдХрд╛рд░реНрдпрд╛рдиреНрд╡рдпрди рд▓рд╛рдЧреВ рд╣реЛред рдкреВрд░реНрд╡рддрд╛ рд▓реЗрдирд╛ рд╣реЛрдЧрд╛ред

@SergioBenitez рдЖрдкрдХреЛ рдЕрдзрд┐рдХ рд╕рд╛рдорд╛рдиреНрдп рдирд┐рд╣рд┐рддрд╛рд░реНрде рдореЗрдВ default fn рдбрд╛рд▓рдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реИред рддреБрдореНрд╣рд╛рд░реА
рдЙрджрд╛рд╣рд░рдг рд╡рд┐рд╢реЗрд╖ рдирд╣реАрдВ рд╣реИред

Tue рдкрд░, рдорд╛рд░реНрдЪ 22, 2016, 6:54 PM рд╕рд░реНрдЬрд┐рдпреЛ рдмреЗрдирд┐рдЯреЗрдЬрд╝ рдиреЛрдЯрд┐рдлрд┐рдХреЗрд╢рди @github.com
рд▓рд┐рдЦрд╛ рдерд╛:

@aturon https://github.com/aturon

рд╕рдорд╕реНрдпрд╛ рдпрд╣ рд╣реИ рдХрд┐ рд╕рдВрдХрд▓рдХ рд░реВрдврд╝рд┐рд╡рд╛рджреА рд░реВрдк рд╕реЗ рдпрд╣ рдорд╛рди рд░рд╣рд╛ рд╣реИ рдХрд┐ str
рднрд╡рд┐рд╖реНрдп рдореЗрдВ FromStr рдХреЛ рд▓рд╛рдЧреВ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдЖ рд╕рдХрддрд╛ рд╣реИред рдЗрд╕рдХреЗ рд▓рд┐рдП рд╡рд╣ рдореВрд░реНрдЦрддрд╛рдкреВрд░реНрдг рд▓рдЧ рд╕рдХрддрд╛ рд╣реИ
рдЙрджрд╛рд╣рд░рдг рдХреЗ рд▓рд┐рдП, рд▓реЗрдХрд┐рди рд╕рд╛рдорд╛рдиреНрдп рддреМрд░ рдкрд░, рд╣рдо рд╣рд░ рд╕рдордп рдирдП рдЗрдореНрдкреНрд▓рд╛рдВрдЯ рдЬреЛрдбрд╝рддреЗ рд╣реИрдВ, рдФрд░ рд╣рдо рдЪрд╛рд╣рддреЗ рд╣реИрдВ
рдЬрдм рд╣рдо рдЙрди рдЖрдХреГрддрд┐рдпреЛрдВ рдХреЛ рдЬреЛрдбрд╝рддреЗ рд╣реИрдВ рддреЛ рдбрд╛рдЙрдирд╕реНрдЯреНрд░реАрдо рдХреЛрдб рдХреЛ рдЯреВрдЯрдиреЗ рд╕реЗ рдмрдЪрд╛рддреЗ рд╣реИрдВред

рдХреНрдпрд╛ рдпрд╣ рд╡рд╛рд╕реНрддрд╡ рдореЗрдВ рдХреНрдпрд╛ рд╡рд┐рд╢реЗрд╖рдЬреНрдЮрддрд╛ рдХреЛ рд╕рдВрдмреЛрдзрд┐рдд рдХрд░рдиреЗ рдХреА рдХреЛрд╢рд┐рд╢ рдирд╣реАрдВ рд╣реИ? рд╕рд╛рде рдореЗрдВ
рд╡рд┐рд╢реЗрд╖рдЬреНрдЮрддрд╛, рдореБрдЭреЗ рдЙрдореНрдореАрдж рд╣реИ рдХрд┐ рднрд▓реЗ рд╣реА FromStr рдХрд╛ рдПрдХ рдХрд╛рд░реНрдпрд╛рдиреНрд╡рдпрди
рднрд╡рд┐рд╖реНрдп рдХреЗ рд▓рд┐рдП & str рдХреЛ рдЬреЛрдбрд╝рд╛ рдЧрдпрд╛, рдХреЗ рд▓рд┐рдП рдкреНрд░рддреНрдпрдХреНрд╖ рдХрд╛рд░реНрдпрд╛рдиреНрд╡рдпрди
& str рдХреЗ рд▓рд┐рдП рд╡рд┐рд╢реЗрд╖рддрд╛ рдкреВрд░реНрд╡рддрд╛ рд▓реЗ рдЬрд╛рдПрдЧрд╛ред

-
рдЖрдк рдЗрд╕реЗ рдкреНрд░рд╛рдкреНрдд рдХрд░ рд░рд╣реЗ рд╣реИрдВ рдХреНрдпреЛрдВрдХрд┐ рдЖрдкрдХрд╛ рдЙрд▓реНрд▓реЗрдЦ рдХрд┐рдпрд╛ рдЧрдпрд╛ рдерд╛ред
рдЗрд╕ рдИрдореЗрд▓ рдХрд╛ рдЙрддреНрддрд░ рд╕реАрдзреЗ рджреЗрдВ рдпрд╛ рдЗрд╕реЗ GitHub рдкрд░ рджреЗрдЦреЗрдВ
https://github.com/rust-lang/rust/issues/31844#issuecomment -200097995

рдореБрдЭреЗ рд▓рдЧрддрд╛ рд╣реИ рдХрд┐ "рдбрд┐рдлрд╝реЙрд▓реНрдЯ" рд╡рд┐рд╢реЗрд╖рддрд╛ рдЖрдЗрдЯрдореЛрдВ рдХреЛ рд╕реНрд╡рдЪрд╛рд▓рд┐рдд рд░реВрдк рд╕реЗ default рдзреНрд╡рдирд┐рдпреЛрдВ рдХреЛ рднреНрд░рдорд┐рдд рдХрд░рдиреЗ рд╡рд╛рд▓рд╛ рдорд╛рдирд╛ рдЬрд╛рддрд╛ рд╣реИред рдЖрдк impl s рдХреЛ рдЖрд╕рд╛рди рдмрдирд╛рдиреЗ рдХреЗ рд╕рд╛рде-рд╕рд╛рде Haskell, рдЖрджрд┐ рдЬреИрд╕реЗ рдЧреБрдг рдХреЗ рд▓рд┐рдП рджреЛрдиреЛрдВ рд╕рдорд░реВрдкрддрд╛ рдЪрд╛рд╣рддреЗ рд╣реИрдВред рдЗрд╕рдХреЗ рдЕрд▓рд╛рд╡рд╛, рдЖрдк рдЖрд╕рд╛рдиреА рд╕реЗ grep рдЙрдирдХреЗ рд▓рд┐рдП рдРрд╕рд╛ рдирд╣реАрдВ рдХрд░ рд╕рдХрддреЗ рдЬреИрд╕реЗ рдЖрдк default рд▓рд┐рдП рдХрд░ рд╕рдХрддреЗ рд╣реИрдВред рдпрд╣ рджреЛрдиреЛрдВ default рдХреАрд╡рд░реНрдб рдХреЗ рд▓рд┐рдП рдХрдард┐рди рдирд╣реАрдВ рд╣реИ рдФрд░ рдПрдХ рдбрд┐рдлрд╝реЙрд▓реНрдЯ рдХрд╛рд░реНрдпрд╛рдиреНрд╡рдпрди рджреЗрддрд╛ рд╣реИ, рд▓реЗрдХрд┐рди рдЙрдиреНрд╣реЗрдВ рдЕрд▓рдЧ рдирд╣реАрдВ рдХрд┐рдпрд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИред рдЗрд╕рдХреЗ рдЕрд▓рд╛рд╡рд╛, рдпрджрд┐ рдХреЛрдИ рднрд╛рд╖рд╛ рдХреЛ рд╕реНрдкрд╖реНрдЯ рдХрд░рдирд╛ рдЪрд╛рд╣рддрд╛ рд╣реИ, рддреЛ рдЗрди "рдбрд┐рдлрд╝реЙрд▓реНрдЯ" рд╡рд┐рд╢реЗрд╖рддрд╛ рд╡рд╕реНрддреБрдУрдВ рдХрд╛ рдирд╛рдо рдмрджрд▓рдХрд░ "рдкреНрд░рд╕реНрддрд╛рд╡рд┐рдд рдкреНрд░рд╕реНрддрд╛рд╡рд┐рдд" рдЖрдЗрдЯрдо рджрд╕реНрддрд╛рд╡реЗрдЬрд╝реАрдХрд░рдг рдореЗрдВ рд░рдЦрд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИред

# 32999 (рдЯрд┐рдкреНрдкрдгреА) рд╕реЗ рдзреНрдпрд╛рди рджреЗрдВ: рдпрджрд┐ рд╣рдо рдЬрд╛рд▓реА рдирд┐рдпрдо рдХреЗ рд╕рд╛рде рдЬрд╛рддреЗ рд╣реИрдВ (рдпрд╛ рдирдХрд╛рд░рд╛рддреНрдордХ рдмрд╛рдзрд╛рдУрдВ рдХреА рдЕрдиреБрдорддрд┐ рджреЗрддреЗ рд╣реИрдВ), рддреЛ рдХрд┐рд╕реА рдЪреАрдЬрд╝ рдХреЗ рдЖрдЧреЗ рд╡рд┐рд╢реЗрд╖рдЬреНрдЮрддрд╛ рдХреЛ рд░реЛрдХрдиреЗ рдХреЗ рд▓рд┐рдП "рдПрдХ рдордзреНрдпрд╡рд░реНрддреА рд╡рд┐рд╢реЗрд╖рддрд╛ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░реЗрдВ" рдЪрд╛рд▓ рдЕрдм рдХрд╛рдо рдирд╣реАрдВ рдХрд░реЗрдЧреАред

@Stebalien

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

@ arielb1 рдЖрд╣ред рдЕрдЪреНрдЫреА рдмрд╛рддред рдореЗрд░реЗ рдорд╛рдорд▓реЗ рдореЗрдВ, рд╡рд┐рд╢реЗрд╖рддрд╛ рдирд┐рдЬреА рдирд╣реАрдВ рд╣реИред

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

рдХреНрдпрд╛ рдПрдХ рдУрд╡рд░рд░рд╛рдЗрдб default impl рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдиреЗ рдХрд╛ рдПрдХ рддрд░реАрдХрд╛ рд╣реИ? рдпрджрд┐ рд╣рд╛рдВ, рддреЛ рдпрд╣ рдкрд░реАрдХреНрд╖рдг рдХреЗ рдирд┐рд░реНрдорд╛рдг рдореЗрдВ рд╕рд╣рд╛рдпрддрд╛ рдХрд░ рд╕рдХрддрд╛ рд╣реИред рдЕрдиреБрдмрдВрдз рдФрд░ libhoare рджреНрд╡рд╛рд░рд╛ рдбрд┐рдЬрд╛рдЗрди рджреЗрдЦреЗрдВред

рдЯрд╛рдЗрдк-рдЪреЗрдХрд┐рдВрдЧ рдХреЗ рджреМрд░рд╛рди рдбрд┐рдлрд╝реЙрд▓реНрдЯ рд╕рдВрдмрджреНрдз рдкреНрд░рдХрд╛рд░реЛрдВ рдХреЗ рдкреНрд░рдХреНрд╖реЗрдкрдг рд╕реЗ рд╕рдВрдХрд▓рди-рд╕рдордп рдкрд░ рдкреНрд░рдХрд╛рд░ рдХреА рдЕрд╕рдорд╛рдирддрд╛ рдХреЛ рд▓рд╛рдЧреВ рдХрд░рдиреЗ рдХреА рдЕрдиреБрдорддрд┐ рдорд┐рд▓реЗрдЧреА: https://gist.github.com/7c081574958d22f89d434a97b626b1b4

#![feature(specialization)]

pub trait NotSame {}

pub struct True;
pub struct False;

pub trait Sameness {
    type Same;
}

mod internal {
    pub trait PrivSameness {
        type Same;
    }
}

use internal::PrivSameness;

impl<A, B> Sameness for (A, B) {
    type Same = <Self as PrivSameness>::Same;
}

impl<A, B> PrivSameness for (A, B) {
    default type Same = False;
}
impl<A> PrivSameness for (A, A) {
    type Same = True;
}

impl<A, B> NotSame for (A, B) where (A, B): Sameness<Same=False> {}

fn not_same<A, B>() where (A, B): NotSame {}

fn main() {
    // would compile
    not_same::<i32, f32>();

    // would not compile
    // not_same::<i32, i32>();
}

рдкреНрд░рддрд┐ рдЯрд┐рдкреНрдкрдгреА @burdges рд╕рдВрдкрд╛рджрд┐рдд рдХреА рдЧрдИ

рдмрд╕ fyi @rphmeier рдХрд┐рд╕реА рдХреЛ рд╕рдВрднрд╡рддрдГ is.gd рд╕реЗ рдмрдЪрдирд╛ рдЪрд╛рд╣рд┐рдП рдХреНрдпреЛрдВрдХрд┐ рдпрд╣ CloudFlare рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдиреЗ рдХреЗ рдХрд╛рд░рдг Tor рдЙрдкрдпреЛрдЧрдХрд░реНрддрд╛рдУрдВ рдХреЗ рд▓рд┐рдП рд╣рд▓ рдирд╣реАрдВ рд╣реЛрддрд╛ рд╣реИред GitHub рдкреВрд░реНрдг URL рдХреЗ рд╕рд╛рде рдареАрдХ рдХрд╛рдо рдХрд░рддрд╛ рд╣реИред рдФрд░ play.rust-lang.org рдЯреЛрд░ рдкрд░ рдареАрдХ рдХрд╛рдо рдХрд░рддрд╛ рд╣реИред

@burdges FWIW play.rust-lang.org рдЦреБрдж рдЕрдкрдиреЗ "рд╢реЙрд░реНрдЯрди" рдмрдЯрди рдХреЗ рд▓рд┐рдП is.gd рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рддрд╛ рд╣реИред

рдЗрд╕реЗ рд╕рдВрднрд╡рддрдГ рдмрджрд▓рд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИ, рд╣рд╛рд▓рд╛рдВрдХрд┐: https://github.com/rust-lang/rust-playpen/blob/9777ef59b/static/web.js#L333

рдЗрд╕ рддрд░рд╣ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░реЗрдВ (https://is.gd/Ux6FNs):

#![feature(specialization)]
pub trait Foo {}
pub trait Bar: Foo {}
pub trait Baz: Foo {}

pub trait Trait {
    type Item;
}

struct Staff<T> { }

impl<T: Foo> Trait for Staff<T> {
    default type Item = i32;
}

impl<T: Foo + Bar> Trait for Staff<T> {
    type Item = i64;
}

impl<T: Foo + Baz> Trait for Staff<T> {
    type Item = f64;
}

fn main() {
    let _ = Staff { };
}

рддреНрд░реБрдЯрд┐:

error: conflicting implementations of trait `Trait` for type `Staff<_>`: [--explain E0119]
  --> <anon>:20:1
20 |> impl<T: Foo + Baz> Trait for Staff<T> {
   |> ^
note: conflicting implementation is here:
  --> <anon>:16:1
16 |> impl<T: Foo + Bar> Trait for Staff<T> {
   |> ^

error: aborting due to previous error

рдХреНрдпрд╛ рдпрд╣ specialization рд╕рдорд░реНрдерди рдХрд░рддрд╛ рд╣реИ, рдФрд░ рдХреНрдпрд╛ рд╡рд░реНрддрдорд╛рди рдореЗрдВ рдХрд┐рд╕реА рдЕрдиреНрдп рдкреНрд░рдХрд╛рд░ рдХрд╛ рдХрд╛рд░реНрдпрд╛рдиреНрд╡рдпрди рд╣реИ?

@zitsen

рдЗрди рдкреНрд░рддреНрдпрд╛рд░реЛрдкрдгреЛрдВ рдХреЛ рд╡рд░реНрддрдорд╛рди рд╡рд┐рд╢реЗрд╖рдЬреНрдЮрддрд╛ рдбрд┐рдЬрд╛рдЗрди рджреНрд╡рд╛рд░рд╛ рдЕрдиреБрдорддрд┐ рдирд╣реАрдВ рд╣реИ, рдХреНрдпреЛрдВрдХрд┐ T: Foo + Bar рдпрд╛ T: Foo + Baz рдЕрдиреНрдп рдХреА рддреБрд▓рдирд╛ рдореЗрдВ рдЕрдзрд┐рдХ рд╡рд┐рд╢рд┐рд╖реНрдЯ рдирд╣реАрдВ рд╣реИред рдпрд╣реА рд╣реИ, рдЕрдЧрд░ рдЖрдкрдХреЗ рдкрд╛рд╕ рдХреБрдЫ T: Foo + Bar + Baz , рддреЛ рдпрд╣ рд╕реНрдкрд╖реНрдЯ рдирд╣реАрдВ рд╣реИ рдХрд┐ рдХреМрди рд╕рд╛ "рдЬреАрдд" рд╣реЛрдирд╛ рдЪрд╛рд╣рд┐рдПред

рд╣рдорд╛рд░реЗ рдкрд╛рд╕ рдПрдХ рдЕрдзрд┐рдХ рдЕрднрд┐рд╡реНрдпрдВрдЬрдХ рдкреНрд░рдгрд╛рд▓реА рдкрд░ рдХреБрдЫ рд╡рд┐рдЪрд╛рд░ рд╣реИрдВ, рдЬреЛ рдЖрдкрдХреЛ _also_ рдХреЛ T: Foo + Bar + Baz рд▓рд┐рдП рдПрдХ рдирд┐рд╣рд┐рддрд╛рд░реНрде рджреЗрдиреЗ рдХреА рдЕрдиреБрдорддрд┐ рджреЗрдЧрд╛ рдФрд░ рдЗрд╕ рддрд░рд╣ рд╕реЗ рдЕрд╕реНрд╡реАрдХрд╛рд░ рдХрд░ рджреЗрдЧрд╛, рд▓реЗрдХрд┐рди рдпрд╣ рдЕрднреА рддрдХ рдкреВрд░реА рддрд░рд╣ рд╕реЗ рдкреНрд░рд╕реНрддрд╛рд╡рд┐рдд рдирд╣реАрдВ рдХрд┐рдпрд╛ рдЧрдпрд╛ рд╣реИред

рдпрджрд┐ рдЛрдгрд╛рддреНрдордХ рдЧреБрдг trait Baz: !Bar рдХрднреА рднреВрдорд┐ рдХреА рд╕реАрдорд╛ рдмрдирд╛рддреЗ рд╣реИрдВ, рддреЛ рдЗрд╕рдХрд╛ рдЙрдкрдпреЛрдЧ рд╡рд┐рд╢реЗрд╖рдЬреНрдЮрддрд╛ рдХреЗ рд╕рд╛рде рднреА рдХрд┐рдпрд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИ рддрд╛рдХрд┐ рдпрд╣ рд╕рд╛рдмрд┐рдд рдХрд┐рдпрд╛ рдЬрд╛ рд╕рдХреЗ рдХрд┐ рдмрд╛рд░ рдХреЛ рд▓рд╛рдЧреВ рдХрд░рдиреЗ рд╡рд╛рд▓реЗ рдкреНрд░рдХрд╛рд░ рдФрд░ рдмрд╛рдЬ рдХреЛ рд▓рд╛рдЧреВ рдХрд░рдиреЗ рд╡рд╛рд▓реЗ рдкреНрд░рдХрд╛рд░ рд╡рд┐рд╢рд┐рд╖реНрдЯ рдФрд░ рд╡реНрдпрдХреНрддрд┐рдЧрдд рд░реВрдк рд╕реЗ рд╡рд┐рд╢рд┐рд╖реНрдЯ рд╣реИрдВред

рд▓рдЧрддрд╛ рд╣реИ @rphmeier рдХрд╛ рдЬрд╡рд╛рдм рд╣реИ рдХрд┐ рдореИрдВ рд╡рд╛рд╕реНрддрд╡ рдореЗрдВ рдХреНрдпрд╛ рдЪрд╛рд╣рддрд╛ рд╣реВрдБ, T: Foo + Bar + Baz рд▓рд┐рдП рднреА рдорджрдж рдорд┐рд▓реЗрдЧреАред

рдмрд╕ рдЗрд╕реЗ рдЕрдирджреЗрдЦрд╛ рдХрд░реЗрдВ, рдореЗрд░реЗ рдкрд╛рд╕ рдЕрднреА рднреА рдореЗрд░реЗ рдорд╛рдорд▓реЗ рдХреЗ рд╕рд╛рде рдХреБрдЫ рдХрд░рдирд╛ рд╣реИ, рдФрд░ рд╣рдореЗрд╢рд╛ specialization рдФрд░ рдЕрдиреНрдп рд╕реБрд╡рд┐рдзрд╛рдУрдВ рдХреЗ рд▓реИрдВрдбрд┐рдВрдЧ рдХреЗ рд▓рд┐рдП рд░реЛрдорд╛рдВрдЪрдХ рд╣реИред

рд╢реБрдХреНрд░рд┐рдпрд╛ @aturon @rphmeier

рдореИрдВ рд╣рд╛рд▓ рд╣реА рдореЗрдВ рд╡рд┐рд╢реЗрд╖рдЬреНрдЮрддрд╛ рдХреЗ рд╕рд╛рде рдЦреЗрд▓ рд░рд╣рд╛ рд╣реВрдВ, рдФрд░ рдореИрдВ рдЗрд╕ рдЕрдЬреАрдм рдорд╛рдорд▓реЗ рдореЗрдВ рдЖрдпрд╛ рд╣реВрдВ:

#![feature(specialization)]

trait Marker {
    type Mark;
}

trait Foo { fn foo(&self); }

struct Fizz;

impl Marker for Fizz {
    type Mark = ();
}

impl Foo for Fizz {
    fn foo(&self) { println!("Fizz!"); }
}

impl<T> Foo for T
    where T: Marker, T::Mark: Foo
{
    default fn foo(&self) { println!("Has Foo marker!"); }
}

struct Buzz;

impl Marker for Buzz {
    type Mark = Fizz;
}

fn main() {
    Fizz.foo();
    Buzz.foo();
}

рд╕рдВрдХрд▓рдХ рдЙрддреНрдкрд╛рджрди:

error: conflicting implementations of trait `Foo` for type `Fizz`: [--explain E0119]
  --> <anon>:19:1
19 |> impl<T> Foo for T
   |> ^
note: conflicting implementation is here:
  --> <anon>:15:1
15 |> impl Foo for Fizz {
   |> ^

playpen

рдореЗрд░рд╛ рдорд╛рдирдирд╛ тАЛтАЛрд╣реИ рдХрд┐ рдЙрдкрд░реЛрдХреНрдд _should_ рд╕рдВрдХрд▓рди, рдФрд░ рджреЛ рджрд┐рд▓рдЪрд╕реНрдк рднрд┐рдиреНрдирддрд╛рдПрдВ рд╣реИрдВ рдЬреЛ рд╡рд╛рд╕реНрддрд╡ рдореЗрдВ рдХрд╛рдо-рдХреЗ рд░реВрдк рдореЗрдВ рдХрд░рддреЗ рд╣реИрдВ:

1) where T::Mark: Fizz рдмрд╛рдЙрдВрдб рдХреЛ рдирд┐рдХрд╛рд▓рдирд╛:

impl<T> Foo for T
    where T: Marker //, T::Mark: Fizz
{
    // ...
}

playpen

2) рдПрдХ "рд╡рд┐рд╢реЗрд╖рддрд╛ рдмрд╛рдзреНрдп рдЙрдкрдирд╛рдо" рдЬреЛрдбрд╝рдирд╛:

trait FooMarker { }
impl<T> FooMarker for T where T: Marker, T::Mark: Foo { }

impl<T> Foo for T where T: FooMarker {
    // ...
}

playpen

(рдЬреЛ _doesn't_ рдХрд╛рдо рдХрд░рддрд╛ рд╣реИ, рддреЛ Marker (рдПрдХ рдЕрд▓рдЧ рдЯреЛрдХрд░рд╛ рдореЗрдВ рдкрд░рд┐рднрд╛рд╖рд┐рдд рдХрд┐рдпрд╛ рдЧрдпрд╛ рд╣реИ!), рджреЗрдЦрдиреЗ рдХреЗ рдЗрд╕ рдЙрджрд╛рд╣рд░рдг рд░реЗрдкреЛ )

рдореЗрд░рд╛ рдпрд╣ рднреА рдорд╛рдирдирд╛ тАЛтАЛрд╣реИ рдХрд┐ рдпрд╣ рдореБрджреНрджрд╛ рдХрд┐рд╕реА рддрд░рд╣ # 20400 рд╕реЗ рд╕рдВрдмрдВрдзрд┐рдд рд╣реЛ рд╕рдХрддрд╛ рд╣реИ

рд╕рдВрдкрд╛рджрд┐рдд рдХрд░реЗрдВ : рдореИрдВрдиреЗ рдЗрд╕ рдмрд╛рд░реЗ рдореЗрдВ рдПрдХ рдореБрджреНрджрд╛ рдЦреЛрд▓рд╛ рд╣реИ: # 36587

рдореИрдВ рд╡рд┐рд╢реЗрд╖рдЬреНрдЮрддрд╛ рдХреЗ рд╕рд╛рде рдПрдХ рд╕рдорд╕реНрдпрд╛ рдХрд╛ рд╕рд╛рдордирд╛ рдХрд░ рд░рд╣рд╛ рд╣реВрдВред рдирд┐рд╢реНрдЪрд┐рдд рдирд╣реАрдВ рд╣реИ рдХрд┐ рдпрд╣ рдХрд╛рд░реНрдпрд╛рдиреНрд╡рдпрди рдХреА рд╕рдорд╕реНрдпрд╛ рд╣реИ рдпрд╛ рд╡рд┐рд╢реЗрд╖рдЬреНрдЮрддрд╛ рдХреЗ рддрд░реАрдХреЗ рдореЗрдВ рдХреЛрдИ рд╕рдорд╕реНрдпрд╛ рдирд┐рд░реНрджрд┐рд╖реНрдЯ рд╣реИред

use std::vec::IntoIter as VecIntoIter;

pub trait ClonableIterator: Iterator {
    type ClonableIter;

    fn clonable(self) -> Self::ClonableIter;
}

impl<T> ClonableIterator for T where T: Iterator {
    default type ClonableIter = VecIntoIter<T::Item>;

    default fn clonable(self) -> VecIntoIter<T::Item> {
        self.collect::<Vec<_>>().into_iter()
    }
}

impl<T> ClonableIterator for T where T: Iterator + Clone {
    type ClonableIter = T;

    #[inline]
    fn clonable(self) -> T {
        self
    }
}

( рдкреНрд▓реЗрдкреЗрди )
(рд╡реИрд╕реЗ, рдпрд╣ рдЕрдЪреНрдЫрд╛ рд╣реЛрдЧрд╛ рдпрджрд┐ рдпрд╣ рдХреЛрдб рдЕрдВрддрддрдГ рдПрдХ рджрд┐рди stdlib рдореЗрдВ рдЙрддрд░рд╛)

рдпрд╣ рдХреЛрдб рдЗрд╕рдХреЗ рд╕рд╛рде рд╡рд┐рдлрд▓ рд╣реЛрддрд╛ рд╣реИ:

error: method `clonable` has an incompatible type for trait:
 expected associated type,
    found struct `std::vec::IntoIter` [--explain E0053]
  --> <anon>:14:5
   |>
14 |>     default fn clonable(self) -> VecIntoIter<T::Item> {
   |>     ^

рд╡рд╛рдкрд╕реА рдореВрд▓реНрдп рдХреЛ Self::ClonableIter рдмрджрд▓рдиреЗ рд╕реЗ рдирд┐рдореНрди рддреНрд░реБрдЯрд┐ рд╣реЛрддреА рд╣реИ:

error: mismatched types [--explain E0308]
  --> <anon>:15:9
   |>
15 |>         self.collect::<Vec<_>>().into_iter()
   |>         ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ expected associated type, found struct `std::vec::IntoIter`
note: expected type `<T as ClonableIterator>::ClonableIter`
note:    found type `std::vec::IntoIter<<T as std::iter::Iterator>::Item>`

рдЬрд╛рд╣рд┐рд░рд╛ рддреМрд░ рдкрд░ рдЖрдк рдПрдХ рдбрд┐рдлрд╝реЙрд▓реНрдЯ рд╕рдВрдмрджреНрдз рдкреНрд░рдХрд╛рд░ рдХреЗ рдареЛрд╕ рдкреНрд░рдХрд╛рд░ рдХреЛ рд╕рдВрджрд░реНрднрд┐рдд рдирд╣реАрдВ рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ, рдЬреЛ рдореБрдЭреЗ рдХрд╛рдлреА рд╕реАрдорд┐рдд рд▓рдЧрддрд╛ рд╣реИред

@tomaka рдпрд╣ рдХрд╛рдо рдХрд░рдирд╛ рдЪрд╛рд╣рд┐рдП, RFC рдкрд╛рда рдореЗрдВ рдпрд╣ рд╣реИ:

impl<T> Example for T {
    default type Output = Box<T>;
    default fn generate(self) -> Box<T> { Box::new(self) }
}

impl Example for bool {
    type Output = bool;
    fn generate(self) -> bool { self }
}

(Https://github.com/rust-lang/rfcs/blob/master/text/1210-impl-specialization.md#the-default-keyword)

рдЬреЛ рдкреНрд░рд╛рд╕рдВрдЧрд┐рдХ рд╣реЛрдиреЗ рдХреЗ рд▓рд┐рдП рдЖрдкрдХреЗ рдорд╛рдорд▓реЗ рдХреЗ рд╕рдорд╛рди рдкрд░реНрдпрд╛рдкреНрдд рд▓рдЧрддрд╛ рд╣реИред

@ рдЗрд╕ рдЙрджрд╛рд╣рд░рдг рдЙрджрд╛рд╣рд░рдг рд╡рд┐рд╢реЗрд╖рддрд╛ рдХреЗ рд▓рд┐рдП рд╕рд╣рдЬ рдкрд░рд┐рднрд╛рд╖рд╛ рдХреЗ рд╕рд╛рде рд╕рдВрдХрд▓рди рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдкреНрд░рддреАрдд рдирд╣реАрдВ рд╣реЛрддрд╛ рд╣реИ: https://play.rust-lang.org/?gist=97ff3c2f7f3e3b50bd3aef000dbfa2ca4a&version=nightly&backtrace=0

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

@ Rphmeier RFC рдкрд╛рда рдмрддрд╛рддрд╛ рд╣реИ рдХрд┐ рдЗрд╕реЗ рдЕрдиреБрдорддрд┐ рджреА рдЬрд╛рдиреА рдЪрд╛рд╣рд┐рдП, рд╣рд╛рд▓рд╛рдВрдХрд┐, рдЗрд╕рдХрд╛ рдЙрджрд╛рд╣рд░рдг рдЗрд╕рд╕реЗ рдХреЙрдкреА рдХрд┐рдпрд╛ рдЧрдпрд╛ рд╣реИред

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

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

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

рдореБрдЭреЗ рдЖрд╢рд╛ рд╣реИ рдХрд┐ рдпрд╣ рд╕рдВрдХрд▓рд┐рдд рдХрд░реЗрдЧрд╛, рдЕрд░реНрдерд╛рдд рдпрд╣ ArrayVec<A> рдлрд╝реАрд▓реНрдб рдлрд╝реАрд▓реНрдбреНрд╕ рд╕реЗ A: Copy + Array рдмрд╛рдЙрдВрдб (рдЦреЗрд▓ рдХреЗ рдореИрджрд╛рди рдкрд░ рд╕рдВрдХрд▓рд┐рдд рд╕реНрдирд┐рдкреЗрдЯ) рджреНрд╡рд╛рд░рд╛ рдЪреБрдиреА рдЧрдИ рдХреА рдХреЙрдкреА рдХрд░рдиреЗ рдпреЛрдЧреНрдпрддрд╛ рдХреЛ рдШрдЯрд╛рддрд╛ рд╣реИред

impl<A: Copy + Array> Copy for ArrayVec<A>
    //where <A as Repr>::Data: Copy
{ }

рдХрдореЗрдВрдЯ-рдЖрдЙрдЯ рдЬрд╣рд╛рдВ рдХреНрд▓реЙрдЬрд╝ рдирд╣реАрдВ рдЪрд╛рд╣рддрд╛ рд╣реИ рдХреНрдпреЛрдВрдХрд┐ рдпрд╣ рд╕рд╛рд░реНрд╡рдЬрдирд┐рдХ рдЗрдВрдЯрд░рдлрд╝реЗрд╕ рдореЗрдВ рдПрдХ рдирд┐рдЬреА рдкреНрд░рдХрд╛рд░ Repr рдХреЛ рдЙрдЬрд╛рдЧрд░ рдХрд░рддрд╛ рд╣реИред (рдпрд╣ рд╡реИрд╕реЗ рднреА ICEs рд╣реИ)ред

рд╕рдВрдкрд╛рджрд┐рдд рдХрд░реЗрдВ: рдореИрдВ рднреВрд▓ рдЧрдпрд╛ рдерд╛ рдХрд┐ рдореИрдВрдиреЗ рдкрд╣рд▓реЗ рд╣реА рдЗрд╕ рдмрд╛рд░реЗ рдореЗрдВ # 33162 рдЬрд╛рд░реА рдХрд┐рдпрд╛ рдерд╛, рдореБрдЭреЗ рдХреНрд╖рдорд╛ рдХрд░реЗрдВред

рдореЗрд░реА рдЯрд┐рдкреНрдкрдгреА, рдореЗрд░реЗ рд╡рд╛рд╕реНрддрд╡рд┐рдХ рдЙрдкрдпреЛрдЧ рдХреЗ рдорд╛рдорд▓реЗ рдХрд╛ рдкрд╛рд▓рди рдХрд░реЗрдВ:

// Ideal version

trait Scannable {}

impl<T: FromStr> Scannable for T {}
impl<T: FromStr> Scannable for Result<T, ()> {}

// But this doesn't follow from the specialisation rules because Result: !FromStr
// Lattice rule would allow filling in that gap or negative reasoning would allow specifying it.

// Second attempt

trait FromResult {
    type Ok;
    fn from(r: Result<Self::Ok, ()>) -> Self;
}

impl<T> Scannable for T {
    default type Ok = T;
    default fn from(r: Result<T, ()>) -> Self {...} // error can't assume Ok == T, could do this if we had `default impl`
}

impl<T> Scannable for Result<T, ()> {
    type Ok = T;
    default fn from(r: Result<T, ()>) -> Self { r }
}

fn scan_from_str<T: FromResult>(x: &str) -> T
    where <T as FromResult>::Ok: FromStr  // Doesn't hold for T: FromStr because of the default on T::Ok
{ ... }

// Can also add the FromStr bound to FromResult::Ok, but doesn't help

// Third attempt
trait FromResult<Ok> {
    fn from(r: Result<Ok, ()>) -> Self;
}

impl<T> FromResult<T> for T {
    default fn from(r: Result<Self, ()>) -> Self { ... }
}

impl<T> FromResult<T> for Result<T, ()> {
    fn from(r: Result<T, ())>) -> Self { r }
}


fn scan_from_str<U: FromStr, T: FromResult<U>>(x: &str) -> T { ... }

// Error because we can't infer that U == String
let mut x: Result<String, ()> = scan_from_str("dsfsf");

@tomaka @Aatch

рд╡рд╣рд╛рдБ рд╕рдорд╕реНрдпрд╛ рдпрд╣ рд╣реИ рдХрд┐ рдЖрдкрдХреЛ рдЕрдиреНрдп рдбрд┐рдлрд╝реЙрд▓реНрдЯ рд╡рд╕реНрддреБрдУрдВ рдХреЗ рдореВрд▓реНрдп рдкрд░ рднрд░реЛрд╕рд╛ рдХрд░рдиреЗ рдХреА рдЕрдиреБрдорддрд┐ рдирд╣реАрдВ рд╣реИред рддреЛ рдЬрдм рдЖрдкрдХреЗ рдкрд╛рд╕ рдпрд╣ рдирд┐рд╣рд┐рдд рд╣реИ:

impl<T> ClonableIterator for T where T: Iterator {
    default type ClonableIter = VecIntoIter<T::Item>;

    default fn clonable(self) -> VecIntoIter<T::Item> {
    //                           ^^^^^^^^^^^^^^^^^^^^
        self.collect::<Vec<_>>().into_iter()
    }
}

рдЬрд┐рд╕ рд╕реНрдерд╛рди рдкрд░ рдореИрдВрдиреЗ рдкреНрд░рдХрд╛рд╢ рдбрд╛рд▓рд╛, clonable Self::ClonableIter рдкрд░ рдирд┐рд░реНрднрд░ рд╣реИ, рд▓реЗрдХрд┐рди рдХреНрдпреЛрдВрдХрд┐ CloneableIter рдХреЛ рдбрд┐рдлрд╝реЙрд▓реНрдЯ рдШреЛрд╖рд┐рдд рдХрд┐рдпрд╛ рдЧрдпрд╛ рд╣реИ, рдЖрдк рдРрд╕рд╛ рдирд╣реАрдВ рдХрд░ рд╕рдХрддреЗред рдЪрд┐рдВрддрд╛ рдпрд╣ рд╣реИ рдХрд┐ рдХреЛрдИ рд╡реНрдпрдХреНрддрд┐ CloneableIter рд▓реЗрдХрд┐рди _not_ clonable рдУрд╡рд░рд░рд╛рдЗрдб рдХрд░ рд╕рдХрддрд╛ рд╣реИред

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

impl<T> ClonableIterator for T where T: Iterator {
    default {
        type ClonableIter = VecIntoIter<T::Item>;
        fn clonable(self) -> VecIntoIter<T::Item> { ... }
    }
}

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

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

pub trait ClonableIterator: Iterator {
    fn clonable(self) -> impl Iterator;
}

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

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

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

рдореИрдВ default impl рдлрд╝реАрдЪрд░ рд▓рд╛рдЧреВ рдХрд░рдиреЗ рдореЗрдВ рд░реБрдЪрд┐ рд░рдЦрддрд╛ рд╣реВрдВ (рдЬрд╣рд╛рдВ рд╕рднреА рдЖрдЗрдЯрдо default )ред
рдХреНрдпрд╛ рдЖрдк рдЙрд╕ рдкрд░ рдпреЛрдЧрджрд╛рди рд╕реНрд╡реАрдХрд╛рд░ рдХрд░реЗрдВрдЧреЗ?

@ рд╡рдлрд╛рджрд╛рд░реА рдирд┐рд╢реНрдЪрд┐рдд рд░реВрдк рд╕реЗ! рдореИрдВ рдХрд╛рдо рдХреЗ рд░реВрдк рдореЗрдВ рдЕрдЪреНрдЫреА рддрд░рд╣ рд╕реЗ рдорджрдж рдХрд░рдиреЗ рдореЗрдВ рдЦреБрд╢реА рд╣реЛрдЧреАред

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

рдирд┐рдореНрдирд▓рд┐рдЦрд┐рдд рдореЗрд░реЗ рдЙрдкрдпреЛрдЧ-рдорд╛рдорд▓реЗ рдХрд╛ рдПрдХ рд╕рд░рд▓реАрдХрд░рдг рд╣реИ, рдЬреЛ рд╡рд┐рд╢реЗрд╖ рд░реВрдк рд╕реЗ рд╕рдВрдмрдВрдзрд┐рдд рдкреНрд░рдХрд╛рд░реЛрдВ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рдХреЛ рдкреНрд░рджрд░реНрд╢рд┐рдд рдХрд░рддрд╛ рд╣реИред
рдореЗрд░реЗ рдкрд╛рд╕ рдПрдХ рд╕рд╛рдорд╛рдиреНрдп рдбреЗрдЯрд╛ рд╕рдВрд░рдЪрдирд╛ рд╣реИ, Foo рдХрд╣рдирд╛ рд╣реИ, рдЬреЛ рдХрдВрдЯреЗрдирд░ рд╡рд┐рд╢реЗрд╖рддрд╛ рд╡рд╕реНрддреБрдУрдВ ( &trait::Property ) рдХреЗ рд╕рдВрдЧреНрд░рд╣ рдХрд╛ рд╕рдордиреНрд╡рдп рдХрд░рддрд╛ рд╣реИред рд╡рд┐рд╢реЗрд╖рддрд╛ trait::Property рджреЛрдиреЛрдВ Property<T> ( Vec<T> рджреНрд╡рд╛рд░рд╛ рд╕рдорд░реНрдерд┐рдд) рдФрд░ PropertyBits ( BitVec , рдПрдХ рдмрд┐рдЯ рд╡реЗрдХреНрдЯрд░ рджреНрд╡рд╛рд░рд╛ рд╕рдорд░реНрдерд┐рдд) рджреНрд╡рд╛рд░рд╛ рдХрд╛рд░реНрдпрд╛рдиреНрд╡рд┐рдд рдХреА рдЬрд╛рддреА рд╣реИред
Foo рдкрд░ рд╕рд╛рдорд╛рдиреНрдп рддрд░реАрдХреЛрдВ рдореЗрдВ, рдореИрдВ рд╕рдВрдмрджреНрдз рдкреНрд░рдХрд╛рд░реЛрдВ рдХреЗ рдорд╛рдзреНрдпрдо рд╕реЗ T рд▓рд┐рдП рд╕рд╣реА рдЕрдВрддрд░реНрдирд┐рд╣рд┐рдд рдбреЗрдЯрд╛ рд╕рдВрд░рдЪрдирд╛ рдХрд╛ рдирд┐рд░реНрдзрд╛рд░рдг рдХрд░рдиреЗ рдореЗрдВ рд╕рдХреНрд╖рдо рд╣реЛрдирд╛ рдЪрд╛рд╣рддрд╛ рд╣реВрдВ, рд▓реЗрдХрд┐рди рдЗрд╕рдХреЗ рд▓рд┐рдП рдЧреИрд░-рд╡рд┐рд╢реЗрд╖ рдорд╛рдорд▓реЛрдВ рдХреЗ рд▓рд┐рдП рдПрдХ рдХрдВрдмрд▓ рдирд┐рд╣рд┐рдд рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рд╡рд┐рд╢реЗрд╖рдЬреНрдЮрддрд╛ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реЛрддреА рд╣реИ рдЗрд╕ рдкреНрд░рдХрд╛рд░ рд╣реИред

trait ContainerFor {
    type P: trait::Property;
}

impl<T> ContainerFor for T {
    default type P = Property<T>; // default to the `Vec`-based version
}

impl ContainerFor for bool {
    type P = PropertyBits; // specialize to optimize for space
}

impl Foo {
    fn add<T>(&mut self, name: &str) {
        self.add_trait_obj(name, Box::new(<T as ContainerFor>::P::new())));
    }
    fn get<T>(&mut self, name: &str) -> Option<&<T as ContainerFor>::P> {
        self.get_trait_obj(name).and_then(|prop| prop.downcast::<_>());
    }
}

рдереИрдВрдХреНрд╕ @ рдиреНрдпреВрдЯреНрд░реЙрди !
рдореВрд▓ рд░реВрдк рд╕реЗ рдореИрдВ ast::ItemKind::Impl рд╕рдВрд░рдЪрдирд╛ рдореЗрдВ рдПрдХ рдирдИ "рдбрд┐рдлрд╝реЙрд▓реНрдЯрддрд╛" рд╡рд┐рд╢реЗрд╖рддрд╛ рдЬреЛрдбрд╝рдХрд░ рдХрд╛рдо рдХрд░ рд░рд╣рд╛ рд╣реВрдВ (рдФрд░ рдлрд┐рд░ рдирд┐рд╣рд┐рдд рдЖрдЗрдЯрдо "рдбрд┐рдлрд╝реЙрд▓реНрдЯрддрд╛" рд╡рд┐рд╢реЗрд╖рддрд╛ рдХреЗ рд╕рд╛рде рдПрдХ рд╕рд╛рде рдирдП рд╡рд┐рд╢реЗрд╖рддрд╛ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рддрд╛ рд╣реВрдВ) рд▓реЗрдХрд┐рди рдПрдХ рддреНрд╡рд░рд┐рдд рдФрд░ рдЖрд╕рд╛рди рднреА рд╣реИ
рд╕рдВрднрд╛рд╡рдирд╛ рд╣реИ рдХрд┐ рдкрд╛рд░реНрд╕рд┐рдВрдЧ рдХреЗ рджреМрд░рд╛рди default impl рдХреЗ рд╕рднреА рдирд┐рд╣рд┐рдд рдорджреЛрдВ рдХреЗ рд▓рд┐рдП рдбрд┐рдлрд╝реЙрд▓реНрдЯ рд╕реЗрдЯ рдХрд░рдиреЗ рдкрд░ред
рдореЗрд░реЗ рд▓рд┐рдП рдпрд╣ рдПрдХ "рдкреВрд░реНрдг" рд╕рдорд╛рдзрд╛рди рдирд╣реАрдВ рд╣реИ рдХреНрдпреЛрдВрдХрд┐ рд╣рдордиреЗ рдпрд╣ рдЬрд╛рдирдХрд╛рд░реА рдЦреЛ рджреА рд╣реИ рдХрд┐ "рдбрд┐рдлрд╝реЙрд▓реНрдЯрддрд╛" рдХрд╛ рддрд╛рддреНрдкрд░реНрдп рдлрд┐рдЧрд░ рд╕реЗ рд╕рдВрдмрдВрдзрд┐рдд рд╣реИ, рди рдХрд┐ рдЗрдореНрдкреНрд▓рд┐рдореЗрдВрдЯ рдХреЗ рдкреНрд░рддреНрдпреЗрдХ рдЖрдЗрдЯрдо рд╕реЗ,
рдЗрд╕рдХреЗ рдЕрд▓рд╛рд╡рд╛ рдЕрдЧрд░ рдХреЛрдИ partial impl рдкреЗрд╢ рдХрд░рдиреЗ рдХреА рдпреЛрдЬрдирд╛ рд╣реИ, рддреЛ рдкрд╣рд▓рд╛ рд╕рдорд╛рдзрд╛рди рдкрд╣рд▓реЗ рд╕реЗ рд╣реА рдПрдХ рд╡рд┐рд╢реЗрд╖рддрд╛ рдкреНрд░рджрд╛рди рдХрд░реЗрдЧрд╛ рдЬрд┐рд╕рдХрд╛ рдЙрдкрдпреЛрдЧ default рдФрд░ рд╕рд╛рде рд╣реА partial рдХреЛ рд╕рдВрдЧреНрд░рд╣реАрдд рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдХрд┐рдпрд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИред рд▓реЗрдХрд┐рди рд╕рд┐рд░реНрдл рдпрдХреАрди рдФрд░
рд╕рдордп рдмрд░реНрдмрд╛рдж рдирд╣реАрдВ рдХрд░ рд░рд╣реЗ рд╣реИрдВ, рдЖрдк рдХреНрдпрд╛ рд╕реЛрдЪрддреЗ рд╣реИрдВ?

@giannicic @aturon рдХреНрдпрд╛ рд╣рдо рдкреНрд░рд╕реНрддрд╛рд╡ рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ рдХрд┐ рд╣рдо default impl рдкрд░ рдЪрд░реНрдЪрд╛ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдПрдХ рд╡рд┐рд╢рд┐рд╖реНрдЯ рдореБрджреНрджрд╛ рдмрдирд╛рдПрдБ?

рдХреЛрдИ рдмрд╛рдд рдирд╣реАрдВ, рдореИрдВрдиреЗ рдПрдХ рдмрдирд╛рдпрд╛: https://github.com/rust-lang/rust/issues/37653

рдХреНрдпрд╛ рдЬрд╛рд▓реА рдирд┐рдпрдо рдореБрдЭреЗ рджреЗ рд╕рдХрддрд╛ рд╣реИ:

trait Foo {}

trait A {}
trait B {}
trait C {}
// ...

рдкреНрд░рдХрд╛рд░реЛрдВ рдХреЗ рд╕рдмрд╕реЗрдЯ рдХреЗ рд▓рд┐рдП Foo рдХрд╛ рдХрд╛рд░реНрдпрд╛рдиреНрд╡рдпрди рдЬреЛрдбрд╝реЗрдВ рдЬреЛ A , B , C , ... рдХреЗ рдХреБрдЫ рд╕рдВрдпреЛрдЬрди рдХреЛ рд▓рд╛рдЧреВ рдХрд░рддреЗ рд╣реИрдВ:

impl Foo for T where T: A { ... }
impl Foo for T where T: B { ... }
impl Foo for T where T: A + B { ... }
impl Foo for T where T: B + C { ... }
// ...

рдФрд░ рдореБрдЭреЗ рдХреБрдЫ рд╕рдВрдпреЛрдЬрдиреЛрдВ рдХреЛ "рдирд┐рд╖рд┐рджреНрдз" рдХрд░рдиреЗ рдХреА рдЕрдиреБрдорддрд┐ рджреЗрдВ, рдЙрджрд╛рд╣рд░рдг рдХреЗ рд▓рд┐рдП, A + C рдХрднреА рдирд╣реАрдВ рд╣реЛрдирд╛ рдЪрд╛рд╣рд┐рдП:

impl Foo for T where T: A + C = delete;

?

рдкреНрд░рд╕рдВрдЧ: рдореИрдВ рд╡рд┐рднрд┐рдиреНрди рдкреНрд░рдХрд╛рд░ рдХреА рдЖрдХреГрддрд┐рдпреЛрдВ (рдЕрдВрдХ, рдХреНрдпреВрдмреНрд╕, рдмрд╣реБрднреБрдЬ, ...) рдХреЗ рд▓рд┐рдП ApproxEqual(Shape, Shape) рд╡рд┐рд╢реЗрд╖рддрд╛ рд▓рд╛рдЧреВ рдХрд░рддреЗ рд╣реБрдП рдпрд╣ рдЪрд╛рд╣рдиреЗ рд▓рдЧрд╛ рд╣реВрдВ рдХрд┐ рдпреЗ рд╕рднреА рд▓рдХреНрд╖рдг рдХрд╣рд╛рдВ рд╣реИрдВред рдореБрдЭреЗ рдЗрд╕реЗ рдЕрд▓рдЧ-рдЕрд▓рдЧ рд▓рдХреНрд╖рдгреЛрдВ рдореЗрдВ рдмрджрд▓рдХрд░ рдЗрд╕рдХреЗ рдЖрд╕рдкрд╛рд╕ рдХрд╛рдо рдХрд░рдирд╛ рдкрдбрд╝рд╛, рдЬреИрд╕реЗ, рдкрд░рд╕реНрдкрд░ рд╡рд┐рд░реЛрдзреА рдХрд╛рд░реНрдпрд╛рдиреНрд╡рдпрди рд╕реЗ рдмрдЪрдиреЗ рдХреЗ рд▓рд┐рдП ApproxEqualPoint(Point, Point) ред

@gnzlbg

рдФрд░ рдореБрдЭреЗ рдХреБрдЫ рд╕рдВрдпреЛрдЬрдиреЛрдВ рдХреЛ "рдирд┐рд╖рд┐рджреНрдз" рдХрд░рдиреЗ рдХреА рдЕрдиреБрдорддрд┐ рджреЗрдВ, рдЙрджрд╛рд╣рд░рдг рдХреЗ рд▓рд┐рдП, рдП + рд╕реА рдХрднреА рдирд╣реАрдВ рд╣реЛрдирд╛ рдЪрд╛рд╣рд┐рдП:

рдирд╣реАрдВ, рдпрд╣ рдХреБрдЫ рдРрд╕рд╛ рдирд╣реАрдВ рд╣реИ рдЬреЛ рдЬрд╛рд▓реА рдирд┐рдпрдо рдХреА рдЕрдиреБрдорддрд┐ рджреЗрдЧрд╛ред рдпрд╣ рдХреБрдЫ рдЖрдХрд╛рд░ рдпрд╛ рдкреНрд░рдХрд╛рд░ рдореЗрдВ "рдирдХрд╛рд░рд╛рддреНрдордХ рддрд░реНрдХ" рдХрд╛ рдЕрдзрд┐рдХ рдбреЛрдореЗрди рд╣реЛрдЧрд╛ред

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

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

@nikomatsakis :

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

рдореИрдВрдиреЗ рдЗрд╕реЗ рд▓рд┐рдЦрддреЗ рд╕рдордп рдмрд╣рд┐рд╖реНрдХрд░рдг рд╕рдореВрд╣реЛрдВ рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рд╕реЛрдЪрд╛ (рдЖрдкрдиреЗ рджреВрд╕рд░реЗ рджрд┐рди рдордВрдЪреЛрдВ рдореЗрдВ рдЗрд╕рдХрд╛ рдЙрд▓реНрд▓реЗрдЦ рдХрд┐рдпрд╛), рд▓реЗрдХрд┐рди рдореБрдЭреЗ рдирд╣реАрдВ рд▓рдЧрддрд╛ рдХрд┐ рд╡реЗ рдЗрд╕ рд╡рд┐рд╢реЗрд╖ рдЙрджрд╛рд╣рд░рдг рдореЗрдВ рдХрд╛рдо рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ рдХреНрдпреЛрдВрдХрд┐ рд╕рднреА рд▓рдХреНрд╖рдг рдХрд╛рд░реНрдпрд╛рдиреНрд╡рдпрди рдЕрдирдиреНрдп рдирд╣реАрдВ рд╣реИрдВред рд╕рдмрд╕реЗ рддреБрдЪреНрдЫ рдЙрджрд╛рд╣рд░рдг Point рдФрд░ Float рд▓рдХреНрд╖рдг рд╣реИ: Float _can_ рдПрдХ 1D рдмрд┐рдВрджреБ рд╣реИ, рдЗрд╕рд▓рд┐рдП ApproxEqualPoint(Point, Point) рдФрд░ ApproxEqualFloat(Float, Float) рдирд╣реАрдВ рд╣реЛ рд╕рдХрддрд╛ рд╣реИ рдЕрдирдиреНрдпред рдЕрдиреНрдп рдЙрджрд╛рд╣рд░рдг рд╣реИрдВ рдЬреИрд╕реЗ Square рдФрд░ Polygon , рдпрд╛ Box | Cube рдФрд░ AABB (рдЕрдХреНрд╖-рд╕рдВрд░реЗрдЦрд┐рдд рдмрд╛рдЙрдВрдбрд┐рдВрдЧ рдмреЙрдХреНрд╕) рдЬрд╣рд╛рдВ "рд╡рд┐рд╢реЗрд╖рддрд╛ рдкрджрд╛рдиреБрдХреНрд░рдо" рд╡рд╛рд╕реНрддрд╡ рдореЗрдВ рдЕрдзрд┐рдХ рдЬрдЯрд┐рд▓ рдмрд╛рдзрд╛рдУрдВ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реЛрддреА рд╣реИред

рдирд╣реАрдВ, рдпрд╣ рдХреБрдЫ рдРрд╕рд╛ рдирд╣реАрдВ рд╣реИ рдЬреЛ рдЬрд╛рд▓реА рдирд┐рдпрдо рдХреА рдЕрдиреБрдорддрд┐ рджреЗрдЧрд╛ред рдпрд╣ рдХреБрдЫ рдЖрдХрд╛рд░ рдпрд╛ рдкреНрд░рдХрд╛рд░ рдореЗрдВ "рдирдХрд╛рд░рд╛рддреНрдордХ рддрд░реНрдХ" рдХрд╛ рдЕрдзрд┐рдХ рдбреЛрдореЗрди рд╣реЛрдЧрд╛ред

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

@gnzlbg рдЬрд╛рд▓реА рд╡рд┐рд╢реЗрд╖рдЬреНрдЮрддрд╛ рдЖрдкрдХреЛ рдЙрд╕ рдирд┐рд╣рд┐рдд рдЖрддрдВрдХ рдХреЛ рдмрдирд╛рдиреЗ рдХреА рдЕрдиреБрдорддрд┐ рджреЗрдЧреА, рд▓реЗрдХрд┐рди рдРрд╕рд╛ рдХрд░рдиреЗ рдХрд╛ рд╡рд┐рдЪрд╛рд░ рдореБрдЭреЗ рдмрдирд╛рддрд╛ рд╣реИ: рд░реЛрдирд╛:ред

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

impl<T> !Foo for T where T: A + C { }

рдореБрдЭреЗ рдкреВрд░реА рддрд░рд╣ рд╕реЗ рдпрдХреАрди рдирд╣реАрдВ рд╣реИ рдХрд┐ рдЕрдиреБрдорддрд┐ рджреЗрдиреЗ рдХреЗ рдирд┐рд╣рд┐рддрд╛рд░реНрде рдХреНрдпрд╛ рд╣реИрдВред рдореБрдЭреЗ рд▓рдЧрддрд╛ рд╣реИ рдХрд┐ рдпрд╣ рдЙрди рдореБрджреНрджреЛрдВ рд╕реЗ рдЬреБрдбрд╝рддрд╛ рд╣реИ рдЬреЛ рдирд┐рдХреЛ рдкрд╣рд▓реЗ рд╕реЗ рд╣реА рдЗрд╕ рдмрд╛рдд рдкрд░ рдкреНрд░рдХрд╛рд╢ рдбрд╛рд▓рддреЗ рд╣реИрдВ рдХрд┐ рд╡рд┐рд╢реЗрд╖рдЬреНрдЮрддрд╛ рдХрд┐рд╕ рддрд░рд╣ рд╕реЗ рдкреЙрд▓реАрдореЛрд░реНрдлрд┐рдЬрд╝реНрдо рдХреЗ рд╕рд╛рде рдХреЛрдб рдкреБрди: рдЙрдкрдпреЛрдЧ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рд╣реИред

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

рдЕрдирд┐рд╡рд╛рд░реНрдп рд░реВрдк рд╕реЗ рдпрд╣ рд╡рд┐рдЪрд╛рд░ рд╣реИ рдХрд┐ рдХрд╣реАрдВ рднреА рдЖрдк trait рдирд┐рд╣рд┐рддрд╛рд░реНрде рд▓рд┐рдЦ рд╕рдХрддреЗ рд╣реИрдВ, рдЖрдк рдХрд┐рд╕реА рдФрд░ рд╕рдВрдЦреНрдпрд╛ рдХреЛ "рдФрд░ рднреА рд▓рд┐рдЦ рд╕рдХрддреЗ рд╣реИрдВ рдпрджрд┐ рдПрдХ рдЕрд▓рдЧ impl рдирд┐рд░реНрджрд┐рд╖реНрдЯ рдХрд░рдирд╛ рд╣реИ рдЬреЛ рдкрд┐рдЫрд▓реЗ рдПрдХ (рдорд╛рдорд▓реЗ) рдореЗрдВ рд▓рд╛рдЧреВ рд╣реЛрдирд╛ рдЪрд╛рд╣рд┐рдП рдПрдХ рд╡реИрдХрд▓реНрдкрд┐рдХ рдЕрдВрддрд┐рдо "рдФрд░ рдХреНрд▓реЙрдЬ" рдХреЗ рд╕рд╛рде рдПрдХ рдирдХрд╛рд░рд╛рддреНрдордХ рдирд┐рд╣рд┐рддрд╛рд░реНрде рдирд┐рд░реНрджрд┐рд╖реНрдЯ рдирд╣реАрдВ рдХрд┐рдпрд╛, (рдпрджрд┐ Trait рд▓рд╛рдЧреВ рд╣реЛрдиреЗ рдХреЗ рд▓рд┐рдП рдХреЛрдИ рднреА рдЦрдВрдб рдирд╣реАрдВ рд╣реИ, рддреЛ !Trait рд▓рд╛рдЧреВ рд╣реЛрддрд╛ рд╣реИ)ред

@withoutboats

"рдЕрдкрд╡рд░реНрдЬрди рд╕рдореВрд╣реЛрдВ" рдХрд╛ рд╡рд┐рдЪрд╛рд░ рд╡рд╛рд╕реНрддрд╡ рдореЗрдВ рд╕рд┐рд░реНрдл рдирдХрд╛рд░рд╛рддреНрдордХ рд╕реБрдкрд░рд╕рдЯреНрд░реЗрдЯ рд╕реАрдорд╛ рд╣реИред

рдореБрдЭреЗ рд▓рдЧрддрд╛ рд╣реИ рдХрд┐ рдореЗрд░реЗ рдЙрдкрдпреЛрдЧ рдХреЗ рдорд╛рдорд▓реЛрдВ рдХреЗ рд▓рд┐рдП рдкрд░реНрдпрд╛рдкреНрдд рд╣реЛрдЧрд╛ред

рдореБрдЭреЗ рд▓рдЧрддрд╛ рд╣реИ рдХрд┐ рдпрд╣ рдЙрди рдореБрджреНрджреЛрдВ рд╕реЗ рдЬреБрдбрд╝рддрд╛ рд╣реИ рдЬреЛ рдирд┐рдХреЛ рдкрд╣рд▓реЗ рд╕реЗ рд╣реА рдЗрд╕ рдмрд╛рдд рдкрд░ рдкреНрд░рдХрд╛рд╢ рдбрд╛рд▓рддреЗ рд╣реИрдВ рдХрд┐ рд╡рд┐рд╢реЗрд╖рдЬреНрдЮрддрд╛ рдХрд┐рд╕ рддрд░рд╣ рд╕реЗ рдкреЙрд▓реАрдореЛрд░реНрдлрд┐рдЬрд╝реНрдо рдХреЗ рд╕рд╛рде рдХреЛрдб рдкреБрди: рдЙрдкрдпреЛрдЧ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рд╣реИред

рдореБрдЭреЗ рдирд╣реАрдВ рдкрддрд╛ рдХрд┐ рдХреНрдпрд╛ рдпреЗ рдЕрд╕рдВрдЧрдд рд╣реЛ рд╕рдХрддреЗ рд╣реИрдВред рдореИрдВ рдЪрд╛рд╣рддрд╛ рд╣реВрдБ:

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

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

trait Foo {}
trait A {}
trait B {}

impl<T> Foo for T where T: A { ... }
impl<T> Foo for T where T: B { ... }
// impl<T> Foo for T where T: A + B { ... }  //< compiler: need to add this impl!

рдФрд░ рдореБрдЭреЗ рдирдХрд╛рд░рд╛рддреНрдордХ рдкреНрд░рднрд╛рд╡ рднреА рджреЗрддрд╛ рд╣реИ:

impl<T> !Foo for T where T: A + B { }
impl<T> !Foo for T where T: _ { } // _ => all cases not explicitly covered yet

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

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

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

рдореИрдВ рд╕рд┐рд░реНрдл # 33017 рдорд╛рд░рд╛ рдФрд░ рдЗрд╕реЗ рдЕрднреА рддрдХ рдпрд╣рд╛рдВ рд▓рд┐рдВрдХ рдирд╣реАрдВ рджреЗрдЦрд╛ред рдЗрд╕реЗ рд╕рд╛рдЙрдВрдбрдиреЗрд╕ рд╣реЛрд▓ рдХреЗ рд░реВрдк рдореЗрдВ рдЪрд┐рд╣реНрдирд┐рдд рдХрд┐рдпрд╛ рдЧрдпрд╛ рд╣реИ, рдЗрд╕рд▓рд┐рдП рдпрд╣рд╛рдВ рдЯреНрд░реИрдХ рдХрд░рдирд╛ рдЕрдЪреНрдЫрд╛ рд╣реЛрдЧрд╛ред

Https://github.com/dtolnay/quote/issues/7 рдХреЗ рд▓рд┐рдП рдореБрдЭреЗ RFC рд╕реЗ рдЗрд╕ рдЙрджрд╛рд╣рд░рдг рдХреЗ рд╕рдорд╛рди рдХреБрдЫ рдЪрд╛рд╣рд┐рдП рдЬреЛ рдЕрднреА рддрдХ рдЙрдкрд▓рдмреНрдз рдирд╣реАрдВ рд╣реИред cc @tomaka @Aatch @rphmeier рдЬрд┐рдиреНрд╣реЛрдВрдиреЗ рдЗрд╕ рдмрд╛рд░реЗ рдореЗрдВ рдкрд╣рд▓реЗ рдЯрд┐рдкреНрдкрдгреА рдХреА рдереАред

trait Example {
    type Output;
    fn generate(self) -> Self::Output;
}

impl<T> Example for T {
    default type Output = Box<T>;
    default fn generate(self) -> Box<T> { Box::new(self) }
}

impl Example for bool {
    type Output = bool;
    fn generate(self) -> bool { self }
}

рдореИрдВ рдирд┐рдореНрдирд▓рд┐рдЦрд┐рдд рд╡рд░реНрдХрдЕрд░рд╛рдЙрдВрдб рдкрд░ рдареЛрдХрд░ рдЦрд╛рдИ рдЬреЛ рдПрдХ рд╣реА рдмрд╛рдд рдХреЛ рд╡реНрдпрдХреНрдд рдХрд░рдиреЗ рдХрд╛ рдПрдХ рддрд░реАрдХрд╛ рджреЗрддрд╛ рд╣реИред

#![feature(specialization)]

use std::fmt::{self, Debug};

///////////////////////////////////////////////////////////////////////////////

trait Example: Output {
    fn generate(self) -> Self::Output;
}

/// In its own trait for reasons, presumably.
trait Output {
    type Output: Debug + Valid<Self>;
}

fn main() {
    // true
    println!("{:?}", Example::generate(true));

    // box("s")
    println!("{:?}", Example::generate("s"));
}

///////////////////////////////////////////////////////////////////////////////

/// Instead of `Box<T>` just so the "{:?}" in main() clearly shows the type.
struct MyBox<T: ?Sized>(Box<T>);

impl<T: ?Sized> Debug for MyBox<T>
    where T: Debug
{
    fn fmt(&self, f: &mut fmt::Formatter) -> fmt::Result {
        write!(f, "box({:?})", self.0)
    }
}

///////////////////////////////////////////////////////////////////////////////

/// Return type of the impl containing `default fn`.
type DefaultOutput<T> = MyBox<T>;

impl Output for bool {
    type Output = bool;
}

impl<T> Example for T where T: Pass {
    default fn generate(self) -> Self::Output {
        T::pass({
            // This is the impl you wish you could write
            MyBox(Box::new(self))
        })
    }
}

impl Example for bool {
    fn generate(self) -> Self::Output {
        self
    }
}

///////////////////////////////////////////////////////////////////////////////
// Magic? Soundness exploit? Who knows?

impl<T: ?Sized> Output for T where T: Debug {
    default type Output = DefaultOutput<T>;
}

trait Valid<T: ?Sized> {
    fn valid(DefaultOutput<T>) -> Self;
}

impl<T: ?Sized> Valid<T> for DefaultOutput<T> {
    fn valid(ret: DefaultOutput<T>) -> Self {
        ret
    }
}

impl<T> Valid<T> for T {
    fn valid(_: DefaultOutput<T>) -> Self {
        unreachable!()
    }
}

trait Pass: Debug {
    fn pass(DefaultOutput<Self>) -> <Self as Output>::Output;
}

impl<T: ?Sized> Pass for T where T: Debug, <T as Output>::Output: Valid<T> {
    fn pass(ret: DefaultOutput<T>) -> <T as Output>::Output {
        <T as Output>::Output::valid(ret)
    }
}

рдореИрдВ рдЕрднреА рднреА https://github.com/dtolnay/quote/issues/7 рдкрд░ рдХрд╛рдо рдХрд░ рд░рд╣рд╛ рд╣реВрдВ рдФрд░ рд╣реАрд░реЗ рдХреЗ рдкреИрдЯрд░реНрди рдХреА рдЬрд░реВрд░рдд рд╣реИред рдпрд╣рд╛рдБ рдореЗрд░рд╛ рд╕рдорд╛рдзрд╛рди рд╣реИред cc @zitsen рдЬрд┐рдиреНрд╣реЛрдВрдиреЗ рдЗрд╕ рдмрд╛рд░реЗ рдореЗрдВ рдкрд╣рд▓реЗ рдкреВрдЫрд╛ рдФрд░ рдЬрд╡рд╛рдм рджреЗрдиреЗ рд╡рд╛рд▓реЗ @aturon рдФрд░

#![feature(specialization)]

/// Can't have these impls directly:
///
///  - impl<T> Trait for T
///  - impl<T> Trait for T where T: Clone
///  - impl<T> Trait for T where T: Default
///  - impl<T> Trait for T where T: Clone + Default
trait Trait {
    fn print(&self);
}

fn main() {
    struct A;
    A.print(); // "neither"

    #[derive(Clone)]
    struct B;
    B.print(); // "clone"

    #[derive(Default)]
    struct C;
    C.print(); // "default"

    #[derive(Clone, Default)]
    struct D;
    D.print(); // "clone + default"
}

trait IfClone: Clone { fn if_clone(&self); }
trait IfNotClone { fn if_not_clone(&self); }

impl<T> Trait for T {
    default fn print(&self) {
        self.if_not_clone();
    }
}

impl<T> Trait for T where T: Clone {
    fn print(&self) {
        self.if_clone();
    }
}

impl<T> IfClone for T where T: Clone {
    default fn if_clone(&self) {
        self.clone();
        println!("clone");
    }
}

impl<T> IfClone for T where T: Clone + Default {
    fn if_clone(&self) {
        self.clone();
        Self::default();
        println!("clone + default");
    }
}

impl<T> IfNotClone for T {
    default fn if_not_clone(&self) {
        println!("neither");
    }
}

impl<T> IfNotClone for T where T: Default {
    fn if_not_clone(&self) {
        Self::default();
        println!("default");
    }
}

рдПрдХ рдмрдЧ (рдпрд╛ рдореЗрд░реЗ рджреГрд╖реНрдЯрд┐рдХреЛрдг рд╕реЗ рдХрдо рд╕реЗ рдХрдо рдЕрдкреНрд░рддреНрдпрд╛рд╢рд┐рдд рд╡реНрдпрд╡рд╣рд╛рд░) рдХреЛ рд╡рд┐рд╢реЗрд╖рдЬреНрдЮрддрд╛ рдФрд░ рдкреНрд░рдХрд╛рд░ рдХреЗ рдЕрдиреБрдорд╛рди рд╕реЗ рдорд╛рд░реЛ: # 38167

рдЗрди рджреЛ рдЖрдХреГрддрд┐рдпреЛрдВ рдХреЛ рд╡рд┐рд╢реЗрд╖рдЬреНрдЮрддрд╛ рдХреЗ рд╕рд╛рде рдорд╛рдиреНрдп рд╣реЛрдиреЗ рдХреА рдЙрдореНрдореАрдж рдХреА рдЬрд╛рдиреА рдЪрд╛рд╣рд┐рдП, рд╣реИ рдирд╛? рдРрд╕рд╛ рд▓рдЧрддрд╛ рд╣реИ рдХрд┐ рдЗрд╕реЗ рд╕рдлрд▓рддрд╛рдкреВрд░реНрд╡рдХ рдирд╣реАрдВ рдЙрдард╛рдпрд╛ рдЬрд╛ рд░рд╣рд╛ рд╣реИред

impl<T, ST, DB> ToSql<Nullable<ST>, DB> for T where
    T: ToSql<ST, DB>,
    DB: Backend + HasSqlType<ST>,
    ST: NotNull,
{
    ...
}

impl<T, ST, DB> ToSql<Nullable<ST>, DB> for Option<T> where
    T: ToSql<ST, DB>,
    DB: Backend + HasSqlType<ST>,
    ST: NotNull,
{
    ...
}

рдореИрдВрдиреЗ рдХреБрдЫ рдЕрдирдкреЗрдХреНрд╖рд┐рдд рд╡реНрдпрд╡рд╣рд╛рд░ рдХреЗ рд▓рд┐рдП https://github.com/rust-lang/rust/issues/38516 рджрд╛рдпрд░ рдХрд┐рдпрд╛, рдЬреЛ рдореИрдВ рд╕рд░реНрдбреЗ рдореЗрдВ рд╡рд┐рд╢реЗрд╖рдЬреНрдЮрддрд╛ рдХреЗ рдирд┐рд░реНрдорд╛рдг рдкрд░ рдХрд╛рдо рдХрд░рддреЗ рд╣реБрдП рдЪрд▓рд╛ред Https://github.com/rust-lang/rust/issues/38167 рдХреЗ рд╕рдорд╛рди, рдпрд╣ рдПрдХ рдРрд╕рд╛ рдорд╛рдорд▓рд╛ рд╣реИ рдЬрд╣рд╛рдВ рдХрд╛рд░реНрдпрдХреНрд░рдо рд╡рд┐рд╢реЗрд╖ рдЖрд░реЗрдЦ рдХреЗ рдмрд┐рдирд╛ рд╕рдВрдХрд▓рд┐рдд рд╣реЛрддрд╛ рд╣реИ рдФрд░ рдЬрдм рдЗрд╕реЗ рдЬреЛрдбрд╝рд╛ рдЬрд╛рддрд╛ рд╣реИ рддреЛ рдПрдХ рдкреНрд░рдХрд╛рд░ рдХреА рддреНрд░реБрдЯрд┐ рд╣реЛрддреА рд╣реИред cc @bluss рдЬреЛ рдЗрд╕ рд╕реНрдерд┐рддрд┐ рд╕реЗ рдкрд╣рд▓реЗ рдЪрд┐рдВрддрд┐рдд рдереЗред

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

рдореЗрд░рд╛ рдореБрдЦреНрдп рдФрдЪрд┐рддреНрдп рдпрд╣ рд╣реИ: "рдкреБрдирд░рд╛рд╡реГрддреНрддрд┐рдпреЛрдВ рдФрд░ рд╡реИрдХреНрдЯрд░ рдкреИрдЯрд░реНрдиред" рдХрднреА-рдХрднреА, рдЙрдкрдпреЛрдЧрдХрд░реНрддрд╛ рд╕рднреА рдкреБрдирд░рд╛рд╡реГрддреНрддрд┐рдпреЛрдВ рдФрд░ рд╡реИрдХреНрдЯрд░ рдХреЗ рд▓рд┐рдП рдХреБрдЫ рд▓рд╛рдЧреВ рдХрд░рдирд╛ рдЪрд╛рд╣рддреЗ рд╣реИрдВ:

impl<I> Foo for I where I: Iterator<Item = u32> { ... }
impl Foo for Vec<u32> { ... }

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

рдЖрдЬ рдпрд╣ рд╕рдВрдХрд▓рди рдирд╣реАрдВ рд╣реИ, рдФрд░ рджрд╛рдВрддреЛрдВ рдХрд╛ tsuris рдФрд░ gnashing рд╣реИред рд╡рд┐рд╢реЗрд╖рдЬреНрдЮрддрд╛ рдЗрд╕ рд╕рдорд╕реНрдпрд╛ рдХреЛ рд╣рд▓ рдХрд░рддреА рд╣реИ:

default impl<I> Foo for I where I: Iterator<Item = u32> { ... }
impl Foo for Vec<u32> { ... }

рд▓реЗрдХрд┐рди рдЗрд╕ рд╕рдорд╕реНрдпрд╛ рдХреЛ рд╣рд▓ рдХрд░рдиреЗ рдореЗрдВ, рдЖрдкрдиреЗ рдЕрдкрдиреЗ рдЯреЛрдХрд░реЗ рдореЗрдВ рдПрдХ рд╕рд╛рд░реНрд╡рдЬрдирд┐рдХ рдЕрдиреБрдмрдВрдз рдЬреЛрдбрд╝ рджрд┐рдпрд╛ рд╣реИ: Foo рд╣реЛрдиреЗ рд╡рд╛рд▓реА рдкреБрдирд░рд╛рд╡реГрддреНрддрд┐ рдХреЛ рд░реЛрдХрдирд╛ рд╕рдВрднрд╡ рд╣реИред рд╢рд╛рдпрдж рд╣рдо рдЖрдкрдХреЛ рдРрд╕рд╛ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдордЬрдмреВрд░ рдирд╣реАрдВ рдХрд░рдирд╛ рдЪрд╛рд╣рддреЗ - рдЗрд╕рд▓рд┐рдП, default рдмрд┐рдирд╛ рд╕реНрдерд╛рдиреАрдп рд╡рд┐рд╢реЗрд╖рдЬреНрдЮрддрд╛ред


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

default рдереА, рдореБрдЭреЗ рд▓рдЧрддрд╛ рд╣реИ, рдореВрд▓ рд░реВрдк рд╕реЗ рдЦреЛрдЬрдХрд░реНрддрд╛ рдФрд░ рд╕реНрд╡-рджрд╕реНрддрд╛рд╡реЗрдЬреАрдХрд░рдг рдХреЛрдб рдХреА рдУрд░ рдЗрд╢рд╛рд░рд╛ рд╣реИред рд╣рд╛рд▓рд╛рдБрдХрд┐ [..] рдореИрдВ рдХрд┐рд╕реА рд╡рд╕реНрддреБ рдХреЛ рддрдм рддрдХ рд╡рд┐рд╢реЗрд╖рдЬреНрдЮ рдирд╣реАрдВ рдмрдирд╛ рд╕рдХрддрд╛ рдЬрдм рддрдХ рдХрд┐ рдореИрдВ рдЖрдкрдХреЛ рдХрд┐рд╕реА рд╡рд╕реНрддреБ рдХрд╛ рд╡рд┐рд╢реЗрд╖рдЬреНрдЮ рди рдмрдирд╛рдКрдБред

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

рдореБрдЭреЗ рдЪрд┐рдВрддрд╛ рд╣реИ рдХреНрдпреЛрдВрдХрд┐ рдЗрд╕ RFC рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рд╕реЛрдЪрдиреЗ рд╕реЗ рдореБрдЭреЗ рдкрд╣рд▓реЗ рд╕реЗ рд╣реА C ++ рдХреЛрдбрдмреЗрд╕ рдореЗрдВ рдХрд╛рдо рдХрд░рдиреЗ рдХрд╛ PTSD рдлреНрд▓реИрд╢рдмреИрдХ рджреЗ рд░рд╣рд╛ рд╣реИ рдЬреЛ рдУрд╡рд░рд▓реЛрдбрд┐рдВрдЧ рдФрд░ рд╡рд┐рд░рд╛рд╕рдд рдХреА рдЕрд╢реНрд▓реАрд▓ рдорд╛рддреНрд░рд╛ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рддреЗ рд╣реИрдВ рдФрд░ рдмрд┐рдирд╛ рдХрд┐рд╕реА рд╡рд┐рдЪрд╛рд░ рдХреЗ wtf рдХреЛрдб рдХреА рдХрд┐рд╕реА рднреА рдкрдВрдХреНрддрд┐ рдореЗрдВ рдЪрд▓ рд░рд╣реЗ рд╣реИрдВ, рдЬрд┐рд╕рдореЗрдВ рдПрдХ рд╡рд┐рдзрд┐ рдХреЙрд▓ рд╣реИред рдореИрдВ рд╡рд╛рд╕реНрддрд╡ рдореЗрдВ рдЙрди рд▓рдВрдмрд╛рдИ рдХреА рд╕рд░рд╛рд╣рдирд╛ рдХрд░рддрд╛ рд╣реВрдВ рдЬреЛ @aturon рд╡рд┐рд╢реЗрд╖рдЬреНрдЮрддрд╛ рдФрд░ рд╕реНрдкрд╖реНрдЯ рдФрд░ рд╕реНрд╡-рджрд╕реНрддрд╛рд╡реЗрдЬреАрдХрд░рдг рдмрдирд╛рдиреЗ рдХреЗ рд▓рд┐рдП рдЧрдП рд╣реИрдВред

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

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

рдореБрдЭреЗ рдЪрд┐рдВрддрд╛ рд╣реИ рдХреНрдпреЛрдВрдХрд┐ рдЗрд╕ RFC рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рд╕реЛрдЪрдиреЗ рд╕реЗ рдкрд╣рд▓реЗ рд╣реА рдореБрдЭреЗ PTSD рдлреНрд▓реИрд╢рдмреИрдХ рджреЗ рд░рд╣рд╛ рд╣реИ ...

рд▓реЗрдХрд┐рди рдЗрд╕ рд╡рд┐рдирд┐рд░реНрджреЗрд╢рди рдХреЛ рдЕрд╕реНрд╡реАрдХрд╛рд░ рдХрд░рдиреЗ рд╕реЗ рдЗрди рдЪреАрдЬреЛрдВ рдХреЛ рд╣реЛрдиреЗ рд╕реЗ рдХреИрд╕реЗ рд░реЛрдХрд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИ?

рдпрджрд┐ рдРрд╕реЗ рдЕрдЪреНрдЫреЗ рдорд╛рдорд▓реЗ рд╣реИрдВ, рдЬрд╣рд╛рдВ рд╣рдо рдЙрдиреНрд╣реЗрдВ рдирд╣реАрдВ рдЪрд╛рд╣рддреЗ рд╣реИрдВ, рддреЛ рд╣рдореЗрдВ рдЗрд╕реЗ рдирд┐рд░реНрджрд┐рд╖реНрдЯ рдХрд░рдирд╛ рдЕрд╕рдВрднрд╡ рдирд╣реАрдВ рд╣реЛрдирд╛ рдЪрд╛рд╣рд┐рдПред

рдпрд╣ рдЬрд░реВрд░реА рдирд╣реАрдВ рд╣реИ рдХрд┐ рдЬрдм рднреА рд╡реЗ рдЗрд╕рдХреЗ рд▓рд┐рдП рдПрдХ рдЕрдЪреНрдЫрд╛ рдЙрдкрдпреЛрдЧ рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ рддреЛ рдЙрдкрдпреЛрдЧрдХрд░реНрддрд╛рдУрдВ рдХреЛ рдПрдХ рд╢рдХреНрддрд┐ рджреЗрдирд╛ рдПрдХ рдЕрдЪреНрдЫрд╛ рд╡рд┐рдЪрд╛рд░ рд╣реИред рдРрд╕рд╛ рдирд╣реАрдВ рд╣реИ рдХрд┐ рдпрд╣ рдЙрдкрдпреЛрдЧрдХрд░реНрддрд╛рдУрдВ рдХреЛ рднреНрд░рдорд┐рдд рдХреЛрдб рд▓рд┐рдЦрдиреЗ рдореЗрдВ рд╕рдХреНрд╖рдо рдмрдирд╛рддрд╛ рд╣реИред

рд▓реЗрдХрд┐рди рдЗрд╕ рд╡рд┐рдирд┐рд░реНрджреЗрд╢рди рдХреЛ рдЕрд╕реНрд╡реАрдХрд╛рд░ рдХрд░рдиреЗ рд╕реЗ рдЗрди рдЪреАрдЬреЛрдВ рдХреЛ рд╣реЛрдиреЗ рд╕реЗ рдХреИрд╕реЗ рд░реЛрдХрд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИ?

рдорд╛рди рд▓реЗрдВ рдХрд┐ рдЖрдк foo.bar() рдФрд░ рдЖрдк bar() рдХреНрдпрд╛ рджреЗрдЦрдирд╛ рдЪрд╛рд╣рддреЗ рд╣реИрдВред рдЕрднреА, рдпрджрд┐ рдЖрдк рдПрдХ рдорд┐рд▓рд╛рди рдкреНрд░рдХрд╛рд░ рдкрд░ рд▓рд╛рдЧреВ рд╡рд┐рдзрд┐ рдкрд╛рддреЗ рд╣реИрдВ рдФрд░ рдпрд╣ default рдЪрд┐рд╣реНрдирд┐рдд рдирд╣реАрдВ рд╣реИ, рддреЛ рдЖрдк рдЬрд╛рдирддреЗ рд╣реИрдВ рдХрд┐ рдЗрд╕рдХреА рд╡рд┐рдзрд┐ рдкрд░рд┐рднрд╛рд╖рд╛ рдЬрд┐рд╕реЗ рдЖрдк рдЦреЛрдЬ рд░рд╣реЗ рд╣реИрдВред @Withoutboats рдХреЗ рдкреНрд░рд╕реНрддрд╛рд╡ рдХреЗ рд╕рд╛рде рдпрд╣ рдЕрдм рд╕рдЪ рдирд╣реАрдВ рд╣реЛрдЧрд╛ - рдЗрд╕рдХреЗ рдмрдЬрд╛рдп рдЖрдкрдХреЛ рдХрднреА рднреА рдпрд╣ рдкрддрд╛ рдирд╣реАрдВ рдЪрд▓реЗрдЧрд╛ рдХрд┐ рдЖрдк рд╡рд╛рд╕реНрддрд╡ рдореЗрдВ рдЙрд╕ рдХреЛрдб рдХреЛ рджреЗрдЦ рд░рд╣реЗ рд╣реИрдВ рдЬрд┐рд╕реЗ рдирд┐рд╖реНрдкрд╛рджрд┐рдд рдХрд┐рдпрд╛ рдЬрд╛ рд░рд╣рд╛ рд╣реИред

рдЗрд╕рдХреЗ рдмрдЬрд╛рдп рдЖрдк рдХрднреА рднреА рдпрд╣ рдирд╣реАрдВ рдЬрд╛рди рдкрд╛рдПрдВрдЧреЗ рдХрд┐ рдЖрдк рд╡рд╛рд╕реНрддрд╡ рдореЗрдВ рдЙрд╕ рдХреЛрдб рдХреЛ рджреЗрдЦ рд░рд╣реЗ рд╣реИрдВ рдЬрд┐рд╕реЗ рдирд┐рд╖реНрдкрд╛рджрд┐рдд рдХрд┐рдпрд╛ рдЬрд╛ рд░рд╣рд╛ рд╣реИред

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

рдЗрд╕ рдмреАрдЪ, default , рд╕рдорд╕реНрдпрд╛ рдмрдиреА рд╣реБрдИ рд╣реИ рдЬрдм рдПрдХ рдЕрдВрдЬреАрд░ рдХреЛ рдЕрдВрддрд┐рдо рд░реВрдк рдирд╣реАрдВ рджрд┐рдпрд╛ рдЧрдпрд╛ рд╣реИред рдпрджрд┐ рд╕рд╣реА рдирд┐рд╣рд┐рддрд╛рд░реНрде рд╡рд╛рд╕реНрддрд╡ рдореЗрдВ default рдирд┐рд╣рд┐рдд рд╣реИ, рддреЛ рдЖрдк рдЕрдирд┐рд╢реНрдЪрд┐рдд рд╣реЛрдиреЗ рдХреА рдХрдард┐рдирд╛рдИ рдХреА рдПрдХ рд╣реА рд╕реНрдерд┐рддрд┐ рдореЗрдВ рд╣реИрдВ рдпрджрд┐ рдпрд╣ рд╕рд╣реА рдирд┐рд╣рд┐рдд рд╣реИред рдФрд░ рдирд┐рд╢реНрдЪрд┐рдд рд░реВрдк рд╕реЗ рдпрджрд┐ рд╡рд┐рд╢реЗрд╖рдЬреНрдЮрддрд╛ рдХреЛ рдирд┐рдпреЛрдЬрд┐рдд рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИ, рддреЛ рдпрд╣ рдЖрдорддреМрд░ рдкрд░ рдорд╛рдорд▓рд╛ рд╣реЛрдЧрд╛ (рдЙрджрд╛рд╣рд░рдг рдХреЗ рд▓рд┐рдП, рдпрд╣ рдЖрдЬ рд▓рдЧрднрдЧ ToString рдкреНрд░рддреНрдпреЗрдХ рдирд┐рд╣рд┐рддрд╛рд░реНрде рдХреЗ рд▓рд┐рдП рдорд╛рдорд▓рд╛ рд╣реИ)ред

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

рдореИрдВ рдпрд╣ рдирд╣реАрдВ рдХрд╣ рд░рд╣рд╛ рд╣реВрдБ рдХрд┐ рдпрд╣ рдкрд░рд┐рд╡рд░реНрддрди рдХрд┐рд╕реА рднреА рддрд░рд╣ рд╕реЗ рдПрдХ рд╕реНрд▓реИрдордбрдВрдХ рд╣реИ, рд▓реЗрдХрд┐рди рдореБрдЭреЗ рд▓рдЧрддрд╛ рд╣реИ рдХрд┐ рдпрд╣ рдПрдХ рдЕрдзрд┐рдХ рд╕реВрдХреНрд╖реНрдо рд╡рд┐рдЪрд╛рд░ рдХреЗ рд▓рд╛рдпрдХ рд╣реИред

рдпрд╣ рдЬрд░реВрд░реА рдирд╣реАрдВ рд╣реИ рдХрд┐ рдЬрдм рднреА рд╡реЗ рдЗрд╕рдХреЗ рд▓рд┐рдП рдПрдХ рдЕрдЪреНрдЫрд╛ рдЙрдкрдпреЛрдЧ рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ рддреЛ рдЙрдкрдпреЛрдЧрдХрд░реНрддрд╛рдУрдВ рдХреЛ рдПрдХ рд╢рдХреНрддрд┐ рджреЗрдирд╛ рдПрдХ рдЕрдЪреНрдЫрд╛ рд╡рд┐рдЪрд╛рд░ рд╣реИред рдРрд╕рд╛ рдирд╣реАрдВ рд╣реИ рдХрд┐ рдпрд╣ рдЙрдкрдпреЛрдЧрдХрд░реНрддрд╛рдУрдВ рдХреЛ рднреНрд░рдорд┐рдд рдХреЛрдб рд▓рд┐рдЦрдиреЗ рдореЗрдВ рд╕рдХреНрд╖рдо рдмрдирд╛рддрд╛ рд╣реИред

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

рдореБрдЭреЗ рд▓рдЧрддрд╛ рд╣реИ рдХрд┐ default рдЗрд╕ рдЕрд░реНрде рдореЗрдВ рдорджрдж рдХрд░рддрд╛ рд╣реИ рдХрд┐ рдпрджрд┐ рдЖрдк рдХрд┐рд╕реА рдХреЛрдб рдХреЛ рдкрдврд╝рдиреЗ рдХреЛ рд╕рд░рд▓ рдмрдирд╛рдирд╛ рдЪрд╛рд╣рддреЗ рд╣реИрдВ рддреЛ рдЖрдк рдкреВрдЫ рд╕рдХрддреЗ рд╣реИрдВ рдХрд┐ рдХреЛрдИ рднреА default рдХрд╛ рдЙрдкрдпреЛрдЧ рдирд╣реАрдВ рдХрд░рддрд╛ рд╣реИ рдпрд╛ рдЗрд╕рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдХрдареЛрд░ рдкреНрд░рд▓реЗрдЦрди рдирд┐рдпрдо рд╕реНрдерд╛рдкрд┐рдд рдирд╣реАрдВ рдХрд░рддрд╛ рд╣реИред рдЙрд╕ рдмрд┐рдВрджреБ рдкрд░, рдЖрдкрдХреЛ рдХреЗрд╡рд▓ default s рд╕реЗ std рдЪрд┐рдВрддрд╛ рдХрд░рдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реИ, рдЬреЛ рд╕рдВрднрд╡рддрдГ рд▓реЛрдЧреЛрдВ рдХреЛ рдмреЗрд╣рддрд░ рд╕рдордЭ рдореЗрдВ рдЖрдПрдЧрд╛ред

рдореБрдЭреЗ рдпрд╣ рд╡рд┐рдЪрд╛рд░ рдпрд╛рдж рд╣реИ рдХрд┐ рдкреНрд░рд▓реЗрдЦрди рдирд┐рдпрдореЛрдВ рдХреЛ рд╡рд┐рд╢реЗрд╖рдЬреНрдЮрддрд╛ рдХреЗ usages рдкрд░ рд▓рдЧрд╛рдпрд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИ, рдЬрд┐рд╕реЗ RFC рджреНрд╡рд╛рд░рд╛ рдЕрдиреБрдореЛрджрд┐рдд рд╡рд┐рд╢реЗрд╖рдЬреНрдЮрддрд╛ рдкреНрд░рд╛рдкреНрдд рдХрд░рдиреЗ рдореЗрдВ рдпреЛрдЧрджрд╛рди рджрд┐рдпрд╛ рдЧрдпрд╛ рд╣реИред

@withoutboats рдХреНрдпрд╛ рдореИрдВ default рд╢рд┐рдерд┐рд▓рддрд╛ рдХреЗ рд▓рд┐рдП рдЖрдкрдХреА рдкреНрд░реЗрд░рдгрд╛ рдХреЛ рдкрдврд╝рдиреЗ рдореЗрдВ рд╕рд╣реА рд╣реВрдВ рдХреНрдпреЛрдВрдХрд┐ рдЖрдк default рдХрд╛ рдПрдХ рдкреНрд░рддрд┐рдмрдВрдзрд┐рдд рд░реВрдк рдЪрд╛рд╣рддреЗ рд╣реИрдВ рдЬрд┐рд╕рдХрд╛ рдЕрд░реНрде рд╣реИ "рдЕрддрд┐-рдпреЛрдЧреНрдп, рд▓реЗрдХрд┐рди рдХреЗрд╡рд▓ рдЗрд╕ рдЯреЛрдХрд░реЗ рдореЗрдВ" (рдпрд╛рдиреА, pub(crate) рд▓реЗрдХрд┐рди default )? рд╣рд╛рд▓рд╛рдВрдХрд┐, рдЗрд╕реЗ рдЖрд╕рд╛рди рдмрдирд╛рдиреЗ рдХреЗ рд▓рд┐рдП рдЖрдк рдХреЛ рдЫреЛрдбрд╝рддреЗ рд╣реБрдП рдХреЗ рд╢рдмреНрджреЛрдВ рдХреЛ рдмрджрд▓рдиреЗ рдХрд╛ рдкреНрд░рд╕реНрддрд╛рд╡ рдХрд░ рд░рд╣реЗ рд╣реИрдВ default , рдмрдЬрд╛рдп рдХреЗ graduations рдЬреЛрдбрд╝рдиреЗ default -рдиреЗрд╕?

рд╕рд╣реА рдмрд╛рддред default(crate) рдЬреИрд╕рд╛ рдХреБрдЫ рдХрд░рдирд╛ рдУрд╡рд░рдХрд┐рд▓ рдЬреИрд╕рд╛ рд▓рдЧрддрд╛ рд╣реИред

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

рд╕рд╣реА рдмрд╛рддред рдбрд┐рдлрд╝реЙрд▓реНрдЯ (рдЯреЛрдХрд░рд╛) рдХреА рддрд░рд╣ рдХреБрдЫ рдХрд░рдирд╛ рдУрд╡рд░рдХрд┐рд▓ рдХреА рддрд░рд╣ рд▓рдЧрддрд╛ рд╣реИред

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

@nikomatsakis рдореЗрд░реЗ рдкрд╛рд╕ рдПрдХ рд╣реА рдкреНрд░реЗрд░рдгрд╛ рд╣реИ, рдЬреЛ рдореИрдВ рдкреНрд░рд╕реНрддрд╛рд╡ рдХрд░ рд░рд╣рд╛ рд╣реВрдВ рд╡рд╣ рдпрд╣ рд╣реИ рдХрд┐ рд╣рдо рдХреЗрд╡рд▓ рдПрдХ рд╣реА рдЯреЛрдХрд░реЗ рдореЗрдВ рд╡рд┐рд╢реЗрд╖рдЬреНрдЮ рдХреЗ рд▓рд┐рдП рдбрд┐рдлрд╝реЙрд▓реНрдЯ рдЖрд╡рд╢реНрдпрдХрддрд╛ рдХреЛ рд╣рдЯрд╛ рджреЗрдВ, рдХреНрдпреЛрдВрдХрд┐ рдЕрдзрд┐рдХ рд▓реАрд╡рд░ рдХреЛ рдЬреЛрдбрд╝рдиреЗ рдХреЗ рд▓рд┐рдПред :-)

рд╕рдВрдпреЛрдЧ рд╕реЗ рдЗрд╕ рдЧреИрд░ рдирд┐рд░реНрдпрд╛рдд рдбрд┐рдлрд╝реЙрд▓реНрдЯ рдЕрдзрд┐рдХ рдЖрдо рдЙрдкрдпреЛрдЧ рд╣реИ, рддреЛ рд╣реЛ рд╕рдХрддрд╛ рд╣реИ рдПрдХ #[default_export] рд╕реБрд╡рд┐рдзрд╛ рдХреЗ рд╕рд╛рде рддреБрд▓рдирд╛ рдХрд░рдХреЗ рдпрд╛рдж рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдЖрд╕рд╛рди рд╣реЛрдЧрд╛ #[macro_export] ред рдПрдХ рдордзреНрдпрд╡рд░реНрддреА рд╡рд┐рдХрд▓реНрдк pub use рдпрд╛ pub mod рд▓рд╛рдЗрдиреЛрдВ рдХреЗ рд▓рд┐рдП рдЗрд╕ рдирд┐рд░реНрдпрд╛рдд рд╕реБрд╡рд┐рдзрд╛ рдХреА рдЕрдиреБрдорддрд┐ рджреЗ рд╕рдХрддрд╛ рд╣реИред

pub рдХреАрд╡рд░реНрдб рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдирд╛ рдмреЗрд╣рддрд░ рд╣реЛрдЧрд╛, рдХреНрдпреЛрдВрдХрд┐ рдореИрдХреНрд░реЛрдЬрд╝ 2.0 рд╕рд╛рдорд╛рдиреНрдп рд╡рд╕реНрддреБрдУрдВ рдХреЗ рд░реВрдк рдореЗрдВ рдореИрдХреНрд░реЛрдЬрд╝ рдХрд╛ рд╕рдорд░реНрдерди рдХрд░реЗрдЧрд╛ рдФрд░ pub рдмрдЬрд╛рдп #[macro_use] ред рдмреЛрд░реНрдб рднрд░ рдореЗрдВ рджреГрд╢реНрдпрддрд╛ рдХреЛ рдЗрдВрдЧрд┐рдд рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП pub рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдирд╛ рдЗрд╕рдХреА рд╕реНрдерд┐рд░рддрд╛ рдХреЗ рд▓рд┐рдП рдПрдХ рдмрдбрд╝реА рдЬреАрдд рд╣реЛрдЧреАред

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

рдкрдм рдХреАрд╡рд░реНрдб рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдирд╛ рдмреЗрд╣рддрд░ рд╣реЛрдЧрд╛

pub default fn рдЕрд░реНрде рд╣реИ "рд╕рд╛рд░реНрд╡рдЬрдирд┐рдХ рд░реВрдк рд╕реЗ fn рдХреА рдбрд┐рдлрд╝реЙрд▓реНрдЯрддрд╛ рдХреЛ рдирд┐рд░реНрдпрд╛рдд рдХрд░реЗрдВ" рдХреЗ рд░реВрдк рдореЗрдВ рдлрд╝рдВрдХреНрд╢рди рдХреА рджреГрд╢реНрдпрддрд╛ рдХреЛ рдкреНрд░рднрд╛рд╡рд┐рдд рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдЦреБрдж рдХреЛ рдирдП рд▓реЛрдЧреЛрдВ рдХреЗ рд▓рд┐рдП рд╕реБрдкрд░ рднреНрд░рд╛рдордХ рд╣реЛрдЧрд╛ред

@jimmycuadra рдпрд╣ рд╣реИ рдХрд┐ pub рдХреАрд╡рд░реНрдб рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдиреЗ рд╕реЗ рдЖрдкрдХрд╛ рдХреНрдпрд╛ рдорддрд▓рдм рд╣реИ? рдореИрдВ @sgrif рд╕реЗ рд╕рд╣рдордд

рд╢рд╛рдпрдж pub default fn рдмрд┐рд▓реНрдХреБрд▓ рдирд╣реАрдВ рд╣реИ, рдХреНрдпреЛрдВрдХрд┐ рдпрд╣ рдЕрд╕реНрдкрд╖реНрдЯ рд╣реИ, рдЬреИрд╕рд╛ рдХрд┐ рдЖрдк рджреЛрдиреЛрдВ рдЙрд▓реНрд▓реЗрдЦ рдХрд░рддреЗ рд╣реИрдВред рдореИрдВ рдмрд╕ рдХрд╣ рд░рд╣рд╛ рдерд╛ рдХрд┐ pub рд╕рд╛рд░реНрд╡рднреМрдорд┐рдХ рд╣реЛрдиреЗ рдХрд╛ рдорддрд▓рдм рд╣реИ "рдХреБрдЫ рдФрд░ рдЙрдЬрд╛рдЧрд░ рдХрд░реЗрдВ рдЕрдиреНрдпрдерд╛ рдмрд╛рд╣рд░ рдХреА рдУрд░ рдирд┐рдЬреАред" рд╕рдВрднрд╡рддрдГ pub рдХреЛ рд╢рд╛рдорд┐рд▓ рдХрд░рдиреЗ рд╡рд╛рд▓реЗ рд╕рд┐рдВрдЯреИрдХреНрд╕ рдХреЗ рдХреБрдЫ рд╕реВрддреНрд░ рд╣реИрдВ рдЬреЛ рдиреЗрддреНрд░рд╣реАрди рд░реВрдк рд╕реЗ рднрд┐рдиреНрди рд╣реЛрдВрдЧреЗ рддрд╛рдХрд┐ рдлрд╝рдВрдХреНрд╢рди рдХреЛ рд╕реНрд╡рдпрдВ рд╕рд╛рд░реНрд╡рдЬрдирд┐рдХ рдмрдирд╛рдиреЗ рдореЗрдВ рднреНрд░рдорд┐рдд рди рд╣реЛрдВред

рд╣рд╛рд▓рд╛рдВрдХрд┐ рдпрд╣ рдереЛрдбрд╝рд╛ рд╕рд╛ рд╡рд╛рдХреНрдпрд╡рд┐рдиреНрдпрд╛рд╕ рд╣реИ, рдореИрдВ default(foo) pub(foo) рддрд░рд╣ рдХрд╛рдо рдХрд░рдиреЗ рдХрд╛ рд╡рд┐рд░реЛрдз рдирд╣реАрдВ рдХрд░реВрдВрдЧрд╛ - рджреЛ рдХреЗ рдмреАрдЪ рд╕рдорд░реВрдкрддрд╛ рдореЗрд░реЗ рд▓рд┐рдП рд╕рд┐рдВрдЯреИрдХреНрд╕ рдХреА рдХрд╛рд▓реНрдкрдирд┐рдХрддрд╛ рдХреЛ рджрд░реНрд╢рд╛рддрд╛ рд╣реИред

Bikeshed рдЪреЗрддрд╛рд╡рдиреА: рдпрджрд┐ рд╣рдо рдЗрд╕реЗ рдмреБрд▓рд╛ рдкрд░ рд╡рд┐рдЪрд╛рд░ рдХрд┐рдпрд╛ рд╣реИ overridable рдХреЗ рдмрдЬрд╛рдп default ? рдпрд╣ рдЕрдзрд┐рдХ рд╢рд╛рдмреНрджрд┐рдХ рд░реВрдк рд╕реЗ рд╡рд░реНрдгрдирд╛рддреНрдордХ рд╣реИ, рдФрд░ overridable(foo) рдореБрдЭреЗ default(foo) рд╕реЗ рдмреЗрд╣рддрд░ рдкрдврд╝рддрд╛ рд╣реИ - рдмрд╛рдж рд╡рд╛рд▓рд╛ рд╕реБрдЭрд╛рд╡ рджреЗрддрд╛ рд╣реИ "рдпрд╣ foo рдХреЗ рджрд╛рдпрд░реЗ рдореЗрдВ рдбрд┐рдлрд╝реЙрд▓реНрдЯ рд╣реИ, рд▓реЗрдХрд┐рди рдХреБрдЫ рдФрд░ рдбрд┐рдлрд╝реЙрд▓реНрдЯ рд╣реЛ рд╕рдХрддрд╛ рд╣реИ рдХрд╣реАрдВ рдФрд░ ", рдЬрдмрдХрд┐ рдкреВрд░реНрд╡ рдХрд╣рддрд╛ рд╣реИ" рдпрд╣ foo "рдХреЗ рджрд╛рдпрд░реЗ рдореЗрдВ рдЕрддрд┐-рдпреЛрдЧреНрдп рд╣реИ, рдЬреЛ рд╕рд╣реА рд╣реИред

рдореБрдЭреЗ рд▓рдЧрддрд╛ рд╣реИ рдХрд┐ рдкрд╣рд▓реЗ рджреЛ рдкреНрд░рд╢реНрди рд╡рд╛рд╕реНрддрд╡ рдореЗрдВ рд╣реИрдВ: рдХреНрдпрд╛ default ness рдХрд╛ рдирд┐рд░реНрдпрд╛рдд рдХрд░рдирд╛ рдпрд╛ рдирд╣реАрдВ рдХрд░рдирд╛ рдЖрдо рдмрд╛рдд рд╣реИ? default рдиреЗрд╕ рдбрд┐рдлрд╝реЙрд▓реНрдЯ рд╡реНрдпрд╡рд╣рд╛рд░ рдирд╣реАрдВ рд╣реЛрдирд╛ рдЪрд╛рд╣рд┐рдП?

рд╣рд╛рдБ рдорд╛рдорд▓рд╛: рдЖрдк рдирд┐рд░реНрдпрд╛рдд рдХреЗ рд╕рд╛рде рд╕рдорд╛рдирддрд╛ рдХреЛ рдХрд╣реАрдВ рдФрд░ рдмрдврд╝рд╛ рд╕рдХрддреЗ рд╣реИрдВ рдЬреИрд╕реЗ pub mod mymodule default; рдФрд░ pub use mymodule::MyTrait default; , рдпрд╛ рд╢рд╛рдпрдж overridable ред рдпрджрд┐ рдЖрд╡рд╢реНрдпрдХ рд╣реЛ, рддреЛ рдЖрдк pub use MyModule::MyTrait::{methoda,methodb} default; рд╕рд╛рде рдХреЗрд╡рд▓ рдХреБрдЫ рддрд░реАрдХреЛрдВ рдХреЗ рд▓рд┐рдП default рдиреЗрд╕ рдирд┐рд░реНрдпрд╛рдд рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ

рдХреЛрдИ рдорд╛рдорд▓рд╛ рдирд╣реАрдВ: рдЖрдкрдХреЛ рдирд┐рдЬреАрддрд╛ рд╡реНрдпрдХреНрдд рдХрд░рдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реИ, рди рдХрд┐ рдкреНрд░рдЪрд╛рд░ рдХреА, рдЬреЛ рд░рд╕реНрдЯ рд╡реИрд╕реЗ рднреА рдХрд┐рд╕реА рднреА рдЪреАрдЬрд╝ рд╕реЗ рдХрд╛рдлреА рднрд┐рдиреНрди рд╣реИ, рдЗрд╕рд▓рд┐рдП рдЕрдм default(crate) рдЗрди рдирд┐рд░реНрдпрд╛рддреЛрдВ рдХреЛ рдирд┐рдпрдВрддреНрд░рд┐рдд рдХрд░рдиреЗ рдХрд╛ рд╕рд╛рдорд╛рдиреНрдп рддрд░реАрдХрд╛ рдмрди рдЬрд╛рддрд╛ рд╣реИред

рдЗрд╕рдХреЗ рдЕрд▓рд╛рд╡рд╛, рдЕрдЧрд░ default рдиреЗрд╕ рдХрд╛ рдирд┐рд░реНрдпрд╛рдд рдФрд░ рдирд┐рд░реНрдпрд╛рдд рдХрд░рдирд╛ рд╕рдорд╛рди рд░реВрдк рд╕реЗ рд╕рд╛рдорд╛рдиреНрдп рдирд╣реАрдВ рд╣реИ, рддреЛ рдЖрдк рд▓реЛрдЧ рд╢рд╛рдпрдж рдордирдорд╛рдиреЗ рдврдВрдЧ рд╕реЗ рд╣рд╛рдБ рдпрд╛ рдирд╛ рдХреЗ рдорд╛рдорд▓реЗ рдореЗрдВ рдЪреБрди рд╕рдХрддреЗ рд╣реИрдВ, рдЗрд╕рд▓рд┐рдП рдлрд┐рд░ рд╕реЗ pub use MyModule::MyTrait::{methoda,methodb} default; рдХрд╛рдо рдХрд░рдирд╛ рдареАрдХ рд╣реИред

рдпреЗ рд╕рднреА рд╕рдВрдХреЗрддрди рд╕рдВрдЧрдд рд╡реИрд╕реЗ рднреА рджрд┐рдЦрддреЗ рд╣реИрдВред рдПрдХ рдЕрдиреНрдп рд╡рд┐рдХрд▓реНрдк рдХреБрдЫ рд╡рд┐рд╢реЗрд╖ impl рд╣реЛ рд╕рдХрддрд╛ рд╣реИ рдЬреЛ default s рдмрдВрдж рд╣реЛ, рд▓реЗрдХрд┐рди рдпрд╣ рдЬрдЯрд┐рд▓ рдФрд░ рдЕрдЬреАрдм рд▓рдЧрддрд╛ рд╣реИред

@burdges рдХреНрдпрд╛ рдЖрдкрдХреЗ рдкрд╛рд╕ "рд╣рд╛рдВ рдХреЗрд╕" рдФрд░ "рдХреЛрдИ рдорд╛рдорд▓рд╛ рдирд╣реАрдВ" рд▓реЗрдмрд▓ рд╣реИ, рдпрд╛ рдЖрдк рдЬреЛ рдХрд╣ рд░рд╣реЗ рд╣реИрдВ, рдХреНрдпрд╛ рдореИрдВ рдЧрд▓рдд рд╕рдордЭ рд░рд╣рд╛ рд╣реВрдВ?

рд╣рд╛рдБ, рдЙрдлрд╝! рдлрд┐рдХреНрд╕реНрдб!

рд╣рдорд╛рд░реЗ рдкрд╛рд╕ impl<T> Borrow<T> for T where T: ?Sized рддрд╛рдХрд┐ Borrow<T> рдХреЗ рд╕реНрд╡рд╛рдорд┐рддреНрд╡ рд╡рд╛рд▓реЗ рдореВрд▓реНрдпреЛрдВ рдХрд╛ рдЗрд▓рд╛рдЬ рдХрд┐рдпрд╛ рдЬрд╛ рд╕рдХреЗ рдЬреИрд╕реЗ рдХрд┐ рд╡реЗ рдЙрдзрд╛рд░ рд▓рд┐рдП рдЧрдП рдереЗред

рдореБрдЭреЗ рд▓рдЧрддрд╛ рд╣реИ рдХрд┐ рд╣рдо clone Borrow<T> рд╕реЗ рдХреЙрд▓ рдХреЛ рдЕрдиреБрдХреВрд▓рд┐рдд рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рд╡рд┐рд╢реЗрд╖рдЬреНрдЮрддрд╛ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ, рд╣рд╛рдБ?

pub trait CloneOrTake<T> {
    fn clone_or_take(self) -> T;
}

impl<B,T> CloneOrTake<T> for B where B: Borrow<T>, T: Clone {
    #[inline]
    default fn clone_or_take(b: B) -> T { b.clone() }
}
impl<T> CloneOrTake<T> for T {
    #[inline]
    fn clone_or_take(b: T) -> T { b };
}

рдореБрдЭреЗ рд▓рдЧрддрд╛ рд╣реИ рдХрд┐ рдпрд╣ Borrow<T> рдЕрдзрд┐рдХ рд╕реНрдерд┐рддрд┐рдпреЛрдВ рдореЗрдВ рдЙрдкрдпреЛрдЧ рдХрд░рдиреЗ рдпреЛрдЧреНрдп рд╣реЛ рд╕рдХрддрд╛ рд╣реИред рдореИрдВ рдЧрд┐рд░рд╛ T: ?Sized рдмрд╛рдзреНрдп рд╣реИ рдХреНрдпреЛрдВрдХрд┐ рдПрдХ рд╕рдВрднрд╡рддрдГ рдХреА рдЬрд░реВрд░рдд рд╣реИ Sized рдЬрдм рд▓реМрдЯрдиреЗ T ред

рдПрдХ рдФрд░ рддрд░реАрдХрд╛ рд╣реЛ рд╕рдХрддрд╛ рд╣реИ

pub trait ToOwnedFinal : ToOwned {
    fn to_owned_final(self) -> Self::Owned;
}

impl<B> ToOwnedFinal for B where B: ToOwned {
    #[inline]
    default fn to_owned_final(b: B) -> Self::Owned { b.to_owned() }
}
impl<T> ToOwnedFinal for T {
    #[inline]
    fn to_owned_final(b: T) -> T { b };
}

рд╣рдордиреЗ рдЖрдЬ рдХреБрдЫ рд╕рдВрднрд╛рд╡рд┐рдд рдЦреЛрдЬреЛрдВ рдХреЛ рдкрд░реЗрд╢рд╛рди рдХрд░ рджрд┐рдпрд╛ рд╣реИ, рдЖрдк рдпрд╣рд╛рдБ рдЖрдИрдЖрд░рд╕реА рд▓реЙрдЧ рдкрдврд╝ рд╕рдХрддреЗ рд╣реИрдВ: https://botbot.me/mozilla/rust-lang/

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

рдПрдХ рдмрд╛рдд рдЬреЛ рдореБрдЭреЗ рдкреВрд░реА рддрд░рд╣ рд╕реЗ рдорд╣рд╕реВрд╕ рд╣реЛрддреА рд╣реИ, рд╡рд╣ рдпрд╣ рд╣реИ рдХрд┐ default рдЖрд╡рд╢реНрдпрдХрддрд╛ рдХреЛ рдЗрд╕ рдЧрд╛рд░рдВрдЯреА рдХреЗ рд╕рд╛рде рд╕рдВрдЧрдд рдирд╣реАрдВ рдХрд┐рдпрд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИ рдХрд┐ рдирдП default рдЗрдВрдкреЛрдЬрд╝ рд╣рдореЗрд╢рд╛ рдкрд┐рдЫрдбрд╝реЗ рд╕рдВрдЧрдд рд╣реЛрддреЗ рд╣реИрдВред рдпрд╣рд╛рдБ рдкреНрд░рджрд░реНрд╢рди рд╣реИ:

рдЯреЛрдХрд░рд╛ parent v 1.0.0

trait A { }
trait B { }
trait C {
    fn foo(&self);
}

impl<T> C for T where T: B {
    // No default, not specializable!
    fn foo(&self) { panic!() }
}

рдЯреЛрдХрд░рд╛ client ( parent рдкрд░ рдирд┐рд░реНрднрд░ рдХрд░рддрд╛ рд╣реИ)

extern crate parent;

struct Local;

impl parent::A for Local { }
impl parent::C for Local {
    fn foo(&self) { }
}

рд╕реНрдерд╛рдиреАрдп рдФрдЬрд╛рд░ A рдФрд░ C рд▓реЗрдХрд┐рди B ред рдпрджрд┐ рд╕реНрдерд╛рдиреАрдп B рд▓рд╛рдЧреВ рдХрд░рддреЗ рд╣реИрдВ, рддреЛ C рдирд┐рд╣рд┐рддрд╛рд░реНрде C for T where T: B рдХреЗ рдЧреИрд░-рд╡рд┐рд╢рд┐рд╖реНрдЯ рдХрдВрдмрд▓ рдХреЗ рд╕рд╛рде рд╕рдВрдШрд░реНрд╖ рд╣реЛрдЧрд╛ред

рдЯреЛрдХрд░рд╛ parent v 1.1.0

// Same code as before, but add:
default impl<T> B for T where T: A { }

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


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

рдореЗрд░реЗ рд▓рд┐рдП рдЕрдкрдиреЗ рдЕрдирд┐рд╢реНрдЪрд┐рдд рддреЛ 'impls рдЧреИрд░ рддреЛрдбрд╝рдиреЗ' рдЕрдЧрд░ рдЧрд╛рд░рдВрдЯреА salvageable рд╣реИ, рд▓реЗрдХрд┐рди рдпрд╣ рдирд┐рд╢реНрдЪрд┐рдд рд╣реИ рдХрд┐ рдпрд╣ impl рдЕрдВрддрд┐рдо рдкрд░ рд╕реНрдкрд╖реНрдЯ рдирд┐рдпрдВрддреНрд░рдг рдХреЗ рд╕рд╛рде рд╕рдВрдЧрдд рдирд╣реАрдВ рд╣реИред

рдХреНрдпрд╛ рдЗрд╕рдХреА рдЕрдиреБрдорддрд┐ рджреЗрдиреЗ рдкрд░ рдХреЛрдИ рдпреЛрдЬрдирд╛ рд╣реИ?

struct Foo;

trait Bar {
    fn bar<T: Read>(stream: &T);
}

impl Bar for Foo {
    fn bar<T: Read>(stream: &T) {
        let stream = BufReader::new(stream);

        // Work with stream
    }

    fn bar<T: BufRead>(stream: &T) {
        // Work with stream
    }
}

рддреЛ рдЕрдирд┐рд╡рд╛рд░реНрдп рд░реВрдк рд╕реЗ рдПрдХ рдЯреЗрдореНрдкрд▓реЗрдЯ рдлрд╝рдВрдХреНрд╢рди рдХреЗ рд▓рд┐рдП рдПрдХ рд╡рд┐рд╢реЗрд╖рдЬреНрдЮрддрд╛, рдЬрд┐рд╕рдореЗрдВ A рдмрд╛рдЙрдВрдб рдХреЗ рд╕рд╛рде рдПрдХ рдкреНрд░рдХрд╛рд░ рдХрд╛ рдкреИрд░рд╛рдореАрдЯрд░ рд╣реЛрддрд╛ рд╣реИ, рдЬрд╣рд╛рдВ рд╡рд┐рд╢реЗрд╖ рд╕рдВрд╕реНрдХрд░рдг рдореЗрдВ B (рдЬрд┐рд╕рдореЗрдВ A рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реЛрддреА рд╣реИ) рдкрд░ рдмрд╛рдЙрдВрдб рд╣реЛрддрд╛ рд╣реИред

@torkleyy рд╡рд░реНрддрдорд╛рди рдореЗрдВ рдирд╣реАрдВ рд╣реИ, рд▓реЗрдХрд┐рди рдЖрдк рдЗрд╕реЗ рдЧреБрдкреНрдд рд░реВрдк рд╕реЗ рдПрдХ рд╡рд┐рд╢реЗрд╖рддрд╛ рдмрдирд╛рдХрд░ рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ, рдЬреЛ T: Read рдФрд░ T: BufRead рдФрд░ рдЖрдкрдХреЗ рдХреЛрдб рдХреЗ рдЙрди рд╣рд┐рд╕реНрд╕реЛрдВ рдХреЛ рд╢рд╛рдорд┐рд▓ рдХрд░рддрд╛ рд╣реИ рдЬрд┐рдиреНрд╣реЗрдВ рдЖрдк рдЙрд╕ рд╡рд┐рд╢реЗрд╖рддрд╛ рдХреЗ рдирд┐рд╣рд┐рддрд╛рд░реНрде рдореЗрдВ рд╡рд┐рд╢реЗрд╖рдЬреНрдЮ рдмрдирд╛рдирд╛ рдЪрд╛рд╣рддреЗ рд╣реИрдВред рдЗрд╕реЗ рд╕рд╛рд░реНрд╡рдЬрдирд┐рдХ API рдореЗрдВ рджрд┐рдЦрд╛рдИ рджреЗрдиреЗ рдХреА рднреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рдирд╣реАрдВ рд╣реИред

рдмреИрдХрд╡рд░реНрдб рд╕рдВрдЧрддрддрд╛ рд╕рдорд╕реНрдпрд╛ рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ, рдореБрдЭреЗ рд▓рдЧрддрд╛ рд╣реИ рдХрд┐ рдЕрдирд╛рде рдирд┐рдпрдореЛрдВ рдХреЗ рд▓рд┐рдП рд╣рдо рдЗрди рдирд┐рдпрдореЛрдВ рд╕реЗ рджреВрд░ рд╣реЛ рд╕рдХрддреЗ рд╣реИрдВ:

_An рдЬреЛрдбрд╝ рдЬрдм рддрдХ рдкреАрдЫреЗ рдЬреЛрдбрд╝рдиреЗ рдХреЗ рд▓рд┐рдП рд╕рдВрдЧрдд рд╣реИ: _

  • _ рдпрд╣ рд▓рдХреНрд╖рдг рдирд┐рд╣рд┐рдд рд╣реИ рдПрдХ рдСрдЯреЛ рд╡рд┐рд╢реЗрд╖рддрд╛ рд╣реИ ред_
  • _ рд░рд┐рд╕реАрд╡рд░ рдПрдХ рдкреНрд░рдХрд╛рд░ рдХрд╛ рдкреИрд░рд╛рдореАрдЯрд░ рд╣реИ, рдФрд░ рдирд┐рд╣рд┐рдд рдореЗрдВ рдкреНрд░рддреНрдпреЗрдХ рдЧреБрдг рдкрд╣рд▓реЗ рд╕реЗ рдореМрдЬреВрдж рд╣реИ ред_

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

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

@withoutboats

рдмреИрдХрд╡рд░реНрдб рд╕рдВрдЧрддрддрд╛ рд╕рдорд╕реНрдпрд╛ рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ, рдореБрдЭреЗ рд▓рдЧрддрд╛ рд╣реИ рдХрд┐ рдЕрдирд╛рде рдирд┐рдпрдореЛрдВ рдХреЗ рд▓рд┐рдП рд╣рдо рдЗрди рдирд┐рдпрдореЛрдВ рд╕реЗ рджреВрд░ рд╣реЛ рд╕рдХрддреЗ рд╣реИрдВ:

_An рдЬреЛрдбрд╝ рдЬрдм рддрдХ рдкреАрдЫреЗ рдЬреЛрдбрд╝рдиреЗ рдХреЗ рд▓рд┐рдП рд╕рдВрдЧрдд рд╣реИ: _

  • _ рдпрд╣ рд▓рдХреНрд╖рдг рдирд┐рд╣рд┐рдд рд╣реИ рдПрдХ рдСрдЯреЛ рд╡рд┐рд╢реЗрд╖рддрд╛ рд╣реИ ред_
  • _ рд░рд┐рд╕реАрд╡рд░ рдПрдХ рдкреНрд░рдХрд╛рд░ рдХрд╛ рдкреИрд░рд╛рдореАрдЯрд░ рд╣реИ, рдФрд░ рдирд┐рд╣рд┐рдд рдореЗрдВ рдкреНрд░рддреНрдпреЗрдХ рдЧреБрдг рдкрд╣рд▓реЗ рд╕реЗ рдореМрдЬреВрдж рд╣реИ ред_

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

рдПрдХ рд╣рдлреНрддреЗ рдФрд░ рдХрдИ рдЪрд░реНрдЪрд╛рдУрдВ рдХреЗ рдмрд╛рдж, рдпрд╣ рджреБрд░реНрднрд╛рдЧреНрдп рд╕реЗ рдорд╛рдорд▓рд╛ рдирд╣реАрдВ рдирд┐рдХрд▓рд╛ рд╣реИред

рд╣рдорд╛рд░реЗ рдкрд╛рд╕ рдЬреЛ рдкрд░рд┐рдгрд╛рдо рд╣реИрдВ рд╡реЗ рд╣реИрдВ: crying_cat_face :,, рд▓реЗрдХрд┐рди рдореБрдЭреЗ рд▓рдЧрддрд╛ рд╣реИ рдХрд┐ рдореИрдВрдиреЗ рдЬреЛ рд▓рд┐рдЦрд╛ рдерд╛ рд╡рд╣ рдЖрдкрдХреЗ рдирд┐рд╖реНрдХрд░реНрд╖ рдХреЗ рд╕рдорд╛рди рд╣реИред рдХрдВрдмрд▓ рдЗрдореНрдкреНрд▓рд╛рдВрдЯ рдЬреЛрдбрд╝рдирд╛ рдПрдХ рдкрд░рд┐рд╡рд░реНрддрди рд╣реИ, рдЪрд╛рд╣реЗ рдЬреЛ рднреА рд╣реЛред рд▓реЗрдХрд┐рди рдХреЗрд╡рд▓ рдХрдВрдмрд▓ рдирд┐рд╣рд┐рдд рд╣реИ (рдФрд░ рдСрдЯреЛ рд╡рд┐рд╢реЗрд╖рддрд╛ рдкреНрд░рддреНрдпрд╛рд░реЛрдкрдг); рдЬрд╣рд╛рдВ рддрдХ тАЛтАЛрдореБрдЭреЗ рдкрддрд╛ рд╣реИ рдХрд┐ рд╣рдореЗрдВ рдРрд╕рд╛ рдорд╛рдорд▓рд╛ рдирд╣реАрдВ рдорд┐рд▓рд╛ рд╣реИ, рдЬрд╣рд╛рдВ рдиреЙрди-рдХрдВрдмрд▓ рдЗрдореНрдкреНрд▓рд╛рдВрдЯ рдбрд╛рдЙрдирд╕реНрдЯреНрд░реАрдо рдХреЛрдб рдХреЛ рддреЛрдбрд╝ рд╕рдХреЗ (рдФрд░ рдпрд╣ рдмрд╣реБрдд рдмреБрд░рд╛ рд╣реЛрдЧрд╛)ред

рдореИрдВрдиреЗ рдПрдХ рдмрд┐рдВрджреБ рдкрд░ рд╕реЛрдЪрд╛ рдерд╛ рдХрд┐ рд╣рдо рдЕрдирд╛рде рдирд┐рдпрдореЛрдВ рдХреЛ рд╢рд┐рдерд┐рд▓ рдХрд░рдиреЗ рдореЗрдВ рд╕рдХреНрд╖рдо рд╣реЛ рд╕рдХрддреЗ рд╣реИрдВ рддрд╛рдХрд┐ рдЖрдк Vec<MyType> рдЬреИрд╕реЗ рдкреНрд░рдХрд╛рд░реЛрдВ рдХреЗ рд▓рд┐рдП рд▓рдХреНрд╖рдгреЛрдВ рдХреЛ рд▓рд╛рдЧреВ рдХрд░ рд╕рдХреЗрдВ, рд▓реЗрдХрд┐рди рдЕрдЧрд░ рд╣рдордиреЗ рдХрд┐рдпрд╛ рдХрд┐ рдпрд╣ рд╕реНрдерд┐рддрд┐ рддрдм рдареАрдХ рдЙрд╕реА рддрд░рд╣ рд╕реЗ рдЪрд▓реЗрдЧреА:

//crate A

trait Foo { }

// new impl
// impl<T> Foo for Vec<T> { }
// crate B
extern crate A;

use A::Foo;

trait Bar {
    type Assoc;
}

// Sadly, this impl is not an orphan
impl<T> Bar for Vec<T> where Vec<T>: Foo {
    type Assoc = ();
}
// crate C

struct Baz;

// Therefore, this impl must remain an orphan
impl Bar for Vec<Baz> {
    type Assoc = bool;
}

@withoutboats рдЖрд╣, рдореИрдВ, рдХреЗ рд░реВрдк рдореЗрдВ рдпрд╛ рдХреЗ рдмрдЬрд╛рдп рдФрд░ рдЕрдкрдиреЗ рджреЛ рдмреБрд▓реЗрдЯ рд╕реВрдЪреА рд╕рдордЭрд╛ рдЬреЛ рдРрд╕рд╛ рд▓рдЧрддрд╛ рд╣реИ рдХрд┐ рддреБрдо рдХреНрдпрд╛ рдорддрд▓рдм рд╣реИ?

@ рдпреВрдЯреНрд░реЙрди рдпреЗ, рдореЗрд░рд╛ рдорддрд▓рдм рдерд╛ 'рдпрд╛' - рд╡реЗ рджреЛ рдорд╛рдорд▓реЗ рд╣реИрдВ рдЬрд╣рд╛рдВ рдпрд╣ рдПрдХ рдкрд░рд┐рд╡рд░реНрддрди рд╣реИред рдХреЛрдИ рднреА рдСрдЯреЛ рдирд┐рд╢рд╛рди, рдЪрд╛рд╣реЗ рдХрд┐рддрдирд╛ рднреА рдареЛрд╕ рдХреНрдпреЛрдВ рди рд╣реЛ, рдПрдХ рдмреНрд░реЗрдХрд┐рдВрдЧ рдЪреЗрдВрдЬ рд╣реИ, рдХреНрдпреЛрдВрдХрд┐ рдЬрд┐рд╕ рддрд░рд╣ рд╕реЗ рд╣рдо рдЙрдирдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рдирдХрд╛рд░рд╛рддреНрдордХ рддрд░реНрдХ рджреЗрддреЗ рд╣реИрдВ, рдЙрд╕реЗ рдкреНрд░рдЪрд╛рд░рд┐рдд рдХрд░рдиреЗ рдХреА рдЕрдиреБрдорддрд┐ рд╣реИ: https://is.gd/k4Xtlp

рдпрд╣реА рд╣реИ, рдЬрдм рддрдХ рдХрд┐ рдЗрд╕рдореЗрдВ рдирдП рдирд╛рдо рди рд╣реЛрдВред AFAIK рдПрдХ рдирдпрд╛ рдирд╛рдо рд╣реИ рдХрд┐ рдПрдХ рдирд┐рд╣рд┐рдд рд╣реИ рдХрднреА рдирд╣реАрдВ рддреЛрдбрд╝ рд░рд╣рд╛ рд╣реИред

@withoutboats рдореБрдЭреЗ рдЖрд╢реНрдЪрд░реНрдп рд╣реЛрддрд╛ рд╣реИ рдХрд┐ рдЕрдЧрд░ рд╣рдо рдСрдЯреЛ-рд▓рдХреНрд╖рдг рдХреЗ рдЖрд╕рдкрд╛рд╕ рдирдХрд╛рд░рд╛рддреНрдордХ рддрд░реНрдХ рдкрд░ рднрд░реЛрд╕рд╛ рдХрд░рдиреЗ рд╡рд╛рд▓реЗ рд▓реЛрдЧреЛрдВ рдХреЛ рд░реЛрдХ рд╕рдХрддреЗ рд╣реИрдВ / рдЪрд╛рд╣рд┐рдПред рдпрд╣реА рд╣реИ, рдЕрдЧрд░ рд╣рдордиреЗ рдХрд╣рд╛ рдХрд┐ рдСрдЯреЛ рдЯреНрд░реИрдХреНрдЯреНрд╕ рдХреЗ рдирдП рдЗрдореНрдкреНрд▓рд┐рдЯреНрд╕ рдХреЛ рдЬреЛрдбрд╝рдирд╛ рдПрдХ рдХрд╛рдиреВрдиреА рд░реВрдк рд╕реЗ рдЯреВрдЯрдиреЗ рд╡рд╛рд▓рд╛ рдмрджрд▓рд╛рд╡ рд╣реИ, рддреЛ рд╣рдо рдлрд┐рд░ рд╕реЗ рдЙрди рдЗрдореНрдкреНрд▓рд╛рдВрдЯреНрд╕ рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рдЖрдЧрд╛рд╣ рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ, рдЬрд┐рдиреНрд╣реЗрдВ рдЕрдкрд╕реНрдЯреНрд░реАрдо рдХреНрд░реЗрдЯ рджреНрд╡рд╛рд░рд╛ Send рдЬреЛрдбрд╝рд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИред рдпрд╣ рд╕рдмрд╕реЗ рдЕрдЪреНрдЫрд╛ рдХрд╛рдо рдХрд░реЗрдЧрд╛ рдЕрдЧрд░ рд╣рдорд╛рд░реЗ рдкрд╛рд╕:

  1. рд╕реНрдерд┐рд░ рд╡рд┐рд╢реЗрд╖рдЬреНрдЮрддрд╛, рдПрдХ рд░рдгрдиреАрддрд┐рдХ рд╕реНрдерд╛рдиреЛрдВ рдореЗрдВ default рдЬреЛрдбрд╝рдХрд░ рдЪреЗрддрд╛рд╡рдирд┐рдпреЛрдВ рдХреЛ рдкрд╛рд░ рдХрд░ рд╕рдХрддрд╛ рд╣реИ (рдмрд╣реБрдд рд╕рдордп);
  2. рдХреБрдЫ рдкреНрд░рдХрд╛рд░ рдХреЗ рд╕реНрдкрд╖реНрдЯ рдирдХрд╛рд░рд╛рддреНрдордХ рдирд┐рд╣рд┐рддрд╛рд░реНрде, рдЗрд╕рд▓рд┐рдП рдХрд┐ Rc рдЬреИрд╕реЗ рдкреНрд░рдХрд╛рд░ рдХрднреА рднреА Send рд▓рд┐рдП рдЙрдирдХреЗ рдЗрд░рд╛рджреЗ рдХреА рдШреЛрд╖рдгрд╛ рдирд╣реАрдВ рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ - рд▓реЗрдХрд┐рди рдлрд┐рд░ рд╣рдорд╛рд░реЗ рдкрд╛рд╕ рдСрдЯреЛ рд▓рдХреНрд╖рдгреЛрдВ рдХреЗ рд▓рд┐рдП рд╣реИ, рдЗрд╕рд▓рд┐рдП рд╣рдо рдЙрдиреНрд╣реЗрдВ рдзреНрдпрд╛рди рдореЗрдВ рд░рдЦ рд╕рдХрддреЗ рд╣реИрдВред

рдореБрдЭреЗ рдирд╣реАрдВ рдкрддрд╛ рдХрд┐ рдореБрдЭреЗ рд▓рдЧрддрд╛ рд╣реИ рдХрд┐ рдпрд╣ рдЗрд╕ рдмрд╛рдд рдкрд░ рдирд┐рд░реНрднрд░ рдХрд░рддрд╛ рд╣реИ рдХрд┐ рдордЬрдмреВрдд рдкреНрд░реЗрд░рдгрд╛ рд╣реИ рдпрд╛ рдирд╣реАрдВред рдРрд╕рд╛ рд▓рдЧрддрд╛ рд╣реИ рдХрд┐ рд╡рд┐рд╢реЗрд╖ рд░реВрдк рд╕реЗ рд╕рдВрднрд╛рд╡рдирд╛ рдирд╣реАрдВ рд╣реИ рдХрд┐ рдЖрдк рдорд╣рд╕реВрд╕ рдХрд░реЗрдВрдЧреЗ рдХрд┐ рдЖрдкрдХреЗ рджреНрд╡рд╛рд░рд╛ рдкрд╣рд▓реЗ рд╣реА рдЬрд╛рд░реА рдХрд┐рдП рдЬрд╛рдиреЗ рдХреЗ рдмрд╛рдж рдПрдХ рдкреНрд░рдХрд╛рд░ рдХрд╛ unsafe impl Send/Sync рд╣реЛ рд╕рдХрддрд╛ рд╣реИ; рдореБрдЭреЗ рд▓рдЧрддрд╛ рд╣реИ рдХрд┐ рдЕрдзрд┐рдХрд╛рдВрд╢ рд╕рдордп рд╕реБрд░рдХреНрд╖рд┐рдд рд╣реЛрдЧрд╛, рдЖрдкрдиреЗ рдПрдХ рдкреНрд░рдХрд╛рд░ рд╕реЗ рд▓рд┐рдЦрд╛ рд╣реИ рдХрд┐ рдпрд╣ рдкрд╣рд▓реЗ рд╕реЗ рд╣реА рд╕реБрд░рдХреНрд╖рд┐рдд рд╣реЛрдЧрд╛ (рдХреНрдпреЛрдВрдХрд┐ рдпрд╣ рдкреНрд░рдХрд╛рд░ рдХрд╛ рдмрд┐рдВрджреБ рд╣реИ)ред

рдореИрдВ рд╣рд░ рд╕рдордп рддрдереНрдп рдХреЗ рдмрд╛рдж unsafe impl Send/Sync рдЬреЛрдбрд╝рддрд╛ рд╣реВрдВред рдХрднреА-рдХрднреА рдХреНрдпреЛрдВрдХрд┐ рдореИрдВ рдЗрд╕реЗ рд╕реБрд░рдХреНрд╖рд┐рдд рдмрдирд╛рддрд╛ рд╣реВрдВ, рдХрднреА-рдХрднреА рдХреНрдпреЛрдВрдХрд┐ рдореБрдЭреЗ рдПрд╣рд╕рд╛рд╕ рд╣реЛрддрд╛ рд╣реИ рдХрд┐ рдЬрд┐рд╕ рд╕реА рдПрдкреАрдЖрдИ рдХреЗ рд╕рд╛рде рдореИрдВ рдЕрдВрддрд░ рдХрд░ рд░рд╣рд╛ рд╣реВрдВ рд╡рд╣ рдереНрд░реЗрдбреНрд╕ рдореЗрдВ рд╕рд╛рдЭрд╛ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдареАрдХ рд╣реИ, рдФрд░ рдХрднреА-рдХрднреА рдпрд╣ рд╕рд┐рд░реНрдл рдЗрд╕рд▓рд┐рдП рд╣реИ рдХрд┐ рдХреНрдпрд╛ рдХреБрдЫ Send / Sync isn рд╣реЛрдирд╛ рдЪрд╛рд╣рд┐рдП рдЬрдм рдореИрдВ рдПрдХ рдкреНрд░рдХрд╛рд░ рдХрд╛ рдкрд░рд┐рдЪрдп рджреЗрддрд╛ рд╣реВрдВ, рддреЛ рдореИрдВ рдХреНрдпрд╛ рд╕реЛрдЪ рд░рд╣рд╛ рд╣реВрдВред

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

рдПрдХ рдмрд╛рдд рдореБрдЭреЗ рдкрд╕рдВрдж рдирд╣реАрдВ рд╣реИ рдХрд┐ рдХреИрд╕реЗ рд╕рдВрдмрдВрдзрд┐рдд рд▓рдХреНрд╖рдг рдЕрднреА рдХрд╛рдо рдХрд░рддреЗ рд╣реИрдВ, рдпрд╣ рдкреИрдЯрд░реНрди рдХрд╛рдо рдирд╣реАрдВ рдХрд░рддрд╛ рд╣реИ:

trait Buffer: Read {
    type Buffered: BufRead;
    fn buffer(self) -> impl BufRead;
}

impl<T: Read> Buffer for T {
    default type Buffered = BufReader<T>;
    default fn buffer(self) -> BufReader<T> {
        BufReader::new(self)
    }
}

impl<T: BufRead> Buffer for T {
    type Buffered = Self;
    fn buffer(self) -> T {
        self
    }
}

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

impl Buffer for SomeRead {
    type Buffered = SomeBufRead;
    // no overriding of fn buffer, it no longer returns Self::Buffered
}

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

@withoutboats рд╣рд╛рдБ, рдпрд╣ рдбрд┐рдЬрд╝рд╛рдЗрди рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рдореБрдЦреНрдп рдЕрдирд╕реБрд▓рдЭреЗ рдкреНрд░рд╢реНрдиреЛрдВ рдореЗрдВ рд╕реЗ рдПрдХ рд╣реИ (рдЬреЛ рдореИрдВ рд╣рд╛рд▓рд┐рдпрд╛ рдЪрд░реНрдЪрд╛рдУрдВ рдореЗрдВ рд▓рд╛рдирд╛ рднреВрд▓ рдЧрдпрд╛ рд╣реВрдБ)ред рдореВрд▓ RFC рдереНрд░реЗрдб рдкрд░ рдЗрд╕ рдмрд╛рд░реЗ рдореЗрдВ рдЙрдЪрд┐рдд рдЪрд░реНрдЪрд╛ рд╣реБрдИ рд╣реИ, рд▓реЗрдХрд┐рди рдореИрдВ рдЬрд▓реНрдж рд╣реА рд╡рд┐рдХрд▓реНрдкреЛрдВ / рдЯреНрд░реЗрдбрдСрдл рдХрд╛ рд╕рд╛рд░рд╛рдВрд╢ рд▓рд┐рдЦрдиреЗ рдХрд╛ рдкреНрд░рдпрд╛рд╕ рдХрд░реВрдВрдЧрд╛ред

@aturon рд╡рд░реНрддрдорд╛рди рд╕рдорд╛рдзрд╛рди рд╕рдмрд╕реЗ рд░реВрдврд╝рд┐рд╡рд╛рджреА рд╣реИ (рд╣рдо рдЬреЛ рднреА рдХрд░рдирд╛ рдЪрд╛рд╣рддреЗ рд╣реИрдВ рдЙрд╕рдХреЗ рд╕рд╛рде рд╕рдВрдЧрдд рд╣реИ) рдпрд╛ рдпрд╣ рдПрдХ рдРрд╕рд╛ рдирд┐рд░реНрдгрдп рд╣реИ рдЬрд┐рд╕реЗ рд╣рдореЗрдВ рд╕реНрдерд┐рд░ рдХрд░рдиреЗ рд╕реЗ рдкрд╣рд▓реЗ рдХрд░рдирд╛ рд╣реЛрдЧрд╛?

рдореИрдВ рд╡реНрдпрдХреНрддрд┐рдЧрдд рд░реВрдк рд╕реЗ рдЗрд╕ рд╕рдорд╕реНрдпрд╛ рдХрд╛ рдПрдХрдорд╛рддреНрд░ рд╡рд╛рд╕реНрддрд╡рд┐рдХ рд╕рдорд╛рдзрд╛рди рд╕рдордЭрддрд╛ рд╣реВрдВ рдХрд┐ @withoutboats рдиреЗ рдЖрдЗрдЯрдо рдХреЛ "рд╕рдореВрд╣реАрдХреГрдд" рдХрд░рдиреЗ рдХреА рдЕрдиреБрдорддрд┐ рддрдм рджреА рдЬрдм рдЖрдк default рдЯреИрдЧ рдирд┐рд░реНрджрд┐рд╖реНрдЯ рдХрд░рддреЗ рд╣реИрдВред рдпрд╣ рдмреЗрд╣рддрд░-рдмреЗрд╣рддрд░-рдмреЗрд╣рддрд░ рд╕рдорд╛рдзрд╛рди рдХреА рддрд░рд╣ рд╣реИ, рд▓реЗрдХрд┐рди рдореБрдЭреЗ рд▓рдЧрддрд╛ рд╣реИ рдХрд┐ рдЗрд╕рд╕реЗ рднреА рдмрджрддрд░-рдмреЗрд╣рддрд░ рд╕рдВрд╕реНрдХрд░рдг (рдХрд┐рд╕реА рднреА рддрд░рд╣ рд╕реЗ рдУрд╡рд░рд░рд╛рдЗрдб рдХрд░рдиреЗ рд╡рд╛рд▓реЗ рд╕рднреА рдХреЛ рдУрд╡рд░рд░рд╛рдЗрдб рдХрд░рдирд╛) рдХрд╛рдлреА рдЦрд░рд╛рдм рд╣реИред (рд▓реЗрдХрд┐рди рдЕрд╕рд▓ рдореЗрдВ @withoutboats рдЬрд┐рд╕ рддрд░рд╣ рд╕реЗ рдЖрдк рдиреЗ рд▓рд┐рдЦрд╛ рд╣реИ рдЗрд╕ рдХреЛрдб рдХреЛ рднреНрд░рдорд┐рдд рдХрд░ рд░рд╣рд╛ рд╣реИред рдореИрдВ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░ рдХреЗ рд╕реНрдерд╛рди рдкрд░ рд▓рдЧрддрд╛ рд╣реИ рдХрд┐ impl BufRead рдХреА рд╡рд╛рдкрд╕реА рдкреНрд░рдХрд╛рд░ рдХреЗ рд░реВрдк рдореЗрдВ Buffer , рдЖрдк рдорддрд▓рдм Self::BufReader , рд╣реИ рдирд╛?)

рдЙрд╕ рд╕реНрдерд┐рддрд┐ рдореЗрдВ, рдирд┐рдореНрдирд▓рд┐рдЦрд┐рдд рдХреА рдЕрдиреБрдорддрд┐ рд╣реЛрдЧреА:

trait Buffer: Read {
    type Buffered: BufRead;
    fn buffer(self) -> impl BufRead;
}

impl<T: Read> Buffer for T {
    default {
        type Buffered = BufReader<T>;
        fn buffer(self) -> BufReader<T> {
            BufReader::new(self)
        }
    }
}

impl<T: BufRead> Buffer for T {
    type Buffered = Self;
    fn buffer(self) -> T {
        self
    }
}

рд▓реЗрдХрд┐рди рд╢рд╛рдпрдж рд╣рдо рдЗрди рд╕рдореВрд╣реЛрдВ рдХрд╛ рдЕрдиреБрдорд╛рди рд▓рдЧрд╛ рд╕рдХрддреЗ рд╣реИрдВ? рдореИрдВрдиреЗ рдЗрд╕реЗ рдмрд╣реБрдд рд╕реЛрдЪрд╛ рдирд╣реАрдВ рд╣реИ, рд▓реЗрдХрд┐рди рдРрд╕рд╛ рд▓рдЧрддрд╛ рд╣реИ рдХрд┐ рдЖрдЗрдЯрдо рдХреА рдЪреВрдХ "рдЙрд▓рдЭрд╛ рд╣реБрдЖ" рд╣реИ, рдЬреЛ рдХрд┐ рд╕реНрдкрд╖реНрдЯ рд╣реИред

рд▓реЗрдХрд┐рди рд╡рд╛рд╕реНрддрд╡ рдореЗрдВ @withoutboats рдЬрд┐рд╕ рддрд░рд╣ рд╕реЗ рдЖрдкрдиреЗ рдЗрд╕ рдХреЛрдб рдХреЛ рд▓рд┐рдЦрд╛ рд╣реИ рд╡рд╣ рднреНрд░рдорд┐рдд рдХрд░рдиреЗ рд╡рд╛рд▓рд╛ рд╣реИред рдореБрдЭреЗ рд▓рдЧрддрд╛ рд╣реИ рдХрд┐ BufRead рдХреЛ рдмрдлрд╝рд░ рдХреЗ рд░рд┐рдЯрд░реНрди рдкреНрд░рдХрд╛рд░ рдХреЗ рд░реВрдк рдореЗрдВ рдЙрдкрдпреЛрдЧ рдХрд░рдиреЗ рдХреЗ рд╕реНрдерд╛рди рдкрд░, рдЖрдкрдХрд╛ рдорддрд▓рдм рд╣реИ :: :: BufReader, рд╕рд╣реА рд╣реИ?

рд╣рд╛рдВ, рдореИрдВрдиреЗ рдЯреНрд░реИрдк рдЖрдзрд╛рд░рд┐рдд рдПрдХ рдХреЗ рд╕рдорд╛рдзрд╛рди рдХреЛ рд╕рдВрд╢реЛрдзрд┐рдд рдХрд┐рдпрд╛ рдерд╛ рдФрд░ рдлрд┐рд░ рд╡рд╛рдкрд╕ рд╕реНрд╡рд┐рдЪ рдХрд░ рджрд┐рдпрд╛ рдерд╛, рд▓реЗрдХрд┐рди рд░рд┐рдЯрд░реНрди рдЯрд╛рдЗрдк рдХреЛ рд╡рд┐рд╢реЗрд╖рддрд╛ рдореЗрдВ рдпрд╛рдж рдХрд┐рдпрд╛ред

рд╣реЛ рд╕рдХрддрд╛ рд╣реИ рдХрд┐ рдЗрд╕ рднрд╛рд╖рд╛ рдХреА рдкреНрд░рдХрд╛рд░ рдкреНрд░рдгрд╛рд▓реА рдХреА рддрд░рд╣ рдХреБрдЫ рднреА рджрд┐рд▓рдЪрд╕реНрдк рд╣реЛ рд╕рдХрддрд╛ рд╣реИ, рдХреНрдпреЛрдВрдХрд┐ рдпрд╣ рд░реБрд╕реНрдЯреНрд╕ рдХреЗ рд╕рдорд╛рди рд▓рдЧрддрд╛ рд╣реИ, рд▓реЗрдХрд┐рди рдХреБрдЫ рд╡рд┐рд╢реЗрд╖рддрд╛рдУрдВ рдХреЗ рд╕рд╛рде, рдЬреЛ рд╡рд░реНрддрдорд╛рди рд╕рдорд╕реНрдпрд╛рдУрдВ рдХреЛ рд╣рд▓ рдХрд░ рд╕рдХрддреЗ рд╣реИрдВред
( A <: B рд░реБрд╕реНрдЯ рдореЗрдВ рд╕рдЪ рд╣реЛрдЧрд╛ рдЬрдм A рдПрдХ рд╕рдВрд░рдЪрдирд╛ рд╣реИ рдФрд░ B , рдпрд╛ рдЬрдм A рдПрдХ рд╡рд┐рд╢реЗрд╖рддрд╛ рд╣реИ, рдФрд░ рд╡рд╕реНрддреБрдУрдВ рдХреА рд╡рд╕реНрддреБрдУрдВ рдХреЗ рд▓рд┐рдП рд╕рд╛рдорд╛рдиреНрдп рдЬрд╛рдирдХрд╛рд░реА рдпрд╣ рд╡рд┐рд╢реЗрд╖рддрд╛ рдореМрдЬреВрдж рд╣реИ, рдореБрдЭреЗ рд▓рдЧрддрд╛ рд╣реИ)

рдРрд╕рд╛ рд▓рдЧрддрд╛ рд╣реИ рдХрд┐ рд╡рд┐рд╢реЗрд╖рдЬреНрдЮрддрд╛ рдХреЗ рд▓рд┐рдП Display рд╡рд┐рд╢реЗрд╖рддрд╛ рдХреЗ рд╕рд╛рде рдПрдХ рдореБрджреНрджрд╛ рд╣реИред
рдЙрджрд╛рд╣рд░рдг рдХреЗ рд▓рд┐рдП, рдпрд╣ рдЙрджрд╛рд╣рд░рдг рд╕рдВрдХрд▓рд┐рдд рдирд╣реАрдВ рдХрд░рддрд╛ рд╣реИ:

use std::fmt::Display;

pub trait Print {
    fn print(&self);
}

impl<T: Display> Print for T {
    default fn print(&self) {
        println!("Value: {}", self);
    }
}

impl Print for () {
    fn print(&self) {
        println!("No value");
    }
}

fn main() {
    "Hello, world!".print();
    ().print();
}

рдирд┐рдореНрдирд▓рд┐рдЦрд┐рдд рддреНрд░реБрдЯрд┐ рдХреЗ рд╕рд╛рде:

error[E0119]: conflicting implementations of trait `Print` for type `()`:
  --> src/main.rs:41:1
   |
35 |   impl<T: Display> Print for T {
   |  _- starting here...
36 | |     default fn print(&self) {
37 | |         println!("Value: {}", self);
38 | |     }
39 | | }
   | |_- ...ending here: first implementation here
40 | 
41 |   impl Print for () {
   |  _^ starting here...
42 | |     fn print(&self) {
43 | |         println!("No value");
44 | |     }
45 | | }
   | |_^ ...ending here: conflicting implementation for `()`

рдЗрд╕ рд╕рдВрдХрд▓рди рдХреЗ рджреМрд░рд╛рди:

pub trait Print {
    fn print(&self);
}

impl<T: Default> Print for T {
    default fn print(&self) {
    }
}

impl Print for () {
    fn print(&self) {
        println!("No value");
    }
}

fn main() {
    "Hello, world!".print();
    ().print();
}

рдЗрд╕ рд╕рдорд╕реНрдпрд╛ рдХреЛ рдареАрдХ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдзрдиреНрдпрд╡рд╛рджред

@antoyo рдХреНрдпрд╛ рдЖрдкрдХреЛ рдпрдХреАрди рд╣реИ рдХрд┐ Display рд╡рд┐рд╢реЗрд╖ рд╣реИ, рдпрд╛ рд╣реЛ рд╕рдХрддрд╛ рд╣реИ рдХреНрдпреЛрдВрдХрд┐ Display tuples рдХреЗ рд▓рд┐рдП рд▓рд╛рдЧреВ рдирд╣реАрдВ рд╣реБрдЖ рд╣реИ рдЬрдмрдХрд┐ Default рд╣реИ?

@shepmaster
рдореБрдЭреЗ рдирд╣реАрдВ рдкрддрд╛ рдХрд┐ рдпрд╣ рд▓рдЧрднрдЧ Display , рд▓реЗрдХрд┐рди рдирд┐рдореНрди рдХрд╛рд░реНрдп Custom рдЯреБрдкрд▓реНрд╕ рдХреЗ рд▓рд┐рдП рд▓рд╛рдЧреВ рдирд╣реАрдВ рдХрд┐рдпрд╛ рдЧрдпрд╛ рд╣реИ:

pub trait Custom { }

impl<'a> Custom for &'a str { }

pub trait Print {
    fn print(&self);
}

impl<T: Custom> Print for T {
    default fn print(&self) {
    }
}

impl Print for () {
    fn print(&self) {
        println!("No value");
    }
}

fn main() {
    "Hello, world!".print();
    ().print();
}

рд╡реИрд╕реЗ, рдпрд╣рд╛рдБ рдЕрд╕рд▓реА рдЪреАрдЬрд╝ рд╣реИ рдЬрд┐рд╕реЗ рдореИрдВ рд╡рд┐рд╢реЗрд╖рдЬреНрдЮрддрд╛ рдХреЗ рд╕рд╛рде рд╣рд╛рд╕рд┐рд▓ рдХрд░рдирд╛ рдЪрд╛рд╣рддрд╛ рд╣реВрдБ:

pub trait Emit<C, R> {
    fn emit(callback: C, value: Self) -> R;
}

impl<C: Fn(Self) -> R, R, T> Emit<C, R> for T {
    default fn emit(callback: C, value: Self) -> R {
        callback(value)
    }
}

impl<C> Emit<C, C> for () {
    fn emit(callback: C, _value: Self) -> C {
        callback
    }
}

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

рд╕рдВрдкрд╛рджрд┐рдд рдХрд░реЗрдВ: рдореБрдЭреЗ рд▓рдЧрддрд╛ рд╣реИ рдХрд┐ рдореБрдЭреЗ рд╕рдордЭ рдореЗрдВ рдЖрдпрд╛ рдХрд┐ рдпрд╣ рд╕рдВрдХрд▓рди рдХреНрдпреЛрдВ рдирд╣реАрдВ рд╣реИ:
T for T () for () рд╕реЗ рдЕрдзрд┐рдХ рд╕рд╛рдорд╛рдиреНрдп рд╣реИ () рдкрд╣рд▓реЗ impl рд╡рд┐рд╢реЗрд╖рдЬреНрдЮрддрд╛ рдирд╣реАрдВ рд╣реЛ рд╕рдХрддреАред
рдФрд░ C рд╕реЗ рдЕрдзрд┐рдХ рд╕рд╛рдорд╛рдиреНрдп рд╣реИ, C: Fn(Self) -> R рджреВрд╕рд░рд╛ impl рд╡рд┐рд╢реЗрд╖рдЬреНрдЮрддрд╛ рдирд╣реАрдВ рд╣реЛ рд╕рдХрддрд╛ рд╣реИред
рдХреГрдкрдпрд╛ рдореБрдЭреЗ рдмрддрд╛рдПрдВ рдХрд┐ рдХреНрдпрд╛ рдореИрдВ рдЧрд▓рдд рд╣реВрдВред
рд▓реЗрдХрд┐рди рдореБрдЭреЗ рдЕрднреА рднреА рдРрд╕рд╛ рдирд╣реАрдВ рд▓рдЧрддрд╛ рдХрд┐ рдпрд╣ Display рд╕рд╛рде рдкрд╣рд▓реЗ рдЙрджрд╛рд╣рд░рдг рдХреЗ рд╕рд╛рде рдХрд╛рдо рдХреНрдпреЛрдВ рдирд╣реАрдВ рдХрд░рддрд╛ рд╣реИред

рдпрд╣ рд╡рд░реНрддрдорд╛рди рдореЗрдВ рд╕рд╣реА рд╡реНрдпрд╡рд╣рд╛рд░ рд╣реИред

Custom рдЙрджрд╛рд╣рд░рдг рдореЗрдВ, рд╡рд┐рд╢реЗрд╖ рд╕реНрдерд╛рдиреАрдп рдирдХрд╛рд░рд╛рддреНрдордХ рддрд░реНрдХ рдХреЗ рдХрд╛рд░рдг рдЙрди рд▓реЛрдЧреЛрдВ рдХрд╛ рдУрд╡рд░рд▓реИрдк рдирд╣реАрдВ рд╣реЛрддрд╛ () рдЕрдиреБрдорд╛рди рд▓рдЧрд╛ рд╕рдХрддреЗ рд╣реИрдВ, рдЬрд┐рд╕рдореЗрдВ Custom рдХрд╛ рдирд┐рд╣рд┐рддрд╛рд░реНрде рдирд╣реАрдВ рд╣реИ, T: Custom рд╕рд╛рде рдУрд╡рд░рд▓реИрдк рдирд╣реАрдВ рд╣реЛрддрд╛ рд╣реИред рдХреЛрдИ рд╡рд┐рд╢реЗрд╖рдЬреНрдЮрддрд╛ рдЖрд╡рд╢реНрдпрдХ рдирд╣реАрдВ рд╣реИред

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

рд▓реЗрдХрд┐рди рдпрд╣ рднреА, рдХреНрдпреЛрдВрдХрд┐ () рдкреНрд░рджрд░реНрд╢рди рдирд╣реАрдВ рд╣реИ, рдпрд╣ T: Display рд╕реЗ рдЕрдзрд┐рдХ рд╡рд┐рд╢рд┐рд╖реНрдЯ рдирд╣реАрдВ рд╣реИред рдпрд╣реА рдХрд╛рд░рдг рд╣реИ рдХрд┐ рд╡рд┐рд╢реЗрд╖рдЬреНрдЮрддрд╛ рдХрд╛рдо рдирд╣реАрдВ рдХрд░рддреА рд╣реИ, рдЬрдмрдХрд┐ рдбрд┐рдлрд╝реЙрд▓реНрдЯ рдорд╛рдорд▓реЗ рдореЗрдВ, (): Default , рдЗрд╕рд▓рд┐рдП рдпрд╣ рдирд┐рд╣рд┐рдд рд╣реИ рдХрд┐ T: Default рд╕реЗ рдЕрдзрд┐рдХ рд╡рд┐рд╢рд┐рд╖реНрдЯ рд╣реИред

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

рдореИрдВрдиреЗ рдЖрдЬреАрд╡рди рд╕рдВрдмрдВрдзрд┐рдд рдзреНрд╡рдирд┐ рдореБрджреНрджреЗ рдХреЛ рдЯреНрд░реИрдХ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП # 40582 рджрд░реНрдЬ рдХрд┐рдпрд╛ред

рдореЗрд░реЗ рдкрд╛рд╕ рдПрдХ рдореБрджреНрджрд╛ рдерд╛ рдЬреЛ рд╡рд┐рд╢реЗрд╖рдЬреНрдЮрддрд╛ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдиреЗ рдХреА рдХреЛрд╢рд┐рд╢ рдХрд░ рд░рд╣рд╛ рдерд╛, рдореБрдЭреЗ рдирд╣реАрдВ рд▓рдЧрддрд╛ рдХрд┐ рдпрд╣ рд╡реИрд╕рд╛ рд╣реА рд╣реИ рдЬреИрд╕рд╛ @antoyo рдХреЗ рдкрд╛рд╕ рдерд╛, рдореИрдВрдиреЗ рдЗрд╕реЗ рдПрдХ рдЕрд▓рдЧ рдореБрджреНрджреЗ # 41140 рдХреЗ рд░реВрдк рдореЗрдВ рджрд░реНрдЬ рдХрд┐рдпрд╛ рдерд╛, рдореИрдВ рдЙрджрд╛рд╣рд░рдг рдХреЛрдб рдпрд╣рд╛рдВ рд╕реЗ рд▓рд╛ рд╕рдХрддрд╛ рд╣реВрдВ рдпрджрд┐ рдЖрд╡рд╢реНрдпрдХ рд╣реЛ

@ afonso360 рдирд╣реАрдВ, рдПрдХ рдЕрд▓рдЧ рдореБрджреНрджрд╛ рдареАрдХ рд╣реИред

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

рдХреНрдпрд╛ рдХреЛрдИ рд╕реНрдкрд╖реНрдЯ рдХрд░ рд╕рдХрддрд╛ рд╣реИ рдХрд┐ рдХреНрдпрд╛ рдпрд╣ рдмрдЧ рд╣реИ, рдпрд╛ рдРрд╕рд╛ рдХреБрдЫ рд╣реИ рдЬреЛ рдЬрд╛рдирдмреВрдЭрдХрд░ рдирд┐рд╖рд┐рджреНрдз рд╣реИ? https://is.gd/pBvefi

@sgrif рдореЗрд░рд╛ рдорд╛рдирдирд╛ тАЛтАЛрд╣реИ рдХрд┐ рдпрд╣рд╛рдВ рдореБрджреНрджрд╛ рд╕рд┐рд░реНрдл рдпрд╣ рд╣реИ рдХрд┐ рдбрд┐рдлрд╝реЙрд▓реНрдЯ рд╕реЗ рдЬреБрдбрд╝реЗ рдкреНрд░рдХрд╛рд░реЛрдВ рдХрд╛ рдкреНрд░рдХреНрд╖реЗрдкрдг рдЕрд╕реНрд╡реАрдХреГрдд рд╣реИред рд╣рд╛рд▓рд╛рдВрдХрд┐ рдирд┐рджрд╛рди рдмреЗрд╣рддрд░ рд╣реЛ рд╕рдХрддрд╛ рд╣реИ: https://github.com/rust-lang/rust/issues/33481

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

рдЗрд╕ рдЯрд┐рдкреНрдкрдгреА рд╕реЗ рд╕рдВрдХреЗрдд рдорд┐рд▓рддрд╛ рд╣реИ рдХрд┐ рдХреБрдЫ рдорд╛рдорд▓реЛрдВ рдХреЗ рд▓рд┐рдП рдзреНрд╡рдирд┐ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реЛрддреА рд╣реИ (рд╣рд╛рд▓рд╛рдВрдХрд┐ рдореБрдЭреЗ рдкрддрд╛ рдирд╣реАрдВ рдХреНрдпреЛрдВ) рдФрд░ рджреВрд╕рд░реЛрдВ рдореЗрдВ рдЗрдВрдЯрд░рдлрд╝реЗрд╕ рдХреЗ рдЙрдкрднреЛрдХреНрддрд╛рдУрдВ рдХреЛ рдЗрд╕реЗ рдПрдХ рдЕрдореВрд░реНрдд рдкреНрд░рдХрд╛рд░ рдХреЗ рд░реВрдк рдореЗрдВ рд╡реНрдпрд╡рд╣рд╛рд░ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдордЬрдмреВрд░ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП: https://github.com/rust- рд▓реИрдВрдЧ / рдЬрдВрдЧ / рдмреНрд▓реЙрдм / e5e664f / src / librustc / рд▓рдХреНрд╖рдг / project.rs # L41

рдХреНрдпрд╛ рдХреЛрдИ рднреА рдХрднреА https://github.com/rust-lang/rust/issues/31844#issuecomment -266221638 рдХреЛ рджреЗрдЦрдиреЗ рдореЗрдВ рд╕рдХреНрд╖рдо рдерд╛? рдЙрди рдЕрдиреБрдорд╛рдиреЛрдВ рдХреЛ рд╡рд┐рд╢реЗрд╖рдЬреНрдЮрддрд╛ рдХреЗ рд╕рд╛рде рдорд╛рдиреНрдп рд╣реЛрдирд╛ рдЪрд╛рд╣рд┐рдП рдЬрд╣рд╛рдВ рддрдХ тАЛтАЛрдореИрдВ рдмрддрд╛ рд╕рдХрддрд╛ рд╣реВрдВред рдореЗрд░рд╛ рдорд╛рдирдирд╛ тАЛтАЛрд╣реИ рдХрд┐ рдПрдХ рдмрдЧ рд╣реИ рдЬреЛ рдЙрдиреНрд╣реЗрдВ рд░реЛрдХ рд░рд╣рд╛ рд╣реИред

@sgrif рдореБрдЭреЗ рд╡рд┐рд╢реНрд╡рд╛рд╕ рд╣реИ рдХрд┐ рдЖрдкрдХреЗ рдХреЛрдб рдХреЗ рд╕рд╛рде рд╕рдорд╕реНрдпрд╛ https://github.com/rust-lang/rust/issues/31844#issuecomment -284235369 рдореЗрдВ рдЗрд╕ рдореБрджреНрджреЗ рдХреЗ рд╕рдорд╛рди рд╣реЛ рд╕рдХрддреА рд╣реИ рдЬрд┐рд╕реЗ @withoutboats рдиреЗ https://github.com рдореЗрдВ рд╕рдордЭрд╛рдпрд╛ рд╣реИ @withoutboats рдХреА рдЯрд┐рдкреНрдкрдгреА рдХреЗ рдЖрдзрд╛рд░ рдкрд░, рдРрд╕рд╛ рд▓рдЧрддрд╛ рд╣реИ рдХрд┐ рд╡рд░реНрддрдорд╛рди рд╕реНрдерд╛рдиреАрдп рддрд░реНрдХ рдХреЛ рдЖрдкрдХреЗ рдЙрджрд╛рд╣рд░рдг рдХреЛ рд╕рдВрдХрд▓рд┐рдд рдХрд░рдиреЗ рдХреА рдЕрдиреБрдорддрд┐ рджреЗрдиреА рдЪрд╛рд╣рд┐рдП, рд▓реЗрдХрд┐рди рд╢рд╛рдпрдж рдореБрдЭрд╕реЗ рдЧрд▓рддреА рд╣реЛ рдЧрдИ рд╣реИ рдХрд┐ рдореБрдЭреЗ рдХреНрдпрд╛ рдХрд╛рдо рдХрд░рдиреЗ рдХреА рдЙрдореНрдореАрдж рд╣реИред

рдПрдХ рддрд░рдл рдХреЗ рд░реВрдк рдореЗрдВ, рдореИрдВрдиреЗ рдирд┐рдореНрдирд▓рд┐рдЦрд┐рдд рдХреЛ рд▓рд╛рдЧреВ рдХрд░рдиреЗ рдХреА рдХреЛрд╢рд┐рд╢ рдХреА, рдЕрд╕рдлрд▓:

trait Optional<T> {
    fn into_option(self) -> Option<T>;
}

impl<R, T: Into<R>> Optional<R> for T {
    default fn into_option(self) -> Option<R> {
        Some(self.into())
    }
}

impl<R> Optional<R> for Option<R> {
    fn into_option(self) -> Option<R> {
        self
    }
}

рдореИрдВ рд╕рд╣рдЬ рдЙрдореНрдореАрдж Option<R> рдХреА рддреБрд▓рдирд╛ рдореЗрдВ рдЕрдзрд┐рдХ рд╡рд┐рд╢рд┐рд╖реНрдЯ рд╣реЛрдирд╛ <R, T: Into<R>> T , рд▓реЗрдХрд┐рди рдирд┐рд╢реНрдЪрд┐рдд рд░реВрдк рд╕реЗ, рдХреБрдЫ рднреА рдирд╣реАрдВ рд░реЛрдХрддрд╛ рд╣реИ рдПрдХ impl<R> Into<R> for Option<R> рднрд╡рд┐рд╖реНрдп рдореЗрдВред

рдореБрдЭреЗ рдпрдХреАрди рдирд╣реАрдВ рд╣реИ рдХрд┐ рдпрд╣ рдХреНрдпреЛрдВ рдЕрд╕реНрд╡реАрдХреГрдд рд╣реИ, рд╣рд╛рд▓рд╛рдВрдХрд┐ред рдпрд╣рд╛рдВ рддрдХ тАЛтАЛрдХрд┐ рдЕрдЧрд░ рдПрдХ impl<R> Into<R> for Option<R> рднрд╡рд┐рд╖реНрдп рдореЗрдВ рдЬреЛрдбрд╝рд╛ рдЧрдпрд╛ рдерд╛, рддрдм рднреА рдореИрдВ рд░реВрд╕реНрдЯ рд╕реЗ рдЧреИрд░- default рдХрд╛рд░реНрдпрд╛рдиреНрд╡рдпрди рдХрд╛ рдЪрдпрди рдХрд░рдиреЗ рдХреА рдЙрдореНрдореАрдж рдХрд░реВрдВрдЧрд╛, рдЬрд╣рд╛рдВ рддрдХ тАЛтАЛрдореИрдВ рджреЗрдЦ рд╕рдХрддрд╛ рд╣реВрдВ, рдЗрд╕ рдХреЛрдб рдХреЛ рдЖрдЧреЗ рдмрдврд╝рд╛рдиреЗ рдХрд╛ рдХреЛрдИ рдорддрд▓рдм рдирд╣реАрдВ рд╣реИ- рд╕рдВрдЧрддрддрд╛ред

рд╕рднреА рдореЗрдВ, рдореИрдВ рд╡рд┐рд╢реЗрд╖рдЬреНрдЮрддрд╛ рдХреЗ рд╕рд╛рде рдХрд╛рдо рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдмрд╣реБрдд рдирд┐рд░рд╛рд╢рд╛ рд╣реЛрддреА рд╣реВрдВред рдореИрдВ рдЬреЛ рдХреБрдЫ рднреА рдХрд╛рдо рдХрд░рдиреЗ рдХреА рдЙрдореНрдореАрдж рдХрд░рддрд╛ рд╣реВрдВ рдЙрд╕рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рдмрд╕ рдирд╣реАрдВред рдХреЗрд╡рд▓ рдРрд╕реЗ рдорд╛рдорд▓реЗ рдЬрд╣рд╛рдВ рдореБрдЭреЗ рд╡рд┐рд╢реЗрд╖рдЬреНрдЮрддрд╛ рдХреЗ рд╕рд╛рде рд╕рдлрд▓рддрд╛ рдорд┐рд▓реА рд╣реИ, рд╡реЗ рдмрд╣реБрдд рд╕рд░рд▓ рд╣реИрдВ, рдЬреИрд╕реЗ рдХрд┐ рджреЛ impl s рдЬрд┐рд╕рдореЗрдВ T where T: A рдФрд░ T where T: A + B ред рдореЗрд░реЗ рдкрд╛рд╕ рдХрд╛рдо рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдПрдХ рдХрдард┐рди рд╕рдордп рд╣реИ, рдФрд░ рддреНрд░реБрдЯрд┐ рд╕рдВрджреЗрд╢ рдЗрдВрдЧрд┐рдд рдирд╣реАрдВ рдХрд░рддреЗ рд╣реИрдВ рдХрд┐ рд╡рд┐рд╢реЗрд╖рдЬреНрдЮ рдХрд╛рдо рдХрд░рдиреЗ рдХрд╛ рдкреНрд░рдпрд╛рд╕ рдХреНрдпреЛрдВ рдирд╣реАрдВ рдХрд░рддреЗ рд╣реИрдВред рдмреЗрд╢рдХ, рдЕрднреА рднреА рдЖрдЧреЗ рдПрдХ рд╕рдбрд╝рдХ рд╣реИ, рдЗрд╕рд▓рд┐рдП рдореБрдЭреЗ рдмрд╣реБрдд рдЙрдкрдпреЛрдЧреА рддреНрд░реБрдЯрд┐ рд╕рдВрджреЗрд╢реЛрдВ рдХреА рдЙрдореНрдореАрдж рдирд╣реАрдВ рд╣реИред рдРрд╕рд╛ рд▓рдЧрддрд╛ рд╣реИ рдХрд┐ рдХреБрдЫ рдорд╛рдорд▓реЗ рдРрд╕реЗ рд╣реИрдВ рдЬрд╣рд╛рдБ рдореИрдВ рд╡рд╛рд╕реНрддрд╡ рдореЗрдВ рдХрд╛рдо рдХрд░рдиреЗ рдХреА рдЙрдореНрдореАрдж рдХрд░рддрд╛ рд╣реВрдБ (рдЬреИрд╕реЗ рдКрдкрд░) рд▓реЗрдХрд┐рди рдпрд╣ рдЕрднреА рдирд╣реАрдВ рд╣реИ, рдФрд░ рд╡рд░реНрддрдорд╛рди рдореЗрдВ рдореЗрд░реЗ рд▓рд┐рдП рдпрд╣ рдкрддрд╛ рд▓рдЧрд╛рдирд╛ рдХрд╛рдлреА рдореБрд╢реНрдХрд┐рд▓ рд╣реИ рдХрд┐ рдЕрдЧрд░ рдореБрдЭреЗ рдЧрд▓рдд рд╕рдордЭрд╛ рдЧрдпрд╛ рд╣реИ рддреЛ рдЗрд╕рдХреА рдЕрдиреБрдорддрд┐ рдХреНрдпрд╛ рд╣реИ (рдФрд░ рдЕрдзрд┐рдХ рдорд╣рддреНрд╡рдкреВрд░реНрдг рдмрд╛рдд) рдХреНрдпреЛрдВ), рдЕрдЧрд░ рдХреБрдЫ рдЧрд▓рдд рд╣реИ, рдпрд╛ рдЕрдЧрд░ рдХреБрдЫ рдЕрднреА рддрдХ рд▓рд╛рдЧреВ рдирд╣реАрдВ рдХрд┐рдпрд╛ рдЧрдпрд╛ рд╣реИред рдЗрд╕ рд╕реБрд╡рд┐рдзрд╛ рдХреЗ рд╕рд╛рде рдЬреЛ рдЪрд▓ рд░рд╣рд╛ рд╣реИ рдЙрд╕рдХрд╛ рдПрдХ рдЕрдЪреНрдЫрд╛ рдЕрд╡рд▓реЛрдХрди рдмрд╣реБрдд рдЙрдкрдпреЛрдЧреА рд╣реЛрдЧрд╛ред

рдореИрдВ рд╕рдХрд╛рд░рд╛рддреНрдордХ рдирд╣реАрдВ рд╣реВрдВ рдпрд╣ рд╕рд╣реА рдЬрдЧрд╣ рдкрд░ рд╣реИ, рд▓реЗрдХрд┐рди рд╣рдо рдЙрди рдЙрдкрдпреЛрдЧрдХрд░реНрддрд╛рдУрдВ рдХреЗ рдордВрдЪ рдкрд░ рдПрдХ рд╕рдорд╕реНрдпрд╛ рдореЗрдВ рднрд╛рдЧ рдЧрдП рдЬрд┐рдиреНрд╣реЗрдВ рдореИрдВ рдпрд╣рд╛рдВ рдЙрд▓реНрд▓реЗрдЦ рдХрд░рдирд╛ рдЪрд╛рд╣рддрд╛ рд╣реВрдВред

рдирд┐рдореНрдирд▓рд┐рдЦрд┐рдд рдХреЛрдб (рдЬреЛ рдпрд╣рд╛рдВ RFC рд╕реЗ рдЕрдиреБрдХреВрд▓рд┐рдд

#![feature(specialization)]

trait Example {
    type Output;
    fn generate(self) -> Self::Output;
}

default impl<T> Example for T {
    type Output = Box<T>;
    fn generate(self) -> Self::Output { Box::new(self) }
}

impl Example for bool {
    type Output = bool;
    fn generate(self) -> Self::Output { self }
}

рдпрд╣ рд╡рд╛рд╕реНрддрд╡ рдореЗрдВ рдПрдХ рдЧрдбрд╝рдмрдбрд╝ рдХреА рддрд░рд╣ рдкреНрд░рддреАрдд рдирд╣реАрдВ рд╣реЛрддрд╛ рд╣реИ, рд▓реЗрдХрд┐рди рдПрдХ рдкреНрд░рдпреЛрдЬреНрдп рд╕рдорд╕реНрдпрд╛ рдХреА рддрд░рд╣ рд╣реИ - рдпрджрд┐ рдПрдХ рдХрд╛рд▓реНрдкрдирд┐рдХ impl рдХреЗрд╡рд▓ рдКрдкрд░ рджрд┐рдП рдЧрдП рдЙрджрд╛рд╣рд░рдг рдореЗрдВ рд╕рдВрдмрдВрдзрд┐рдд рдкреНрд░рдХрд╛рд░, defaulti impl generate рд╣реЛрдЧрд╛ред 'рдЯреА рдЯрд╛рдЗрдкреЗрдХреИрдЪред

рдпрд╣рд╛рдВ рдзрд╛рдЧреЗ рд╕реЗ рд▓рд┐рдВрдХ

@ burns47 рдпрд╣рд╛рдБ рдПрдХ рднреНрд░рд╛рдордХ рд▓реЗрдХрд┐рди рдЙрдкрдпреЛрдЧреА рдХрд╛рдо рд╣реИ: https://github.com/rust-lang/rust/issues/31844#issuecomment -263175793ред

@dtolnay рдХрд╛рдлреА рд╕рдВрддреЛрд╖рдЬрдирдХ рдирд╣реАрдВ рд╣реИ - рдХреНрдпрд╛ рд╣реЛрдЧрд╛ рдпрджрд┐ рд╣рдо рдЙрди рдЧреБрдгреЛрдВ рдкрд░ рд╡рд┐рд╢реЗрд╖рдЬреНрдЮрддрд╛ рдХрд░ рд░рд╣реЗ рд╣реИрдВ рдЬреЛ рд╣рдорд╛рд░реЗ рдкрд╛рд╕ рдирд╣реАрдВ рд╣реИрдВ (рдФрд░ рд╕рдВрд╢реЛрдзрд┐рдд рдирд╣реАрдВ рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ)? рд╣рдореЗрдВ рдЗрд╕ IMO рдХреЛ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рд░реАрдлрд╝реНрд░реИрдХреНрдЯрд░ / рд░рд┐рдлреНрд▓реЗрдХреНрдЯрд░ рд╡рд┐рд╢реЗрд╖рддрд╛ рдХреЛ рдлрд┐рд░ рд╕реЗ рд▓рд┐рдЦрдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рдирд╣реАрдВ рд╣реИред

рдХреНрдпрд╛ рдХреЛрдИ рдЯрд┐рдкреНрдкрдгреА рдХрд░ рд╕рдХрддрд╛ рд╣реИ рдХрд┐ рдХреНрдпрд╛ рдирд┐рдореНрдирд▓рд┐рдЦрд┐рдд рдореБрджреНрджреЗ рдХреЗ рдХреЛрдб рдХреЛ рдЬрд╛рдирдмреВрдЭрдХрд░ рдЦрд╛рд░рд┐рдЬ рдХрд░ рджрд┐рдпрд╛ рдЧрдпрд╛ рд╣реИ? https://github.com/rust-lang/rust/issues/45542

рд╡рд┐рд╢реЗрд╖рдЬреНрдЮрддрд╛ рдХреЗ рд▓рд┐рдП рдирд┐рдореНрдирд▓рд┐рдЦрд┐рдд рдХреА рддрд░рд╣ рдХреБрдЫ рдЬреЛрдбрд╝рдиреЗ рдХреА рдЕрдиреБрдорддрд┐ рд╣реЛрдЧреА libcore?

impl<T: Ord> Eq for T {}

impl<T: Ord> PartialEq for T {
    default fn eq(&self, other: &Self) -> bool {
        self.cmp(other) == Ordering::Equal
    }
}

impl<T: Ord> PartialOrd for T {
    default fn partial_cmp(&self, other: &Self) -> Option<Ordering> {
        Some(self.cmp(other))
    }
}

рдЗрд╕ рддрд░рд╣ рдЖрдк рдЕрдкрдиреЗ рдХрд╕реНрдЯрдо рдкреНрд░рдХрд╛рд░ рдХреЗ рд▓рд┐рдП Ord рд▓рд╛рдЧреВ рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ рдФрд░ Eq , PartialEq , рдФрд░ PartialOrd рд╕реНрд╡рдЪрд╛рд▓рд┐рдд рд░реВрдк рд╕реЗ рд▓рд╛рдЧреВ рд╣реЛ рд╕рдХрддреЗ рд╣реИрдВред

рдзреНрдпрд╛рди рджреЗрдВ рдХрд┐ Ord рдФрд░ рд╕рд╛рде рд╣реА PartialEq рдпрд╛ PartialOrd рдХрд░рдирд╛ рдЦрддрд░рдирд╛рдХ рд╣реИ рдФрд░ рдмрд╣реБрдд рд╕реВрдХреНрд╖реНрдо рдХреАрдбрд╝реЗ рдкреИрджрд╛ рдХрд░ рд╕рдХрддрд╛ рд╣реИ! рдЗрди рдбрд┐рдлрд╝реЙрд▓реНрдЯ рдЖрдХреГрддрд┐рдпреЛрдВ рдХреЗ рд╕рд╛рде рдЖрдк рдЙрди рд▓рдХреНрд╖рдгреЛрдВ рдХреЛ рдкреНрд░рд╛рдкреНрдд рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдХрдо рд▓реБрднрд╛рдПрдВрдЧреЗ, рдЗрд╕рд▓рд┐рдП рд╕рдорд╕реНрдпрд╛ рдХреБрдЫ рд╣рдж рддрдХ рдХрдо рд╣реЛ рдЬрд╛рдПрдЧреАред


рд╡реИрдХрд▓реНрдкрд┐рдХ рд░реВрдк рд╕реЗ, рд╣рдо рд╡рд┐рд╢реЗрд╖рдЬреНрдЮрддрд╛ рдХрд╛ рд▓рд╛рдн рдЙрдард╛рдиреЗ рдХреЗ рд▓рд┐рдП рд╡реНрдпреБрддреНрдкрддреНрддрд┐ рдХреЛ рд╕рдВрд╢реЛрдзрд┐рдд рдХрд░рддреЗ рд╣реИрдВред рдЙрджрд╛рд╣рд░рдг рдХреЗ рд▓рд┐рдП, #[derive(PartialOrd)] struct Foo(String) рдКрдкрд░ рд▓рд┐рдЦрдирд╛ рдирд┐рдореНрди рдХреЛрдб рдЙрддреНрдкрдиреНрди рдХрд░ рд╕рдХрддрд╛ рд╣реИ:

impl PartialOrd for Foo {
    default fn partial_cmp(&self, other: &Foo) -> Option<Ordering> {
        self.0.partial_cmp(&other.0)
    }
}

impl PartialOrd for Foo where Foo: Ord {
    fn partial_cmp(&self, other: &Self) -> Option<Ordering> {
        Some(self.cmp(other))
    }
}

рдпрджрд┐ Ord рд▓рд╛рдЧреВ рдирд╣реАрдВ рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИ рддреЛ рдЗрд╕ рддрд░рд╣ рдбрд┐рдлрд╝реЙрд▓реНрдЯ рдЗрдореНрдкреНрд▓рд╛рдВрдЯ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИред рд▓реЗрдХрд┐рди рдЕрдЧрд░ рдпрд╣ рд╣реИ, рддреЛ PartialOrd Ord рдкрд░ рдирд┐рд░реНрднрд░ рдХрд░рддрд╛ рд╣реИред рджреБрд░реНрднрд╛рдЧреНрдп рд╕реЗ, рдпрд╣ рд╕рдВрдХрд▓рди рдирд╣реАрдВ рдХрд░рддрд╛ рд╣реИ: error[E0119]: conflicting implementations of trait `std::cmp::PartialOrd` for type `Foo`

@stjepang рдореБрдЭреЗ рдирд┐рд╢реНрдЪрд┐рдд рд░реВрдк рд╕реЗ рдЙрдореНрдореАрдж рд╣реИ рдХрд┐ рдЬреИрд╕реЗ рдХрдВрдмрд▓ рдХреЛ рдЬреЛрдбрд╝рд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИ - impl<T:Copy> Clone for T рднреАред

рдореБрдЭреЗ рд▓рдЧрддрд╛ рд╣реИ

impl<T: Ord> PartialEq for T

рд╣реЛрдирд╛ рдЪрд╛рд╣рд┐рдП

impl<T, U> PartialEq<U> for T where T : PartialOrd<U>

рдХреНрдпреЛрдВрдХрд┐ PartialOrd рд▓рд┐рдП PartialEq рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реЛрддреА рд╣реИ рдФрд░ рдЗрд╕реЗ рднреА рдкреНрд░рджрд╛рди рдХрд░ рд╕рдХрддреЗ рд╣реИрдВред

рдЕрднреА, рдХреЛрдИ рд╡рд╛рд╕реНрддрд╡ рдореЗрдВ рд╕рдВрдмрджреНрдз рдкреНрд░рдХрд╛рд░реЛрдВ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд┐рд╕реА рд╡рд┐рд╢реЗрд╖рдЬреНрдЮрддрд╛ рдХреЛ рд╕реАрдорд┐рдд рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдирд╣реАрдВ рдХрд░ рд╕рдХрддрд╛ рд╣реИ , рдХреНрдпреЛрдВрдХрд┐ рджреЛрдиреЛрдВ рдХреЛ рд╡реЗ рдЕрдирд┐рдпреЛрдЬрд┐рдд рдкреБрдирд░рд╛рд╡реГрддреНрддрд┐ рдХреЛ рдЯреНрд░рд┐рдЧрд░ рдХрд░рддреЗ рд╣реИрдВ ред Https://github.com/dhardy/rand/issues/18#issuecomment -358147645 рджреЗрдЦреЗрдВ

рдЖрдЦрд┐рд░рдХрд╛рд░, рдореИрдВ рдпрд╣ рджреЗрдЦрдиреЗ рдХреЗ рд▓рд┐рдП рдкреНрдпрд╛рд░ рдХрд░рддрд╛ рд╣реВрдВ рдХрд┐ рдореИрдВ @nikomatsakis рджреНрд╡рд╛рд░рд╛ рдкреНрд░рд╕реНрддрд╛рд╡рд┐рдд рд╡рд╛рдХреНрдп рд░рдЪрдирд╛ рдХреЗ рд╕рд╛рде рд╡рд┐рд╢реЗрд╖рдЬреНрдЮрддрд╛ рд╕рдореВрд╣реЛрдВ рдХреЛ рдпрд╣рд╛рдВ рдХреНрдпрд╛ рдХрд╣ рд░рд╣рд╛ рд╣реВрдВ https://github.com/rust-lang/rust/issues/31844#issuecomment -249355357 рдФрд░ рд╕реНрд╡рддрдВрддреНрд░ рд░реВрдк рд╕реЗ рдореЗрд░реЗ рджреНрд╡рд╛рд░рд╛ред рдореИрдВ рдЙрд╕ рдкреНрд░рд╕реНрддрд╛рд╡ рдкрд░ рдмрд╛рдж рдореЗрдВ рдПрдХ RFC рд▓рд┐рдЦрдирд╛ рдкрд╕рдВрдж рдХрд░рддрд╛ рд╣реВрдВ рдЬрдм рд╣рдо рд╡рд┐рд╢реЗрд╖рдЬреНрдЮрддрд╛ рдХреЛ рд╕реНрдерд┐рд░ рдХрд░рдиреЗ рдХреЗ рдХрд░реАрдм рд╣реЛрддреЗ рд╣реИрдВред

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

рдЬреИрд╕рд╛ рдХрд┐ рдХреЙрдкреА рдХреНрд▓реЛрдЬрд░ рдкрд╣рд▓реЗ рд╕реЗ рд╣реА рдмреАрдЯрд╛ рдореЗрдВ рд╕реНрдЯреИрдмрд▓рд╛рдЗрдЬ рдХрд┐рдП рдЧрдП рдереЗ, рдбреЗрд╡рд▓рдкрд░реНрд╕ рдХреЛ рдЕрдм рд╡рд┐рд╢реЗрд╖рдЬреНрдЮрддрд╛ рдкрд░ рд╕реНрдерд┐рд░ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдЕрдзрд┐рдХ рдкреНрд░реЗрд░рдгрд╛ рд╣реИред рдХрд╛рд░рдг рдпрд╣ рд╣реИ рдХрд┐ Fn рдФрд░ FnOnce + Clone рдХреНрд▓реЛрдЬрд░ рдХреЗ рджреЛ рдЕрддрд┐рд╡реНрдпрд╛рдкреА рд╕реЗрдЯ рдХрд╛ рдкреНрд░рддрд┐рдирд┐рдзрд┐рддреНрд╡ рдХрд░рддреЗ рд╣реИрдВ, рдФрд░ рдХрдИ рдорд╛рдорд▓реЛрдВ рдореЗрдВ рд╣рдореЗрдВ рдЙрди рджреЛрдиреЛрдВ рдХреЗ рд▓рд┐рдП рд▓рдХреНрд╖рдг рд▓рд╛рдЧреВ рдХрд░рдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реИред

рдмрд╕ рдпрд╣ рдкрддрд╛ рдХрд░реЗрдВ рдХрд┐ rfc 2132 рдХреЗ рд╢рдмреНрдж рдХрд╛ рдЕрд░реНрде рдпрд╣ рд▓рдЧрддрд╛ рд╣реИ рдХрд┐ рдХреЗрд╡рд▓ 5 рдкреНрд░рдХрд╛рд░ рдХреЗ рдХреНрд▓реЛрдЬрд░ рд╣реИрдВ:

  • FnOnce ( move рд╕рднреА рдХреИрдкреНрдЪрд░ рдХрд┐рдП рдЧрдП рдЪрд░ рдХреЗ рд╕рд╛рде рди рддреЛ Copy рдФрд░ рди рд╣реА Clone )
  • FnOnce + Clone ( move рд╕рднреА рдкрдХрдбрд╝реЗ рдЧрдП рдЪрд░ рдХреЗ рд╕рд╛рде Clone )
  • FnOnce + Copy + Clone ( move рд╕рднреА рдкрдХрдбрд╝реЗ рдЧрдП рдЪрд░ рдХреЗ рд╕рд╛рде Copy рдФрд░ рдЗрд╕рд▓рд┐рдП Clone )
  • FnMut + FnOnce (рдПрдХ рдЧреИрд░- move рдЙрддреНрдкрд░рд┐рд╡рд░реНрддрд┐рдд рд╡реИрд░рд┐рдПрдмрд▓ рдХреЗ рд╕рд╛рде
  • Fn + FnMut + FnOnce + Copy + Clone (рдПрдХ рдЧреИрд░- move рдмрдВрдж рдХрд┐рдП рдЧрдП рдмрд┐рдирд╛ рдкрд░рд┐рд╡рд░реНрддрди рдХрд┐рдП рдЧрдП рдЪрд░)

рдЗрд╕рд▓рд┐рдП рдпрджрд┐ рдирд┐рдХрдЯ рднрд╡рд┐рд╖реНрдп рдореЗрдВ рд╡рд┐рдирд┐рд░реНрджреЗрд╢ рдЙрдкрд▓рдмреНрдз рдирд╣реАрдВ рд╣реИ, рддреЛ рд╢рд╛рдпрдж рд╣рдореЗрдВ Fn рдХреА рдЕрдкрдиреА рдкрд░рд┐рднрд╛рд╖рд╛ рдХреЛ рдЕрдкрдбреЗрдЯ рдХрд░рдирд╛ рдЪрд╛рд╣рд┐рдП рддрд╛рдХрд┐ Fn FnOnce + Clone рд╕рд╛рде рдУрд╡рд░рд▓реИрдкрд┐рдВрдЧ рди рд╣реЛ?

рдореИрдВ рд╕рдордЭрддрд╛ рд╣реВрдВ рдХрд┐ рдХреЛрдИ рд╡реНрдпрдХреНрддрд┐ рдкрд╣рд▓реЗ рд╕реЗ рд╣реА Fn Copy/Clone рдмрд┐рдирд╛

рдХреНрдпрд╛ рд╡рд┐рд╢реЗрд╖рдЬреНрдЮрддрд╛ рджреНрд╡рд╛рд░рд╛ рдирд┐рдореНрдирд▓рд┐рдЦрд┐рдд рдХреА рдЕрдиреБрдорддрд┐ рджреА рдЬрд╛рдиреА рдЪрд╛рд╣рд┐рдП ( default рдХреА рдЕрдиреБрдкрд╕реНрдерд┐рддрд┐ рдкрд░ рдзреНрдпрд╛рди рджреЗрдВ) рдпрд╛ рдпрд╣ рдПрдХ рдмрдЧ рд╣реИ?

#![feature(specialization)]
mod ab {
    pub trait A {
        fn foo_a(&self) { println!("a"); }
    }

    pub trait B {
        fn foo_b(&self) { println!("b"); }
    }

    impl<T: A> B for T {
        fn foo_b(&self) { println!("ab"); }
    }

    impl<T: B> A for T {
        fn foo_a(&self) { println!("ba"); }
    }
}

use ab::B;

struct Foo;

impl B for Foo {}

fn main() {
    Foo.foo_b();
}

рд╡рд┐рд╢реЗрд╖рдЬреНрдЮрддрд╛ рдХреЗ рдмрд┐рдирд╛, рдЗрд╕рдХреЗ рд╕рд╛рде рдирд┐рд░реНрдорд╛рдг рдХрд░рдиреЗ рдореЗрдВ рд╡рд┐рдлрд▓ рд░рд╣рддрд╛ рд╣реИ:

error[E0119]: conflicting implementations of trait `ab::B` for type `Foo`:
  --> src/main.rs:24:1
   |
11 |     impl<T: A> B for T {
   |     ------------------ first implementation here
...
24 | impl B for Foo {}
   | ^^^^^^^^^^^^^^ conflicting implementation for `Foo`

@ рдЧреНрд▓реИрдВрдбрд┐рдпрдо рдкреГрдереНрд╡реА рдкрд░ рдХреНрдпрд╛ рдЪрд▓ рд░рд╣рд╛ рд╣реИ? рдЕрдЪреНрдЫрд╛ рдЙрджрд╛рд╣рд░рдг, рдпрд╣рд╛рдБ рдЦреЗрд▓ рдХрд╛ рдореИрджрд╛рди рд▓рд┐рдВрдХ: https://play.rust-lang.org/?gist=fc7cf5145222c432e2bd8de1b0a425cd&version=nightly&mode-debug

рдХреНрдпрд╛ рдпрд╣? рдореЗрд░реЗ рдЙрджрд╛рд╣рд░рдг рдореЗрдВ рдХреЛрдИ рдЦрд╛рд▓реА рдирд┐рд╣рд┐рддрд╛рд░реНрде рдирд╣реАрдВ рд╣реИред

@glandium

 impl B for Foo {}

@MoSal рд▓реЗрдХрд┐рди рдпрд╣ B рдбрд┐рдлрд╝реЙрд▓реНрдЯ рдХрд╛рд░реНрдпрд╛рдиреНрд╡рдпрди рдХреЗ рд╕рд╛рде рдПрдХ рд╡рд┐рдзрд┐ рдЬреЛрдбрд╝рддрд╛ рд╣реИред

@gnzlbg рдпрд╣ рдкрд░рд┐рднрд╛рд╖рд╛ рд╕реЗ рдЦрд╛рд▓реА рд╣реИред рдмреНрд░реЗрд╕рд┐рдЬрд╝ рдХреЗ рдмреАрдЪ рдХреБрдЫ рднреА рдирд╣реАрдВред


#![feature(specialization)]

use std::borrow::Borrow;

#[derive(Debug)]
struct Bla {
    bla: Vec<Option<i32>>
}

// Why is this a conflict ?
impl From<i32> for Bla {
    fn from(i: i32) -> Self {
        Bla { bla: vec![Some(i)] }
    }
}

impl<B: Borrow<[i32]>> From<B> for Bla {
    default fn from(b: B) -> Self {
        Bla { bla: b.borrow().iter().map(|&i| Some(i)).collect() }
    }
}

fn main() {
    let b : Bla = [1, 2, 3].into();
    println!("{:?}", b);
}

error[E0119]: conflicting implementations of trait `std::convert::From<i32>` for type `Bla`:
  --> src/main.rs:17:1
   |
11 | impl From<i32> for Bla {
   | ---------------------- first implementation here
...
17 | impl<B: Borrow<[i32]>> From<B> for Bla {
   | ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ conflicting implementation for `Bla`
   |
   = note: upstream crates may add new impl of trait `std::borrow::Borrow<[i32]>` for type `i32` in future versions

рдХреНрдпрд╛ рд╡рд┐рд╢реЗрд╖рдЬреНрдЮрддрд╛ рднрд╡рд┐рд╖реНрдп рдХреЗ рд╕рдВрднрд╛рд╡рд┐рдд рд╕рдВрдШрд░реНрд╖реЛрдВ рдХреЛ рд░реЛрдХ рдирд╣реАрдВ рдкрд╛рдПрдЧреА?

рдореБрдЭреЗ рдЕрдЪреНрдЫрд╛рдИ рджреЗрдВ, рдпрд╣ рдПрдХ рдзреАрдореА рдЧрддрд┐ рд╕реЗ рдЪрд▓рдиреЗ рд╡рд╛рд▓реА рд╡рд┐рд╢реЗрд╖рддрд╛ рд╣реИ! рджреЛ рд╡рд░реНрд╖реЛрдВ рдореЗрдВ рдХреЛрдИ рдкреНрд░рдЧрддрд┐ рдирд╣реАрдВ рд╣реБрдИ, рдРрд╕рд╛ рд▓рдЧрддрд╛ рд╣реИ (рдирд┐рд╢реНрдЪрд┐рдд рд░реВрдк рд╕реЗ рдореВрд▓ рдкрдж рдХреЗ рдЕрдиреБрд╕рд╛рд░)ред рдХреНрдпрд╛ рд▓рдВрдЧ рдЯреАрдо рдиреЗ рдЗрд╕реЗ рдЫреЛрдбрд╝ рджрд┐рдпрд╛ рд╣реИ?

@alexreg рдирд╡реАрдирддрдо рд╡рд┐рдХрд╛рд╕ рдХреЗ рд▓рд┐рдП http://aturon.github.io/2018/04/05/sound-specialization/ рджреЗрдЦреЗрдВред

@alexreg рдпрд╣ рдкрддрд╛ рдЪрд▓рд╛ рд╣реИ рдХрд┐ рдзреНрд╡рдирд┐ рдХрд╛ рдЕрд░реНрде _ рднрд╛рд░_ рд╣реИред рдореЗрд░рд╛ рдорд╛рдирдирд╛ тАЛтАЛрд╣реИ рдХрд┐ рд╡рд░реНрддрдорд╛рди рдореЗрдВ рд╣реЛ рд░рд╣реЗ "рд╣рдореЗрд╢рд╛ рд▓рд╛рдЧреВ рд╣реЛрдиреЗ рд╡рд╛рд▓реЗ рдЕрдиреБрдорд╛рдиреЛрдВ" рдкрд░ рдХреБрдЫ рдХрд╛рдо рд╣реЛ рд░рд╣рд╛ рд╣реИ, рдЗрд╕рд▓рд┐рдП рдкреНрд░рдЧрддрд┐ рд╣реИред Https://github.com/rust-lang/rust/pull/49624 рджреЗрдЦреЗрдВ

рдереЛрдбрд╝рд╛ рд╕рдВрдШрд░реНрд╖ рдХреЗ рдмрд╛рдж, рдРрд╕рд╛ рд▓рдЧрддрд╛ рд╣реИ рдХрд┐ specialization рдФрд░ overlapping_marker_traits рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдХреЗ рд╣реИрдХ рдХреЗ рдорд╛рдзреНрдпрдо рд╕реЗ рдкрд╣рд▓реЗ рд╕реЗ рд╣реА рдЪреМрд░рд╛рд╣реЗ рдХреЗ рдирд┐рд╢рд╛рди рдХреЛ рдкреНрд░рднрд╛рд╡реА рдврдВрдЧ рд╕реЗ рд▓рд╛рдЧреВ рдХрд░рдирд╛ рд╕рдВрднрд╡ рд╣реИред

https://play.rust-lang.org/?gist=cb7244f41c040db41fc447d491031263&version=nightly&mode=debug

рдореИрдВрдиреЗ рдЗрд╕ C ++ рдХреЛрдб рдХреЗ рдмрд░рд╛рдмрд░ рд▓рд╛рдЧреВ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдПрдХ рдкреБрдирд░рд╛рд╡рд░реНрддреА рд╡рд┐рд╢реЗрд╖ рдлрд╝рдВрдХреНрд╢рди рд▓рд┐рдЦрдиреЗ рдХреА рдХреЛрд╢рд┐рд╢ рдХреА:


C ++ рдХреЛрдб

#include <cassert>
#include <vector>

template<typename T>
size_t count(T elem)
{
    return 1;
}

template<typename T>
size_t count(std::vector<T> vec)
{
    size_t n = 0;
    for (auto elem : vec)
    {
        n += count(elem);
    }
    return n;
}

int main()
{
    auto v1 = std::vector{1, 2, 3};
    assert(count(v1) == 3);

    auto v2 = std::vector{ std::vector{1, 2, 3}, std::vector{4, 5, 6} };
    assert(count(v2) == 6);

    return 0;
}


рдореИрдВрдиреЗ рдпрд╣ рдХреЛрд╢рд┐рд╢ рдХреА:


рд░рд╕реНрдЯ рдХреЛрдб

#![feature(specialization)]

trait Count {
    fn count(self) -> usize;
}

default impl<T> Count for T {
    fn count(self) -> usize {
        1
    }
}

impl<T> Count for T
where
    T: IntoIterator,
    T::Item: Count,
{
    fn count(self) -> usize {
        let i = self.into_iter();

        i.map(|x| x.count()).sum()
    }
}

fn main() {
    let v = vec![1, 2, 3];
    assert_eq!(v.count(), 3);

    let v = vec![
        vec![1, 2, 3],
        vec![4, 5, 6],
    ];
    assert_eq!(v.count(), 6);
}


рд▓реЗрдХрд┐рди рдореБрдЭреЗ рдПрдХ рдорд┐рд▓ рд░рд╣рд╛ рд╣реИ:

overflow evaluating the requirement `{integer}: Count`

рдореБрдЭреЗ рдирд╣реАрдВ рд▓рдЧрддрд╛ рдХрд┐ рдРрд╕рд╛ рд╣реЛрдирд╛ рдЪрд╛рд╣рд┐рдП рдХреНрдпреЛрдВрдХрд┐ impl<T> Count for T where T::Item: Count рдХреЛ рдЕрддрд┐рдкреНрд░рд╡рд╛рд╣ рдирд╣реАрдВ рд╣реЛрдирд╛ рдЪрд╛рд╣рд┐рдПред

рд╕рдВрдкрд╛рджрд┐рдд рдХрд░реЗрдВ: рдХреНрд╖рдорд╛ рдХрд░реЗрдВ, рдореИрдВрдиреЗ рдЕрднреА рджреЗрдЦрд╛ рдХрд┐ рдпрд╣ рдкрд╣рд▓реЗ рд╣реА рдЙрд▓реНрд▓реЗрдЦ рдХрд┐рдпрд╛ рдЧрдпрд╛ рдерд╛

@Boiethios рдЖрдкрдХрд╛ usecase рдХрд╛рдо рдХрд░ рд░рд╣рд╛ рд╣реИ рдпрджрд┐ рдЖрдк fn рдкрд░ рдбрд┐рдлрд╝реЙрд▓реНрдЯ рд╣реИрдВ рдФрд░

#![feature(specialization)]

trait Count {
    fn count(self) -> usize;
}

impl<T> Count for T {
    default fn count(self) -> usize {
        1
    }
}

impl<T> Count for T
where
    T: IntoIterator,
    T::Item: Count,
{
    fn count(self) -> usize {
        let i = self.into_iter();

        i.map(|x| x.count()).sum()
    }
}

fn main() {
    let v = vec![1, 2, 3];
    assert_eq!(v.count(), 3);

    let v = vec![vec![1, 2, 3], vec![4, 5, 6]];
    assert_eq!(v.count(), 6);
}

рдХреНрдпрд╛ рд╕рд╛рдЙрдВрдбрдиреЗрд╕ рдЫреЗрдж рдЕрднреА рднреА рддрдп рдирд╣реАрдВ рд╣реБрдЖ рд╣реИ?

@alexreg рдореБрдЭреЗ рдРрд╕рд╛ рдирд╣реАрдВ рд▓рдЧрддрд╛ред Http://smallcultfollowing.com/babysteps/blog/2018/02/09/maximally-minimal-specialization-always-applicable-impls/ рджреЗрдЦреЗрдВ

рдореЗрд░рд╛ рдЕрдиреБрдорд╛рди рд╣реИ рдХрд┐ рдЕрднреА рд╕рднреА рдХрд╛ рдзреНрдпрд╛рди рд╕рдВрд╕реНрдХрд░рдг рдкрд░ рдХреЗрдВрджреНрд░рд┐рдд рд╣реИ ...

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

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

@pythonesque https://github.com/rust-lang/rust/pull/42411 рдкрд░ рдХреБрдЫ рдЪрд░реНрдЪрд╛ рд╣реБрдИ рд╣реИ

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

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

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

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

рдФрд░ рдпрд╣ рд╡рд╛рд╕реНрддрд╡ рдореЗрдВ рд╕рдЪ рд╣реИ рдХрд┐ рдЬреЛ рдореИрдВ рдЪрд╛рд╣рддрд╛ рд╣реВрдВ рд╡рд╣ "рдирдХрд╛рд░рд╛рддреНрдордХ рддрд░реНрдХ" рд╕реНрд╡рд╛рдж рдХрд╛ рд╣реИ (рд╣рд╛рд▓рд╛рдВрдХрд┐ рдмрдВрдж рд▓рдХреНрд╖рдг рд╡рд╛рд╕реНрддрд╡ рдореЗрдВ рдкрд░реНрдпрд╛рдкреНрдд рдирд╣реАрдВ рд╣реЛрдВрдЧреЗ)ред

рдирдХрд╛рд░рд╛рддреНрдордХ рддрд░реНрдХ рдХреЗ рд▓рд┐рдП рдПрдХ рд╡реИрдХрд▓реНрдкрд┐рдХ рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реЛрддреА рд╣реИ рдЬреЛ рдХрд┐рд╕реА рдкреНрд░рдХрд╛рд░ рдХреЗ рдФрдЬрд╛рд░ рд▓рдХреНрд╖рдг рдХреЗ рдПрдХ рдмрдВрдж рд╕реЗрдЯ рдХрд╛ рдХреЗрд╡рд▓ рдПрдХ рд╣реА рд╡рд┐рд╢реЗрд╖рддрд╛, рдРрд╕реА рд╣реИ рдХрд┐ рд╕реЗрдЯ рдХреЗ рдЕрдиреНрдп рдЕрдиреНрдп рд▓рдХреНрд╖рдг рдХреЗ рд╕рд╛рде рдХрд╛рд░реНрдпрд╛рдиреНрд╡рдпрди рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ рдУрд╡рд░рд▓реИрдк рдирд╣реАрдВ (рдЬреИрд╕реЗ T рдФрдЬрд╛рд░ рд╕реЗ рдПрдХ { Float | Int | Bool | Ptr } )ред

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

рд╡рд░реНрддрдорд╛рди рдореЗрдВ рд░рд╛рдд рдореЗрдВ, рдпрд╣ рдХрд╛рдо рдХрд░рддрд╛ рд╣реИ:

trait Foo {}
trait Bar {}

impl<T: Bar> Foo for T {}
impl Foo for () {}

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

#![feature(specialization)]

trait Foo<F> {}
trait Bar<F> {}

default impl<F, T: Bar<F>> Foo<F> for T {}
impl<F> Foo<F> for () {}

рдХреНрдпрд╛ рдпрд╣ рдПрдХ рддрд░реНрдХ рд╣реИ рдпрд╛ рдпрд╣ рдПрдХ рдмрдЧ рд╣реИ?

@ рд╢реНрд░реАрдорд╛рди рдЕрд╢реЛрдХ рд╕рд┐рд░реНрдл рд╕рд╛рдорд╛рдиреНрдп рдЕрдирд╛рде рдирд┐рдпрдо рдирд╣реАрдВ рд╣реИ? рдкрд╣рд▓реЗ рдорд╛рдорд▓реЗ рдореЗрдВ, рдХреЛрдИ рдбрд╛рдЙрдирд╕реНрдЯреНрд░реАрдо рдЯреЛрдХрд░рд╛ impl Bar for () рдирд╣реАрдВ рд╣реЛ рд╕рдХрддрд╛ рдерд╛ impl Bar<CustomType> for () рдЬреЛ рдЖрдкрдХреЗ рдбрд┐рдлрд╝реЙрд▓реНрдЯ рдирд┐рд╣рд┐рддрд╛рд░реНрде рдХреЗ рд╕рд╛рде рд╕рдВрдШрд░реНрд╖ рдХрд░реЗрдЧрд╛ред

@Boscop рдЙрд╕ рдкрд░рд┐рджреГрд╢реНрдп рдореЗрдВ, рдбрд┐рдлрд╝реЙрд▓реНрдЯ рд░реВрдк рд╕реЗ рдХрд┐рд╕реА рднреА рддрд░рд╣ рд╕реЗ рдЧреИрд░-рдбрд┐рдлрд╝реЙрд▓реНрдЯ рджреНрд╡рд╛рд░рд╛ рдиреАрдЪреЗ рдУрд╡рд░рд░рд╛рдЗрдб рдХрд┐рдпрд╛ рдЬрд╛рдирд╛ рдЪрд╛рд╣рд┐рдПред рдЙрджрд╛рд╣рд░рдг рдХреЗ рд▓рд┐рдП, рдпрджрд┐ рдореЗрд░реЗ рдкрд╛рд╕: impl Bar<bool> for () {} рдЕрдиреНрдп рдирд┐рд╣рд┐рддрд╛рд░реНрдереЛрдВ рд╕реЗ рдкрд╣рд▓реЗ рдЬреЛрдбрд╝рд╛ рдЧрдпрд╛ рд╣реИ, рддреЛ рдореИрдВ рдЗрд╕реЗ рдХрд╛рдо рдХрд░рдиреЗ рдХреА рдЙрдореНрдореАрдж рдХрд░реВрдВрдЧрд╛ (рдЖрд░рдПрдлрд╕реА / рдЕрдкреЗрдХреНрд╖рд╛ рдХреЗ рдЕрдиреБрд╕рд╛рд░)ред рдХреНрдпрд╛ рдпрд╣ рд╕рд╣реА рдирд╣реАрдВ рд╣реИ?

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

рдпрд╣ рд╕рдорд╕реНрдпрд╛ рд╕рдВрднрд╡рддрдГ # 45814 рдкрд░ рдирд┐рд░реНрднрд░ рдХрд░рддреА рд╣реИред

рдХреНрдпрд╛ рд╡рд┐рд╢реЗрд╖рдЬреНрдЮрддрд╛ рдореЗрдВ рдореМрдЬреВрдж рдирд╣реАрдВ рд╣реИрдВ рдбрд┐рдлрд╝реЙрд▓реНрдЯ рдкрд░ рд╡рд┐рд╢реЗрд╖рддрд╛ рд╕реАрдорд╛ рдХрд╛ рд╕рдорд░реНрдерди рдХрд░рдиреЗ рдХреА рдХреЛрдИ рдпреЛрдЬрдирд╛ рд╣реИ?

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

#![feature(specialization)]
trait Handler<M> {
    fn handle(&self, m:M);
}

struct Inner;
impl Handler<f64> for Inner {
    fn handle(&self, m : f64) {
        println!("inner got an f64={}", m);
    }
}

struct Struct<T>(T);
impl<T:Handler<M>, M:std::fmt::Debug> Handler<M> for Struct<T> {
    default fn handle(&self, m : M) {
        println!("got something else: {:?}", m);
        self.0.handle(m)
    }
}
impl<T> Handler<String> for Struct<T> {
    fn handle(&self, m : String) {
        println!("got a string={}", m);
    }
}
impl<T> Handler<u32> for Struct<T> {
    fn handle(&self, m : u32) {
        println!("got a u32={}", m);
    }
}

fn main() {
    let s = Struct(Inner);
    s.handle("hello".to_string());
    s.handle(5.0 as f64);
    s.handle(5 as u32);
}

рдЗрд╕рдХреЗ рдЕрд▓рд╛рд╡рд╛, рдКрдкрд░ рдХреЗ рдЙрджрд╛рд╣рд░рдг рдореЗрдВ, рдХреБрдЫ рдЕрдЬреАрдм рдЬреЛ рдореИрдВрдиреЗ рдЕрдиреБрднрд╡ рдХрд┐рдпрд╛ рд╣реИ - рдбрд┐рдлрд╝реЙрд▓реНрдЯ рд╣реИрдВрдбрд▓рд░ рдЗрдореНрдкреНрд▓рд╛рдВрдЯ (рдФрд░ рд╕реНрд╡рдпрдВ рднреА ред.0 mhandle (m)) рдкрд░ рдмрдВрдзреЗ рд╣реБрдП рдирд┐рд╢рд╛рди рдХреЛ рд╣рдЯрд╛рдиреЗ рдХреЗ рдмрд╛рдж рдХреЛрдб рдмрд┐рдирд╛ рдореБрджреНрджреЛрдВ рдХреЗ рд╕рдВрдХрд▓рди рдХрд░рддрд╛ рд╣реИред рд╣рд╛рд▓рд╛рдБрдХрд┐, рдЬрдм рдЖрдк u32 рдХреЗ рд▓рд┐рдП рдХрд╛рд░реНрдпрд╛рдиреНрд╡рдпрди рд╣рдЯрд╛рддреЗ рд╣реИрдВ, рддреЛ рдпрд╣ рдЕрдиреНрдп рд╡рд┐рд╢реЗрд╖рддрд╛ рдХрдЯреМрддреА рдХреЛ рддреЛрдбрд╝рддрд╛ рд╣реИ:

#![feature(specialization)]
trait Handler<M> {
    fn handle(&self, m:M);
}

struct Struct<T>(T);
impl<T, M:std::fmt::Debug> Handler<M> for Struct<T> {
    default fn handle(&self, m : M) {
        println!("got something else: {:?}", m);
    }
}
impl<T> Handler<String> for Struct<T> {
    fn handle(&self, m : String) {
        println!("got a string={}", m);
    }
}
// impl<T> Handler<u32> for Struct<T> {
//     fn handle(&self, m : u32) {
//         println!("got a u32={}", m);
//     }
// }
fn main() {
    let s = Struct(());
    s.handle("hello".to_string());
    s.handle(5.0 as f64);
}

рд╣рд╛рд▓рд╛рдВрдХрд┐ u32 рдХреЗ рд▓рд┐рдП рд╣реИрдВрдбрд▓рд░ рдХреЛ рдХреЙрд▓ рдХрд░рдиреЗ рд╡рд╛рд▓рд╛ рдХреЛрдИ рдХреЛрдб рдирд╣реАрдВ рд╣реИ, рдлрд┐рд░ рднреА рд╡рд╣рд╛рдВ рдирд╣реАрдВ рд╣реЛрдиреЗ рдХреЗ рдХрд╛рд░рдг рдпрд╣ рдХреЛрдб рдХрдВрдкрд╛рдЗрд▓ рди рд╣реЛрдиреЗ рдХрд╛ рдХрд╛рд░рдг рдмрдирддрд╛ рд╣реИред

рд╕рдВрдкрд╛рджрд┐рдд рдХрд░реЗрдВ: рдпрд╣ рджреВрд╕рд░реА рд╕рдорд╕реНрдпрд╛ рдХреЗ рд╕рдорд╛рди рдкреНрд░рддреАрдд рд╣реЛрддрд╛ рд╣реИ ("рд╣рд╛рд▓рд╛рдВрдХрд┐, рдЬрдм рдЖрдк u32 рдХреЗ рд▓рд┐рдП рдХрд╛рд░реНрдпрд╛рдиреНрд╡рдпрди рдХреЛ рд╣рдЯрд╛рддреЗ рд╣реИрдВ, рддреЛ рдпрд╣ рдЕрдиреНрдп рд╡рд┐рд╢реЗрд╖рддрд╛ рдХрдЯреМрддреА рдХреЛ рддреЛрдбрд╝рддрд╛ рд╣реИ") рдХрд┐ рдЧреНрд▓реИрдбреА рдиреЗ рдПрдХ рдкреЛрд╕реНрдЯ рдХрд╛

рдЬрдВрдЧ рдХреЗ рд╕рд╛рде 1.35.0-рд░рд╛рдд (3de010678 2019-04-11), рдирд┐рдореНрдирд▓рд┐рдЦрд┐рдд рдХреЛрдб рдПрдХ рддреНрд░реБрдЯрд┐ рджреЗрддрд╛ рд╣реИ:

#![feature(specialization)]
trait MyTrait<T> {
    fn print(&self, parameter: T);
}

struct Message;

impl<T> MyTrait<T> for Message {
    default fn print(&self, parameter: T) {}
}

impl MyTrait<u8> for Message {
    fn print(&self, parameter: u8) {}
}

fn main() {
    let message = Message;
    message.print(1_u16);
}

рддреНрд░реБрдЯрд┐:

error[E0308]: mismatched types
  --> src/main.rs:20:19
   |
18 |     message.print(1_u16);
   |                   ^^^^^ expected u8, found u16

рд╣рд╛рд▓рд╛рдБрдХрд┐, рдЬрдм рдореИрдВ impl MyTrait<u8> рдмреНрд▓реЙрдХ рдХреЛ рдЫреЛрдбрд╝рддрд╛ рд╣реВрдВ рддреЛ рдХреЛрдб рд╕рдВрдХрд▓рд┐рдд рдФрд░ рдХрд╛рдо рдХрд░рддрд╛ рд╣реИ:

#![feature(specialization)]
trait MyTrait<T> {
    fn print(&self, parameter: T);
}

struct Message;

impl<T> MyTrait<T> for Message {
    default fn print(&self, parameter: T) {}
}

/*
impl MyTrait<u8> for Message {
    fn print(&self, parameter: u8) {}
}
*/

fn main() {
    let message = Message;
    message.print(1_u16);
}

рдХреНрдпрд╛ рдпрд╣ рдбрд┐рдЬрд╛рдЗрди рджреНрд╡рд╛рд░рд╛ рд╣реИ, рдХреНрдпрд╛ рдпрд╣ рдЗрд╕рд▓рд┐рдП рд╣реИ рдХреНрдпреЛрдВрдХрд┐ рдХрд╛рд░реНрдпрд╛рдиреНрд╡рдпрди рдЕрдзреВрд░рд╛ рд╣реИ, рдпрд╛ рдпрд╣ рдПрдХ рдмрдЧ рд╣реИ?

рдЗрд╕рдХреЗ рдЕрд▓рд╛рд╡рд╛, рдореИрдВ рдпрд╣ рдЬрд╛рдирдирд╛ рдЪрд╛рд╣реВрдВрдЧрд╛ рдХрд┐ рдХреНрдпрд╛ рдпрд╣ рд╡рд┐рд╢реЗрд╖рдЬреНрдЮрддрд╛ рдХреЗ рд▓рд┐рдП рдЙрдкрдпреЛрдЧ рдорд╛рдорд▓рд╛ (рдПрдХрд▓ рдХрдВрдХреНрд░реАрдЯ рдкреНрд░рдХрд╛рд░ рдХреЗ рд▓рд┐рдП рдЕрддрд┐рд╡реНрдпрд╛рдкреА рдкреНрд░рдХрд╛рд░ рдХреЗ рдорд╛рдкрджрдВрдбреЛрдВ рдХреЗ рд╕рд╛рде рд▓рдХреНрд╖рдг рд▓рд╛рдЧреВ рдХрд░рдирд╛) рдЕрддрд┐рд╡реНрдпрд╛рдкреА рдкреНрд░рдХрд╛рд░ рдХреЗ рд▓рд┐рдП рдПрдХ рд╣реА рд╡рд┐рд╢реЗрд╖рддрд╛ рдХреЛ рд▓рд╛рдЧреВ рдХрд░рдиреЗ рдХрд╛ рд╡рд┐рд░реЛрдз рдХрд┐рдпрд╛ рдЬрд╛рдПрдЧрд╛ред RFC 1210 рдореЗрдВ "рдкреВрд░реНрд╡рд╡рд░реНрддреА рдирд┐рдпрдореЛрдВ рдХреЛ рдкрд░рд┐рднрд╛рд╖рд┐рдд рдХрд░рдирд╛" рдЕрдиреБрднрд╛рдЧ рдкрдврд╝рдирд╛, рдореБрдЭреЗ рд▓рдЧрддрд╛ рд╣реИ рдХрд┐ рдЗрд╕рдХрд╛ рд╕рдорд░реНрдерди рдХрд┐рдпрд╛ рдЬрд╛рдПрдЧрд╛, рд▓реЗрдХрд┐рди RFC рдРрд╕реЗ рдЙрджрд╛рд╣рд░рдг рдирд╣реАрдВ рджреЗрддрд╛ рд╣реИ рдФрд░ рдореБрдЭреЗ рдирд╣реАрдВ рдкрддрд╛ рдХрд┐ рд╣рдо рдЕрднреА рднреА рдЗрд╕ RFC рдХрд╛ рд╕рдЦреНрддреА рд╕реЗ рдкрд╛рд▓рди рдХрд░ рд░рд╣реЗ рд╣реИрдВред

рдПрдХ рдЕрдЬреАрдм рд░рд┐рдкреЛрд░реНрдЯ рдХрд░реЗрдВ:

trait MyTrait {}
impl<E: std::error::Error> MyTrait for E {}

struct Foo {}
impl MyTrait for Foo {}  // OK

// But this one is conflicting with error message:
//
//   "... note: upstream crates may add new impl of trait `std::error::Error` for type
//    std::boxed::Box<(dyn std::error::Error + 'static)>` in future versions"
//
// impl MyTrait for Box<dyn std::error::Error> {}

рдЗрд╕ рдорд╛рдорд▓реЗ рдореЗрдВ Box<dyn std::error::Error> рдЕрдЬреАрдмреЛрдЧрд░реАрдм ("рд╡рд┐рд╢реЗрд╖" рд╢рдмреНрдж рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдиреЗ рд╕реЗ рдмрдЪреЗрдВ) рдХреНрдпреЛрдВ рд╣реИ? рдпрд╣рд╛рдВ рддрдХ тАЛтАЛрдХрд┐ рдЕрдЧрд░ рдпрд╣ рднрд╡рд┐рд╖реНрдп рдореЗрдВ std::error::Error рдХрд╛ рдЕрдиреБрдорд╛рди рд▓рдЧрд╛рддрд╛ рд╣реИ, рддреЛ рднреА impl MyTrait for Box<dyn std::error::Error> рдЕрднреА рднреА impl<E: std::error::Error> MyTrait for E рдПрдХ рд╡реИрдз рд╡рд┐рд╢реЗрд╖рдЬреНрдЮрддрд╛ рд╣реИ, рдирд╣реАрдВ?

рдЕрднреА рднреА рдПрдХ рдорд╛рдиреНрдп рд╡рд┐рд╢реЗрд╖рдЬреНрдЮрддрд╛ рд╣реИ

рдЖрдкрдХреЗ рдорд╛рдорд▓реЗ рдореЗрдВ impl<E: std::error::Error> MyTrait for E рд╡рд┐рд╢реЗрд╖ рдирд╣реАрдВ рдХрд┐рдпрд╛ рдЬрд╛ рд╕рдХрддрд╛, рдХреНрдпреЛрдВрдХрд┐ рдЗрд╕рдореЗрдВ рдХреЛрдИ default рд╡рд┐рдзрд┐рдпрд╛рдБ рдирд╣реАрдВ рд╣реИрдВред

@ bjorn3 рдРрд╕рд╛ рд▓рдЧ рд░рд╣рд╛ рд╣реИ рдХрд┐ рдпрд╣ рдХрд╛рдо рдХрд░рдирд╛ рдЪрд╛рд╣рд┐рдП, рд▓реЗрдХрд┐рди рдЕрдЧрд░ рдЖрдк рдбрдореА рд╡рд┐рдзрд┐рдпреЛрдВ рдореЗрдВ рдЬреЛрдбрд╝рддреЗ рд╣реИрдВ рддреЛ рднреА рдРрд╕рд╛ рдирд╣реАрдВ рд╣реИ

рдЯреЛрдХрд░рд╛ рдореЗрдВ bar

pub trait Bar {}
impl<B: Bar> Bar for Box<B> {}

рдЯреЛрдХрд░рд╛ рдореЗрдВ foo

#![feature(specialization)]

use bar::*;

trait Trait {
    fn func(&self) {}
}

impl<E: Bar> Trait for E {
    default fn func(&self) {}
}

struct Foo;
impl Trait for Foo {}  // OK

impl Trait for Box<dyn Bar> {} // Error error[E0119]: conflicting implementations of trait

рдзреНрдпрд╛рди рджреЗрдВ рдХрд┐ рдпрджрд┐ рдЖрдк рдЯреЛрдХрд░рд╛ bar рдмрджрд▓рддреЗ рд╣реИрдВ

pub trait Bar {}
impl<B: ?Sized + Bar> Bar for Box<B> {}

рдлрд┐рд░ foo рд╕рдВрдХрд▓рди рдХрд░реЗрдВред

@ bjorn3 рдРрд╕рд╛ рд▓рдЧрддрд╛ рд╣реИ рдХрд┐ рд╣рдореЗрдВ рдЗрд╕реЗ ( рдЦреЗрд▓ рдХреЗ рдореИрджрд╛рди ) рд╡рд┐рд╢реЗрд╖реАрдХреГрдд рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП default рд╡рд┐рдзрд┐ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рдирд╣реАрдВ рд╣реИред

@ рдХреГрд╖реНрдгрдирд╛рд╕реА I рдЖрдкрдХреЗ рдЙрджрд╛рд╣рд░рдг ( рдЦреЗрд▓ рдХреЗ рдореИрджрд╛рди ) рдореЗрдВ "рдкрд░рд╕реНрдкрд░ рд╡рд┐рд░реЛрдзреА рдХрд╛рд░реНрдпрд╛рдиреНрд╡рдпрди" рддреНрд░реБрдЯрд┐ рдХреЛ рдкреБрди: рдЙрддреНрдкрдиреНрди рдирд╣реАрдВ рдХрд░ рд╕рдХрддрд╛ рд╣реИред

рдЕрдкрдбреЗрдЯ: рдУрд╣, рдореИрдВ рджреЗрдЦ рд░рд╣рд╛ рд╣реВрдВред рд▓рдХреНрд╖рдг Bar рдЙрджрд╛рд╣рд░рдг рдХреЗ рд▓рд┐рдП рдХрд╛рдо рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдПрдХ рдЕрдкрд╕реНрдЯреНрд░реАрдо рдЯреЛрдХрд░рд╛ рд╕реЗ рд╣реЛрдирд╛ рдЪрд╛рд╣рд┐рдПред

@updogliu рдЖрдкрдХрд╛ рдЙрджрд╛рд╣рд░рдг рд╡рд┐рд╢реЗрд╖рдЬреНрдЮрддрд╛ рдирд╣реАрдВ рджрд┐рдЦрд╛рддрд╛ рд╣реИ рдХреНрдпреЛрдВрдХрд┐ Foo Error рд▓рд╛рдЧреВ рдирд╣реАрдВ рд╣реЛрддрд╛ рд╣реИред

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

#![feature(specialization)]
use std::fmt::Debug;

trait Print {
    fn print(self);
}

default impl<T> Print for [T; 1] where T: Debug {
    fn print(self) {
        println!("{:?}", self);
    }
}

impl<T> Print for [T; 1] where T: Debug + Clone {
    fn print(self) {
        println!("{:?}", self.clone());
    }
}

fn main() {
    let x = [0u8];
    x.print();
}

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

рдореЛрдЯреЗ-рджрд╛рдиреЗ рд╡рд╛рд▓реЗ default impl рдмреНрд▓реЙрдХ рд╣рдореЗрд╢рд╛ рдореЗрд░реЗ рд▓рд┐рдП рдмрд╣реБрдд рд╣реА рдЕрдЬреАрдм рдХрд╛рдо рдХрд░рддреЗ рд░рд╣реЗ рд╣реИрдВ, рдореИрдВ рдЗрд╕рдХреЗ рдмрдЬрд╛рдп default fn рдмрдврд╝рд┐рдпрд╛ рдЕрдирд╛рдЬ рдХреЗ рд╕рд┐рдВрдЯреИрдХреНрд╕ рдХреА рдХреЛрд╢рд┐рд╢ рдХрд░рдирд╛ рдЪрд╛рд╣реВрдБрдЧрд╛ред

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

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

@ HadrienG2 рдореИрдВрдиреЗ рд╡рд╛рд╕реНрддрд╡ рдореЗрдВ рдЗрд╕ рдкрд░рд┐рдпреЛрдЬрдирд╛ рдореЗрдВ рд╣рдореЗрд╢рд╛ default fn рдХрд┐рдпрд╛ рд╣реИ рд▓реЗрдХрд┐рди рдЗрд╕ рдмрд╛рд░ рдореИрдВ default рдХреАрд╡рд░реНрдб рднреВрд▓ рдЧрдпрд╛ рдФрд░ рд╕рдВрдХрд▓рдХ рдиреЗ рдЗрд╕реЗ impl рдЬреЛрдбрд╝рдиреЗ рдХрд╛ рд╕реБрдЭрд╛рд╡ рджрд┐рдпрд╛ред рдкрд╣рд▓реЗ рд╕реНрдЯреИрдХ рдкреБрдирд░рд╛рд╡реГрддреНрддрд┐ рдореБрджреНрджрд╛ рдирд╣реАрдВ рджреЗрдЦрд╛ рдерд╛ рдФрд░ рдЕрдЧрд░ рдпрд╣ рдЗрд╕ рд╕реНрддрд░ рдкрд░ рдЙрдореНрдореАрдж рдереА рдпрдХреАрди рдирд╣реАрдВ рдерд╛ред рд╕реБрдЭрд╛рд╡ рдХреЗ рд▓рд┐рдП рдзрдиреНрдпрд╡рд╛рдж, default fn рдареАрдХ рдХрд╛рдо рдХрд░рддрд╛ рд╣реИред

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

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

// This compiles correctly today:
#![feature(specialization)] 
use std::marker::PhantomData;
struct Foo<T>(PhantomData<T>);
impl<T> Foo<T> {
    default const fn foo() -> Self { Self(PhantomData) }
    // ^^should't default here error?
}
// ----
// Adding this fails:
impl<T: Copy> Foo<T> {
    const fn foo() -> Self { Self(PhantomData) }
}

рдореВрд▓ RFC рд╡рд┐рдзрд┐ рдХреЛ рдПрдХ рд╡рд┐рд╢реЗрд╖рддрд╛ рдореЗрдВ рдЙрдард╛рдиреЗ рдХрд╛ рдкреНрд░рд╕реНрддрд╛рд╡ рдХрд░рддрд╛ рд╣реИ, рдЬреЛ рдХрд┐ рдкреНрд░рдХрд╛рд░ рдХреЗ рд▓рд┐рдП рдХрд╛рд░реНрдпрд╛рдиреНрд╡рд┐рдд рдХрд░рддрд╛ рд╣реИ, рдФрд░ рдЗрдореНрдкреНрд▓рд┐рдЯ рдХрд░рддрд╛ рд╣реИред рдореБрдЭреЗ рд▓рдЧрддрд╛ рд╣реИ рдХрд┐ рдХрд╛рд╕реНрдЯ рдПрдлрдПрди рддрд░реАрдХреЛрдВ рдХреЗ рд▓рд┐рдП, рдкреНрд░рдХрд╛рд░ рдХреЗ рд▓рд┐рдП рдирд┐рд╢рд╛рди рдХреЗ рдЙрди рд▓реЛрдЧреЛрдВ рдХреЛ рдХреЙрдиреНрд╕реНрдЯ рдЗрдореНрдкреНрд▓рд╛рдВрдЯ рд╣реЛрдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реЛрдЧреАред

рдЗрд╕ рд╕реНрдерд┐рддрд┐ рдореЗрдВ рдЖрдиреЗ рд╡рд╛рд▓реЗ рд╕рднреА рд▓реЛрдЧреЛрдВ рдХреЗ рд▓рд┐рдП рдФрд░ рдЗрд╕ рд╕реНрдерд┐рддрд┐ рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рдЬрд╛рдирдиреЗ рдХреЗ рд▓рд┐рдП рдЙрддреНрд╕реБрдХ рдереЗ - 2018 рдореЗрдВ рдХреБрдЫ рдорд╣рддреНрд╡рдкреВрд░реНрдг рд╡реИрдЪрд╛рд░рд┐рдХ рдкреНрд░рдЧрддрд┐ рд╣реБрдИ:
http://smallcultfollowing.com/babysteps/blog/2018/02/09/maximally-minimal-specialization-always-applicable-impls/
http://aturon.github.io/tech/2018/04/05/sound-specialization/

рдЕрднреА рд╣рд╛рд▓ рд╣реА рдореЗрдВ, рдкрд┐рдЫрд▓реЗ рдорд╣реАрдиреЗ @nikomatsakis рдиреЗ рд▓рд┐рдЦрд╛ рд╣реИ (рдПрдХ рдЙрджрд╛рд╣рд░рдг рдХреЗ рд░реВрдк рдореЗрдВ, рдПрдХ рдФрд░ рд╕рдВрджрд░реНрдн рдореЗрдВ; рдмреЛрд▓реНрдб рдорд╛рдЗрди):

рдПрдХ рдорд╣рддреНрд╡рдкреВрд░реНрдг рдореБрджреНрджрд╛ рдерд╛ [рд╡рд┐рд╢реЗрд╖рдЬреНрдЮрддрд╛ рдореЗрдВ] рдЬрд┐рд╕реЗ рдХрднреА рд╕рдВрддреЛрд╖рдЬрдирдХ рдврдВрдЧ рд╕реЗ рд╣рд▓ рдирд╣реАрдВ рдХрд┐рдпрд╛ рдЧрдпрд╛ рдерд╛, рдЬреАрд╡рдирдХрд╛рд▓ рдФрд░ рд▓рдХреНрд╖рдгреЛрдВ рдХреЗ рдЪрд╛рд░реЛрдВ рдУрд░ рдПрдХ рддрдХрдиреАрдХреА рдзреНрд╡рдирд┐ рдЪрд┐рдВрддрд╛ [...] рдлрд┐рд░, [рдКрдкрд░ рдЬреЛ рджреЛ рдкреЛрд╕реНрдЯ рдЬреБрдбрд╝реЗ рд╣реБрдП рд╣реИрдВ]ред рдРрд╕рд╛ рд▓рдЧрддрд╛ рд╣реИ рдХрд┐ рдЗрди рд╡рд┐рдЪрд╛рд░реЛрдВ рдиреЗ рдореВрд▓ рд░реВрдк рд╕реЗ рд╕рдорд╕реНрдпрд╛ рдХреЛ рд╣рд▓ рдХрд░ рджрд┐рдпрд╛ рд╣реИ , рд▓реЗрдХрд┐рди рд╣рдо рдЗрд╕ рдмреАрдЪ рд╡реНрдпрд╕реНрдд рд╣реИрдВ рдФрд░ рдЙрдирдХреЗ рдкрд╛рд╕ рдкрд╛рд▓рди рдХрд░рдиреЗ рдХрд╛ рд╕рдордп рдирд╣реАрдВ рд╣реИред

рдЙрдореНрдореАрдж рд╣реИ рдХрд┐ рд╣рд╛рд▓рд╛рдВрдХрд┐ рд╕реНрдкрд╖реНрдЯ рд░реВрдк рд╕реЗ рдЕрднреА рднреА рдХрд╛рдо рдХрд░рдирд╛ рд╣реИред

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

рд╕рднреА рдХреЛ рдирдорд╕реНрдХрд╛рд░! рдХреНрдпрд╛ рдХреЛрдИ рдореБрдЭреЗ рдмрддрд╛ рд╕рдХрддрд╛ рд╣реИ рдХрд┐ рдпрд╣ рдЙрдкрдпреЛрдЧ рдорд╛рдорд▓рд╛ рдХрд╛рдо рдХреНрдпреЛрдВ рдирд╣реАрдВ рдХрд░рддрд╛ рд╣реИ? рдХреАрдбрд╝реЗ рдпрд╛ рдЕрдкреЗрдХреНрд╖рд┐рдд рд╡реНрдпрд╡рд╣рд╛рд░?

рдЗрд╕ рдЙрджрд╛рд╣рд░рдг рдХреЗ рд░реВрдк рдореЗрдВред impl A for i32 рдареАрдХ рд╣реИ, рд▓реЗрдХрд┐рди impl A for () рдХреЛ 1.39.0-рд░рд╛рдд рдореЗрдВ рд╕рдВрдХрд▓рд┐рдд рдирд╣реАрдВ рдХрд┐рдпрд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИред

#![feature(specialization)]

trait A {
    fn a();
}

default impl <T: ToString> A for T {
    fn a() {}
}

impl A for i32 {
    fn a() {}
}

impl A for () {
    fn a() {}
}

рд╕рдВрдХрд▓рд┐рдд рд╕рдВрджреЗрд╢:

error[E0119]: conflicting implementations of trait `A` for type `()`:
  --> src/lib.rs:16:1
   |
8  | default impl <T: ToString> A for T {
   | ---------------------------------- first implementation here
...
16 | impl A for () {
   | ^^^^^^^^^^^^^ conflicting implementation for `()`
   |
   = note: upstream crates may add new impl of trait `std::fmt::Display` for type `()` in future versions

@Hexilee рдиреЗ рдирд┐рд╣рд┐рддрд╛рд░реНрде рдХреЗ рддрд░реАрдХреЛрдВ рдкрд░ default рд▓рдЧрд╛рдПрдВред

@ рдХреГрд╖реНрдгрд╕реНрдирд╛рдирд╕реА рдЙрджрд╛рд╣рд░рдг реи

@zserik рд╣рд╛рдБ, рдореБрдЭреЗ рдкрддрд╛ рд╣реИред рдореБрдЭреЗ рдирд╣реАрдВ рд▓рдЧрддрд╛ рдХрд┐ рдЗрд╕реЗ рдЕрднреА рддрдХ рд▓рд╛рдЧреВ рдХрд┐рдпрд╛ рдЧрдпрд╛ рд╣реИ, рдпрд╛ рдЗрд╕реЗ рд╣рдЯрд╛ рджрд┐рдпрд╛ рдЧрдпрд╛ рд╣реИред рдХрд┐рд╕реА рднреА рдорд╛рдорд▓реЗ рдореЗрдВ рдпрд╣ рдЕрдм рдХрд╛рдо рдирд╣реАрдВ рдХрд░рддрд╛ рд╣реИред

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

рдореИрдВ рдпрд╣рд╛рдБ рдпрд╣ рдкреВрдЫ рд░рд╣рд╛ рд╣реВрдБ, рдХреНрдпреЛрдВрдХрд┐ рдореИрдВрдиреЗ рдЗрд╕ рд╡рд┐рд╖рдп рдкрд░ рдХрд╣реАрдВ рдФрд░ рдзреНрдпрд╛рди рдирд╣реАрдВ рджрд┐рдпрд╛ рд╣реИ - рдХреНрдпрд╛ рдХреЛрдИ default рд╡рд┐рднрд┐рдиреНрди рдорд╛рдирдХ рдкреБрд╕реНрддрдХрд╛рд▓рдп рдХрд╛рд░реНрдпреЛрдВ рдХреЛ рд▓рд╛рдЧреВ рдХрд░рдиреЗ рдХреА рдХреЛрдИ рдпреЛрдЬрдирд╛ рд╣реИ, рдЗрд╕реА рддрд░рд╣ рд╕реЗ рд╣рдордиреЗ const рдХреИрд╕реЗ рдХрд┐рдпрд╛ рд╣реИ From рдФрд░ Into рдХрд╛рд░реНрдпрд╛рдиреНрд╡рдпрди ( impl<T, U: From<T>> Into<U> for T рдФрд░ impl<T> From<T> for T ) рдХреЗ рд▓рд┐рдП рд╡реНрдпрд╛рдкрдХ рд╕рд╛рдорд╛рдиреНрдп From рд▓рд┐рдЦрдирд╛ рдореБрд╢реНрдХрд┐рд▓ рд╣реИ Into core рд╕реЗ рдбрд╛рдЙрдирд╕реНрдЯреНрд░реАрдо рдХрд╛рд░реНрдпрд╛рдиреНрд╡рдпрди, рдФрд░ рдпрд╣ рдЕрдЪреНрдЫрд╛ рд╣реЛрдЧрд╛ рдпрджрд┐ рдореИрдВ рдЕрдкрдиреЗ рд╕реНрд╡рдпрдВ рдХреЗ рдмрдХреНрд╕реЗ рдореЗрдВ рдЙрди рд░реВрдкрд╛рдВрддрд░рдгреЛрдВ рдХреЛ рдУрд╡рд░рд░рд╛рдЗрдб рдХрд░ рд╕рдХрддрд╛ рд╣реВрдВред

рдЕрдЧрд░ рд╣рдо From / Into рд▓рд┐рдП рд╡рд┐рд╢реЗрд╖рдЬреНрдЮрддрд╛ рдХреА рдЕрдиреБрдорддрд┐ рджреЗрддреЗ рд╣реИрдВ, рддреЛ рднреА рдпрд╣ рдЬрд╛рд▓реА рд╕рдорд╕реНрдпрд╛ рдХреЗ рдХрд╛рд░рдг рд╕рд╛рдорд╛рдиреНрдп рдЕрдиреБрдорд╛рдиреЛрдВ рдореЗрдВ рдорджрдж рдирд╣реАрдВ рдХрд░реЗрдЧрд╛ред

@ рдХреГрд╖реНрдгрдирд╛рд╕реА рдореБрдЭреЗ рд╡рд┐рд╢реНрд╡рд╛рд╕ рдирд╣реАрдВ рд╣реИ рдХрд┐ рдорд╛рдорд▓рд╛ рд╣реИред рдЙрджрд╛рд╣рд░рдг рдХреЗ рд▓рд┐рдП, рдпрд╣ рдХреЛрдб рдХрд╛рдо рдХрд░рдирд╛ рдЪрд╛рд╣рд┐рдП рдЕрдЧрд░ From рдФрд░ Into рд╡рд┐рд╢реЗрд╖ рд╣реЛ, рд▓реЗрдХрд┐рди рдРрд╕рд╛ рдирд╣реАрдВ рд╣реИ рдХрд┐ рд╡реЗ рдЗрд╕ рдкреНрд░рдХрд╛рд░ рд╣реИрдВ:

impl<M: Into<[S; 2]>, S> From<M> for GLVec2<S> {
    fn from(to_array: M) -> GLVec2<S> {
        unimplemented!()
    }
}
impl<M, S> Into<M> for GLVec2<S>
where
    [S; 2]: Into<M>,
{
    fn into(self) -> M {
        unimplemented!()
    }
}

pub struct GLVec2<S> {
    pub x: S,
    pub y: S,
}

рдпрджрд┐ рдЖрдк From рдФрд░ Into рдХреЛ рдПрдХ рдХрд╕реНрдЯрдо рд╡рд┐рд╢реЗрд╖рддрд╛ рдореЗрдВ рд░реВрдкрд╛рдВрддрд░рд┐рдд рдХрд░рддреЗ рд╣реИрдВ, рдЬрд┐рд╕рдореЗрдВ рд╡реЗ рд╕рд╛рдорд╛рдиреНрдп рдХрд╛рд░реНрдпрд╛рдиреНрд╡рдпрди рдирд╣реАрдВ рд╣реИрдВ: https://play.rust-lang.org/?version=stable&mode=dugugeded= 2018 рдФрд░ рд╕рд╛рд░ = cc126b016ff62643946aebc6bab88c98

@ рдареАрдХ рд╣реИ, рдпрджрд┐ рдЖрдк рдбрд┐рдлрд╝реЙрд▓реНрдЯ

https://play.rust-lang.org/?version=nightly&mode=debug&edition=2018&gist=e5b9da0eeca05d063e2605135a0b5ead

рдореИрдВ рджреЛрд╣рд░рд╛рдКрдВрдЧрд╛, рдорд╛рдирдХ рд▓рд╛рдЗрдмреНрд░реЗрд░реА рдореЗрдВ рдбрд┐рдлрд╝реЙрд▓реНрдЯ рд░реВрдк рд╕реЗ рдирд┐рд╣рд┐рдд рд╣реЛрдиреЗ рдХреЗ рд▓рд┐рдП Into From/Into рдирд┐рд╣рд┐рддрд╛рд░реНрде Into рд╕рдВрднрд╡ рдХреЗ рд▓рд┐рдП рд╕рд╛рдорд╛рдиреНрдп рдкреНрд░рддреНрдпрд╛рд░реЛрдкрдг рдирд╣реАрдВ рдХрд░реЗрдЧрд╛ред (рдФрд░ рдпрд╣ From рд╕рд╛рдорд╛рдиреНрдп рдкреНрд░рднрд╛рд╡ рдХреЛ рдкреНрд░рднрд╛рд╡рд┐рдд рдирд╣реАрдВ рдХрд░рддрд╛ рд╣реИ)

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

рдпрд╣ рдкреИрдЯрд░реНрди рд╕рд░рд▓ рд╣реИ - рд╣рдо WithLabel рдпрд╛ WithID рдЬреИрд╕реА рд╕рдВрд░рдЪрдирд╛рдУрдВ рдХреЛ рдкрд░рд┐рднрд╛рд╖рд┐рдд рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ рдЬреЛ рдЕрдВрддрд░реНрдирд┐рд╣рд┐рдд рд╕рдВрд░рдЪрдирд╛рдУрдВ рдореЗрдВ рдХреБрдЫ рдлрд╝реАрд▓реНрдб рдФрд░ рд╡рд┐рдзрд┐рдпрд╛рдБ рдЬреЛрдбрд╝рддреЗ рд╣реИрдВ, рдЗрд╕рд▓рд┐рдП рдпрджрд┐ рд╣рдо WithLabel<WithID<MyType>> рдмрдирд╛рддреЗ рд╣реИрдВ рддреЛ рд╣рдо рд╕рдХреНрд╖рдо рд╣реЛрдВрдЧреЗ id , label рдФрд░ MyType рд╕рднреА рдлрд╝реАрд▓реНрдб / рддрд░реАрдХреЗ рдкреНрд░рд╛рдкреНрдд рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдПред рджреБрд░реНрднрд╛рдЧреНрдп рд╕реЗ, рд╡рд░реНрддрдорд╛рди рдХрд╛рд░реНрдпрд╛рдиреНрд╡рдпрди рдХреЗ рд╕рд╛рде, рдпрд╣ рд╕рдВрднрд╡ рдирд╣реАрдВ рд╣реИред

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

#![feature(specialization)]

use std::ops::Deref;
use std::ops::DerefMut;

// =================
// === WithLabel ===
// =================

struct WithLabel<T>(String, T);

pub trait HasLabel {
    fn label(&self) -> &String;
}

impl<T> HasLabel for WithLabel<T> {
    fn label(&self) -> &String { 
        &self.0
    }
}

// THIS SHOULD COMPILE, BUT GETS REJECTED
// impl<T> HasLabel for T
// where T: Deref, <Self as Deref>::Target : HasLabel {
//     default fn label(&self) -> &String { 
//         self.deref().label() 
//     }
// }

impl<T> Deref for WithLabel<T> {
    type Target = T;
    fn deref(&self) -> &Self::Target {
        &self.1
    }
}

// ==============
// === WithID ===
// ==============

struct WithID<T>(i32, T);

pub trait HasID {
    fn id(&self) -> &i32;
}

impl<T> HasID for WithID<T> {
    fn id(&self) -> &i32 { 
        &self.0
    }
}

// THIS SHOULD COMPILE, BUT GETS REJECTED
// impl<T> HasID for T
// where T: Deref, <Self as Deref>::Target : HasID {
//     default fn id(&self) -> &i32 { 
//         self.deref().id() 
//     }
// }

impl<T> Deref for WithID<T> {
    type Target = T;
    fn deref(&self) -> &Self::Target {
        &self.1
    }
}

// =============
// === Usage ===
// =============

struct A(i32);

type X = WithLabel<WithID<A>>;

fn test<T: HasID + HasLabel> (t: T) {
    println!("{:?}", t.label());
    println!("{:?}", t.id());
}

fn main() {
    let v1 = WithLabel("label1".to_string(), WithID(0, A(1)));
    // test(v1); // THIS IS EXAMPLE USE CASE WHICH DOES NOT COMPILE
}

test(v1) рд▓рд╛рдЗрди рдХрд╛рд░реНрдп рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП, рд╣рдореЗрдВ рдореИрдиреНрдпреБрдЕрд▓ рд░реВрдк рд╕реЗ рдирд┐рд╣рд┐рдд рдЗрд╕ рддрд░рд╣ рдХреЗ рд▓рдХреНрд╖рдгреЛрдВ рдХреЛ рдЬреЛрдбрд╝рдирд╛ рд╣реЛрдЧрд╛:

impl<T: HasID> HasID for WithLabel<T> {
    fn id(&self) -> &i32 { 
        self.deref().id()
    }
}

рдмреЗрд╢рдХ, рдЗрд╕реЗ рдкреВрд░рд╛ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП, рд╣рдореЗрдВ рдЗрд╕ рд╡рд┐рд╢реЗрд╖рддрд╛ рдХреЛ рдмрдирд╛рдиреЗ рдХреА рднреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реЛрдЧреА:

impl<T: HasLabel> HasLabel for WithID<T> {
    fn label(&self) -> &String { 
        self.deref().label()
    }
}

рдФрд░ рдпрд╣ рдмрд╣реБрдд рд╣реА рдмреБрд░рд╛ рд╣реИ ред рдХреЗрд╡рд▓ 2 рдкреНрд░рдХрд╛рд░реЛрдВ рдХреЗ рд▓рд┐рдП рдпрд╣ рд╕рд░рд▓ рд╣реИред рд╣рд╛рд▓рд╛рдВрдХрд┐, рдХрд▓реНрдкрдирд╛ рдХрд░реЗрдВ рдХрд┐ рд╣рдореЗрдВ 10 рдЕрд▓рдЧ-рдЕрд▓рдЧ рдЕрдкрд╛рд░рджрд░реНрд╢реА-рдкреНрд░рдХрд╛рд░ рдХреА рдкрд░рд┐рднрд╛рд╖рд╛рдПрдВ рдорд┐рд▓реА рд╣реИрдВ, рдЬреЛ рдЕрд▓рдЧ-рдЕрд▓рдЧ рдХреНрд╖реЗрддреНрд░реЛрдВ рдХреЛ рдЬреЛрдбрд╝рддреА рд╣реИрдВ, рдЬреИрд╕реЗ WithID , WithLabel , WithCallback , ... рдЖрдк рдЗрд╕реЗ рдирд╛рдо рджреЗрддреЗ рд╣реИрдВред рд╡рд┐рд╢реЗрд╖рдЬреНрдЮрддрд╛ рдХреЗ рд╡рд░реНрддрдорд╛рди рд╡реНрдпрд╡рд╣рд╛рд░ рдХреЗ рд╕рд╛рде, рд╣рдореЗрдВ рдкрд░рд┐рднрд╛рд╖рд┐рдд рдХрд░рдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реЛрдЧреА ... 1000 рд╕реЗ рдЕрдзрд┐рдХ рд╡рд┐рднрд┐рдиреНрди рд╡рд┐рд╢реЗрд╖рддрд╛ рдХрд╛рд░реНрдпрд╛рдиреНрд╡рдпрди! рдпрджрд┐ рдЯрд┐рдкреНрдкрдгреА рдХрд┐рдП рдЧрдП рдХреЛрдб рдХреЛ рд╕реНрд╡реАрдХрд╛рд░ рдХрд┐рдпрд╛ рдЬрд╛рдПрдЧрд╛, рддреЛ рд╣рдореЗрдВ рдХреЗрд╡рд▓ 10 рд╡рд┐рд╢реЗрд╖рддрд╛ рдХрд╛рд░реНрдпрд╛рдиреНрд╡рдпрди рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реЛрдЧреА рдФрд░ рдкреНрд░рддреНрдпреЗрдХ рдирдП рдкреНрд░рдХрд╛рд░ рдХреЛ рд▓рд╛рдЧреВ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдХреЗрд╡рд▓ рдПрдХ рдЕрддрд┐рд░рд┐рдХреНрдд рдХрд╛рд░реНрдпрд╛рдиреНрд╡рдпрди рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реЛрдЧреА ред

рдореБрдЭреЗ рдпрдХреАрди рдирд╣реАрдВ рд╣реИ рдХрд┐ рдЖрдкрдХрд╛ рдХреЛрдб рд╡рд┐рд╢реЗрд╖рдЬреНрдЮрддрд╛ рд╕реЗ рдХреИрд╕реЗ рд╕рдВрдмрдВрдзрд┐рдд рд╣реИред рдЖрдкрдХрд╛ рддрд░реНрдХ (рдЖрдкрдХрд╛ рдкреНрд░рд╛рд░рдВрднрд┐рдХ рдХреЛрдб рд╕рдВрдХрд▓рд┐рдд рдХрд░рддрд╛ рд╣реИ рд▓реЗрдХрд┐рди рдЯрд┐рдкреНрдкрдгреА рдХреА рдЧрдИ test(v1); рд▓рд╛рдЗрди рдЖрдкрдХреЗ рджреНрд╡рд╛рд░рд╛ рджрд┐рдП рдЧрдП рдореИрдиреБрдЕрд▓ рдХреЗ рдмрд┐рдирд╛ рд╕рдВрдХрд▓рди рдирд╣реАрдВ рдХрд░рддреА рд╣реИ) рдЕрднреА рднреА рд▓рд╛рдЧреВ рд╣реЛрддреА рд╣реИ рдпрджрд┐ рдкрд╣рд▓реЗ #![feature(specialization)] рд▓рд╛рдЗрди рдХреЛ рд╣рдЯрд╛ рджрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИред

@qnighy рдХреЛрдб HasLabel for T рдФрд░ HasID for T - рдХреА рдЧрдбрд╝рдмрдбрд╝реА рдХреЗ рдмрд╛рдж рд╕рдВрдХрд▓рд┐рдд рдХрд░рдирд╛ рдЪрд╛рд╣рд┐рдП - рд╡реЗ рд╡рд┐рд╢реЗрд╖рдЬреНрдЮрддрд╛ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░ рд░рд╣реЗ рд╣реИрдВред рд╡рд░реНрддрдорд╛рди рдореЗрдВ, рдЙрдиреНрд╣реЗрдВ рдЕрд╕реНрд╡реАрдХрд╛рд░ рдХрд░ рджрд┐рдпрд╛ рдЧрдпрд╛ рд╣реИ (рдореЗрд░реЗ рджреНрд╡рд╛рд░рд╛ рдкреНрд░рджрд╛рди рдХрд┐рдП рдЧрдП рдХреЛрдб рдореЗрдВ рдЙрдиреНрд╣реЗрдВ рдЕрдирд╕реБрдирд╛ рдХрд░рдиреЗ рдХрд╛ рдкреНрд░рдпрд╛рд╕ рдХрд░реЗрдВ!)ред рдХреНрдпрд╛ рдпрд╣ рдЕрдм рдЖрдкрдХреЗ рд▓рд┐рдП рд╕рдордЭ рдореЗрдВ рдЖрддрд╛ рд╣реИ? ЁЯЩВ

рдЖрдЗрдП рддреАрди рдЙрджрд╛рд╣рд░рдгреЛрдВ рдкрд░ рд╡рд┐рдЪрд╛рд░ рдХрд░реЗрдВ WithLabel<WithID<A>> , WithID<WithLabel<A>> рдФрд░ WithLabel<WithLabel<A>> ред рдлрд┐рд░

  • рдкрд╣рд▓рд╛ рдирд┐рд╣рд┐рддрд╛рд░реНрде WithLabel<WithID<A>> рдФрд░ WithLabel<WithLabel<A>> ред
  • рджреВрд╕рд░рд╛ рдирд┐рд╣рд┐рддрд╛рд░реНрде WithID<WithLabel<A>> рдФрд░ WithLabel<WithLabel<A>> ред

рдЗрд╕рд▓рд┐рдП рдкреНрд░рддреНрдпрд╛рд░реЛрдкрдг рдХреА рдЬреЛрдбрд╝реА рдЖрд░рдПрдлрд╕реА рд╕реЗ рдирд┐рдореНрдирд▓рд┐рдЦрд┐рдд рдЦрдВрдб

рд╡рд┐рд╢реЗрд╖рдЬреНрдЮрддрд╛ рд╕реБрдирд┐рд╢реНрдЪрд┐рдд рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рд╕реБрд╕рдВрдЧрдд рд╣реИ, рд╣рдо рд╕реБрдирд┐рд╢реНрдЪрд┐рдд рдХрд░реЗрдВрдЧреЗ рдХрд┐ рдХрд┐рд╕реА рднреА рджреЛ рдХреЗ рд▓рд┐рдП I рдФрд░ J рдХрд┐ рдУрд╡рд░рд▓реИрдк рд╣реЛ, рд╣рдорд╛рд░реЗ рдкрд╛рд╕ I < J рдпрд╛ J < I ред рдпрд╣реА рд╣реИ, рдПрдХ рджреВрд╕рд░реЗ рд╕реЗ рд╡рд╛рд╕реНрддрд╡ рдореЗрдВ рдЕрдзрд┐рдХ рд╡рд┐рд╢рд┐рд╖реНрдЯ рд╣реЛрдирд╛ рдЪрд╛рд╣рд┐рдПред

рдФрд░ рдпрд╣ рдЖрдкрдХреЗ рдорд╛рдорд▓реЗ рдореЗрдВ рднреА рдПрдХ рд╡рд╛рд╕реНрддрд╡рд┐рдХ рд╕рдорд╕реНрдпрд╛ рд╣реИ рдХреНрдпреЛрдВрдХрд┐ HasLabel WithLabel<WithLabel<A>> рдХрд╛ рдирд┐рд╣рд┐рддрд╛рд░реНрде рджреЛ рддрд░реАрдХреЛрдВ рд╕реЗ рд╡реНрдпрд╛рдЦреНрдпрд╛ рдХрд┐рдпрд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИред

рд╣рдо рдЗрд╕ рдорд╛рдорд▓реЗ рдХреЛ рдХреИрд╕реЗ рдХрд╡рд░ рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ рдпрд╣ рдЖрд░рдПрдлрд╕реА рдореЗрдВ рдкрд╣рд▓реЗ рд╕реЗ рд╣реА

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

@qnighy , рдЗрд╕рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рд╕реЛрдЪрдиреЗ рдХреЗ рд▓рд┐рдП рдзрдиреНрдпрд╡рд╛рджред

рдФрд░ рдпрд╣ рдЖрдкрдХреЗ рдорд╛рдорд▓реЗ рдореЗрдВ рдПрдХ рд╡рд╛рд╕реНрддрд╡рд┐рдХ рд╕рдорд╕реНрдпрд╛ рднреА рд╣реИ рдХреНрдпреЛрдВрдХрд┐ WithLabel<WithLabel<A>> рдХреЗ рд╣рд╕рд▓рд╛рдмреЗрд▓ рдХреА рд╡реНрдпрд╛рдЦреНрдпрд╛ рджреЛ рддрд░реАрдХреЛрдВ рд╕реЗ рдХреА рдЬрд╛ рд╕рдХрддреА рд╣реИред

рдпрд╣ рд╕рдЪ рд╣реИ рдХрд┐ рдЕрдЧрд░ рд╣рдо рдкрд░ рд╡рд┐рдЪрд╛рд░ рдирд╣реАрдВ рдХрд░рддреЗ impl<T> HasLabel for WithLabel<T> рдХреА рддреБрд▓рдирд╛ рдореЗрдВ рдЕрдзрд┐рдХ рд╡рд┐рд╢реЗрд╖ рд░реВрдк impl<T> HasLabel for T рдХреЗ рдЗрдирдкреБрдЯ рдХреЗ рд▓рд┐рдП WithLabel<WithLabel<A>> ред рдЖрдкрдХреЗ рджреНрд╡рд╛рд░рд╛ рдЪрд┐рдкрдХрд╛рдП рдЧрдП рдЖрд░рдПрдлрд╕реА рдХрд╛ рд╣рд┐рд╕реНрд╕рд╛ рд╡рд╛рд╕реНрддрд╡ рдореЗрдВ рдХрд╡рд░ рдХрд░рддрд╛ рд╣реИ, рд╣рд╛рд▓рд╛рдВрдХрд┐, рдореЗрд░рд╛ рдорд╛рдирдирд╛ тАЛтАЛрд╣реИ рдХрд┐ рдпрд╣ рдПрдХ рдЧрдВрднреАрд░ рд╕реАрдорд╛ рд╣реИ рдФрд░ рдореИрдВ рдЗрд╕ рдПрдХреНрд╕рдЯреЗрдВрд╢рди рдХреЗ рдкрд╣рд▓реЗ рд░рд┐рд▓реАрдЬ рдореЗрдВ рдЗрд╕ рдЙрдкрдпреЛрдЧ рдХреЗ рдорд╛рдорд▓реЗ рдореЗрдВ рдлрд┐рд░ рд╕реЗ рд╕рдорд░реНрдерди рдХреЗ рд▓рд┐рдП рд╡рд┐рдЪрд╛рд░ рдХрд░реВрдВрдЧрд╛ред

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

рдЕрдЪреНрдЫреА рдмрд╛рдд рдпрд╣ рд╣реИ рдХрд┐ рд╡рд╛рд╕реНрддрд╡ рдореЗрдВ рд╕рдм рдХреБрдЫ рдЕрдм (рд╡рд┐рд╢реЗрд╖рдЬреНрдЮрддрд╛ рд╕рд╣рд┐рдд) рд╕рдВрдХрд▓рди рдХрд░рддрд╛ рд╣реИ рд▓реЗрдХрд┐рди test(v1) рдЙрдкрдпреЛрдЧ рдирд╣реАрдВ:

#![feature(specialization)]
#![feature(optin_builtin_traits)]

use std::ops::Deref;
use std::ops::DerefMut;

// =================
// === WithLabel ===
// =================

struct WithLabel<T>(String, T);

auto trait IsNotWithLabel {}
impl<T> !IsNotWithLabel for WithLabel<T> {}

pub trait HasLabel {
    fn label(&self) -> &String;
}

impl<T> HasLabel for WithLabel<T> {
    fn label(&self) -> &String { 
        &self.0
    }
}

impl<T> HasLabel for T
where T: Deref + IsNotWithLabel, <Self as Deref>::Target : HasLabel {
    default fn label(&self) -> &String { 
        self.deref().label() 
    }
}

impl<T> Deref for WithLabel<T> {
    type Target = T;
    fn deref(&self) -> &Self::Target {
        &self.1
    }
}

// ==============
// === WithID ===
// ==============

struct WithID<T>(i32, T);

pub trait HasID {
    fn id(&self) -> &i32;
}

impl<T> HasID for WithID<T> {
    fn id(&self) -> &i32 { 
        &self.0
    }
}

auto trait IsNotWithID {}
impl<T> !IsNotWithID for WithID<T> {}

impl<T> HasID for T
where T: Deref + IsNotWithID, <Self as Deref>::Target : HasID {
    default fn id(&self) -> &i32 { 
        self.deref().id() 
    }
}

impl<T> Deref for WithID<T> {
    type Target = T;
    fn deref(&self) -> &Self::Target {
        &self.1
    }
}

// =============
// === Usage ===
// =============

struct A(i32);

type X = WithLabel<WithID<A>>;

fn test<T: HasID + HasLabel> (t: T) {
    println!("{:?}", t.label());
    println!("{:?}", t.id());
}

fn main() {
    let v1 = WithLabel("label1".to_string(), WithID(0, A(1)));
    test(v1);
}

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

https://play.rust-lang.org/?version=nightly&mode=debug&edition=2018&gist=b66ee0021db73efaaa5d46edfb4f3990

@qnighy рдореИрдВрдиреЗ рдЗрд╕ рдмрдЧ рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рдПрдХ рдЕрд▓рдЧ рдореБрджреНрджрд╛ рдмрдирд╛рдпрд╛ рд╣реИ: https://github.com/rust-lang/rust/issues/66041

рдареАрдХ рд╣реИ, рдореИрдВрдиреЗ рдЕрднреА рдкрддрд╛ рд▓рдЧрд╛рдпрд╛ рд╣реИ рдХрд┐ auto traits рдХрд╛ рд╕рдорд╛рдзрд╛рди рдпрд╣рд╛рдВ рдХрднреА рдирд╣реАрдВ рд╣реЛрдЧрд╛, рдЬреИрд╕рд╛ рдХрд┐ (https://doc.rust-lang.org/nightly/unstable-book/language-features/optin-builtin-traits рдХреЗ рдЕрдиреБрд╕рд╛рд░ред html) рд╡реЗ рдПрдХ рд╕рдВрд░рдЪрдирд╛ рдореЗрдВ рд╕рднреА рдХреНрд╖реЗрддреНрд░реЛрдВ рдХрд╛ рдкреНрд░рдЪрд╛рд░ рдХрд░рддреЗ рд╣реИрдВ:

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

рд╕рдВрдкрд╛рджрд┐рдд рдХрд░реЗрдВ
@qnighy рдХрд┐рд╕реА рддрд░рд╣ рдореИрдВрдиреЗ рдЕрдирджреЗрдЦреА рдХреА рдХрд┐ рдЖрдкрдиреЗ рдЦреЗрд▓ рдХреЗ рдореИрджрд╛рди рдХреЗ рд▓рд┐рдП рдПрдХ рд▓рд┐рдВрдХ рдкреНрд░рджрд╛рди рдХрд┐рдпрд╛ рд╣реИред Much рдЗрд╕рдХреЗ рд▓рд┐рдП рдмрд╣реБрдд рдмрд╣реБрдд рдзрдиреНрдпрд╡рд╛рджред рдпрд╣ рдХрд╛рдо рдХрд░рддрд╛ рд╣реИ рдФрд░ рдореИрдВ рдЗрд╕ рдмрд╛рдд рд╕реЗ рдЪрдХрд┐рдд рд╣реВрдВ рдХрд┐ рдпрд╣ рд╕рдорд╛рдзрд╛рди рдХрд┐рддрдирд╛ рдЖрд╕рд╛рди рд╣реИред рдХрдорд╛рд▓ рд╣реИ рдХрд┐ рд╣рдо рд╡рд░реНрддрдорд╛рди рдореЗрдВ рд╡реНрдпрдХреНрдд рдХрд░рдиреЗ рдореЗрдВ рд╕рдХреНрд╖рдо рд╣реИрдВ рдФрд░ рдореБрдЭреЗ рдЙрдореНрдореАрдж рд╣реИ рдХрд┐ рднрд╡рд┐рд╖реНрдп рдореЗрдВ рдпрд╣ рд╕рдВрднрд╛рд╡рдирд╛ рдЧрд╛рдпрдм рдирд╣реАрдВ рд╣реЛрдЧреА!

рдРрд╕реА рд╕реНрдерд┐рддрд┐ рдореЗрдВ, overlapping marker traits рд╣реА рдПрдХрдорд╛рддреНрд░ рд╣реИрдХ рд╣реИ рдЬрд┐рд╕реЗ рд╣рдо рдЕрдм рдЙрдкрдпреЛрдЧ рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ, рд▓реЗрдХрд┐рди рдореБрдЭреЗ рд▓рдЧрддрд╛ рд╣реИ рдХрд┐ рднрд╡рд┐рд╖реНрдп рдореЗрдВ рдХрд┐рд╕реА рдкреНрд░рдХрд╛рд░ рдХреЗ рдЖрд╕рд╛рди рд╕рдорд╛рдзрд╛рди рдХреЛ рдЕрдиреБрдорддрд┐ рджреЗрдиреЗ рдХреЗ рд▓рд┐рдП рдЕрдЪреНрдЫрд╛ рд╣реЛрдЧрд╛ рдХрд┐ рдЕрдкрд╛рд░рджрд░реНрд╢реА рдкреНрд░рдХрд╛рд░реЛрдВ рдХреЛ рд╡реНрдпрдХреНрдд рдХрд░реЗрдВ (рдЬреИрд╕рд╛ рдХрд┐ рдореЗрд░реА рдкрд┐рдЫрд▓реА рдкреЛрд╕реНрдЯ рдореЗрдВ рд╡рд░реНрдгрд┐рдд рд╣реИ: https : //github.com/rust-lang/rust/issues/31844#issuecomment-549023367)ред

рдПрдХ рдмрд╣реБрдд рд╣реА рд╕рд░рд▓ рдЙрджрд╛рд╣рд░рдг ( рдЙрдкрд░реЛрдХреНрдд рдЙрджрд╛рд╣рд░рдг рдХрд╛ рд╕рд░рд▓реАрдХрд░рдг) рдЬреЛ рд╡рд┐рдлрд▓ рд░рд╣рддрд╛ рд╣реИ:

trait Trait<T> {}
impl<T> Trait<T> for T {}
impl<T> Trait<()> for T {}

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

рдЗрд╕рдХреЗ рдмрд┐рдирд╛, рд╡рд░реНрддрдорд╛рди рдХрд╛рд░реНрдпрд╛рдиреНрд╡рдпрди рдореЗрд░реЗ рдЙрджреНрджреЗрд╢реНрдпреЛрдВ рдХреЗ рд▓рд┐рдП рдмреЗрдХрд╛рд░ рд╣реИред рдпрджрд┐ рдЙрдкрд░реЛрдХреНрдд рдЕрдиреБрдорддрд┐ рджреА рдЧрдИ рдереА, рддреЛ рдореЗрд░рд╛ рдорд╛рдирдирд╛ тАЛтАЛрд╣реИ рдХрд┐ рд░реИрдкрд░ рдкреНрд░рдХрд╛рд░реЛрдВ рдкрд░ From рд▓рд╛рдЧреВ рдХрд░рдирд╛ рд╕рдВрднрд╡ рд╣реЛрдЧрд╛ (рд╣рд╛рд▓рд╛рдВрдХрд┐ рдореИрдВ Into рдмрд╛рд░реЗ рдореЗрдВ рдЕрдирд┐рд╢реНрдЪрд┐рдд рд╣реВрдВ)ред

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

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

trait Trait {
    fn test(&self) { println!("default implementation"); }
}

impl<T> Trait for T {
    // violates DRY principle
    default fn test(&self) { println!("default implementation"); }
}

рдореИрдВ рдЗрд╕реЗ рдареАрдХ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдирд┐рдореНрдирд▓рд┐рдЦрд┐рдд рд╕рд┐рдВрдЯреИрдХреНрд╕ рдХрд╛ рдкреНрд░рд╕реНрддрд╛рд╡ рдХрд░рддрд╛ рд╣реВрдВ (рдпрджрд┐ рдЗрд╕реЗ рдареАрдХ рдХрд░рдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реИ):

impl<T> Trait for T {
    // delegates to the already existing default implementation
    default fn test(&self);
}

# 68309 рдкрд░ рд╕реНрдерд╛рдирд╛рдВрддрд░рд┐рдд рдХрд┐рдпрд╛ рдЧрдпрд╛

@jazzfool рдХреГрдкрдпрд╛ рдЗрд╕реЗ рдПрдХ рдореБрджреНрджреЗ рдХреЗ рд░реВрдк рдореЗрдВ

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

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

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

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

рдЖрдк рдореИрдХреНрд░реЛ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдХреЗ рдкрд░реАрдХреНрд╖рдг рдХрд░ рд╕рдХрддреЗ рд╣реИрдВред рдореИрдВ рдЕрдкрдиреА рдЬрдВрдЧ рдХреЗ рд╕рд╛рде рдереЛрдбрд╝рд╛ рдХрдареЛрд░ рд╣реВрдБ, рд▓реЗрдХрд┐рди рдЗрди рдкрдВрдХреНрддрд┐рдпреЛрдВ рдХреЗ рд╕рд╛рде рдХреБрдЫ ...

[#cfg(test)]
static mut SPECIALIZATION_TRIGGERED : bool = false;

[#cfg(test)]
macro_rules! specialization_trigger {
    () =>  { SPECIALIZATION_TRIGGERED = true; };
}

[#cfg(not(test))]
macro_rules! specialization_trigger {
    () => {};
}

рдлрд┐рд░ рд╡рд┐рд╢реЗрд╖ рдирд┐рд╣рд┐рдд рдореЗрдВ specialization_trigger!() рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░реЗрдВ, рдФрд░ рдкрд░реАрдХреНрд╖рдгреЛрдВ рдореЗрдВ assert!(SPECIALIZATION_TRIGGERED);

[#cfg(test)]
static mut SPECIALIZATION_TRIGGERED : bool = false;
...

рдЖрдк рдЙрдкрдпреЛрдЧ рдХрд░рдирд╛ рдЪрд╛рд╣рддреЗ рд╣реИрдВ рдЬрд╛рдПрдЧрд╛ thread_local! { static VAR: Cell<bool> = Cell::new(false); } рдХреЗ рдмрдЬрд╛рдп static mut рдХреНрдпреЛрдВрдХрд┐ рдЕрдиреНрдпрдерд╛ рдЪрд░ рдПрдХ рдкрд░реАрдХреНрд╖рдг рдорд╛рдорд▓реЗ рдзрд╛рдЧрд╛ рдореЗрдВ рд╕реЗрдЯ рд╣реЛ рд╕рдХрддрд╛ рд╣реИ рдФрд░ рдЧрд▓рддреА рд╕реЗ рдХрд┐рд╕реА рджреВрд╕рд░реЗ рдзрд╛рдЧреЗ рд╕реЗ рдкрдврд╝реЗрдВред рдЗрд╕рдХреЗ рдЕрд▓рд╛рд╡рд╛, рдкреНрд░рддреНрдпреЗрдХ рдкрд░реАрдХреНрд╖рдг рдХреА рд╢реБрд░реБрдЖрдд рдореЗрдВ рдЪрд░ рдХреЛ рд░реАрд╕реЗрдЯ рдХрд░рдирд╛ рдпрд╛рдж рд░рдЦреЗрдВ, рдЕрдиреНрдпрдерд╛ рдЖрдкрдХреЛ рдкрд┐рдЫрд▓реЗ рдкрд░реАрдХреНрд╖рдг рд╕реЗ true рдорд┐рд▓реЗрдЧрд╛ред

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

рдкреБрди: рдЙрдкрдпреЛрдЧ рдЕрдиреБрднрд╛рдЧ рдореЗрдВ , рдпрд╣ рдЙрджрд╛рд╣рд░рдг рджрд┐рдпрд╛ рдЧрдпрд╛ рд╣реИ:

trait Add<Rhs=Self> {
    type Output;
    fn add(self, rhs: Rhs) -> Self::Output;
    fn add_assign(&mut self, rhs: Rhs);
}

// the `default` qualifier here means (1) not all items are implied
// and (2) those that are can be further specialized
default impl<T: Clone, Rhs> Add<Rhs> for T {
    fn add_assign(&mut self, rhs: Rhs) {
        let tmp = self.clone() + rhs;
        *self = tmp;
    }
}

рдореБрдЭреЗ рдЖрд╢реНрдЪрд░реНрдп рд╣реИ рдХрд┐ рдпрд╣ рдХреИрд╕реЗ рдЯрд╛рдЗрдк-рдЪреЗрдХ рдХрд░рдирд╛ рдЪрд╛рд╣рд┐рдП, рдпрд╣ рджреЗрдЦрддреЗ рд╣реБрдП рдХрд┐ tmp рдХрд╛ рдЯрд╛рдЗрдк Self::Output рдФрд░ рдЗрд╕ рд╕рдВрдмрджреНрдз рдкреНрд░рдХрд╛рд░ рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рдХреБрдЫ рднреА рдЬреНрдЮрд╛рдд рдирд╣реАрдВ рд╣реИред RFC рдЯреЗрдХреНрд╕реНрдЯ рдпрд╣ рдирд╣реАрдВ рд╕рдордЭрд╛рддрд╛ рд╣реИ рдХрд┐ рдХрдо рд╕реЗ рдХрдо рдХрд╣реАрдВ рднреА рдРрд╕рд╛ рдирд╣реАрдВ рд╣реИ рдЬрд╣рд╛рдБ рдЙрджрд╛рд╣рд░рдг рджрд┐рдпрд╛ рдЧрдпрд╛ рд╣реЛред

рдХреНрдпрд╛ рдпрд╣рд╛рдБ рдХреБрдЫ рддрдВрддреНрд░ рд╣реИ рдЬреЛ рдЙрд╕ рдХрд╛рд░реНрдп рдХреЛ рдХрд░рдиреЗ рд╡рд╛рд▓рд╛ рдерд╛ / рд╣реИ?

рдХреНрдпрд╛ рд╡рд╣ рдбрд┐рдлрд╝реЙрд▓реНрдЯ where T: Add<Output = T> рд╡рд┐рд╡рд╢ рд╣реЛ рд╕рдХрддрд╛ рд╣реИ? рдпрд╛ рдХрд┐ рдПрдХ рдХрд░рдгреАрдп рд▓реВрдк рд╣реИ?

@ рд░рд╛рд▓реНрдлрдЬрдВрдЧ рдореИрдВ рдорд╛рдирддрд╛ рд╣реВрдВ рдХрд┐ рдЧрд▓рдд рд▓рдЧрддрд╛ рд╣реИред

рдореЗрд░реЗ рдкрд╛рд╕ рдкреНрд░рдХреНрд░рд┐рдпрд╛ рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рдПрдХ рд╕рд╡рд╛рд▓ рд╣реИ: рдпрд╣ рдореБрджреНрджрд╛ рдХрд┐рддрдирд╛ рд╕рд╛рд░реНрдердХ рд╣реИ рдФрд░ рд▓реЛрдЧреЛрдВ рдХреЗ рд▓рд┐рдП рдЗрд╕ рд╕реБрд╡рд┐рдзрд╛ рдХреЛ рдЖрдЬрд╝рдорд╛рдирд╛ рдХрд┐рддрдирд╛ рд╕рд╛рд░реНрдердХ рд╣реИ? рдЬреИрд╕рд╛ рдХрд┐ рдореИрдВ рд╕рдордЭрддрд╛ рд╣реВрдВ рдХрд┐ рд╡рд░реНрддрдорд╛рди рдХрд╛рд░реНрдпрд╛рдиреНрд╡рдпрди рдирд┐рд░рд╛рдзрд╛рд░ рдФрд░ рдЕрдкреВрд░реНрдг рд╣реИ рдФрд░ рд╕рдВрднрд╡рддрдГ рдкреВрд░реА рддрд░рд╣ рд╕реЗ рдЪрд╛рдХ рдпрд╛ рдХреБрдЫ рдФрд░ рджреНрд╡рд╛рд░рд╛ рдкреНрд░рддрд┐рд╕реНрдерд╛рдкрд┐рдд рдХрд┐рдпрд╛ рдЬрд╛рдПрдЧрд╛ред рдЕрдЧрд░ рдпрд╣ рд╕рдЪ рд╣реИ, рддреЛ рдХреНрдпрд╛ рд╣рдореЗрдВ рдЗрд╕ рд╕реБрд╡рд┐рдзрд╛ рдФрд░ рдЕрдиреНрдп (рдЬреИрд╕реЗ рдЬреАрдПрдЯреА) рдХреЛ рддрдм рддрдХ рд▓рд╛рдЧреВ рдХрд░рдирд╛ рдЪрд╛рд╣рд┐рдП рдЬрдм рддрдХ рдХрд┐ рд╡реЗ рдареАрдХ рд╕реЗ рдлрд┐рд░ рд╕реЗ рддреИрдпрд╛рд░ рдирд╣реАрдВ рд╣реЛ рд╕рдХрддреЗ?

рдХреГрдкрдпрд╛ рд▓рд╛рдЧреВ рди рдХрд░реЗрдВред рдЯреВрдЯрд╛ рд╣реБрдЖ, рдирд┐рд░рд╛рдзрд╛рд░ рдФрд░ рдЕрдкреВрд░реНрдг рдЕрднреА рднреА рдкреНрд░рдпреЛрдЧ рдХреА рдЕрдиреБрдорддрд┐ рджреЗрддрд╛ рд╣реИред

рдЕрдЧрд░ рдпрд╣ рд╕рдЪ рд╣реИ, рддреЛ рдХреНрдпрд╛ рд╣рдореЗрдВ рдЗрд╕ рд╕реБрд╡рд┐рдзрд╛ рдФрд░ рдЕрдиреНрдп (рдЬреИрд╕реЗ рдЬреАрдПрдЯреА) рдХреЛ рддрдм рддрдХ рд▓рд╛рдЧреВ рдХрд░рдирд╛ рдЪрд╛рд╣рд┐рдП рдЬрдм рддрдХ рдХрд┐ рд╡реЗ рдареАрдХ рд╕реЗ рдлрд┐рд░ рд╕реЗ рддреИрдпрд╛рд░ рдирд╣реАрдВ рд╣реЛ рд╕рдХрддреЗ?

рдХреГрдкрдпрд╛ рди рдХрд░реЗрдВ, PyO3 (рдкрд╛рдпрдерди рдмрд╛рдЗрдВрдбрд┐рдВрдЧ рд▓рд╛рдЗрдмреНрд░реЗрд░реА) рд╡рд░реНрддрдорд╛рди рдореЗрдВ рд╡рд┐рд╢реЗрд╖рдЬреНрдЮрддрд╛ рдкрд░ рдирд┐рд░реНрднрд░ рдХрд░рддрд╛ рд╣реИред Https://github.com/PyO3/pyo3/issues/210 рджреЗрдЦреЗрдВ

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

@ рд▓реНрдпреВрдХреНрд░рд┐рдПрд▓ рд╣рд╛рдБ, рдХрдИ рдЙрдкрдпреЛрдЧреА рдЕрдиреБрдХреВрд▓рди (рд╡рд┐рд╢реЗрд╖ рд░реВрдк рд╕реЗ

рдЙрджрд╛рд╣рд░рдг рдХреЗ рд▓рд┐рдП, FusedIterator рдФрд░ TrustedLen рд╡рд┐рд╢реЗрд╖рдЬреНрдЮрддрд╛ рдХреЗ рдмрд┐рдирд╛ рдмреЗрдХрд╛рд░ рд╣реИрдВред

PyO3 (рдкрд╛рдпрдерди рдмрд╛рдЗрдВрдбрд┐рдВрдЧ рд▓рд╛рдЗрдмреНрд░реЗрд░реА) рд╡рд░реНрддрдорд╛рди рдореЗрдВ рд╡рд┐рд╢реЗрд╖рдЬреНрдЮрддрд╛ рдкрд░ рдирд┐рд░реНрднрд░ рдХрд░рддрд╛ рд╣реИ

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

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

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

рдЗрди рджрд┐рдиреЛрдВ рд╡реЗ min_specialization (рдЙрджрд╛рд╣рд░рдг рдХреЗ рд▓рд┐рдП https://github.com/rust-lang/rust/pull/71321 рджреЗрдЦреЗрдВ) рдкрд░ рдирд┐рд░реНрднрд░ рдХрд░рддреЗ рд╣реИрдВ, рдЬрд┐рд╕рдореЗрдВ рд╕рдмрд╕реЗ рдмрдбрд╝рд╛ рдзреНрд╡рдирд┐ рдЫреЗрдж рд╣реИред

@nikomatsakis

рдореИрдВ рдорд╛рдирддрд╛ рд╣реВрдВ рдХрд┐ рдЧрд▓рдд рд▓рдЧрддрд╛ рд╣реИред

рдХрд┐рд╕реА рднреА рд╡рд┐рдЪрд╛рд░ рдХрд╛ рдЗрд░рд╛рджрд╛ рдХреЛрдб рдХреНрдпрд╛ рд╣реИ? рдореИрдВрдиреЗ рдкрд╣рд▓реЗ рд╕реЛрдЪрд╛ рдерд╛ рдХрд┐ default impl рдХрд╛ рдЙрджреНрджреЗрд╢реНрдп рднреА type Output = Self; рд╕реЗрдЯ рдХрд░рдирд╛ рдерд╛, рд▓реЗрдХрд┐рди рдпрд╣ рд╡рд╛рд╕реНрддрд╡ рдореЗрдВ рдкреНрд░рд╕реНрддрд╛рд╡рд┐рдд RFC рдореЗрдВ Output = T рдмрд╛рдЙрдВрдб рдХрд░рдирд╛ рдерд╛?

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

рдореИрдВ рдЗрд╕ рдЯреНрд░реИрдХрд┐рдВрдЧ рд╕рдорд╕реНрдпрд╛ рд╕реЗ min_specialization 71321 рдкреАрдЖрд░ рдХреЗ рдмрд╛рд╣рд░ рдЕрд╕реНрдерд┐рд░ рдкреБрд╕реНрддрдХ рдХреЗ рдЕрдиреБрд╕рд╛рд░ рдпрд╣ рдЙрд╕ рд╕реБрд╡рд┐рдзрд╛ рдХреЗ рд▓рд┐рдП рдЯреНрд░реИрдХрд┐рдВрдЧ рдореБрджреНрджрд╛ рд╣реИред

рдореБрдЭреЗ рдЙрд╕ рдлреАрдЪрд░ рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рдЬреНрдпрд╛рджрд╛ рдЬрд╛рдирдХрд╛рд░реА рдирд╣реАрдВ рд╣реИ, рдореИрдВрдиреЗ рд╕рд┐рд░реНрдл рд▓рд┐рдмрд╕реНрдЯрд░реНрдб рд╕рд╛рдЙрдВрдбрдиреЗрд╕ рдлрд┐рдХреНрд╕ рджреЗрдЦреА рд╣реИред рдЗрд╕реЗ https://github.com/rust-lang/rust/pull/68970 рдореЗрдВ рдкреЗрд╢ рдХрд┐рдпрд╛ рдЧрдпрд╛, рдЬреЛ рдЗрд╕рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рдХреБрдЫ рдФрд░ рдмрд╛рддреЗрдВ рдмрддрд╛рддрд╛ рд╣реИред

@matthewjasper рдХреЛ рдпрд╣ рд╕рдордЭ рдореЗрдВ рдЖрддрд╛ рд╣реИ рдХрд┐ рдЗрд╕реЗ рдереЛрдбрд╝рд╛ рдФрд░ рджрд╕реНрддрд╛рд╡реЗрдЬрд╝ рдХрд┐рдпрд╛ рдЬрд╛рдП рдФрд░ рд░рд╛рдд рдХреЗ рдЙрдкрдпреЛрдЧрдХрд░реНрддрд╛рдУрдВ рдХреЛ feature(specialization) рдкреНрд░рд╡рд╛рд╕ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдХрд╣рд╛ рдЬрд╛рдП?

рдРрд╕рд╛ рд▓рдЧрддрд╛ рд╣реИ рдХрд┐ рдХрдо рд╕реЗ рдХрдо рдПрдХ рдЪреЗрддрд╛рд╡рдиреА рд╣реЛрдиреА рдЪрд╛рд╣рд┐рдПред рдРрд╕рд╛ рд▓рдЧрддрд╛ рд╣реИ рдХрд┐ рдпрд╣ рд╕реБрд╡рд┐рдзрд╛ рдЕрдкрдиреА рд╡рд░реНрддрдорд╛рди рд╕реНрдерд┐рддрд┐ рдореЗрдВ рдЙрдкрдпреЛрдЧ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП blatantly рдЯреВрдЯреА рд╣реБрдИ рдФрд░ рдЦрддрд░рдирд╛рдХ рд╣реИред

рдореБрдЭреЗ рд▓рдЧрддрд╛ рд╣реИ рдХрд┐ specialization min_specialization рдкрд░реНрдпрд╛рдп рдмрди рд╕рдХрддрд╛ рд╣реИ, рд▓реЗрдХрд┐рди рдореМрдЬреВрджрд╛ рдкрд░рд┐рдпреЛрдЬрдирд╛рдУрдВ рдХреЗ рд▓рд┐рдП рдЖрд╡рд╢реНрдпрдХ рд╣реЛрдиреЗ рдкрд░, PyO3 рдпрд╛ рдЬреЛ рднреА рд╣реЛ, рдПрдХ рдФрд░ unsound_specialization рд╕реБрд╡рд┐рдзрд╛ рдЬреЛрдбрд╝реЗрдВред рдпрд╣ рдХрд┐рд╕реА рдХреЛ рднреА рдмрдЪрд╛рдПрдЧрд╛ рдЬреЛ рдХреЗрд╡рд▓ min_specialization рдХрд╛рдлреА рдкреНрд░рдпрд╛рд╕ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рддрд╛ рд╣реИ, рд▓реЗрдХрд┐рди рдХрд┐рд╕реА рдФрд░ рдХреЛ рддреНрд░реБрдЯрд┐ рд╕рдВрджреЗрд╢ рдорд┐рд▓рддрд╛ рд╣реИ, рдФрд░ рдпрд╣рд╛рдВ рдирдпрд╛ рдирд╛рдо рджреЗрдЦ рд╕рдХрддреЗ рд╣реИрдВред

@RalfJung

рдХрд┐рд╕реА рднреА рд╡рд┐рдЪрд╛рд░ рдХрд╛ рдЗрд░рд╛рджрд╛ рдХреЛрдб рдХреНрдпрд╛ рд╣реИ?

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

default impl<T: Clone, Rhs> Add<Rhs> for T {
    type Output = T;

    fn add_assign(&mut self, rhs: Rhs) {
        let tmp = self.clone() + rhs;
        *self = tmp;
    }
}

рдЪреЗрддрд╛рд╡рдиреА рдпрд╣ рдереА рдХрд┐ рдпрджрд┐ рдЖрдк impl рдХрд┐рд╕реА рднреА рд╕рджрд╕реНрдп рдХреЛ рдУрд╡рд░рд░рд╛рдЗрдб рдХрд░рддреЗ рд╣реИрдВ, рддреЛ рдЖрдкрдХреЛ рдЙрди рд╕рднреА рдХреЛ рдУрд╡рд░рд░рд╛рдЗрдб рдХрд░рдирд╛ рд╣реЛрдЧрд╛ред рд╣рдордиреЗ рдмрд╛рдж рдореЗрдВ рдЗрд╕ рд╡рд┐рдЪрд╛рд░ рдХрд╛ рд╕рдорд░реНрдерди рдХрд┐рдпрд╛, рдФрд░ рдлрд┐рд░ рд╡рд┐рднрд┐рдиреНрди рдкреБрдирд░рд╛рд╡реГрддреНрддрд┐рдпреЛрдВ рдХреЗ рдЪрд╛рд░реЛрдВ рдУрд░ рд▓рд╛рдд рдорд╛рд░реА, рдЬреИрд╕реЗ рдХрд┐ "рдбрд┐рдлрд╝реЙрд▓реНрдЯ рд╕рдореВрд╣" (рдЬреЛ рдпрд╣рд╛рдВ рднреА рдХрд╛рдо рдХрд░реЗрдЧрд╛), рдФрд░ рдЕрдВрдд рдореЗрдВ рдХрд┐рд╕реА рднреА рд╕рдорд╛рдзрд╛рди рдХреЛ рдирд╣реАрдВ рдЕрдкрдирд╛рдпрд╛ рдХреНрдпреЛрдВрдХрд┐ рд╣рдореЗрдВ рд▓рдЧрд╛ рдХрд┐ рд╣рдо рдмрд╛рдж рдореЗрдВ рдПрдХ рдмрд╛рд░ рд╕реМрджрд╛ рдХрд░ рд▓реЗрддреЗ рд╣реИрдВ рдЕрдиреНрдп, рдПрд░, рджрдмрд╛рдиреЗ рдХреА рд╕рдорд╕реНрдпрд╛рдПрдВ (cc # 71420)ред

рдХреГрдкрдпрд╛ рди рдХрд░реЗрдВ, PyO3 (рдкрд╛рдпрдерди рдмрд╛рдЗрдВрдбрд┐рдВрдЧ рд▓рд╛рдЗрдмреНрд░реЗрд░реА) рд╡рд░реНрддрдорд╛рди рдореЗрдВ рд╡рд┐рд╢реЗрд╖рдЬреНрдЮрддрд╛ рдкрд░ рдирд┐рд░реНрднрд░ рдХрд░рддрд╛ рд╣реИред PyO3 / pyo3 # 210 рджреЗрдЦреЗрдВ

рдпрд╣рд╛рдБ PyO3 рдЕрдиреБрдЪрд░ - рд╣рдо рд╡рд┐рд╢реЗрд╖рдЬреНрдЮрддрд╛ рд╕реЗ рджреВрд░ рдЬрд╛рдиреЗ рдХреЗ рдкрдХреНрд╖ рдореЗрдВ рд╣реИрдВ рддрд╛рдХрд┐ рд╣рдо рд╕реНрдерд┐рд░ рдЬрдВрдЧ рдкрд░ рдкрд╣реБрдБрдЪ рд╕рдХреЗрдВред рдХреНрдпрд╛ рдмрд╛рдХреА рд╡рд┐рд╢реЗрд╖рдЬреНрдЮрддрд╛ рдкреВрд░реА рд╣реЛрдиреЗ рд╕реЗ рдкрд╣рд▓реЗ min_specialization рд╕реНрдерд┐рд░ рд╣реЛрдиреЗ рдХреА рд╕рдВрднрд╛рд╡рдирд╛ рд╣реЛрдЧреА?

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

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

рдореБрдЭреЗ рд▓рдЧрддрд╛ рд╣реИ рдХрд┐ рдпрд╣ рд╕рд╣реА YouTube рд▓рд┐рдВрдХ рд╣реИ: https://youtu.be/uDbs_1LXqus
(рдореЗрд░реЗ рдлреЛрди рдкрд░ рднреА)

рд╣рд╛рдБ, рдпрд╣ рдмрд╛рдд рд╣реИред рдпрд╣рд╛рдБ рд╡рд┐рд╢рд┐рд╖реНрдЯ рдЪрд░реНрдЪрд╛ рдХрд╛ рдПрдХ рд▓рд┐рдВрдХ рджрд┐рдпрд╛ рдЧрдпрд╛ рд╣реИ: https://youtu.be/uDbs_1LXqus?t=2073

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

#![feature(rustc_attrs, min_specialization)]

рддрдм рдпрджрд┐ рдЖрдкрдХреЛ рдПрдХ _specialization predicate_ рд▓рдХреНрд╖рдг рдмрдирд╛рдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реИ рдЬреИрд╕рд╛ рдХрд┐ рдЕрдзрд┐рдХрддрдо рдиреНрдпреВрдирддрдо рд╡рд┐рд╢реЗрд╖рдЬреНрдЮрддрд╛ рдореЗрдВ рд╕рдордЭрд╛рдпрд╛ рдЧрдпрд╛ рд╣реИ рддреЛ рдЖрдк #[rustc_specialization_trait] рд╕рд╛рде рд╡рд┐рд╢реЗрд╖рддрд╛ рдШреЛрд╖рдгрд╛ рдХреЛ рдЪрд┐рд╣реНрдирд┐рдд рдХрд░рддреЗ рд╣реИрдВред

рдЗрд╕ рдлрд╛рдЗрд▓ рдореЗрдВ рдореЗрд░рд╛ рд╕рд╛рд░рд╛ рд╕реНрдкреЗрд╢рд▓рд╛рдЗрдЬреЗрд╢рди рдХрд┐рдпрд╛ рдЧрдпрд╛ рд╣реИ рдФрд░ рдпрд╣рд╛рдБ рдПрдХ рд╡рд┐рд╢реЗрд╖рдЬреНрдЮрддрд╛ рдХреЗ

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

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

https://github.com/LLFourn/secp256kfun/blob/6766b60c02c99ca24f816801fe876fed79643c3a/secp25kkfun/src/op.rs#L196 -L206

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

рдРрд╕рд╛ рд▓рдЧрддрд╛ рд╣реИ рдХрд┐ рдпрд╣ рд╕рдм рдХреБрдЫ рд╕рд░рд▓ рдерд╛ рдпрджрд┐ рдЖрдк рдХреБрдЫ рд╡рд┐рд╢реЗрд╖ рдХрд░рдиреЗ рдпреЛрдЧреНрдп рдереЗ рдФрд░ рдЬрдм рдЖрдк рдХреБрдЫ рдРрд╕рд╛ рдХрд░рддреЗ рд╣реИрдВ рддреЛ рдЖрдк рдареАрдХ-рдареАрдХ рдШреЛрд╖рдгрд╛ рдХрд░рддреЗ рд╣реИрдВ, рдЬреЛ рдЖрдкрдХреЛ рд╡рд┐рд╢реЗрд╖рдЬреНрдЮрддрд╛ рдкреНрд░рджрд╛рди рдХрд░рддреЗ рд╣реИрдВред RFC рдореЗрдВ рдЙрджрд╛рд╣рд░рдг рдкреНрд░рд╕реНрддреБрдд рдХрд░рдирд╛ рдХрд┐ рдореЗрд░реЗ рдорди рдореЗрдВ рдХреНрдпрд╛ рдерд╛:

impl<A, T> Extend<A, T> for Vec<A> where T: IntoIterator<Item=A>
{
    // no need for default
    fn extend(&mut self, iterable: T) {
        ...
    }
}

// We declare explicitly which impl we are specializing repeating all type bounds etc
specialize impl<A, T> Extend<A, T> for Vec<A> where T: IntoIterator<Item=A>
    // And then we declare explicitly how we are making this impl narrower with тАШwhenтАЩ.
    // i.e. This impl is like the first except replace all occurances of тАШTтАЩ with тАШ&'a [A]тАЩ
    when<'a> T = &'a [A]
{
    fn extend(&mut self, iterable: &'a [A]) {
        ...
    }
}

рдкреНрд░рддрд┐рдХреНрд░рд┐рдпрд╛ рдХреЗ рд▓рд┐рдП рдзрдиреНрдпрд╡рд╛рджред

рдпрд╣рд╛рдБ рдореЗрд░реА рдЯрд┐рдкреНрдкрдгреА, рд╡рд┐рд╢реЗрд╖ рд░реВрдк рд╕реЗ рдЖрдЗрдЯрдо рем, рдорд╛рдирдХ рдкреБрд╕реНрддрдХрд╛рд▓рдп рдореЗрдВ рдПрдХ рдареЛрд╕ рдорд╛рдорд▓рд╛ рдкреНрд░рджрд╛рди рдХрд░рддрд╛ рд╣реИ, рдЬрд╣рд╛рдБ рдПрдХ рд╡рд┐рд╢реЗрд╖рдЬреНрдЮрддрд╛ рд╣реЛрдирд╛ рд╡рд╛рдВрдЫрдиреАрдп рд╣реЛ рд╕рдХрддрд╛ рд╣реИ рдЬреЛ рдХреЗрд╡рд▓ рдЖрдВрд╢рд┐рдХ рд░реВрдк рд╕реЗ рдЕрдзрд┐рдХ рдЙрдкрдпреЛрдЧ рдпреЛрдЧреНрдп рд╣реЛ: IndexSet рдПрдХ рдЕрд▓рдЧ Output рдкреНрд░рдХрд╛рд░ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реЛрдЧреА рдХреНрдпреЛрдВрдХрд┐ IndexSet Index рдмрд┐рдирд╛ рд▓рд╛рдЧреВ рдХрд┐рдпрд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИ, рд▓реЗрдХрд┐рди рд╣рдо рд╢рд╛рдпрдж рджреЛрдиреЛрдВ рдкреНрд░рдХрд╛рд░реЛрдВ рдХреЛ рдЕрд▓рдЧ-рдЕрд▓рдЧ Output рдкреНрд░рдХрд╛рд░реЛрдВ рдХреЗ рд╕рд╛рде рд╕рд╣-рдЕрд╕реНрддрд┐рддреНрд╡ рдХреА рдЕрдиреБрдорддрд┐ рдирд╣реАрдВ рджреЗрдирд╛ рдЪрд╛рд╣рддреЗ рд╣реИрдВред рдХреЗ рдмрд╛рдж рд╕реЗ IndexSet рдХреЗ рдорд╛рдорд▓реЗ рдореЗрдВ рдПрдХ рдбрд┐рдлрд╝реЙрд▓реНрдЯ рдХрд╛рд░реНрдпрд╛рдиреНрд╡рдпрди рд╣реЛ рд╕рдХрддрд╛ рдерд╛ IndexMut , рдЗрд╕рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рд╡рд┐рд╢реЗрд╖рдЬреНрдЮрддрд╛ рдЕрдиреБрдорддрд┐ рджреЗрдиреЗ рдХреЗ рд▓рд┐рдП рдЙрдЪрд┐рдд рд╣реЛрдЧрд╛ index_set рдХреА рд╡рд┐рд╢реЗрд╖рдЬреНрдЮрддрд╛ рдХреА рдЕрдиреБрдорддрд┐ рдХреЗ рдмрд┐рдирд╛ рд╡рд┐рдзрд┐ Output ред

рдореЗрд░реЗ рдкрд╛рд╕ рд╡реАрдбрд┐рдпреЛ рдХреЗ рд╕рд╛рде рдПрдХ рдХрдард┐рди рд╕рдордп рд╣реИ, рдЗрд╕рд▓рд┐рдП рдореИрдВ рд▓рд┐рдВрдХ рдХрд┐рдП рдЧрдП рд╡реАрдбрд┐рдпреЛ рдХреЛ рдирд╣реАрдВ рджреЗрдЦ рд╕рдХрддрд╛ рд╣реВрдВ, рд╣рд╛рд▓рд╛рдВрдХрд┐, рдореЗрд░реЗ рдкрд╛рд╕ #[min_specialization] рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рдПрдХ рдкреНрд░рд╢реНрди рд╣реИред рдХреЗ рд░реВрдк рдореЗрдВ-рд╣реИ, рд╡рд╣рд╛рдБ рдПрдХ рд╣реИ rustc_unsafe_specialization_marker рдХреА рддрд░рд╣ рд▓рдХреНрд╖рдг рдкрд░ рд╡рд┐рд╢реЗрд╖рддрд╛ FusedIterator рдХрд┐ рдЕрдиреБрдХреВрд▓рди рд╕рдВрдХреЗрдд рдкреНрд░рджрд╛рди рдХрд░рддреЗ рд╣реИрдВ, рддрд╛рдХрд┐ рд╡реЗ рдкрд░ рд╡рд┐рд╢реЗрд╖ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИред @matthewjasper рдиреЗ рд▓рд┐рдЦрд╛:

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

рдореБрдЭреЗ рд▓рдЧрддрд╛ рд╣реИ рдХрд┐ рдпрд╣ рдпреЛрдЬрдирд╛ @ рдиреНрдпреВрдЯрди рдХреЗ рдкреНрд░рд╕реНрддрд╛рд╡ рдХреЛ рд▓рд╛рдЧреВ рдХрд░рдиреЗ рдФрд░ рдЗрди ( where specialize(T: FusedIterator) ) рдЬреИрд╕реЗ рд▓рдХреНрд╖рдгреЛрдВ рдХреЗ рд▓рд┐рдП рдПрдХ рд╡рд┐рд╢реЗрд╖рдЬреНрдЮрддрд╛ рдореЛрдбрд┐рдЯреА рдЬреЛрдбрд╝рдиреЗ рдХреА рд╣реИред рд▓реЗрдХрд┐рди рд╡рд░реНрддрдорд╛рди рдореЗрдВ, рдРрд╕рд╛ рдкреНрд░рддреАрдд рд╣реЛрддрд╛ рд╣реИ рдХрд┐ рдХреЛрдИ рднреА рдХреЛрдб рдЗрди рд▓рдХреНрд╖рдгреЛрдВ рдкрд░ рд╡рд┐рд╢реЗрд╖рдЬреНрдЮ рдХрд░ рд╕рдХрддрд╛ рд╣реИ ред рдпрджрд┐ рдЗрд╕реЗ рд╕реНрдерд┐рд░ рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИ, рддреЛ рд▓реЛрдЧ рд╕реНрдерд┐рд░ рд╡рд┐рд╢реЗрд╖рдЬреНрдЮрддрд╛рдУрдВ рдХреЛ рд▓рд┐рдЦ рд╕рдХрддреЗ рд╣реИрдВ, рдЬреЛ рдЗрд╕ рдкрд░ рдирд┐рд░реНрднрд░ рдХрд░рддреЗ рд╣реИрдВ, рдЬрд┐рд╕рдХрд╛ рдЕрд░реНрде рд╣реИ рдХрд┐ рдпрд╣ рдирд┐рд░рд╛рдзрд╛рд░рддрд╛ рд╕реНрдерд┐рд░ рд╣реЛрдЧреАред

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

рдпрджрд┐ рдЗрд╕реЗ рд╕реНрдерд┐рд░ рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИ, рддреЛ рд▓реЛрдЧ рд╕реНрдерд┐рд░ рд╡рд┐рд╢реЗрд╖рдЬреНрдЮрддрд╛рдУрдВ рдХреЛ рд▓рд┐рдЦ рд╕рдХрддреЗ рд╣реИрдВ, рдЬреЛ рдЗрд╕ рдкрд░ рдирд┐рд░реНрднрд░ рдХрд░рддреЗ рд╣реИрдВ, рдЬрд┐рд╕рдХрд╛ рдЕрд░реНрде рд╣реИ рдХрд┐ рдпрд╣ рдирд┐рд░рд╛рдзрд╛рд░рддрд╛ рд╕реНрдерд┐рд░ рд╣реЛрдЧреАред

рдпрд╣ рдореЗрд░реА рд╕рдордЭ рд╣реИ рдХрд┐ min_specialization рд░реВрдк рдореЗрдВ-рд╕реНрдерд┐рд░реАрдХрд░рдг рдХреЗ рд▓рд┐рдП рдЗрд░рд╛рджрд╛ рдирд╣реАрдВ рд╣реИред

рдореИрдВ рджреВрд╕рд░реЗ рдХреЗ рдХреБрдЫ рдкреНрд░рдХрд╛рд░ рдХреЗ рдорд╛рд░реНрдХрд░реЛрдВ рдХреЛ рд╡рд┐рд╢реЗрд╖рд╛рдВрдХ рд▓рдЧрд╛рдирд╛ рдЪрд╛рд╣реВрдВрдЧрд╛ред рд╕рд░рд╕рд░рд╛рд╣рдЯ рдореЗрдВ рдХреЛрдб рдХреЗ рдХреБрдЫ рдорд╛рдорд▓реЗ рдФрд░ рдорд╛рдирдХ рдкреБрд╕реНрддрдХрд╛рд▓рдп рдРрд╕рд╛ рдирд╣реАрдВ рдХрд░ рд░рд╣реЗ рд╣реИрдВ рдЬреЛ рдРрд╕рд╛ рджрд┐рдЦрддрд╛ рд╣реИ рдХреНрдпреЛрдВрдХрд┐ рдпрд╣ рдЬрд╛рдирдиреЗ рдХрд╛ рдХреЛрдИ рддрд░реАрдХрд╛ рдирд╣реАрдВ рд╣реИ рдХрд┐ рд╡рд┐рд╢реЗрд╖рдЬреНрдЮрддрд╛ рд╡рд╛рд╕реНрддрд╡ рдореЗрдВ рд╣реЛ рд░рд╣реА рд╣реИ:

Copy рдПрдХ рдЕрдирд╛рд╡рд╢реНрдпрдХ рд╡рд┐рд╢реЗрд╖рдЬреНрдЮрддрд╛:
https://github.com/rust-lang/rust/pull/72707/files#diff -3afa644e1d09503658d661130df65f59L1955

"рд╡рд┐рд╢реЗрд╖рдЬреНрдЮрддрд╛" рдЬреЛ рдирд╣реАрдВ рд╣реИ:
https://github.com/rust-lang/rust/pull/71321/files#diff -da456bd3af6d94a9693e625ff7303113L1589

рдореИрдХреНрд░реЛ рджреНрд╡рд╛рд░рд╛ рддрдм рддрдХ рдХрд╛рд░реНрдпрд╛рдиреНрд╡рд┐рдд рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИ рдЬрдм рддрдХ рдХрд┐ рдХреЛрдИ рдзреНрд╡рдЬ рдбрд┐рдлрд╝реЙрд▓реНрдЯ рдбрд┐рдлрд╝реЙрд▓реНрдЯ рдХреЛ рдкрд╛рд░ рдирд╣реАрдВ рдХрд░ рдЬрд╛рддрд╛ рд╣реИ:
https://github.com

@matthewjasper рдЕрдВрддрд┐рдо рд▓рд┐рдВрдХ рдХрд┐рд╕реА рднреА рд╡рд┐рд╢рд┐рд╖реНрдЯ рд╕реНрдирд┐рдкреЗрдЯ рд╕реЗ рд▓рд┐рдВрдХ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдкреНрд░рдХрдЯ рдирд╣реАрдВ рд╣реЛрддрд╛ рд╣реИред

рдореБрдЭреЗ рдпрдХреАрди рдирд╣реАрдВ рд╣реИ рдХрд┐ рдпрд╣ рдПрдХ рд╕реНрдкрд╖реНрдЯ рд▓рдХреНрд╖реНрдп рд╣реИ, рд▓реЗрдХрд┐рди AIUI рддрдереНрдп рдпрд╣ рд╣реИ рдХрд┐ рд╡рд┐рд╢реЗрд╖рдЬреНрдЮрддрд╛ рдХреЗ рдирд┐рд╢рд╛рди рдЪрд┐рд╣реНрдирд┐рдд рдирд╣реАрдВ рд╣реИрдВ, рдЖрдкрдХреЛ рдХрдВрдмрд▓ рдХреЗ рдирд┐рд╢рд╛рди рдкрд░ рдкрд░рд┐рд╡рд░реНрддрди рд╕реЗ рдмрдЪрдиреЗ рдХрд╛ рдПрдХ рддрд░реАрдХрд╛ рджреЗрддрд╛ рд╣реИред рдПрдХ рдирдпрд╛ default impl<T> Trait for T рдбрд╛рдЙрдирд╕реНрдЯреНрд░реАрдо рдХреЗ рд╕рд╛рде рд╕рдВрдШрд░реНрд╖ рдирд╣реАрдВ рдХрд░рддрд╛ рд╣реИ - рд╡реЗ рд╕рд┐рд░реНрдл рд╡рд┐рд╢реЗрд╖рдЬреНрдЮрддрд╛ рдмрди рдЬрд╛рддреЗ рд╣реИрдВред

рдХреНрдпрд╛ рдЗрд╕реЗ рдХреЗрд╡рд▓ рдЪрд┐рдиреНрд╣рд┐рдд рдХрд░рдирд╛ рдПрдХ рдЪреЗрддрд╛рд╡рдиреА рд╣реЛ рд╕рдХрддреА рд╣реИ?

рд╕рд░рд╕рд░рд╛рд╣рдЯ рдореЗрдВ рдХреЛрдб рдХреЗ рдХреБрдЫ рдорд╛рдорд▓реЗ рдФрд░ рдорд╛рдирдХ рдкреБрд╕реНрддрдХрд╛рд▓рдп рдРрд╕рд╛ рдирд╣реАрдВ рдХрд░ рд░рд╣реЗ рд╣реИрдВ рдЬреЛ рдРрд╕рд╛ рджрд┐рдЦрддрд╛ рд╣реИ рдХреНрдпреЛрдВрдХрд┐ рдпрд╣ рдЬрд╛рдирдиреЗ рдХрд╛ рдХреЛрдИ рддрд░реАрдХрд╛ рдирд╣реАрдВ рд╣реИ рдХрд┐ рд╡рд╛рд╕реНрддрд╡ рдореЗрдВ рд╡рд┐рд╢реЗрд╖рдЬреНрдЮрддрд╛ рдХреНрдпрд╛ рд╣реЛ рд░рд╣реА рд╣реИ

рдЬрд╛рд╡рд╛ рдХреЗ рд╕рд╛рде рдореЗрд░рд╛ рдЕрдиреБрднрд╡ рд╕рдорд╛рди рд╣реИ (рд╣рд╛рд▓рд╛рдВрдХрд┐ рдмрд┐рд▓реНрдХреБрд▓ рдЕрдиреБрд░реВрдк рдирд╣реАрдВ)ред рдпрд╣ рдкрддрд╛ рд▓рдЧрд╛рдирд╛ рдореБрд╢реНрдХрд┐рд▓ рд╣реЛ рд╕рдХрддрд╛ рд╣реИ рдХрд┐ рд╡рд╛рд╕реНрддрд╡ рдореЗрдВ рдХрд┐рд╕ рд╡рд░реНрдЧ рдХрд╛ рдЙрдкрд╡рд░реНрдЧ рдЪрд▓ рд░рд╣рд╛ рд╣реИ ...

рд╣рдо рдХреБрдЫ рд╡рд┐рд╢реЗрд╖ рдорд╛рд░реНрдХрд░реЛрдВ рдкрд░ рдХреБрдЫ рдорд╛рд░реНрдХрд░ рдЪрд╛рд╣рддреЗ рд╣реИрдВ, рд╣рд╛рд▓рд╛рдВрдХрд┐, рдпрд╣ рд╕реНрдкрд╖реНрдЯрддрд╛ рдХреЗ рд▓рд┐рдП рднреА рд╣реИ рдХрд┐ рдХреНрдпрд╛ рд╕рд╣реА рд╣реИ?

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

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

рдореБрдЭреЗ рд▓рдЧрддрд╛ рд╣реИ рдХрд┐ рдмрджрд▓рд╛рд╡ рджрд┐рдЦрд╛рдиреЗ рдХреЗ рд▓рд┐рдП рдпрд╣ рдЕрдВрддрд░ рдмрд╣реБрдд рдмрдбрд╝рд╛ рд╣реЛ рд╕рдХрддрд╛ рд╣реИред рдпрд╣ рдЗрд╕ рдУрд░ рдЗрд╢рд╛рд░рд╛ рдХрд░ рд░рд╣рд╛ рд╣реИ: https://github.com/rust-lang/rust/blob/fb818d4321dee29ec1938c002c1ff79b0e7eaadff/src/librust_span/def_id.rs#L124

рдкреБрди: рдХрдВрдмрд▓ рдирд┐рд╣рд┐рдд рд╣реИ, рд╡реЗ рд╡реИрд╕реЗ рднреА рдкрд░рд┐рд╡рд░реНрддрди рддреЛрдбрд╝ рд░рд╣реЗ рд╣реИрдВ:

  • рд╡реЗ рдЖрдВрд╢рд┐рдХ рд░реВрдк рд╕реЗ рдПрдХ рдбрд╛рдЙрдирд╕реНрдЯреНрд░реАрдо рдкреНрд░рддреНрдпрд╛рд░реЛрдкрдг рдХреЛ рдУрд╡рд░рд▓реИрдк рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ, рдЬрд┐рд╕рдХреА рдЕрдиреБрдорддрд┐ рдирд╣реАрдВ рд╣реИ
  • рд╕реБрд╕рдВрдЧрддрддрд╛ рдЙрдирдХреЗ рдЧреИрд░-рдЕрд╕реНрддрд┐рддреНрд╡ рдХреЛ рдФрд░ рдЕрдзрд┐рдХ рд╕реВрдХреНрд╖реНрдо рддрд░реАрдХреЛрдВ рд╕реЗ рдЧреНрд░рд╣рдг рдХрд░ рд╕рдХрддреА рд╣реИ (рдпрд╣реА рд╡рдЬрд╣ рд╣реИ рдХрд┐ рдкреБрдирд░реНрдЬреАрд╡рди рдкреНрд░рддреНрдпрд╛рд░реЛрдкрдг рдЖрдВрддрд░рд┐рдХ рд░реВрдк рд╕реЗ рдЬреЛрдбрд╝реЗ рдЧрдП рдереЗ)
  • рд╡рд┐рд╢реЗрд╖рдЬреНрдЮрддрд╛ рдХреЗ рдирд┐рд╣рд┐рддрд╛рд░реНрде рд╣рдореЗрд╢рд╛ рд▓рд╛рдЧреВ рд╣реЛрддреЗ рд╣реИрдВ, рдЬрд┐рд╕рдХрд╛ рдЕрд░реНрде рд╣реИ:

    • рд╣рдо рд▓реЛрдЧреЛрдВ рдХреЗ рдкреНрд░рддреНрдпрд╛рд░реЛрдкрдг рдХреЛ рддреЛрдбрд╝рддреЗ рд╣реИрдВ (рдХреНрдпрд╛ min_specialization рдХрд░рддрд╛ рд╣реИ)ред

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

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

@cuviper рд╡рд╛рд╕реНрддрд╡ рдореЗрдВ, рдореБрдЭреЗ рд▓рдЧрддрд╛ рд╣реИ рдХрд┐ рдЕрднреА рднреА рдирдП рдХрдВрдмрд▓ рдЗрдореНрдкреНрд▓рд╛рдВрдЯ рдЬреЛрдбрд╝рдиреЗ рдХреЗ рдЖрд╕рдкрд╛рд╕ рдХреЗ рдХрд┐рдирд╛рд░реЗ рдорд╛рдорд▓реЗ рдереЗ, рдпрд╣рд╛рдВ рддрдХ тАЛтАЛрдХрд┐ рд╡рд┐рд╢реЗрд╖рдЬреНрдЮрддрд╛ рдХреЗ рд╕рд╛рде рднреАред рдореБрдЭреЗ рдпрд╛рдж рд╣реИ рдХрд┐ рдореИрдВ рдпрд╣ рдкрддрд╛ рд▓рдЧрд╛рдиреЗ рдХреА рдХреЛрд╢рд┐рд╢ рдХрд░ рд░рд╣рд╛ рдерд╛ рдХрд┐ рд╣рдореЗрдВ impl<T: Copy> Clone for T { } рдЬреЛрдбрд╝рдиреЗ рдХреА рдЕрдиреБрдорддрд┐ рджреЗрдиреЗ рдХреЗ рд▓рд┐рдП рдпрд╣ рдмреНрд▓реЙрдЧ рдкреЛрд╕реНрдЯ рдореИрдВрдиреЗ рдЗрд╕рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рдХрд┐рд╕реА рднреА рд╕реНрдерд┐рддрд┐ рдореЗрдВ

рднрд▓реЗ рд╣реА, рд╣рдо рдЗрд╕реЗ #[override] рдПрдиреЛрдЯреЗрд╢рди рди рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдПрдХ рд▓рд┐рдВрдЯ рдЪреЗрддрд╛рд╡рдиреА рджреЗ рд╕рдХрддреЗ рд╣реИрдВред

рдЙрд╕ рдиреЗ рдХрд╣рд╛, рдЕрдЧрд░ рд╣рдо рдЙрдкрдпреЛрдЧрдХрд░реНрддрд╛ рдХреЛ рдпрд╣ рдШреЛрд╖рд┐рдд рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ рдХрд┐ рд╡реЗ рдХреМрди рд╕реЗ рд╡рд┐рд╢реЗрд╖рдЬреНрдЮ рд╣реИрдВ (рдХреЛрдИ рд╡рд┐рдЪрд╛рд░ рдирд╣реАрдВ рд╣реИ рдХрд┐ рд╣рдо рдРрд╕рд╛ рдХреИрд╕реЗ рдХрд░реЗрдВрдЧреЗ), рдпрд╣ рдЙрдирдХреА рдЪреАрдЬреЛрдВ рдХреЛ рд╕рд░рд▓ рдХрд░реЗрдЧрд╛ред рдЕрднреА рдХрдВрдкрд╛рдЗрд▓рд░ рдХреЛ рдЗрдореНрдкреНрд▓рд╛рдВрдЯ рдХреЗ рдмреАрдЪ рдХреЗ рд░рд┐рд╢реНрддреЛрдВ рдХреЛ рдХрдо рдХрд░рдирд╛ рд╣реИ рдФрд░ рдпрд╣ рд╣рдореЗрд╢рд╛ рдереЛрдбрд╝рд╛ рдореБрд╢реНрдХрд┐рд▓ рд╣реИред

рдЪрд╛рдХ рдкрд░рд┐рдпреЛрдЬрдирд╛ рдореЗрдВ рд╣рдореЗрдВ рд▓рдВрдмрд┐рдд рд╡рд╕реНрддреБрдУрдВ рдореЗрдВ рд╕реЗ рдПрдХ рдкреНрд░рдпрд╛рд╕ рдХрд░рдирд╛ рд╣реИ рдФрд░ рд╡рд╛рдкрд╕ рдЬрд╛рдирд╛ рд╣реИ рдФрд░ рдпрд╣ рдмрддрд╛рдирд╛ рд╣реИ рдХрд┐ рд╡рд╣рд╛рдВ рд╡рд┐рд╢реЗрд╖рдЬреНрдЮрддрд╛ рдХреИрд╕реЗ рд╡реНрдпрдХреНрдд рдХреА рдЬрд╛рдиреА рдЪрд╛рд╣рд┐рдПред

рд╕рд░рд╕рд░рд╛рд╣рдЯ рдореЗрдВ рдХреЛрдб рдХреЗ рдХреБрдЫ рдорд╛рдорд▓реЗ рдФрд░ рдорд╛рдирдХ рдкреБрд╕реНрддрдХрд╛рд▓рдп рдРрд╕рд╛ рдирд╣реАрдВ рдХрд░ рд░рд╣реЗ рд╣реИрдВ рдЬреЛ рдРрд╕рд╛ рджрд┐рдЦрддрд╛ рд╣реИ рдХреНрдпреЛрдВрдХрд┐ рдпрд╣ рдЬрд╛рдирдиреЗ рдХрд╛ рдХреЛрдИ рддрд░реАрдХрд╛ рдирд╣реАрдВ рд╣реИ рдХрд┐ рд╡рд╛рд╕реНрддрд╡ рдореЗрдВ рд╡рд┐рд╢реЗрд╖рдЬреНрдЮрддрд╛ рдХреНрдпрд╛ рд╣реЛ рд░рд╣реА рд╣реИ

рдЬрд╛рд╡рд╛ рдХреЗ рд╕рд╛рде рдореЗрд░рд╛ рдЕрдиреБрднрд╡ рд╕рдорд╛рди рд╣реИ (рд╣рд╛рд▓рд╛рдВрдХрд┐ рдмрд┐рд▓реНрдХреБрд▓ рдЕрдиреБрд░реВрдк рдирд╣реАрдВ)ред рдпрд╣ рдкрддрд╛ рд▓рдЧрд╛рдирд╛ рдореБрд╢реНрдХрд┐рд▓ рд╣реЛ рд╕рдХрддрд╛ рд╣реИ рдХрд┐ рд╡рд╛рд╕реНрддрд╡ рдореЗрдВ рдХрд┐рд╕ рд╡рд░реНрдЧ рдХрд╛ рдЙрдкрд╡рд░реНрдЧ рдЪрд▓ рд░рд╣рд╛ рд╣реИ ...

рдордИ рдореЗрдВ рд╡рд╛рдкрд╕, рдореИрдВрдиреЗ IRLO рдкрд░ рд╡рд┐рд╢реЗрд╖рдЬреНрдЮрддрд╛ рдХреЗ рд▓рд┐рдП рдПрдХ where match рдЗрдореНрдкреНрд▓рд╛рдВрдЯ рдХрд░рдиреЗ рдХреА рдЕрдиреБрдорддрд┐ рджреЗрддрд╛ рд╣реИ:

impl<R, T> AddAssign<R> for T {
    fn add_assign(&mut self, rhs: R) where match T {
        T: AddAssignSpec<R> => self.add_assign(rhs),
        T: Add<R> + Copy => *self = *self + rhs,
        T: Add<R> + Clone => { let tmp = self.clone() + rhs; *self = tmp; }
    }
}

рдбрд╛рдЙрдирд╕реНрдЯреНрд░реАрдо рддрдм "рд╕реНрдкреЗрд╢рд▓рд╛рдЗрдЬреЗрд╢рди" рдХреЛ рд▓рд╛рдЧреВ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдЗрд╕ рддрд░рд╣ рдХреЗ impl рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░ рд╕рдХрддреА рд╣реИ, рдХреНрдпреЛрдВрдХрд┐ рдХрдиреНрд╡реЗрдВрд╢рди рджреНрд╡рд╛рд░рд╛ рдЗрд╕ рддрд░рд╣ рдХреЗ рдирд┐рд╣рд┐рддрд╛рд░реНрде рдХреЗ рд▓рд┐рдП Trait рдкрд╣рд▓реЗ рдЙрди рдкреНрд░рдХрд╛рд░реЛрдВ рд╕реЗ рдореЗрд▓ рдЦрд╛рдПрдВрдЧреЗ рдЬреЛ рдХрд┐рд╕реА рдЕрдиреНрдп рд╡рд┐рд╢реЗрд╖рддрд╛ TraitSpec , рдФрд░ рдбрд╛рдЙрдирд╕реНрдЯреНрд░реАрдо рдкреНрд░рдХрд╛рд░ рдЬреЗрдиреЗрд░рд┐рдХ рд╡реНрдпрд╡рд╣рд╛рд░ рдХреЛ рдУрд╡рд░рд░рд╛рдЗрдб рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдЙрд╕ рд╡рд┐рд╢реЗрд╖рддрд╛ рдХреЛ рд▓рд╛рдЧреВ рдХрд░рдиреЗ рдореЗрдВ рд╕рдХреНрд╖рдо рд╣реЛрдЧрд╛:

// Crate upstream
pub trait Foo { fn foo(); }
pub trait FooSpec { fn foo(); }

impl<T> Foo for T {
    fn foo() where T {
        T : FooSpec => T::foo(),
        _ => { println!("generic implementation") }
    }
}

fn foo<T : Foo>(t: T) {
    T::foo()
}

// crate downstream
struct A {}
struct B {}

impl upstream::FooSpec for A {
    fn foo() { println!("Specialized"); }
}

fn main() {
    upstream::foo(A); // prints "specialized"
    upstream::foo(B); // prints "generic"
}

рдпрд╣ рдлреЙрд░реНрдореНрдпреБрд▓реЗрд╢рди рдЕрдкрд╕реНрдЯреНрд░реАрдо рдХреЗ рдХреНрд░рдо рдХреЛ рдЪреБрдирдиреЗ рдХреЗ рд▓рд┐рдП рдЕрдкрд╕реНрдЯреНрд░реАрдо рдХреЛ рдЕрдзрд┐рдХ рдирд┐рдпрдВрддреНрд░рдг рджреЗрддрд╛ рд╣реИ, рдФрд░ рдЬреИрд╕рд╛ рдХрд┐ рдпрд╣ рд╡рд┐рд╢реЗрд╖рддрд╛ / рдлрд╝рдВрдХреНрд╢рди рд╣рд╕реНрддрд╛рдХреНрд╖рд░ рдХрд╛ рд╣рд┐рд╕реНрд╕рд╛ рд╣реИ, рдпрд╣ рдкреНрд░рд▓реЗрдЦрди рдореЗрдВ рджрд┐рдЦрд╛рдИ рджреЗрдЧрд╛ред IMO рдпрд╣ рдЬрд╛рдирдиреЗ рдХреЗ рд▓рд┐рдП "рдЗрдореНрдкреНрд▓рд╛рдпрд┐рдВрдЧ рдЪреЗрдЬрд╝рд┐рдВрдЧ" рдХреЛ рд░реЛрдХрддрд╛ рд╣реИ рдХрд┐ рд╡рд╛рд╕реНрддрд╡ рдореЗрдВ рдХреМрди рд╕реА рд╢рд╛рдЦрд╛ рд▓рд╛рдЧреВ рд╣реИ, рдХреНрдпреЛрдВрдХрд┐ рд░рд┐рдЬрд╝реЙрд▓реНрдпреВрд╢рди рдСрд░реНрдбрд░ рд╕реНрдкрд╖реНрдЯ рд╣реИред

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

рдЗрд╕ рдлреЙрд░реНрдореВрд▓реЗрд╢рди рдХреА рдХрдорд┐рдпрд╛рдВ рдпрд╣ рд╣реИрдВ рдХрд┐ рдпрд╣ RFC рдореЗрдВ рдПрдХ рдХреА рддреБрд▓рдирд╛ рдореЗрдВ рдмрд╣реБрдд рдЕрд▓рдЧ рдорд╛рд░реНрдЧ рд╣реИ, рдФрд░ 2016 рд╕реЗ рд▓рд╛рдЧреВ рдХрд┐рдпрд╛ рдЬрд╛ рд░рд╣рд╛ рд╣реИ, рдФрд░ рдпрд╣ рдХрд┐ рдХрдо рд╕реЗ рдХрдо рдХреБрдЫ рд▓реЛрдЧреЛрдВ рдиреЗ рдЗрд╕ рдмрд╛рдд рдкрд░ рдЪрд┐рдВрддрд╛ рд╡реНрдпрдХреНрдд рдХреА рдХрд┐ рдпрд╣ рд╡рд░реНрддрдорд╛рди рдХреЗ рд░реВрдк рдореЗрдВ рдЕрднрд┐рд╡реНрдпрдВрдЬрдХ рдФрд░ / рдпрд╛ рд╕рд╣рдЬ рдирд╣реАрдВ рд╣реЛрдЧрд╛ред рд╡рд┐рд╢реЗрд╖рдЬреНрдЮрддрд╛ рд╕реБрд╡рд┐рдзрд╛ (рдореБрдЭреЗ рд▓рдЧрддрд╛ рд╣реИ "рдкреНрд░рдХрд╛рд░ рдкрд░ рдореЗрд▓" рдмрд╣реБрдд рд╕рд╣рдЬ рд╣реИ, рд▓реЗрдХрд┐рди рдореИрдВ рдкрдХреНрд╖рдкрд╛рддреА рд╣реВрдВ рдХреНрдпреЛрдВрдХрд┐ рдореИрдВ рд╕реВрддреНрд░реАрдХрд░рдг рдХрд╛ рдкреНрд░рд╕реНрддрд╛рд╡ рдХрд░рддрд╛ рд╣реВрдВ)ред

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

@dureuill рдЬрд╛рдирдХрд╛рд░реА рдХреЗ рд▓рд┐рдП рдзрдиреНрдпрд╡рд╛рдж! рдпрд╣ рд╡рд╛рд╕реНрддрд╡ рдореЗрдВ рдПрдХ рджрд┐рд▓рдЪрд╕реНрдк рд╡рд┐рдЪрд╛рд░ рд╣реИред рдПрдХ рдЪрд┐рдВрддрд╛ рдХрд╛ рд╡рд┐рд╖рдп рдпрд╣ рд╣реИ рдХрд┐ рдпрд╣ рдЬрд░реВрд░реА рдирд╣реАрдВ рд╣реИ рдХрд┐ рд╡рд┐рд╢реЗрд╖рдЬреНрдЮрддрд╛ рдХреЗ рд▓рд┐рдП рдХреБрдЫ рдЕрдиреНрдп рдкреНрд░рддреНрдпрд╛рд╢рд┐рдд рдЙрдкрдпреЛрдЧ рдХреЗ рдорд╛рдорд▓реЛрдВ рдХреЛ рд╣рд▓ рдХрд┐рдпрд╛ рдЬрд╛рдП, рд╡рд┐рд╢реЗрд╖ рд░реВрдк рд╕реЗ "рд╡реГрджреНрдзрд┐рд╢реАрд▓ рд░реВрдк рд╕реЗ рдкрд░рд┐рд╖реНрдХреГрдд рд╡реНрдпрд╡рд╣рд╛рд░" рдорд╛рдорд▓рд╛ рдЬреИрд╕рд╛ рдХрд┐ рдЗрд╕ рдмреНрд▓реЙрдЧ рдкреЛрд╕реНрдЯ рдореЗрдВ @aturon рджреНрд╡рд╛рд░рд╛ рд╡рд░реНрдгрд┐рдд рд╣реИред рдлрд┐рд░ рднреА, рдзреНрдпрд╛рди рдореЗрдВ рд░рдЦрдиреЗ рд▓рд╛рдпрдХред

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

@ the8472 @nikomatsakis , @ рдбрд╛рд░реНрдХ-рд▓реАрдЬрди: рд╕рдХрд╛рд░рд╛рддреНрдордХ рдкреНрд░рддрд┐рдХреНрд░рд┐рдпрд╛ рдХреЗ рд▓рд┐рдП рдзрдиреНрдпрд╡рд╛рдж! рдореИрдВ IRLO рдереНрд░реЗрдб рдореЗрдВ рдЖрдкрдХреА рдХреБрдЫ рдЯрд┐рдкреНрдкрдгрд┐рдпреЛрдВ рдХрд╛ рдЬрд╡рд╛рдм рджреЗрдиреЗ рдХреА рдХреЛрд╢рд┐рд╢ рдХрд░рддрд╛ рд╣реВрдВ, рдХреНрдпреЛрдВрдХрд┐ рдореИрдВ рдЯреНрд░реИрдХрд┐рдВрдЧ рдореБрджреНрджреЗ рдкрд░ рдмрд╣реБрдд рдЕрдзрд┐рдХ рд╢реЛрд░ рдирд╣реАрдВ рдХрд░рдирд╛ рдЪрд╛рд╣рддрд╛ рд╣реВрдВ (рдореИрдВ рдЖрдк рдореЗрдВ рд╕реЗ рдкреНрд░рддреНрдпреЗрдХ рдХреЗ рд▓рд┐рдП рдорд╛рдлреА рдЪрд╛рд╣рддрд╛ рд╣реВрдВ, рдЬрд┐рдиреНрд╣реЛрдВрдиреЗ рд╡рд┐рд╢реЗрд╖рдЬреНрдЮрддрд╛ рдкрд░ рд╕рдорд╛рдЪрд╛рд░ рдХреА рдЙрдореНрдореАрдж рдХреА рдереА рдФрд░ рдмрд╕ рдореЗрд░реА рд░рдВрдмрд▓рд┐рдВрдЧ рдорд┐рд▓реА: рдирд┐рд╕реНрддрдмреНрдзрддрд╛ :)ред

рдЕрдЧрд░ рдореИрдВ рдХреБрдЫ рдпреБрд╡рд╛ рд▓рд┐рдЦрдиреЗ рдХрд╛ рдкреНрд░рдмрдВрдзрди рдХрд░рддрд╛ рд╣реВрдВ, рддреЛ рдореИрдВ рдПрдХ рдЕрд▓рдЧ RFC рдЦреЛрд▓ рд╕рдХрддрд╛ рд╣реВрдВред рдЗрд╕ рдмреАрдЪ, рдореИрдВ рд▓рд┐рдВрдХ рдХрд┐рдП рдЧрдП IRLO рдереНрд░реЗрдб рдкрд░ рдкреНрд░рддрд┐рдХреНрд░рд┐рдпрд╛ рдХреЗ рд▓рд┐рдП рдмрд╣реБрдд рдЦреБрд▓рд╛ рд╣реВрдВред рдореИрдВрдиреЗ aturon рдХреЗ рдмреНрд▓реЙрдЧ рдкреЛрд╕реНрдЯ рд╕реЗ рдПрдХ рд▓рдВрдмрд╛ рдЙрджрд╛рд╣рд░рдг рдЬреЛрдбрд╝рд╛ рд╣реИ, рдЗрд╕рд▓рд┐рдП рдЙрд╕ рдкрд░ рдЯрд┐рдкреНрдкрдгреА рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рд╕реНрд╡рддрдВрддреНрд░ рдорд╣рд╕реВрд╕ рдХрд░реЗрдВ!

рдореИрдВ рднреА рдХреБрдЫ рд╡рд┐рд╢реЗрд╖ рдкреНрд░рдХрд╛рд░ рдХреЗ рдорд╛рд░реНрдХрд░ рд╣реЛрдиреЗ рдХреЗ рдкрдХреНрд╖ рдореЗрдВ рд╣реВрдВред

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

рдЕрдиреНрдпрдерд╛, рдХреЗрд╡рд▓ рдореМрдЬреВрджрд╛ рдХреАрд╡рд░реНрдб рдЬреЛ рд▓рдЧрддрд╛ рд╣реИ ... рдЕрдЪреНрдЫреА рддрд░рд╣ рд╕реЗ .. рдорд╛рд░реНрдХрд░ рдХреЗ рд░реВрдк рдореЗрдВ рдЙрдкрдпреБрдХреНрдд рд╣реИ, super рд╣реЛ рд╕рдХрддрд╛ рд╣реИ?

Https://github.com/rust-lang/rust/issues/31844#issuecomment -639977601 рд╕реЗ @LLFourn рдХреЗ рдЙрджрд╛рд╣рд░рдг рдХрд╛ рдкреБрди: рдЙрдкрдпреЛрдЧ рдХрд░рдХреЗ рд╕рд╛рд░рд╛рдВрд╢:

  • super (рдкрд╣рд▓реЗ рд╕реЗ рдЖрд░рдХреНрд╖рд┐рдд рд╣реИ, рд▓реЗрдХрд┐рди рдЗрд╕реЗ default рд╡рд┐рдХрд▓реНрдк рдХреЗ рд░реВрдк рдореЗрдВ рднреА рдЧрд▓рдд рд╕рдордЭрд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИ)
super impl<A, T> Extend<A, T> for Vec<A> where T: IntoIterator<Item=A>
  • specialize
specialize impl<A, T> Extend<A, T> for Vec<A> where T: IntoIterator<Item=A>
  • spec ( specialize impl implement ) (https://github.com/rust-lang рдореЗрдВ @ssokolow рджреНрд╡рд╛рд░рд╛ рдЙрдард╛рдпрд╛ рдЧрдпрд╛ рд╡реИрдз рдЪрд┐рдВрддрд╛ рдХрд╛ рд╡рд┐рд╖рдп ) / рдЬрдВрдЧ / рдореБрджреНрджреЛрдВ / 31,844 # issuecomment-690,980,762)
spec impl<A, T> Extend<A, T> for Vec<A> where T: IntoIterator<Item=A>
  • override (рдкрд╣рд▓реЗ рд╕реЗ рд╣реА рдЖрд░рдХреНрд╖рд┐рдд, рдзрдиреНрдпрд╡рд╛рдж @ the8472 https://github.com/rust-lang/rust/issues/31844#issuecomment-691042082)
override impl<A, T> Extend<A, T> for Vec<A> where T: IntoIterator<Item=A>

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

рдпрд╛ spec ( specialize рддрд░рд╣ impl implement )

"рд╡рд┐рдирд┐рд░реНрджреЗрд╢" рдкрд╣рд▓реЗ рд╕реЗ рд╣реА "рд╡рд┐рдирд┐рд░реНрджреЗрд╢" (рдЬреИрд╕реЗред HTML 5 рдХрд▓реНрдкрдирд╛ ") рдХреЗ рд▓рд┐рдП рд╢реЙрд░реНрдЯрд╣реИрдВрдб рдХреЗ рд░реВрдк рдореЗрдВ рд▓реЛрдЧреЛрдВ рдХреЛ рдЕрдзрд┐рдХ рдкрд░рд┐рдЪрд┐рдд рд╣реИ, рдЗрд╕рд▓рд┐рдП рдореБрдЭреЗ рдирд╣реАрдВ рд▓рдЧрддрд╛ рдХрд┐ рдпрд╣" рд╡рд┐рд╢реЗрд╖рдЬреНрдЮ "рдХреЗ рд▓рд┐рдП рдПрдХ рдЕрдЪреНрдЫрд╛ рдЖрд╢реБрд▓рд┐рдкрд┐ рд╣реЛрдЧрд╛ред

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

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

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

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

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

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

рдпрд╣ рджреЗрдЦрддреЗ рд╣реБрдП рдХрд┐ рдореИрдВ "рд╕реНрдкреЗрд╕рд┐рдлрд┐рдХреЗрд╢рди" рдХрд╛ рдорддрд▓рдм "рд╕реНрдкреЗрд╕рд┐рдлрд┐рдХреЗрд╢рди" рд╕реЗ рдХрд┐рддрдиреА рджреГрдврд╝рддрд╛ рд╕реЗ рдЙрдореНрдореАрдж рдХрд░рддрд╛ рд╣реВрдВ, рдореБрдЭреЗ рд▓рдЧрддрд╛ рд╣реИ рдХрд┐ рдпрд╣ рдПрдХ рдФрд░ рд╕реНрдерд┐рддрд┐ рд╣реИ, рдЬрд╣рд╛рдВ рд╣рдореЗрдВ рдЕрдореЗрд░рд┐рдХреА рдЕрдВрдЧреНрд░реЗрдЬреА рд╡рд░реНрддрдиреА рдкрд░ рд╕рдмрд╕реЗ рдХрдо рд╡рд┐рдХрд▓реНрдк рдЪреБрдирдиреЗ рдкрд░ рд╡рд┐рдЪрд╛рд░ рдХрд░рдирд╛ рдЪрд╛рд╣рд┐рдПред

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

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

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

рдЕрд▓рдЧ рддрд░реАрдХреЗ рд╕реЗ рд░рдЦреЗрдВ: рдЬрдВрдЧ рдореЗрдВ рдЗрд╕реНрддреЗрдорд╛рд▓ рд╣реЛрдиреЗ рд╡рд╛рд▓рд╛ рд╣рд░ рд╢рдмреНрдж рд╕реНрдерд╛рдиреАрдп рдирд┐рд░реНрднрд░ рд╣реИред

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

рдХреАрд╡рд░реНрдб рдХреЗ рд░реВрдк рдореЗрдВ special рдЙрдкрдпреЛрдЧ рдХрд░реЗрдВ?

рд╡реИрдХрд▓реНрдкрд┐рдХ, рджреЛ рдЦреЛрдЬрд╢рдмреНрдж рдмрдирд╛рдПрдБ: specialize рдФрд░ specialise рдФрд░ рдЙрдиреНрд╣реЗрдВ рд╕рдорддреБрд▓реНрдп рдмрдирд╛рдПрдВ ...

(рдпрд╛ рдЖрдк рдЧреИрд░-рдЕрдореЗрд░рд┐рдХрд┐рдпреЛрдВ рдХреЛ рд╡рд╛рд╕реНрддрд╡рд┐рдХ рд╡рд░реНрддрдиреА рд▓рд┐рдЦрдирд╛ рд╕реАрдЦ рд╕рдХрддреЗ рд╣реИрдВ: рд╣рдореЗрдВ:-)

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

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

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

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

рдЕрдВрдЧреНрд░реЗрдЬреА рдХреА рдХреМрди рд╕реА рдмреЛрд▓реА рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рдмрд╣рд╕ рдХрд░рдиреЗ рдХреЗ рдмрдЬрд╛рдп, рд╣рдо рдЪрд╛рд╣рддреЗ рд╣реИрдВ рдХрд┐ рдпрд╣ рдкрд╣рдЪрд╛рдирдХрд░реНрддрд╛ рдЕрдВрджрд░ рд╣реЛ, рд╢рд╛рдпрдж рд╣рдо рдЗрд╕реЗ рд╕рдордЭреМрддрд╛ рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ рдФрд░ рдЗрд╕реЗ рд╣рд┐рдмреНрд░реВ рдореЗрдВ рдбрд╛рд▓ рд╕рдХрддреЗ рд╣реИрдВ?

@ssokolow рдЬрдмрдХрд┐ рд╕рд╛рдорд╛рдиреНрдп рд░реВрдк рд╕реЗ рдлрд┐рд╕рд▓рди рдврд▓рд╛рди рддрд░реНрдХ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдПрдХ рдордЬрдмреВрдд рддрд░реНрдХ рдирд╣реАрдВ рд╣реИ, рдореИрдВ рдЗрд╕ рдорд╛рдорд▓реЗ рдореЗрдВ рдЖрдкрдХреЗ рд╕рд╛рде рд╕рд╣рдордд рд╣реВрдВред рдПрдХ рддрд░реНрдХ рджреЗ рд╕рдХрддрд╛ рд╣реИ рдХрд┐ рдХрдИ рднрд╛рд╖рд╛рдПрдВ рдареАрдХ рд╣реИрдВ рд▓реЗрдХрд┐рди рдХрдо рд╕реЗ рдХрдо рджреЛ рдХрд╛рд░рдг рд╣реИрдВ рдХрд┐ рдпрд╣ рдХреНрдпреЛрдВ рдирд╣реАрдВ рд╣реИ:

  • рдЕрд▓рдЧ-рдЕрд▓рдЧ рднрд╛рд╖рд╛рдУрдВ рдореЗрдВ рдХреБрдЫ рд╢рдмреНрдж рд╕рдорд╛рди рджрд┐рдЦрддреЗ рд╣реИрдВ, рд▓реЗрдХрд┐рди рдЕрд▓рдЧ-рдЕрд▓рдЧ рдЪреАрдЬреЛрдВ рдХрд╛ рдорддрд▓рдм рд╣реИ (рдЕрднреА рдкреНрд░реЛрдЧреНрд░рд╛рдорд┐рдВрдЧ-рд╕рдВрдмрдВрдзрд┐рдд рдЙрджрд╛рд╣рд░рдг рдХреЗ рд╕рд╛рде рдирд╣реАрдВ рдЖ рд╕рдХрддрд╛ рд╣реИ, рд▓реЗрдХрд┐рди рдПрдХ рдпрд╛рджреГрдЪреНрдЫрд┐рдХ рдЙрджрд╛рд╣рд░рдг: a рд╕реНрд▓реЛрд╡рд╛рдХ рдореЗрдВ and рдЕрдВрдЧреНрд░реЗрдЬреА рдореЗрдВ рд╣реИ)
  • рд▓реЛрдЧреЛрдВ рдХреЛ рджреВрд╕рд░реА рднрд╛рд╖рд╛ рдореЗрдВ рдХреЛрдб рдкрдврд╝рдиреЗ рдореЗрдВ рднрд╛рд░реА рдкрд░реЗрд╢рд╛рдиреА рднрд▓реЗ рд╣реА рд╡реЗ рднрд╛рд╖рд╛ рдЬрд╛рдирддреЗ рд╣реЛрдВ ред рдореИрдВ рдЕрдиреБрднрд╡ рд╕реЗ рдЬрд╛рдирддрд╛ рд╣реВрдВред (рд▓рдВрдмреА рдХрд╣рд╛рдиреА рд╕рдВрдХреНрд╖реЗрдк: рдореБрдЭреЗ рд╡рд┐рд╢реНрд╡рд╡рд┐рджреНрдпрд╛рд▓рдп рд╢рд┐рдХреНрд╖рд╛ рдШреЛрдЯрд╛рд▓реЗ рдореЗрдВ рдореЗрд░реА "рдорд╛рддреГ рднрд╛рд╖рд╛" рд╕реЗ рд╕реАрдзреЗ рдЕрдВрдЧреНрд░реЗрдЬреА рдореЗрдВ рдЕрдиреБрд╡рд╛рджрд┐рдд рд╢рдмреНрджреЛрдВ рдХреЗ рд╕рд╛рде рдХреБрдЫ рдЧреНрд░рдВрдереЛрдВ рдХреЛ рд╕рдордЭрдиреЗ рдореЗрдВ рдмрдбрд╝реА рдкрд░реЗрд╢рд╛рдиреА рд╣реБрдИред)

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

рдпрд╣ рд╕рдм рдХрд╣рд╛ рдЬрд╛ рд░рд╣рд╛ рд╣реИ, рдореБрдЭреЗ рдмрд╣реБрдд рдЦреБрд╢реА рд╣реЛрдЧреА "рдХреНрдпрд╛ рдЖрдкрдХрд╛ рдорддрд▓рдм XXX рдерд╛?" рддреНрд░реБрдЯрд┐ рд╕рдВрджреЗрд╢ рджреГрд╖реНрдЯрд┐рдХреЛрдгред рдЕрдиреНрдп рд╢рдмреНрдж рдЬрд┐рдирдХреЗ рдкрд╛рд╕ рдЕрдиреНрдп рд╕рдорд╕реНрдпрд╛рдПрдВ рдирд╣реАрдВ рд╣реИрдВ, рдареАрдХ рд╣реИрдВред

рдХрдо рд╕реЗ рдХрдо рдХрд┐рд╕реА рдХреЛ рдХреЛрдб рдореЗрдВ рдлреБрдЯрдмреЙрд▓ рдкрд░ рдЪрд░реНрдЪрд╛ рдХрд░рдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рдирд╣реАрдВ рд╣реИред ;)

рдпреВрдПрд╕ рд╕реНрдкреЗрд▓рд┐рдВрдЧ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдиреЗ рд╡рд╛рд▓реЗ рджреЗрд╢реЛрдВ рдореЗрдВ рд▓рдЧрднрдЧ 70% рджреЗрд╢реА рдЕрдВрдЧреНрд░реЗрдЬреА рдмреЛрд▓рдиреЗ рд╡рд╛рд▓реЗ рд▓реЛрдЧ рд░рд╣рддреЗ рд╣реИрдВред

рдЗрд╕рдХреЗ рдЕрд▓рд╛рд╡рд╛ ..

"-рдЗрдЬрд╝ рд╕реНрдкреЗрд▓рд┐рдВрдЧ рдХреЛ рдЕрдХреНрд╕рд░ рдмреНрд░рд┐рдЯреЗрди рдореЗрдВ рдПрдХ рдЕрдореЗрд░рд┐рдХреАрд╡рд╛рдж рдХреЗ рд░реВрдк рдореЗрдВ рдЧрд▓рдд рддрд░реАрдХреЗ рд╕реЗ рджреЗрдЦрд╛ рдЬрд╛рддрд╛ рд╣реИред 15 рд╡реАрдВ рд╢рддрд╛рдмреНрджреА рдХреЗ рдмрд╛рдж рд╕реЗ рдЗрд╕рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд░рд╣рд╛ рд╣реИ, рдПрдХ рд╕рджреА рд╕реЗ рднреА рдЕрдзрд┐рдХ-рд╕реЗ-рдкреВрд░реНрд╡ рднрд╡рд┐рд╖реНрдпрд╡рд╛рдгреА рдХреА рдЧрдИ рд╣реИред рдпрд╣ рд╕реАрдзреЗ-рдЧреНрд░реАрдХ-рдорд╛рдЗрдХрд┐рдХреЛ-рдХреИрдЬрд╝реАрди рдФрд░ рд▓реИрдЯрд┐рди -рдЗрдЬрд╝рд╛рд░реЗ рд╕реЗ рдЖрддрд╛ рд╣реИ, рдЬрдмрдХрд┐ - ise рдлреНрд░рд╛рдВрд╕реАрд╕реА -iser рдХреЗ рдорд╛рдзреНрдпрдо рд╕реЗ рдЖрддрд╛ рд╣реИред рдСрдХреНрд╕рдлреЛрд░реНрдб рдЗрдВрдЧреНрд▓рд┐рд╢ рдбрд┐рдХреНрд╢рдирд░реА (OED) рдПрдХ рд╡рд┐рдХрд▓реНрдк рдХреЗ рд░реВрдк рдореЗрдВ -ise рдлреЙрд░реНрдо рдХреА рд╕рд┐рдлрд╛рд░рд┐рд╢ рдХрд░рддрд╛ рд╣реИ рдФрд░ рд╕реВрдЪреАрдмрджреНрдз рдХрд░рддрд╛ рд╣реИред "

"рдСрдХреНрд╕рдлреЛрд░реНрдб рдпреВрдирд┐рд╡рд░реНрд╕рд┐рдЯреА рдкреНрд░реЗрд╕ (OUP) рджреНрд╡рд╛рд░рд╛ рдкреНрд░рдХрд╛рд╢рди-рд╣реЗрдирд░реА рд╡реЙрдЯрд╕рди рдлрд╛рдЙрд▓рд░ рдХреЗ рдП рдбрд┐рдХреНрд╢рдирд░реА рдСрдлрд╝ рдореЙрдбрд░реНрди рдЗрдВрдЧреНрд▓рд┐рд╢ рдпреВрдЬрд╝, рд╣рд╛рд░реНрдЯреНрд╕ рд░реВрд▓реНрд╕, рдФрд░ рдж рдСрдХреНрд╕рдлрд╝реЛрд░реНрдб рдЧрд╛рдЗрдб рдЯреВ рдЗрдВрдЧреНрд▓рд┐рд╢ рдпреВрдЬрд╝ рдХреЗ рд░реВрдк рдореЗрдВ рдкреНрд░рдХрд╛рд╢рди-рднреА рд╕рд┐рдлрд╛рд░рд┐рд╢ рдХрд░рддреЗ рд╣реИрдВред рд╣рд╛рд▓рд╛рдВрдХрд┐, рд░реЙрдмрд░реНрдЯ рдПрд▓рди рдХреЗ рдкреЙрдХреЗрдЯ рдлрд╛рдЙрд▓рд░ рдХрд╛ рдореЙрдбрд░реНрди рдЗрдВрдЧреНрд▓рд┐рд╢ рдпреВрдЬрд╝ рдпрд╛ рддреЛ рд╕реНрдкреЗрд▓рд┐рдВрдЧ рдорд╛рдирддреЗ рд╣реИрдВред рдХрд╣реАрдВ рднреА рд╕реНрд╡реАрдХрд╛рд░реНрдп рд╣реЛрдиреЗ рдХреЗ рд▓рд┐рдП рд▓реЗрдХрд┐рди рдпреВ.рдПрд╕.

рд╕рдВрджрд░реНрднред https://en.wikipedia.org/wiki/American_and_British_English_spelling_differences# -ise, _- ize _ (- isation, _- ization)

рдРрд╕рд╛ рдкреНрд░рддреАрдд рд╣реЛрддрд╛ рд╣реИ рдХрд┐ рд╕реНрдкреИрдирд┐рд╢ рдФрд░ рдЗрддрд╛рд▓рд╡реА рдореЗрдВ az рдпрд╛ рджреЛ рд╣реИрдВ, рдЗрд╕рд▓рд┐рдП рдпрд╣ рдирд┐рд╢реНрдЪрд┐рдд рдирд╣реАрдВ рд╣реИ рдХрд┐ рдлреНрд░реЗрдВрдЪ рдХрд╣рд╛рдБ рд╕реЗ рдкреНрд░рд╛рдкреНрдд рдХрд░рддрд╛ рд╣реИ, рд╢рд╛рдпрдж рдЬрд░реНрдорди рд╕реЗ?

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

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

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

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

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

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

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

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