Rust: рд╕рд╛рдорд╛рдиреНрдп рд╕рдВрдмрджреНрдз рдкреНрд░рдХрд╛рд░реЛрдВ (GAT) рдХреЗ рд▓рд┐рдП рдЯреНрд░реИрдХрд┐рдВрдЧ рд╕рдорд╕реНрдпрд╛

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

рдпрд╣ рд╕рд╛рдорд╛рдиреНрдп рд╕рдВрдмрджреНрдз рдкреНрд░рдХрд╛рд░реЛрдВ рдХреЗ рд▓рд┐рдП рдПрдХ рдЯреНрд░реИрдХрд┐рдВрдЧ рд╕рдорд╕реНрдпрд╛ рд╣реИ (рд░рд╕реНрдЯ-рд▓реИрдВрдЧ/рдЖрд░рдПрдлрд╕реАрдПрд╕#1598)

рдРрд╕рд╛ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП:

рдмреНрд▓реЙрдХрд┐рдВрдЧ рдмрдЧ

A-associated-items A-traits A-typesystem B-RFC-approved B-unstable C-tracking-issue E-mentor F-generic_associated_types T-compiler T-lang WG-compiler-traits requires-nightly

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

https://github.com/rust-lang/rust/issues/44265#issuecomment -568247656 рдПрдХ (рдХреБрдЫ рд╣рдж рддрдХ рд╕рдВрдХреНрд╖рд┐рдкреНрдд) рдЕрдкрдбреЗрдЯ рд╣реИред

67510 рдЕрдВрддрд┐рдо рдкреНрд░рдореБрдЦ ICE/рд▓рд╛рдкрддрд╛ рд╡рд┐рд╢реЗрд╖рддрд╛ рд╣реИ рдЬрд┐рд╕реЗ рд▓рд╛рдЧреВ рдХрд░рдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реИред

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

рдпрд╣рд╛рдВ рдПрдХ рдкреНрд░рдХрд╛рд░ рдХреА рдХрд╛рд░реНрдпрд╛рдиреНрд╡рдпрди рдпреЛрдЬрдирд╛ рд╣реИ рдЬрд┐рд╕реЗ рдореИрдВ рдЕрджреНрдпрддрди рд░рдЦрдиреЗ рдХрд╛ рдкреНрд░рдпрд╛рд╕ рдХрд░реВрдВрдЧрд╛ред

  • [] рдЪрд░рдг рдПрдХ: рдПрдПрд╕рдЯреА рдФрд░ рд╕реБрдВрджрд░-рдкреНрд░рд┐рдВрдЯрд┐рдВрдЧ рдореЗрдВ рд╕рдорд░реНрдерди рдЬреЛрдбрд╝реЗрдВ

    • рд╕рдВрднрд╡рдд: рдкрд╣рд▓рд╛ рдХрджрдо рдирдП рд░реВрдкреЛрдВ рдХреЛ рдкрд╛рд░реНрд╕ рдХрд░рдирд╛ рд╢реБрд░реВ рдХрд░рдирд╛ рдФрд░ рдПрдПрд╕рдЯреА рдореЗрдВ рдЙрдирдХреЗ рд▓рд┐рдП рд╕рдорд░реНрдерди рдЬреЛрдбрд╝рдирд╛ рд╣реИред

    • рдЕрдзрд┐рдХ рд╡рд┐рд╕реНрддреГрдд рд╡рд┐рдЪрд╛рд░реЛрдВ рдХреЗ рд▓рд┐рдП рдпрд╣ рдЯрд┐рдкреНрдкрдгреА рдпрд╣рд╛рдБ рджреЗрдЦреЗрдВред

    • рд╣рдореЗрдВ рдХреБрдЫ рдХреЗрд╡рд▓-рдкрд╛рд░реНрд╕рд┐рдВрдЧ рдкрд░реАрдХреНрд╖рдг рд▓рд┐рдЦрдиреЗ рдореЗрдВ рд╕рдХреНрд╖рдо рд╣реЛрдирд╛ рдЪрд╛рд╣рд┐рдП рдФрд░ рд╕реБрдВрджрд░-рдкреНрд░рд┐рдВрдЯрд░ рдХрд╛ рдкрд░реАрдХреНрд╖рдг рднреА рдХрд░рдирд╛ рдЪрд╛рд╣рд┐рдП

    • рдЬрдм рд╣рдо рдПрдЪрдЖрдИрдЖрд░ рдХрдо рдХрд░рддреЗ рд╣реИрдВ, рддреЛ рд╣рдо рдЧрд▓рддреА рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ рдХрд┐ рдХреНрдпрд╛ рдХреЛрдИ GAT рдореМрдЬреВрдж рд╣реИ

    • рд╣рдо рддрдм рдлреАрдЪрд░ рдЧреЗрдЯ рднреА рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ

  • [ ] рдФрд░ рднреА рдЖрдиреЗ рдХреЛ рд╣реИ

рдореИрдВ рдПрдПрд╕рдЯреА рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рдЕрдзрд┐рдХ рд╡рд┐рд╕реНрддрд╛рд░ рд╕реЗ рд▓рд┐рдЦрдХрд░ рд╢реБрд░реВ рдХрд░рддрд╛ рд╣реВрдВред рдЖрдЗрдП рдкрд╣рд▓реЗ рдЪрд░реНрдЪрд╛ рдХрд░реЗрдВ рдХрд┐ рдпрд╣ рдЖрдЬ рдХреИрд╕реЗ рдХрд╛рдо рдХрд░рддрд╛ рд╣реИ:

рдПрдХ рд╡рд┐рд╢реЗрд╖рддрд╛ рдкрд░рд┐рднрд╛рд╖рд╛ рдореЗрдВ рдПрдХ type Foo: Bar [= Baz]; рдЖрдЗрдЯрдо рдЗрд╕ рдПрдПрд╕рдЯреА рд╕рдВрд╕реНрдХрд░рдг рджреНрд╡рд╛рд░рд╛ рдкрд░рд┐рднрд╛рд╖рд┐рдд рдХрд┐рдпрд╛ рдЧрдпрд╛ рд╣реИред рдЗрд╕рдореЗрдВ рд╕реАрдорд╛рдПрдВ ( Bar ) рдФрд░ (рд╡реИрдХрд▓реНрдкрд┐рдХ) рдбрд┐рдлрд╝реЙрд▓реНрдЯ рдорд╛рди Baz рд╢рд╛рдорд┐рд▓ рд╣реИрдВред рдирд╛рдо TraitItem рд╕рдВрд░рдЪрдирд╛ рдореЗрдВ рдкрд░рд┐рднрд╛рд╖рд┐рдд рдХрд┐рдпрд╛ рдЧрдпрд╛ рд╣реИ ред

рдПрдХ рд╡рд┐рд╢реЗрд╖рддрд╛ impl рдореЗрдВ рдПрдХ type Foo = Bar; рдЖрдЗрдЯрдо рдЗрд╕ AST рд╕рдВрд╕реНрдХрд░рдг рджреНрд╡рд╛рд░рд╛ рдкрд░рд┐рднрд╛рд╖рд┐рдд рдХрд┐рдпрд╛ рдЧрдпрд╛ рд╣реИ - рдЬрд┐рд╕рдореЗрдВ рдХреЗрд╡рд▓ Bar рдкреНрд░рдХрд╛рд░ рд╢рд╛рдорд┐рд▓ рд╣реИ, рдХреНрдпреЛрдВрдХрд┐ Foo рдЖрджрд┐ рдХреЛ ImplItem рдореЗрдВ рдкрд░рд┐рднрд╛рд╖рд┐рдд рдХрд┐рдпрд╛ рдЧрдпрд╛ рд╣реИ ред

рддрд░реАрдХреЗ рдПрдХ рджрд┐рд▓рдЪрд╕реНрдк рдорд╛рдорд▓рд╛ рд╣реИ рдХреНрдпреЛрдВрдХрд┐ рдЙрдиреНрд╣реЗрдВ рдкрд╣рд▓реЗ рд╕реЗ рд╣реА рд╕рд╛рдорд╛рдиреНрдп рдмрдирд╛рдпрд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИред рдЙрди рд╕рд╛рдорд╛рдиреНрдп рдорд╛рдкрджрдВрдбреЛрдВ рдХреЛ MethodSig рд╕рдВрд░рдЪрдирд╛ рдХреЗ Generics рдХреНрд╖реЗрддреНрд░ рдореЗрдВ рдШреЛрд╖рд┐рдд рдХрд┐рдпрд╛ рдЧрдпрд╛ рд╣реИ ред рдпрд╣ Generics рд╕рдВрд░рдЪрдирд╛ рдХрд╛ рдПрдХ рдЙрджрд╛рд╣рд░рдг рд╣реИред

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

рд╢рд╛рдпрдж рдПрдХ рдЕрдЪреНрдЫрд╛ рдкрд╣рд▓рд╛ рдкреАрдЖрд░ рд╕рд┐рд░реНрдл рдЙрд╕ рдмрджрд▓рд╛рд╡ рдХреЛ рдХрд░рдирд╛ рд╣реЛрдЧрд╛, рдЕрдиреНрдп рд╕рднреА рдореМрдЬреВрджрд╛ рдХрд╛рд░реНрдпрдХреНрд╖рдорддрд╛рдУрдВ рдХреЛ рд╕рдорд╛рди рд░рдЦрддреЗ рд╣реБрдПред рдпрд╛рдиреА, рд╣рдо Generics рдХреЛ TraitItem (рдФрд░ ImplItem ) рдореЗрдВ рдФрд░ MethodSig рдореЗрдВ рд╕реЗ рдЕрдзрд┐рдХ рдХрд░реЗрдВрдЧреЗред рд╣рдо рдЧреИрд░-рд╡рд┐рдзрд┐рдпреЛрдВ рдХреЗ рд▓рд┐рдП рдПрдХ рдЦрд╛рд▓реА Generics рдХреА рдЖрдкреВрд░реНрддрд┐ рдХрд░реЗрдВрдЧреЗред рд╣рдо рдореМрдЬреВрджрд╛ рдХреЛрдб рдХреЗ рдорд╛рдзреНрдпрдо рд╕реЗ рдХрд╛рдо рдХрд░реЗрдВрдЧреЗ, рдЗрд╕реЗ рдХрд╛рдо рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдЖрд╡рд╢реНрдпрдХрддрд╛рдиреБрд╕рд╛рд░ рдЬреЗрдирд░рд┐рдХ рдХреЛ рдкреНрд▓рдореНрдмрд┐рдВрдЧ рдХрд░реЗрдВрдЧреЗред

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

рдореИрдВрдиреЗ рдЬреЗрдиреЗрд░рд┐рдХ рдХреЛ TraitItem рдореЗрдВ рдЙрдард╛рдиреЗ рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рдирд╣реАрдВ рд╕реЛрдЪрд╛ рдерд╛ред рдореЗрд░рд╛ рджреГрд╖реНрдЯрд┐рдХреЛрдг Generics рдХреЛ TraitItemKind::Type рдореЗрдВ рдбрд╛рд▓рдирд╛ рдерд╛ рдХреНрдпреЛрдВрдХрд┐ рд╡рд╣ рдЬрдЧрд╣ рд╣реИ рдЬрд╣рд╛рдВ рдкреНрд░рдХрд╛рд░ рдХреА рдШреЛрд╖рдгрд╛ рдкрд╣рд▓реЗ рд╕реЗ рд╣реА рд╕рдВрдЧреНрд░рд╣реАрдд рд╣реИред рдЖрдкрдХрд╛ рджреГрд╖реНрдЯрд┐рдХреЛрдг рднреА рд╕рдордЭ рдореЗрдВ рдЖрддрд╛ рд╣реИ рдЗрд╕рд▓рд┐рдП рдореИрдВ рдЗрд╕реЗ рд▓рд╛рдЧреВ рдХрд░рдиреЗ рдкрд░ рдХрд╛рдо рдХрд░реВрдВрдЧрд╛ред рдЪреВрдВрдХрд┐ рдореИрдВ рдЕрднреА рднреА рдЗрд╕ рдХреЛрдбрдмреЗрд╕ рдХреЗ рд▓рд┐рдП рдкреВрд░реА рддрд░рд╣ рд╕реЗ рдирдпрд╛ рд╣реВрдВ, рдореБрдЭреЗ рдпрд╣ рдЬрд╛рдирдиреЗ рдореЗрдВ рджрд┐рд▓рдЪрд╕реНрдкреА рд╣реИ рдХрд┐ рдореЗрд░реЗ рджреГрд╖реНрдЯрд┐рдХреЛрдг рдХреЗ рдиреБрдХрд╕рд╛рди рдХреНрдпрд╛ рд╣реЛрдВрдЧреЗ рдпрджрд┐ рдЗрд╕рдХрд╛ рдЙрдкрдпреЛрдЧ рдЖрдкрдХреЗ рджреНрд╡рд╛рд░рд╛ рд╕реБрдЭрд╛рдП рдЧрдП рдПрдХ рдкрд░ рдХрд┐рдпрд╛ рдЧрдпрд╛ рдерд╛ред рдХреНрдпрд╛ рдЖрдк рдореБрдЭреЗ рдЕрдкрдиреА рд╡рд┐рдЪрд╛рд░ рдкреНрд░рдХреНрд░рд┐рдпрд╛ рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рдХреБрдЫ рдЬрд╛рдирдХрд╛рд░реА рджреЗ рд╕рдХрддреЗ рд╣реИрдВ? :рд╕реНрдорд╛рдЗрд▓реА:

рдпрд╣рд╛рдБ рд╡рд╣ рдкрд░рд┐рд╡рд░реНрддрди рд╣реИ рдЬреЛ рдореИрдВрдиреЗ рдХрд┐рдпрд╛ рд╣реЛрдЧрд╛:

pub enum TraitItemKind {
    // Generics aren't supported here yet
    Const(P<Ty>, Option<P<Expr>>),
    // `Generics` is already a field in `MethodSig`
    Method(MethodSig, Option<P<Block>>),
    // Added `Generics` here:
    Type(Generics, TyParamBounds, Option<P<Ty>>),
    Macro(Mac),
}

рд╕рдВрдкрд╛рджрд┐рдд рдХрд░реЗрдВ: Gitter . рдкрд░ рдирд┐рдХреЛрдорд╛рддреНрд╕рдХрд┐рд╕ рджреНрд╡рд╛рд░рд╛ рдЙрддреНрддрд░

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

рдареАрдХ рд╣реИ! рдЕрдЧрд▓рд╛ рдХрджрдо рдкрд╛рд░реНрд╕рд░ рдХрд╛ рд╡рд┐рд╕реНрддрд╛рд░ рдХрд░рдирд╛ рд╣реИред рдпрд╣рд╛рдВ рдХреБрдЫ рд╕рд▓рд╛рд╣ рд╣реИрдВред рдЖрдЗрдП рд╡рд┐рд╢реЗрд╖рддрд╛ рд╡рд╕реНрддреБрдУрдВ рд╕реЗ рд╢реБрд░реВ рдХрд░реЗрдВред

рдпрд╣ рд░реВрдЯреАрди рд╡рд┐рд╢реЗрд╖рддрд╛ рдЖрдЗрдЯрдо рдХреЛ рдкрд╛рд░реНрд╕ рдХрд░рддрд╛ рд╣реИ ред рд╣рдо рдЙрд╕ рдорд╛рдорд▓реЗ рдХрд╛ рд╡рд┐рд╕реНрддрд╛рд░ рдХрд░рдирд╛ рдЪрд╛рд╣рддреЗ рд╣реИрдВ рдЬреЛ рд╕рдВрдмрдВрдзрд┐рдд рдкреНрд░рдХрд╛рд░реЛрдВ рдХреЛ type Foo<....> = ...; (рд╢рд╛рдпрдж рдЬрд╣рд╛рдВ-рдХреНрд▓реЙрдЬ рднреА) рдЬреИрд╕реА рдЪреАрдЬреЛрдВ рдХреЛ рдкрд╛рд░реНрд╕ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рд╕рдВрднрд╛рд▓рддрд╛ рд╣реИред ( <...> "рдЬреЗрдиреЗрд░рд┐рдХ" рд╣реИ рдЬрд┐рд╕реЗ рд╣рдордиреЗ рдЕрднреА рдПрдПрд╕рдЯреА рдореЗрдВ рдЬреЛрдбрд╝рд╛ рд╣реИред)

рд╡рд░реНрддрдорд╛рди рдореЗрдВ рдпрд╣ parse_ty_param рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░ рд░рд╣рд╛ рд╣реИ, рдЬреЛ рдореВрд▓ рд░реВрдк рд╕реЗ T: Foo рдЖрджрд┐ рдЬреИрд╕реЗ рдХреБрдЫ рдХреЛ рдкрд╛рд░реНрд╕ рдХрд░рддрд╛ рд╣реИред рд╣рдореЗрдВ рдРрд╕рд╛ рдХрд░рдирд╛ рдмрдВрдж рдХрд░рдирд╛ рд╣реЛрдЧрд╛, рдХреНрдпреЛрдВрдХрд┐ рд╕рдВрдмрдВрдзрд┐рдд рдкреНрд░рдХрд╛рд░ рдХреА рдШреЛрд╖рдгрд╛рдУрдВ рдХреЗ рд▓рд┐рдП рд╡реНрдпрд╛рдХрд░рдг рдЕрдм рдЯрд╛рдЗрдк рдкреИрд░рд╛рдореАрдЯрд░ рдХреЗ рд▓рд┐рдП рдореЗрд▓ рдирд╣реАрдВ рдЦрд╛рддрд╛ рд╣реИред рддреЛ рд╣рдо рд╢рд╛рдпрдж parse_trait_item_assoc_ty рдЬреИрд╕рд╛ рдХреБрдЫ рдЬреЛрдбрд╝рдирд╛ рдЪрд╛рд╣реЗрдВрдЧреЗред рдпрд╣ parse_ty_param() рдХреЗ рдПрдХ рдкреНрд░рдХрд╛рд░ рдХреЗ рдХреНрд▓реЛрди рдХреЗ рд░реВрдк рдореЗрдВ рд╢реБрд░реВ рд╣реЛ рд╕рдХрддрд╛ рд╣реИ, рд▓реЗрдХрд┐рди рдлрд┐рд░ рд╣рдо рдЗрд╕реЗ рдпрд╣реАрдВ рд╕рдВрд╢реЛрдзрд┐рдд рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП parse_generics() рдХреЛ рд▓рд╛рдЧреВ рдХрд░рдирд╛ рдЪрд╛рд╣реЗрдВрдЧреЗред рдпрджрд┐ рдХреЛрдИ рдореМрдЬреВрдж рд╣реИ рддреЛ рд╡рд╣ рджрд┐рдирдЪрд░реНрдпрд╛ рдПрдХ рдЬреЗрдиреЗрд░рд┐рдХ рдШреЛрд╖рдгрд╛ ( <...> ) рдХреЛ рдкрд╛рд░реНрд╕ рдХрд░реЗрдЧреА, рдЕрдиреНрдпрдерд╛ рдпрд╣ рд╕рд┐рд░реНрдл рдПрдХ рдЦрд╛рд▓реА рдЬреЗрдирд░рд┐рдХ рд▓реМрдЯрд╛рддреА рд╣реИред рдлрд┐рд░ рд╣рдо рдкрд╛рд░реНрд╕ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдПрдХ рдХреЙрд▓ рдЬреЛрдбрд╝рдирд╛ рдЪрд╛рд╣рддреЗ рд╣реИрдВ рдЬрд╣рд╛рдВ рдХреНрд▓реЙрдЬ рдпрд╣реАрдВ рд╣реИрдВ - рдЖрдк рдЙрд╕ рдХреЙрд▓ рдкрд░ рдореЙрдбрд▓ рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ рдЬреЛ рдкрд╛рд░реНрд╕рд┐рдВрдЧ рд╡рд┐рдзрд┐рдпреЛрдВ рдХреЗ рджреМрд░рд╛рди рд╣реЛрддреА рд╣реИ , рдзреНрдпрд╛рди рджреЗрдВ рдХрд┐ рдкрд░рд┐рдгрд╛рдо generics рдореЗрдВ рд╕рдВрдЧреНрд░рд╣реАрдд рд╣реИ рдЬрд┐рд╕реЗ рд╣рдордиреЗ рдкрд╣рд▓реЗ рдкрд╛рд░реНрд╕ рдХрд┐рдпрд╛ рдерд╛ред

рдПрдХ рдмрд╛рд░ рдРрд╕рд╛ рдХрд░рдиреЗ рдХреЗ рдмрд╛рдж, рд╣рдореЗрдВ рдХреБрдЫ рдкрд╛рд░реНрд╕рд┐рдВрдЧ рдкрд░реАрдХреНрд╖рдг рдЬреЛрдбрд╝рдиреЗ рдореЗрдВ рд╕рдХреНрд╖рдо рд╣реЛрдирд╛ рдЪрд╛рд╣рд┐рдПред рдореИрдВ рдРрд╕рд╛ src/test/run-pass/rfc1598-generic-associated-types/ рдЬреИрд╕реА рдирд┐рд░реНрджреЗрд╢рд┐рдХрд╛ рдмрдирд╛рдХрд░ рдФрд░ рдЙрди рдлрд╝рд╛рдЗрд▓реЛрдВ рдХреЛ рдЬреЛрдбрд╝рдХрд░ рдХрд░реВрдВрдЧрд╛ рдЬрд┐рдирдХреА рдЖрдк рд╡рд╣рд╛рдВ рд╕рдлрд▓рддрд╛рдкреВрд░реНрд╡рдХ рдкрд╛рд░реНрд╕ рдХрд░рдиреЗ рдХреА рдЙрдореНрдореАрдж рдХрд░рддреЗ рд╣реИрдВред рдЕрднреА рд╡реЗ рдареАрдХ рд╕реЗ рдХрд╛рдо рдирд╣реАрдВ рдХрд░реЗрдВрдЧреЗ, рд▓реЗрдХрд┐рди рдЗрд╕рд╕реЗ рдХреЛрдИ рдлрд░реНрдХ рдирд╣реАрдВ рдкрдбрд╝рддрд╛ред рдмрд╕ рдПрдХ рдЦрд╛рд▓реА рдореБрдЦреНрдп рдХрд╛рд░реНрдп рдЬреЛрдбрд╝реЗрдВред рдлрд┐рд░ рд╣рдо рдРрд╕реЗ рдЙрджрд╛рд╣рд░рдг рднреА рдЬреЛрдбрд╝ рд╕рдХрддреЗ рд╣реИрдВ рдЬрд┐рдиреНрд╣реЗрдВ src/test/ui/rfc1598-generic-associated-types/ рдореЗрдВ рдкрд╛рд░реНрд╕ рдирд╣реАрдВ рдХрд░рдирд╛ рдЪрд╛рд╣рд┐рдП ( рдпреВрдЖрдИ рдкрд░реАрдХреНрд╖рдг рдЬреЛрдбрд╝рдиреЗ рдХреЗ рдирд┐рд░реНрджреЗрд╢реЛрдВ рдХреЗ рд▓рд┐рдП COMPILER_TESTS.md рджреЗрдЦреЗрдВ)ред

рдХреБрдЫ рдФрд░ - рд╣рдореЗрдВ рдЗрд╕ рдмрд┐рдВрджреБ рдкрд░ рдЗрд╕ рдХрд╛рдо рдХреЛ рдЧреЗрдЯ рдХрд░рдиреЗ рдХреА рдЬрд╝рд░реВрд░рдд рд╣реИ, рддрд╛рдХрд┐ рд▓реЛрдЧ рдЗрд╕ рд╕рд╛рдорд╛рди рдХреЛ рд╕реНрдерд┐рд░ рдирд┐рд░реНрдорд╛рдг рдореЗрдВ рдЙрдкрдпреЛрдЧ рдХрд░рдиреЗ рд╕реЗ рдмрдЪ рд╕рдХреЗрдВред рдлреЛрд░реНрдЬ рдкрд░ рдпрд╣рд╛рдВ рдлреАрдЪрд░-рдЧреЗрдЯ рдЬреЛрдбрд╝рдиреЗ рдХреЗ рд▓рд┐рдП рдХреБрдЫ рдирд┐рд░реНрджреЗрд╢ рд╣реИрдВ (рдЕрдВрддрд┐рдо рдЦрдВрдб рджреЗрдЦреЗрдВ)ред рд╣рдореЗрдВ visit_trait_item рдФрд░ visit_impl_item рдореЗрдВ рд╡рд┐рдЬрд╝рд┐рдЯрд░ рдХреЛ feature_gate.rs рдореЗрдВ рдЬреЛрдбрд╝рдирд╛ рдЪрд╛рд╣рд┐рдП; рдпрджрд┐ рд╡рд╣ рдЖрдЗрдЯрдо рдПрдХ рд╡рд┐рдзрд┐ рдирд╣реАрдВ рд╣реИ, рд▓реЗрдХрд┐рди рдЗрд╕рдореЗрдВ рдПрдХ рдЧреИрд░-рд░рд┐рдХреНрдд рдЬреЗрдирд░рд┐рдХ рд╣реИ, рддреЛ рд╣рдо gate_feature_post ( рдЙрджрд╛рд╣рд░рдг ) рдХрд╛ рдЖрд╣реНрд╡рд╛рди рдХрд░ рд╕рдХрддреЗ рд╣реИрдВред

рдирд╛рдо рд╕рдорд╛рдзрд╛рди рд╕реЗрдЯ рдЕрдк рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП, рдореБрдЭреЗ рд▓рдЧрддрд╛ рд╣реИ рдХрд┐ рд╣рдореЗрдВ рдХреЗрд╡рд▓ рдЙрдЪрд┐рдд "рдкрд╕рд▓рд┐рдпреЛрдВ" рдХреЛ рдЬрдЧрд╣ рдореЗрдВ рдкреНрд░рд╛рдкреНрдд рдХрд░рдирд╛ рд╣реИ (рдирд╛рдо рд╕рдорд╛рдзрд╛рди рд╕рд╛рдордЧреНрд░реА рдЙрди рдирд╛рдореЛрдВ рдХреЗ рд╕реЗрдЯ рдХреЛ рд╡реНрдпрд╡рд╕реНрдерд┐рдд рдХрд░рддреА рд╣реИ рдЬреЛ рдкрд╕рд▓рд┐рдпреЛрдВ рдореЗрдВ рджрд╛рдпрд░реЗ рдореЗрдВ рд╣реИрдВ; рдкреНрд░рддреНрдпреЗрдХ рдкрд╕рд▓реА рдПрдХ рдмрд╛рдзреНрдпрдХрд╛рд░реА рд╕реНрддрд░ рдХрд╛ рдкреНрд░рддрд┐рдирд┐рдзрд┐рддреНрд╡ рдХрд░рддреА рд╣реИ)ред рдЙрджрд╛рд╣рд░рдг рдХреЗ рд▓рд┐рдП рдПрдХ impl рдХреЗ рд▓рд┐рдП:

impl<A,B> Foo<B> for Vec<A> {
   fn bar<T,U>(x: ...) { 
       for y in ... {
       }
   }
}

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

- <A,B> (from the impl)
   - <T,U> (from the `bar` method's generics)
      - `x` (from the parameter list)
          - `y` (from the let)

рд╕рд╛рдорд╛рдиреНрдп рддреМрд░ рдкрд░, рддрд░реАрдХреЛрдВ рдХреЗ рдХрд╛рдо рдХрд░рдиреЗ рдХреЗ рддрд░реАрдХреЗ рдкрд░ рдореЙрдбрд▓рд┐рдВрдЧ рдХрд░рдирд╛ рдПрдХ рдмреБрд░рд╛ рд╡рд┐рдЪрд╛рд░ рдирд╣реАрдВ рд╣реИред рдореБрдЭреЗ рд▓рдЧрддрд╛ рд╣реИ рдХрд┐ рд╣рдо рдпрд╣рд╛рдВ рдХреБрдЫ "рднрд╡рд┐рд╖реНрдп рдХрд╛ рдкреНрд░реВрдлрд┐рдВрдЧ" рднреА рдХрд░ рд╕рдХрддреЗ рд╣реИрдВред

рдпрд╣рд╛рдВ рд╡рд╣ рдХреЛрдб рд╣реИ рдЬреЛ рдПрдХ рд╡рд┐рдзрд┐ рдХреЗ рдкреНрд░рдХрд╛рд░ рдкреИрд░рд╛рдореАрдЯрд░ рдХреЛ рджрд╛рдпрд░реЗ рдореЗрдВ рд▓рд╛рддрд╛ рд╣реИ (рдпрд╣ рдПрдХ рд╡рд┐рд╢реЗрд╖рддрд╛ рдореЗрдВ рдкрд░рд┐рднрд╛рд╖рд┐рдд рд╡рд┐рдзрд┐ рдХреЗ рд▓рд┐рдП рд╣реИ):

https://github.com/rust-lang/rust/blob/a35a3abcda67a729edbb7d649dbc663c6feabd4c/src/librustc_resolve/lib.rs#L1890 -L1892

рдЬрдмрдХрд┐ рдПрдХ рд╡рд┐рд╢реЗрд╖рддрд╛ рдореЗрдВ рдкрд░рд┐рднрд╛рд╖рд┐рдд type рдХреЗ рд▓рд┐рдП, рд╣рдореЗрдВ рдПрдХ рдЦрд╛рд▓реА рдкреНрд░рдХрд╛рд░ рдкреИрд░рд╛рдореАрдЯрд░ рд░рд┐рдм ( NoTypeParameters ) рдЬреЛрдбрд╝рдиреЗ рдХреЗ рд▓рд┐рдП рд╣рд╛рд░реНрдбрдХреЛрдб рдХрд┐рдпрд╛ рдЧрдпрд╛ рд╣реИ:

https://github.com/rust-lang/rust/blob/a35a3abcda67a729edbb7d649dbc663c6feabd4c/src/librustc_resolve/lib.rs#L1897 -L1901

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

рд░реБрдЪрд┐ рдХреЗ рдЕрдиреНрдп рдмрд┐рдВрджреБ:

рддреБрдореНрд╣реЗрдВ рдирдпрд╛ рддрд░реАрдХрд╛ рдорд┐рд▓ рдЧрдпрд╛ рд╣реИред

@petrochenkov - рд╕рд╣реА рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рдзреНрд╡рдирд┐?

@nikomatsakis

рд╕рд╣реА рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рдзреНрд╡рдирд┐?

рд╕рдм рдХреБрдЫ рд╕рд╣реА рджрд┐рдЦрддрд╛ рд╣реИред

рдЕрдЧрд▓рд╛ рдХрджрдоред рдЖрдЬреАрд╡рди рд╕рдВрдХрд▓реНрдкред

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

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

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

рдХреЛрдб рдХрд╛ рдПрдХ рдЙрджрд╛рд╣рд░рдг рдмрд┐рдЯ рдпрд╣рд╛рдВ рджрд┐рдпрд╛ рдЧрдпрд╛ рд╣реИред рдпрд╣ рд╡рд╣ рдХреЛрдб рд╣реИ рдЬреЛ impl , struct рдпрд╛ рдЕрдиреНрдп рдЧреИрд░-рдХрд╛рд░реНрдпрд╛рддреНрдордХ рдЖрдЗрдЯрдо рдкрд░ рдЬрд╛рддрд╛ рд╣реИред рдЗрди рдорд╛рдорд▓реЛрдВ рдореЗрдВ, рдЬреИрд╕рд╛ рдХрд┐ GAT рдореЗрдВ рд╣реЛрддрд╛ рд╣реИ, рд╣рдо рдореВрд▓ рд░реВрдк рд╕реЗ Generics рд╕реЗ рд╕рднреА рдЖрдЬреАрд╡рди рдорд╛рдкрджрдВрдбреЛрдВ рдХреЛ рджрд╛рдпрд░реЗ рдореЗрдВ рд▓рд╛рдирд╛ рдЪрд╛рд╣рддреЗ рд╣реИрдВ рдФрд░ рдЙрдиреНрд╣реЗрдВ "рдкреНрд░рд╛рд░рдВрднрд┐рдХ-рдмрд╛рдзреНрдп" рдЬреАрд╡рдирдХрд╛рд▓ рдореЗрдВ рдореИрдк рдХрд░рдирд╛ рдЪрд╛рд╣рддреЗ рд╣реИрдВ:

https://github.com/rust-lang/rust/blob/ddaebe938b8eb1f5e17570ae8091743972e02bdd/src/librustc/middle/resolve_lifetime.rs#L370 -L388

рдЖрдк рджреЗрдЦ рд╕рдХрддреЗ рд╣реИрдВ рдХрд┐ рдпрд╣ рдкрд╣рд▓реЗ рдЬреАрд╡рдирдХрд╛рд▓ рдХрд╛ рдПрдХ рд╡реЗрдХреНрдЯрд░ рдмрдирд╛рддрд╛ рд╣реИ, рдкреНрд░рддреНрдпреЗрдХ рдХреЗ рд▓рд┐рдП Region::early рдЖрд╣реНрд╡рд╛рди рдХрд░рддрд╛ рд╣реИ:

https://github.com/rust-lang/rust/blob/ddaebe938b8eb1f5e17570ae8091743972e02bdd/src/librustc/middle/resolve_lifetime.rs#L376 -L378

рдЗрд╕рдХреЗ рдмрд╛рдж рдпрд╣ Scope рдмрдирд╛рддрд╛ рд╣реИред next_early_index рдЪрд░ рдХреЗрд╡рд▓ рдпрд╣ рдЧрд┐рди рд░рд╣рд╛ рд╣реИ рдХрд┐ рдХрд┐рддрдиреЗ рдкреНрд░рд╛рд░рдВрднрд┐рдХ-рдмрд╛рдзреНрдп рдЬреАрд╡рдирдХрд╛рд▓ рджрд╛рдпрд░реЗ рдореЗрдВ рд╣реИрдВред рдЪреВрдВрдХрд┐ рдпрд╣ рдХреЛрдб рдЖрдЗрдЯрдо рдХреЗ рд▓рд┐рдП рд╡рд┐рд╢рд┐рд╖реНрдЯ рд╣реИ, рдпрд╣ рд╣рдореЗрд╢рд╛ рдЗрд╕ рд╡рд░реНрддрдорд╛рди рдЖрдЗрдЯрдо рдкрд░ рдШреЛрд╖рд┐рдд рдкреНрд░рд╛рд░рдВрднрд┐рдХ-рдмрд╛рдзреНрдп рдЬреАрд╡рдирдХрд╛рд▓ рдХреА рд╕рдВрдЦреНрдпрд╛ рд╣реЛрдЧреАред (рдмрд╛рдж рдореЗрдВ рд╣рдо рдПрдХ рдРрд╕реЗ рдорд╛рдорд▓реЗ рдХреЛ рджреЗрдЦреЗрдВрдЧреЗ рдЬрд╣рд╛рдВ рд╣рдо рдЕрддрд┐рд░рд┐рдХреНрдд рдЬреАрд╡рди рдХрд╛рд▓ рдХреЛ рджрд╛рдпрд░реЗ рдореЗрдВ рд▓рд╛ рд░рд╣реЗ рд╣реИрдВ, рдЬреЛ рдХрд┐ рд╣рдо GAT рдХреЗ рд▓рд┐рдП рдЕрдзрд┐рдХ рдЪрд╛рд╣рддреЗ рд╣реИрдВред)

https://github.com/rust-lang/rust/blob/ddaebe938b8eb1f5e17570ae8091743972e02bdd/src/librustc/middle/resolve_lifetime.rs#L379 -L384

рдЕрдВрдд рдореЗрдВ, рд╣рдо with() рдХрд╛ рдЖрд╣реНрд╡рд╛рди рдХрд░рддреЗ рд╣реИрдВред рдпрд╣ рд╡рд┐рдзрд┐ рджрд╛рдпрд░реЗ рдХреЛ рджрд╛рдпрд░реЗ рдореЗрдВ рд▓рд╛рдПрдЧреА рдФрд░ рдмрдВрдж рдХрд░рдиреЗ рдХрд╛ рдЖрд╣реНрд╡рд╛рди рдХрд░реЗрдЧреАред рдЗрд╕ рдХреНрд▓реЛрдЬрд░ рдХреЗ рдЕрдВрджрд░ рд╣рдо рдЬрд┐рди рднреА рдЬреАрд╡рдирдХрд╛рд▓реЛрдВ рдХрд╛ рджреМрд░рд╛ рдХрд░рддреЗ рд╣реИрдВ, рдЙрдирдореЗрдВ рд╡реЗ рдирд╛рдо рджрд┐рдЦрд╛рдИ рджреЗрдВрдЧреЗ рдЬрд┐рдиреНрд╣реЗрдВ рд╣рдордиреЗ рдЕрднреА-рдЕрднреА рдкрд░рд┐рднрд╛рд╖рд┐рдд рдХрд┐рдпрд╛ рд╣реИ:

https://github.com/rust-lang/rust/blob/ddaebe938b8eb1f5e17570ae8091743972e02bdd/src/librustc/middle/resolve_lifetime.rs#L385 -L388

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

https://github.com/rust-lang/rust/blob/ddaebe938b8eb1f5e17570ae8091743972e02bdd/src/librustc/middle/resolve_lifetime.rs#L482 -L501

рдореБрдЭреЗ рдХреБрдЫ рдмрд╛рддреЛрдВ рдкрд░ рдкреНрд░рдХрд╛рд╢ рдбрд╛рд▓рдиреЗ рджреЛред рд╕рдмрд╕реЗ рдкрд╣рд▓реЗ, рд╡рд┐рдзрд┐ next_early_index рдЕрдЧрд▓реА рдмрд┐рдирд╛ рдЕрд╕рд╛рдЗрди рдХреА рдЧрдИ рдкреНрд░рд╛рд░рдВрднрд┐рдХ-рдмрд╛рдЙрдВрдб рдЗрдВрдбреЗрдХреНрд╕ рд▓реМрдЯрд╛рддреА рд╣реИ:

https://github.com/rust-lang/rust/blob/ddaebe938b8eb1f5e17570ae8091743972e02bdd/src/librustc/middle/resolve_lifetime.rs#L488

рдпрд╣ рдПрдХ рдкреНрд░рд╛рд░рдВрднрд┐рдХ рдмрд┐рдВрджреБ рдкреНрд░рджрд╛рди рдХрд░рддрд╛ рд╣реИред рдЗрд╕рдХреЗ рдмрд╛рдж, рд╣рдо рдирдИ рдкреНрд░рд╛рд░рдВрднрд┐рдХ-рдмрд╛рдЙрдВрдб рд▓рд╛рдЗрдлрд╝рдЯрд╛рдЗрдо рдкрд░рд┐рднрд╛рд╖рд╛рдПрдБ рдмрдирд╛рдиреЗ рдХреЗ рд▓рд┐рдП рдлрд┐рд░ рд╕реЗ Region::early рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рддреЗ рд╣реИрдВ рдЬрд┐рдирдХрд╛ рд╕рдорд╛рдзрд╛рди рдЗрд╕рдХреЗ рд╡рд┐рд░реБрджреНрдз рдХрд┐рдпрд╛ рдЬрд╛рдПрдЧрд╛:

https://github.com/rust-lang/rust/blob/ddaebe938b8eb1f5e17570ae8091743972e02bdd/src/librustc/middle/resolve_lifetime.rs#L490 -L492

рдЕрдВрдд рдореЗрдВ, рд╣рдо рдлрд┐рд░ рд╕реЗ with рдкрд░ рдХреЙрд▓ рдХрд░рдХреЗ рдЙрдиреНрд╣реЗрдВ рджрд╛рдпрд░реЗ рдореЗрдВ рд▓рд╛рддреЗ рд╣реИрдВ:

https://github.com/rust-lang/rust/blob/ddaebe938b8eb1f5e17570ae8091743972e02bdd/src/librustc/middle/resolve_lifetime.rs#L494 -L501

рдареАрдХ рд╣реИ, рд╡реЗ рджреЛ рдЙрджрд╛рд╣рд░рдг рд╣реИрдВред рд╣рдо рджреВрд╕рд░реЗ рд╡рд╛рд▓реЗ рдХреА рддрд░рд╣ рд╣реА рдХреБрдЫ рдХрд░рдирд╛ рдЪрд╛рд╣рддреЗ рд╣реИрдВред рд╣рдо рдЗрди рджреЛ рд╡рд┐рдзрд┐рдпреЛрдВ рдХреА рдкрд░рд┐рднрд╛рд╖рд╛рдУрдВ рдХреЛ рд╕рдВрд╢реЛрдзрд┐рдд рдХрд░рдирд╛ рдЪрд╛рд╣реЗрдВрдЧреЗ:

https://github.com/rust-lang/rust/blob/ddaebe938b8eb1f5e17570ae8091743972e02bdd/src/librustc/middle/resolve_lifetime.rs#L509

https://github.com/rust-lang/rust/blob/ddaebe938b8eb1f5e17570ae8091743972e02bdd/src/librustc/middle/resolve_lifetime.rs#L520

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

рддреЛ рдореИрдВ рдЖрдЬ рдкрд╣рд▓реЗ рдЗрд╕ рдкрд░ рдХреВрдж рдкрдбрд╝рд╛ред рдореИрдВ рдпрд╣ рд╕реБрдирд┐рд╢реНрдЪрд┐рдд рдХрд░рдирд╛ рдЪрд╛рд╣рддрд╛ рд╣реВрдВ рдХрд┐ рдореИрдВ рд╕рд╣реА рд░рд╛рд╕реНрддреЗ рдкрд░ рд╣реВрдВ:

  • рдмрд╕ рдЗрддрдирд╛ рдХрд░рдиреЗ рдХреА рдЬрд░реВрд░рдд рдереА рдХрд┐ рдЬреАрд╡рди рднрд░ рдХреЛ рдорд╛рдирдЪрд┐рддреНрд░ рд╕реЗ рдкрд░рд┐рдЪрд┐рдд рдХрд░рд╛рдпрд╛ рдЬрд╛рдП рдФрд░ рдлрд┐рд░ рд╡рд┐рд╢реЗрд╖рддрд╛/рдирд┐рд╣рд┐рдд рд╡рд╕реНрддреБ рдХреЛ рдЪрд▓рд╛рдпрд╛ рдЬрд╛рдП? рдЬрд╛рдБрдЪ рдХрд╛рдо рдХрд░ рд░рд╣реА рдкреНрд░рддреАрдд рд╣реЛрддреА рд╣реИ, рд╣рд╛рд▓рд╛рдБрдХрд┐ рдпрд╣ рдмрддрд╛рдирд╛ рдХрдард┐рди рд╣реИ (рдмрд╛рдж рдореЗрдВ рджреЗрдЦреЗрдВ)...
  • рдореИрдВрдиреЗ type parameters are not allowed on this type рддреНрд░реБрдЯрд┐рдпреЛрдВ рдХреЛ рдареАрдХ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП qpath_to_ty рдФрд░ associated_path_def_to_ty рдореЗрдВ librustc_typeck/astconv.rs рдХреЗ рд▓рд┐рдП рдЯрд╛рдЗрдк рдкреИрд░рд╛рдореАрдЯрд░ рдирд┐рд╖реЗрдз рдЫреЛрдбрд╝ рджрд┐рдпрд╛ред рдореБрдЭреЗ рд▓рдЧрддрд╛ рд╣реИ рдХрд┐ рдЗрд╕реЗ рдХреБрдЫ рдЪреЗрдХ рдХреЗ рд╕рд╛рде рдмрджрд▓рдиреЗ рдХреА рдЬрд░реВрд░рдд рд╣реИред рднреА...
  • рдореБрдЭреЗ рдЕрдм рдЯрд╛рдЗрдкреЗрдХ рд╕реЗ рдХреНрд░реИрд╢ рд╣реЛ рд░рд╣рд╛ рд╣реИред (рд░рд╛рдЗрдЯрдмреИрдХ, рд╡рд┐рд╢реЗрд╖ рд░реВрдк рд╕реЗ)

рдЯрд╛рдЗрдкреЗрдХ рд╡рд┐рдлрд▓рддрд╛рдУрдВ рдХреЛ src/test/compile-fail/struct-path-associated-type.rs рдЯреНрд░рд┐рдЧрд░ рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИ рдХреНрдпреЛрдВрдХрд┐ рдпрд╣ рдЙрди рдорд╛рдиреЛрдВ рдХреЛ рдЬреЗрдирд░рд┐рдХ рдкреНрд░рджрд╛рди рдХрд░рддрд╛ рд╣реИ рдЬрд┐рдирдХрд╛ рдХреЛрдИ рд╕рдВрдмрджреНрдз рдкреНрд░рдХрд╛рд░ рдирд╣реАрдВ рд╣реИред

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

рдЙрд╕ рдкрд░ рдХрд╛рдо рдХрд░рдиреЗ рдЬрд╛ рд░рд╣реЗ рд╣реИрдВ, рд▓реЗрдХрд┐рди рдХреНрдпрд╛ рдореИрдВ рд╕рд╣реА рджрд┐рд╢рд╛ рдореЗрдВ рдЬрд╛ рд░рд╣рд╛ рд╣реВрдВ, рдЗрд╕ рдкрд░ рд╕рдВрдХреЗрдд рдХреА рд╕рд░рд╛рд╣рдирд╛ рдХреА рдЬрд╛рддреА рд╣реИред

рд╣рд╛рдп @ рдмреНрд░реИрдВрдбрдирд╕рди! рдореИрдВ рд░рд╕реНрдЯ рдХрдВрдкрд╛рдЗрд▓рд░ рдкрд░ рд╣реИрдХрд┐рдВрдЧ рд╕реЗ рдХрд┐рд╕реА рдХреЛ рднреА рд╣рддреЛрддреНрд╕рд╛рд╣рд┐рдд рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдШреГрдгрд╛ рдХрд░рддрд╛ рд╣реВрдВ, рд▓реЗрдХрд┐рди рдореБрдЭреЗ рд▓рдЧрддрд╛ рд╣реИ рдХрд┐ @sunjay рдкрд╣рд▓реЗ рд╕реЗ рд╣реА рдПрдХ рд╣реА рд╕рд╛рдорд╛рди рдкрд░ рд╕рдХреНрд░рд┐рдп рд░реВрдк рд╕реЗ рд╣реИрдХрд┐рдВрдЧ рдХрд░ рд░рд╣рд╛ рдерд╛ рдФрд░ рд╢реБрд░реБрдЖрдд рд╕реЗ рд╣реА рдЗрд╕ рдмрджрд▓рд╛рд╡ рдХрд╛ рдкреАрдЫрд╛ рдХрд░ рд░рд╣рд╛ рд╣реИ, рдЗрд╕рд▓рд┐рдП рд╢рд╛рдпрдж рдпрд╣ рдЙрдирдХреЗ рд▓рд┐рдП рдЦрддреНрдо рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рд╕рдордЭ рдореЗрдВ рдЖрддрд╛ рд╣реИ рдпрд╣ рдкрд░рд┐рд╡рд░реНрддрди рднреА (рдореБрдЭреЗ рд▓рдЧрддрд╛ рд╣реИ рдХрд┐ рд╡реЗ рдкрд╣рд▓реЗ рд╣реА рд╢реБрд░реВ рд╣реЛ рдЪреБрдХреЗ рд╣реИрдВ)ред рдореБрдЭреЗ рдпрдХреАрди рдирд╣реАрдВ рд╣реИ рдХрд┐ рдЗрд╕ рдкреНрд░рдпрд╛рд╕ рдХреЛ рд╕рдорд╛рдирд╛рдВрддрд░ рдХрд░рдиреЗ рдХрд╛ рдХреЛрдИ рд╕реНрдкрд╖реНрдЯ рддрд░реАрдХрд╛ рд╣реИ (рдирд┐рд╢реНрдЪрд┐рдд рд░реВрдк рд╕реЗ рдпрд╣ рд╕рдВрднрд╡ рд╣реИ, рд▓реЗрдХрд┐рди рд╣рдореЗрдВ рд╣рд╛рде рд╕реЗ рдереЛрдбрд╝рд╛ рдкрд╣рд▓реЗ рдХрджрдо рдЙрдард╛рдирд╛ рд╣реЛрдЧрд╛)ред

рд╣рд╛рд▓рд╛рдВрдХрд┐, рдпрджрд┐ рдЖрдк рдирд┐рдкрдЯрдиреЗ рдХреЗ рд▓рд┐рдП рдХреБрдЫ рдЦреЛрдЬрдиреЗ рдореЗрдВ рд░реБрдЪрд┐ рд░рдЦрддреЗ рд╣реИрдВ, рддреЛ рдХреНрдпрд╛ рдореИрдВ рдЗрд╕ рдореАрд▓ рдХреЗ рдкрддреНрдерд░ рдкрд░ рдХреБрдЫ рдмрдЧ рд╕реЗ рдирд┐рдкрдЯрдиреЗ рдХреА рд╕рд┐рдлрд╛рд░рд┐рд╢ рдХрд░ рд╕рдХрддрд╛ рд╣реВрдВ? рдРрд╕рд╛ рд▓рдЧрддрд╛ рд╣реИ рдХрд┐ https://github.com/rust-lang/rust/issues/46472 рдХреЗ рд▓рд┐рдП рдмрд╛рдд рдирд╣реАрдВ рдХреА рдЬрд╛ рд░рд╣реА рд╣реИ, рдореИрдВ рдЬрд▓реНрдж рд╣реА рд╡рд╣рд╛рдВ рдХреБрдЫ рдЯрд┐рдкреНрдкрдгрд┐рдпрд╛рдВ рдЫреЛрдбрд╝рдиреЗ рдХреА рдХреЛрд╢рд┐рд╢ рдХрд░ рд╕рдХрддрд╛ рд╣реВрдВред

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

@ рд╕рдВрдЬрдп , рдпрджрд┐ рдЖрдк рдЕрднреА рднреА рд╕рдХреНрд░рд┐рдп рд░реВрдк рд╕реЗ рдХрд╛рдо рдХрд░ рд░рд╣реЗ рд╣реИрдВ/рдЗрд╕ рдкрд░ рдХрд╛рдо рдХрд░рдиреЗ рдХреА рдпреЛрдЬрдирд╛ рдмрдирд╛ рд░рд╣реЗ рд╣реИрдВ, рддреЛ рдХреГрдкрдпрд╛ рдореБрдЭреЗ рдмрддрд╛рдПрдВ - рдореБрдЭреЗ рдЗрд╕ рдкрд░ рдЕрдкрдирд╛ рдХрд╛рдо рдбреБрдкреНрд▓рд┐рдХреЗрдЯ рдХрд░рдиреЗ рдХрд╛ рдХреЛрдИ рдорддрд▓рдм рдирд╣реАрдВ рд╣реИред

рдирдорд╕реНрддреЗ @brandonson , рдЖрдкрдХреА рдЙрддреНрд╕реБрдХрддрд╛ рдФрд░ рдорджрдж рдХрд░рдиреЗ рдХреА рдЗрдЪреНрдЫрд╛ рдХреЗ рд▓рд┐рдП рдзрдиреНрдпрд╡рд╛рджред :) рдореИрдВ рд╡рд╛рд╕реНрддрд╡ рдореЗрдВ рдЗрд╕ рдкрд░ рд╕рдХреНрд░рд┐рдп рд░реВрдк рд╕реЗ рдХрд╛рдо рдХрд░ рд░рд╣рд╛ рд╣реВрдВред рдореИрдВ рдЗрд╕реЗ рдареАрдХ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдирд┐рдХреЛ рдХреЗ рд╕рд╛рде рдорд┐рд▓рдХрд░ рдХрд╛рдо рдХрд░рддреЗ рд╣реБрдП рдХрд╛рд░реНрдпрд╛рдиреНрд╡рдпрди рдХреЗ рдкреНрд░рддреНрдпреЗрдХ рднрд╛рдЧ рдХреЛ рдЪрд░рдг рджрд░ рдЪрд░рдг рджреЗрдЦ рд░рд╣рд╛ рд╣реВрдВред

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

рдкреНрд░рдЧрддрд┐ рдХреИрд╕реА рдЪрд▓ рд░рд╣реА рд╣реИ? =) рд░рд╛рдд рдореЗрдВ рдЗрд╕рдХреЗ рд╕рд╛рде рдкреНрд░рдпреЛрдЧ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдЗрдВрддрдЬрд╛рд░ рдирд╣реАрдВ рдХрд░ рд╕рдХрддрд╛ <3

рдореБрдЭреЗ рдЖрд╢реНрдЪрд░реНрдп рд╣реИ рдХрд┐ GAT рдФрд░ рдХреЙрдиреНрд╕реНрдЯ рдЬреЗрдирд░рд┐рдХ рдХрд╛ рдХреНрд░реЙрд╕ рд╕реЗрдХреНрд╢рди рдХреИрд╕реЗ рдХрд╛рдо рдХрд░реЗрдЧрд╛ рдФрд░ рдХреНрдпрд╛ рдпрд╣ рдкреНрд░рд╕реНрддрд╛рд╡реЛрдВ рдХрд╛ рд╣рд┐рд╕реНрд╕рд╛ рдерд╛ рдЬрдм рдПрдХ рд╕рд╛рде рд░рдЦрд╛ рдЧрдпрд╛ рдерд╛?

рдореЗрд░рд╛ рдХреНрдпрд╛ рдорддрд▓рдм рд╣реИ рдЗрд╕рдХрд╛ рдПрдХ рдЙрджрд╛рд╣рд░рдг:

trait Foo {
    type Bar<const N>;
}

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

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

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

рдореБрдЭреЗ рд▓рдЧрддрд╛ рд╣реИ рдХрд┐ рдЖрдЧреЗ рдмрдврд╝рдиреЗ рд╡рд╛рд▓реА рд░рдгрдиреАрддрд┐ рджреЛ рдЧреБрдирд╛ рд╣реИ:

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

    • рдХреБрдЫ рдиреАрдВрд╡ рдкрд╣рд▓реЗ рд╣реА рд░рдЦреА рдЬрд╛ рдЪреБрдХреА рд╣реИ, рдЗрд╕рд▓рд┐рдП рдЙрдореНрдореАрдж рд╣реИ рдХрд┐ рдпрд╣ рдХрд╛рдлреА рд╣рдж рддрдХ "рд░рд┐рдлреИрдХреНрдЯрд░рд┐рдВрдЧ" рдХрд╛рд░реНрдп рд╣реИ

    • рд▓реЗрдХрд┐рди рдореБрдЭреЗ рд╡рд┐рд╕реНрддрд╛рд░ рд╕реЗ рд▓рд┐рдЦрдиреЗ рдХреА рдЬрд░реВрд░рдд рд╣реИ, рдЙрд╕ рдпреЛрдЬрдирд╛ рдХрд╛ рдХреЛрдИ рд▓рд┐рдЦрд┐рдд рд╡рд┐рд╡рд░рдг рдирд╣реАрдВ рд╣реИ рдЬрд┐рд╕реЗ рдореИрдВ рдЬрд╛рдирддрд╛ рд╣реВрдВ рдФрд░ рдореЗрд░реЗ рдкрд╛рд╕ рдЗрд╕ рдорд┐рдирдЯ рдХреЗ рд▓рд┐рдП рд╕рдордп рдирд╣реАрдВ рд╣реИред

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

рдпрд╣ рддреЛ рдмрд╣реБрдд рд╣реА рдЕрдЪреНрдЫреА рдмрд╛рдд рд╣реИ !! рдЗрд╕ рдФрд░ рдЕрдиреНрдп рд╕рднреА рдкреНрд░рдпрд╛рд╕реЛрдВ рдореЗрдВ @sunjay рдХреЛ рд╢реБрднрдХрд╛рдордирд╛рдПрдБред

рдкрд╣рд▓рд╛ рдХрджрдо рдпрд╣ рд╕реБрдирд┐рд╢реНрдЪрд┐рдд рдХрд░рдирд╛ рд╣реЛрдЧрд╛ рдХрд┐ рд╣рдорд╛рд░реЗ рдкрд╛рд╕ рдкрд░реАрдХреНрд╖рдгреЛрдВ рдХрд╛ рдПрдХ рдкреВрд░рд╛ рд╕реВрдЯ рд╣реИред рдореМрдЬреВрджрд╛ рдкрд░реАрдХреНрд╖рдгреЛрдВ рдореЗрдВ рдкрд╛рдпрд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИ:

src/test/ui/rfc1598-generic-associated-types

рдХреЗрд╡рд▓ рдЙрдиреНрд╣реЗрдВ рджреЗрдЦрдХрд░, рд╣рдо рдкрд╣рд▓реЗ рд╕реЗ рд╣реА рдХрд┐рдП рдЬрд╛рдиреЗ рд╡рд╛рд▓реЗ рдХреБрдЫ рдХрд╛рд░реНрдпреЛрдВ рдХреЛ рджреЗрдЦ рд╕рдХрддреЗ рд╣реИрдВ:

  • [ ] construct_with_other_type.rs -- рдЕрдкреНрд░рддреНрдпрд╛рд╢рд┐рдд E0110 рддреНрд░реБрдЯрд┐ рджреЗрддрд╛ рд╣реИ
  • [x] empty_generics -- рдЬрд╛рдВрдЪрддрд╛ рд╣реИ рдХрд┐ type Bar<,> рддреНрд░реБрдЯрд┐ рджреЗрддрд╛ рд╣реИ, рдареАрдХ рд▓рдЧрддрд╛ рд╣реИ
  • [x] generic-associated-types-where.rs -- рдЬрд╛рдВрдЪрддрд╛ рд╣реИ рдХрд┐ рд╣рдо where рдХреНрд▓реЙрдЬ рдХреЛ рд╕рд╣реА рдЬрдЧрд╣реЛрдВ рдкрд░ рдкрд╛рд░реНрд╕ рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ, рдареАрдХ рд▓рдЧрддрд╛ рд╣реИ
  • [ ] generic_associated_type_undeclared_lifetimes.rs -- рдЕрдкреНрд░рддреНрдпрд╛рд╢рд┐рдд E0110 рддреНрд░реБрдЯрд┐ рджреЗрддрд╛ рд╣реИ
  • [ ] iterable.rs -- рдЕрдкреНрд░рддреНрдпрд╛рд╢рд┐рдд E0110 рддреНрд░реБрдЯрд┐ рджреЗрддрд╛ рд╣реИ
  • [ ] pointer_family.rs -- рдЕрдкреНрд░рддреНрдпрд╛рд╢рд┐рдд E0109 рддреНрд░реБрдЯрд┐ рджреЗрддрд╛ рд╣реИ
  • [ ] streaming_iterator.rs -- рдЕрдкреНрд░рддреНрдпрд╛рд╢рд┐рдд E0110 рддреНрд░реБрдЯрд┐ рджреЗрддрд╛ рд╣реИ

рд╡реЗ рд╕реНрдерд╛рди рдЬрд╣рд╛рдБ рдХрд╡рд░реЗрдЬ рдХреА рдХрдореА рд╣реИ

  • [ ] рд╡рд░реНрддрдорд╛рди рдореЗрдВ рд╣рдорд╛рд░реЗ рдкрд╛рд╕ рдмрд╣реБрдд рдЕрдзрд┐рдХ "рдЕрдкреЗрдХреНрд╖рд┐рдд рдЙрдкрдпреЛрдЧ" рдкрд░реАрдХреНрд╖рдг рдирд╣реАрдВ рд╣реИрдВ -- рдЕрд░реНрдерд╛рдд, рд╡реЗ рдЪреАрдЬрд╝реЗрдВ рдЬреЛ рд╕рдлрд▓ рд╣реЛрдиреА рдЪрд╛рд╣рд┐рдП

    • pointer_family рдЙрд╕ рджрд┐рд╢рд╛ рдореЗрдВ рдкреНрд░рддреАрдд рд╣реЛрддрд╛ рд╣реИ

    • рдореИрдВ рдХрд┐рд╕реА рдкреНрд░рдХрд╛рд░ рдХреЗ trait Iterable { type Item; type Iter<'a>: Iterator<Item = &'a Self::Item>; } рдкрд░реАрдХреНрд╖рдг рдХреА рдЕрдкреЗрдХреНрд╖рд╛ рдХрд░рддрд╛ рд╣реВрдВ

  • [ ] рд▓рд╛рдЗрдлрдЯрд╛рдЗрдо рд╢реИрдбреЛрдЗрдВрдЧ рдЯреЗрд╕реНрдЯ -- рд╣рдо рдЖрдо рддреМрд░ рдкрд░ рд▓рд╛рдЗрдлрд╝рдЯрд╛рдЗрдо рд╢реИрдбреЛрдЗрдВрдЧ рдХреЛ рдкреНрд░рддрд┐рдмрдВрдзрд┐рдд рдХрд░рддреЗ рд╣реИрдВ, рдЗрд╕рд▓рд┐рдП рдЗрдиреНрд╣реЗрдВ рдЕрд╡реИрдз рд╣реЛрдирд╛ рдЪрд╛рд╣рд┐рдП:

    • trait Foo<'a> { type Item<'a>; }

    • impl<'a> Foo<'a> for &'a u32 { type Item<'a> = i32; }

  • [] "рдкреВрд░реА рддрд░рд╣ рд╕реЗ рдпреЛрдЧреНрдп" рд╕рд┐рдВрдЯреИрдХреНрд╕ рдХрд╛ рдкрд░реАрдХреНрд╖рдг рдирд╣реАрдВ рдХрд┐рдпрд╛ рдЬрд╛ рд░рд╣рд╛ рд╣реИ

    • рдЙрджрд╛рд╣рд░рдг рдХреЗ рд▓рд┐рдП, pointer_family рдкрд░реАрдХреНрд╖рдг рдореЗрдВ Self::Pointer<T> рд╣реИ, рд▓реЗрдХрд┐рди <Self as PointerFamily>::Pointer<T> рдирд╣реАрдВ рд╣реИ

  • [ ] GAT рдХреЗ рд▓рд┐рдП рддрд░реНрдХреЛрдВ рдХреА рдЧрд▓рдд рд╕рдВрдЦреНрдпрд╛ред рдЙрджрд╛рд╣рд░рдг рдХреЗ рд▓рд┐рдП, рдКрдкрд░ рджреА рдЧрдИ Iterable рдкрд░рд┐рднрд╛рд╖рд╛:

    • <T as Iterable>::Item -- рдХреЛрдИ рдкреИрд░рд╛рдореАрдЯрд░ рдирд╣реАрдВ? рдЦрд░рд╛рдмред

    • рдзреНрдпрд╛рди рджреЗрдВ рдХрд┐ рд╣рдо рдЗрд╕реЗ рдХреБрдЫ рд╕рдВрджрд░реНрднреЛрдВ рдореЗрдВ рд╕реНрд╡реАрдХрд╛рд░ рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ, рдХреНрдпреЛрдВрдХрд┐ рдХреБрдЫ рддреБрд▓рдиреАрдп рд╕рдВрджрд░реНрднреЛрдВ рдореЗрдВ рд╣рдо рдЬреАрд╡рди рдХреЛ рд╕рдорд╛рдкреНрдд рдХрд░рдиреЗ рдХреА рдЕрдиреБрдорддрд┐ рджреЗрддреЗ рд╣реИрдВред

      рдореИрдВ рдпрд╣рд╛рдБ рдХрд┐рд╕реА рднреА рддрд░рд╣ рдЬрд╛ рд╕рдХрддрд╛ рдерд╛; рдореИрдВ рдЪрд╛рд╣реВрдВрдЧрд╛ рдХрд┐ рд▓реЛрдЧ рдЗрд╕ рддрд░рд╣ рдХреЗ рдорд╛рдорд▓реЛрдВ рдореЗрдВ рдПрдХ рд╕реНрдкрд╖реНрдЯ '_ рд▓рд┐рдЦреЗрдВред

    • <T as Iterable>::Item<'_> -- рд╕рд╣реА!

    • <T as Iterable>::Item<T> -- рдмрд╣реБрдд рд╕рд╛рд░реЗ рдкреНрд░рдХрд╛рд░!

    • рдЖрджрд┐, рдРрд╕реЗ рдкрд░реАрдХреНрд╖рдг рдХрд░рдирд╛ рдЕрдЪреНрдЫрд╛ рд╣реЛрдЧрд╛ рдЬреЛ рдирд┐рд╢реНрдЪрд┐рдд рд░реВрдк рд╕реЗ рджреЛрдиреЛрдВ рдкреНрд░рдХрд╛рд░ рдФрд░ рдЬреАрд╡рдирдХрд╛рд▓ рд▓реЗрддреЗ рд╣реИрдВ

  • [ ] рд╕рдВрдмрджреНрдз рдкреНрд░рдХрд╛рд░реЛрдВ рдкрд░ рдЪреВрдХ? trait Foo { type Bar<T, U = T> where T: PartialEq<U>; }

    • рдЙрд╕ рд╕реНрдерд┐рддрд┐ рдореЗрдВ, SomeType::Bar<u32> рдХреЗ рд▓рд┐рдП рд╢реЛрд░ рд╣реЛрдЧрд╛ SomeType::Bar<u32,u32> , рдЬрд┐рд╕реЗ рд╣рдореЗрдВ рдЬрд╛рдВрдЪрдирд╛ рдЪрд╛рд╣рд┐рдПред

рдЕрдкреНрд░рддреНрдпрд╛рд╢рд┐рдд E0110 рддреНрд░реБрдЯрд┐рдпреЛрдВ рдХреЛ рдареАрдХ рдХрд░рдирд╛

рддреНрд░реБрдЯрд┐ E0110 prohibit_type_params рджреНрд╡рд╛рд░рд╛ рд░рд┐рдкреЛрд░реНрдЯ рдХреА рдЧрдИ рд╣реИ:

https://github.com/rust-lang/rust/blob/e65547d4fad0425d1db4f33a4d8134bf2cad939e/src/librustc_typeck/astconv.rs#L912

рдкрд╣рд▓рд╛ рдХрджрдо рдпрд╣ рдкрддрд╛ рд▓рдЧрд╛рдирд╛ рд╣реИ рдХрд┐ рдЗрд╕реЗ рдХрд╣рд╛рдВ рд╕реЗ рдмреБрд▓рд╛рдпрд╛ рдЧрдпрд╛ рд╣реИред рдРрд╕рд╛ рдХрд░рдиреЗ рдХрд╛ рдореЗрд░рд╛ рдкрд╕рдВрджреАрджрд╛ рддрд░реАрдХрд╛ рд╕реНрдерд╛рдиреАрдп рдирд┐рд░реНрдорд╛рдг рдкреНрд░рд╛рдкреНрдд рдХрд░рдирд╛ рдФрд░ -Ztreat-err-as-bug рдХреЗ рд╕рд╛рде рд╕рдВрдпреБрдХреНрдд RUST_BACKTRACE=1 рдЙрдкрдпреЛрдЧ рдХрд░рдирд╛ рд╣реИред рд▓реЗрдХрд┐рди рдореИрдВ рдЖрдкрдХреЛ рд╡реЗ рдкрд░рд┐рдгрд╛рдо рдирд╣реАрдВ рджрд┐рдЦрд╛ рд╕рдХрддрд╛ рдХреНрдпреЛрдВрдХрд┐ рдЬрдВрдЧ рдЕрднреА рднреА рдмрди рд░рд╣реА рд╣реИред :P рддреЛ рдЗрд╕рдХреЗ рдмрдЬрд╛рдп рдореИрдВрдиреЗ рдПрдХ рддреНрд╡рд░рд┐рдд rg prohibit_type_params рдХрд┐рдпрд╛, рдореБрдЭреЗ рдЬрд▓реНрджреА рд╕реЗ рдПрдХ рд╕рдВрджрд┐рдЧреНрдз рдорд╛рдорд▓реЗ рдХреЛ рдЗрдВрдЧрд┐рдд рдХрд░рдиреЗ рджреЗрдВ рдЬреЛ рдореБрдЭреЗ рджрд┐рдЦрд╛рдИ рджреЗ рд░рд╣рд╛ рд╣реИред

рдПрдХ рдЖрд╣реНрд╡рд╛рди associated_path_def_to_ty рд╕реЗ рд╣реИ:

https://github.com/rust-lang/rust/blob/e65547d4fad0425d1db4f33a4d8134bf2cad939e/src/librustc_typeck/astconv.rs#L791 -L803

рдЬреИрд╕рд╛ рдХрд┐ рдЯрд┐рдкреНрдкрдгреА рдЗрдВрдЧрд┐рдд рдХрд░рддреА рд╣реИ, рдЗрд╕реЗ Pointer<T> рдШрдЯрдХ рдХреЛ Self::Pointer<T> рдЬреИрд╕реЗ рдкрде рдореЗрдВ рд╣рд▓ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдЖрдордВрддреНрд░рд┐рдд рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИ (рдзреНрдпрд╛рди рджреЗрдВ рдХрд┐ рдЯрд╛рдЗрдк рдкреИрд░рд╛рдореАрдЯрд░ рдХреЛ рдкрде рдЦрдВрдб рдХрд╛ рд╣рд┐рд╕реНрд╕рд╛ рдорд╛рдирд╛ рдЬрд╛рддрд╛ рд╣реИ, рд╕рд╛рде рд╣реА рд╡реЗ рдЬрд┐рд╕ рдирд╛рдо рд╕реЗ рдЬреБрдбрд╝реЗ рд╣реЛрддреЗ рд╣реИрдВ ) GATs рддрдХ, рдЯрд╛рдЗрдк рдкреИрд░рд╛рдореАрдЯрд░ рд╡рд╣рд╛рдВ рдХрд╛рдиреВрдиреА рдирд╣реАрдВ рдереЗ (рдЙрджрд╛рд╣рд░рдг рдХреЗ рд▓рд┐рдП, T::Item ), рдЗрд╕рд▓рд┐рдП рд╣рдорд╛рд░реЗ рдкрд╛рд╕ рдХреЗрд╡рд▓ рдПрдХ рдХрдВрдмрд▓ рдкреНрд░рддрд┐рдмрдВрдз рд╣реИ:

https://github.com/rust-lang/rust/blob/e65547d4fad0425d1db4f33a4d8134bf2cad939e/src/librustc_typeck/astconv.rs#L810

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

рдХреНрдпрд╛ рдХреЛрдИ рдЕрднреА рднреА рдЗрд╕ рдкрд░ рдХрд╛рдо рдХрд░ рд░рд╣рд╛ рд╣реИ? рдореБрдЭреЗ рдРрд╕рд╛ рд▓рдЧрддрд╛ рд╣реИ рдХрд┐ рдпрд╣ рдПрдХ рд▓рдВрдмрд╛ рд░рд╛рд╕реНрддрд╛ рддрдп рдХрд░рдирд╛ рд╣реИред GAT рдореЗрд░рд╛ рд╕рдмрд╕реЗ рд╡рд╛рдВрдЫрд┐рдд RFC рд╣реИред рдпрджрд┐ рдирд╣реАрдВ, рддреЛ рдореБрдЭреЗ рдХреБрдЫ рдкрд░реАрдХреНрд╖рдгреЛрдВ рдореЗрдВ рдпреЛрдЧрджрд╛рди рджреЗрдирд╛ рдЕрдЪреНрдЫрд╛ рд▓рдЧреЗрдЧрд╛...

@rickyhan рддреЛ @Centril рдФрд░ @gavento рдкрд░реАрдХреНрд╖рдг рдХрд╛рд░реНрдп рдХреЛ рд╡рд┐рднрд╛рдЬрд┐рдд рдХрд░рдиреЗ рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ WG- рд▓рдХреНрд╖рдгреЛрдВ рдХреА рдЧрдбрд╝рдмрдбрд╝реА рдкрд░ рдмрд╛рдд рдХрд░ рд░рд╣реЗ рдереЗ, рд▓реЗрдХрд┐рди рдореБрдЭреЗ рдирд╣реАрдВ рдкрддрд╛ рдХрд┐ рдХреЛрдИ рдкреНрд░рдЧрддрд┐ рд╣реБрдИ рд╣реИ рдпрд╛ рдирд╣реАрдВред рд╣реЛ рд╕рдХрддрд╛ рд╣реИ рдХрд┐ рд╡реЗ рдЗрд╕рдореЗрдВ рд╢рд╛рдорд┐рд▓ рд╣реЛрдВред рдореБрдЭреЗ рд▓рдЧрддрд╛ рд╣реИ рдХрд┐ рдПрдХ рдкреАрдЖрд░ рдХрд╛ рд╕реНрд╡рд╛рдЧрдд рдХрд┐рдпрд╛ рдЬрд╛рдПрдЧрд╛ред =)

рдХреНрд╖рдорд╛ рдХрд░реЗрдВ рдпрджрд┐ рдореИрдВ рдореВрд░реНрдЦ рд╣реВрдВ, рд▓реЗрдХрд┐рди рдХреНрдпрд╛ рдЗрд╕ рддрд░рд╣ рдХреА рдмрд╛рдд GAT рдХреЗ рд╕рд╛рде рдХрд╛рдиреВрдиреА рд╣реЛрдиреЗ рд╡рд╛рд▓реА рд╣реИ?

trait Sequencer {
    type Wrap<A>;
    fn chain<A, B, F>(Self::Wrap<A>, F) -> Self::Wrap<B>
        where F: FnOnce(A) -> Self::Wrap<B>;
    fn wrap<A>(A) -> Self::Wrap<A>;
}

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

@ рдорд╛рд░реНрдХ-рдЖрдИрдПрдо рдореИрдВрдиреЗ рдЗрд╕реЗ рдкрд┐рдЫрд▓реЗ рд╣рдлреНрддреЗ рдПрдХ рд╢реЙрдЯ рджрд┐рдпрд╛ рдерд╛ред рдореЗрд░реА рд╕рдордЭ рд╕реЗ, рд╕рд┐рдВрдЯреИрдХреНрд╕ рдкрд╛рд░реНрд╕рд░ рд╣реИ (рд╣рд╛рд▓рд╛рдВрдХрд┐ рд▓рд╛рдкрддрд╛ рдкрд░реАрдХреНрд╖рдг)ред рд▓реЗрдХрд┐рди "рдХрд╛рд░реНрдпрд╛рдиреНрд╡рдпрди" рдЕрднреА рддрдХ рдирд╣реАрдВ рд▓рд┐рдЦрд╛ рдЧрдпрд╛ рд╣реИред (рдЕрдзрд┐рдХ рдЬрд╛рдирдХрд╛рд░реА рдХреЗ рд▓рд┐рдП https://github.com/rust-lang/rust/issues/44265#issuecomment-330915766 рджреЗрдЦреЗрдВ)

@quadrupleslap AIUI, рдпрд╣ рдмрд╛рдж рдореЗрдВ рд╕рдВрднрд╡ рд╣реЛрдЧрд╛, рд▓реЗрдХрд┐рди рд╕рдмрд╕реЗ рдкрд╣рд▓реЗ, GAT рдХреЗрд╡рд▓ рдЖрдЬреАрд╡рди рдорд╛рдкрджрдВрдбреЛрдВ рдХрд╛ рд╕рдорд░реНрдерди рдХрд░реЗрдЧрд╛ред

@ рдмреЙрд╕реНрдХреЛрдк рдЖрд░рдПрдлрд╕реА рдирд┐рд░реНрджрд┐рд╖реНрдЯ рдХрд░рддрд╛ рд╣реИ рдХрд┐ рдЯрд╛рдЗрдк рдкреИрд░рд╛рдореАрдЯрд░ рднреА рд╕рдорд░реНрдерд┐рдд рд╣реЛрдВрдЧреЗред

рдХреНрдпрд╛ рдХрд┐рд╕реА рдХреЛ рд░рд╕реНрдЯрд╕реА рдореЗрдВ рд╕рд┐рдВрдЯреИрдХреНрд╕ рдХреЗ рдХрд╛рд░реНрдпрд╛рдиреНрд╡рдпрди рдХреА рд╕рд╣реА рд╕реНрдерд┐рддрд┐ рдкрддрд╛ рд╣реИ? рдпрд╣ рдЬреНрдпрд╛рджрд╛рддрд░ рд╡рд╣рд╛рдВ рд▓рдЧрддрд╛ рд╣реИ, рд▓реЗрдХрд┐рди рдЙрдЪреНрдЪ рд░реИрдВрдХ рд╡рд╛рд▓реА рд╕реАрдорд╛рдПрдВ рдЖрдИрд╕реАрдИ рдЙрддреНрдкрдиреНрди рдХрд░рддреА рд╣реИрдВ:
http://play.rust-lang.org/?gist=a48959858ed5dd432c2396feae5c3cc1&version=nightly&mode=debug

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

рдореЗрд░реЗ рд▓рд┐рдП рдРрд╕рд╛ рд▓рдЧрддрд╛ рд╣реИ рдХрд┐ рд╕рдВрдЪрд╛рд░ GAT рдХреЗ рдХрд╛рд░реНрдпрд╛рдиреНрд╡рдпрди рдХреЛ рдзреАрдорд╛ рдХрд░рдиреЗ рд╡рд╛рд▓реА рдкреНрд░рдореБрдЦ рд╕рдорд╕реНрдпрд╛ рд╣реИред рдРрд╕рд╛ рд▓рдЧрддрд╛ рд╣реИ рдХрд┐ рдХрдо рд╕реЗ рдХрдо рдХреБрдЫ рд▓реЛрдЧ рдЗрд╕ рдкрд░ рдХрд╛рдо рдХрд░рдиреЗ рдореЗрдВ рд░реБрдЪрд┐ рд░рдЦрддреЗ рд╣реИрдВ, рд▓реЗрдХрд┐рди рдХреЛрдИ рднреА рд╡рд╛рд╕реНрддрд╡ рдореЗрдВ рд╕рдЯреАрдХ рдХрд╛рд░реНрдпрд╛рдиреНрд╡рдпрди рд╕реНрдерд┐рддрд┐ рдирд╣реАрдВ рдЬрд╛рдирддрд╛ рд╣реИ рдФрд░ рдХреМрди рдкрд╣рд▓реЗ рд╕реЗ рд╣реА рдЗрд╕ рдкрд░ рдХрд╛рдо рдХрд░ рд░рд╣рд╛ рд╣реИред GAT рдХреЛ рд▓рд╛рдЧреВ рдХрд░рдиреЗ рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рдмрд╛рдд рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдЖрдк рдПрдХ Discord (рдпрд╛ IRC?) рдЪреИрдирд▓ рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рдХреНрдпрд╛ рд╕реЛрдЪрддреЗ рд╣реИрдВ? рдореБрдЭреЗ рд▓рдЧрддрд╛ рд╣реИ рдХрд┐ рдпрд╣ рдирд┐рд╢реНрдЪрд┐рдд рд░реВрдк рд╕реЗ рдорджрдж рдХрд░реЗрдЧрд╛ред

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

рдЗрд╕рд▓рд┐рдП рдореИрдВрдиреЗ рдбрд┐рд╕реНрдХреЙрд░реНрдб рдкрд░ рдПрдХ рд╕рдорд░реНрдкрд┐рдд рдЪреИрдирд▓ рдорд╛рдВрдЧрд╛ред рд▓реЗрдХрд┐рди рдЪреИрдирд▓ рдорд┐рд▓рдиреЗ рдХреЗ рдмрдЬрд╛рдп рдореИрдВрдиреЗ рдХреБрдЫ рдЪреАрдЬреЗрдВ рд╕реАрдЦреАрдВред рдореИрдВрдиреЗ GAT рд╕реЗ рд╕рдВрдмрдВрдзрд┐рдд рд╣рд░ рдЪреАрдЬ рдХреА рдЦреЛрдЬ рдХреАред рдЗрд╕рд▓рд┐рдП рдореИрдВ рдЗрд╕ рд╕реБрд╡рд┐рдзрд╛ рдХреЗ рд╕рдВрдмрдВрдз рдореЗрдВ рд╕рднреА рдЬрд╛рдирдХрд╛рд░реА рдХреЛ рд╕рдВрдХреНрд╖реЗрдк рдореЗрдВ рдкреНрд░рд╕реНрддреБрдд рдХрд░рдиреЗ рдХрд╛ рдкреНрд░рдпрд╛рд╕ рдХрд░реВрдВрдЧрд╛; рд╢рд╛рдпрдж рдпрд╣ рдХреБрдЫ рд▓реЛрдЧреЛрдВ рдХреЗ рд▓рд┐рдП рдЙрдкрдпреЛрдЧреА рд╣реИред рд▓реЗрдХрд┐рди рдореИрдВ рдХреБрдЫ рдирд╣реАрдВ рдЬрд╛рдирддрд╛, рдЗрд╕рд▓рд┐рдП рдЗрд╕реЗ рдирдордХ рдХреЗ рджрд╛рдиреЗ рдХреЗ рд╕рд╛рде рд▓реЗ рд▓реЛ! рдЗрд╕рдХреЗ рдЕрд▓рд╛рд╡рд╛: рдХреГрдкрдпрд╛ рдореБрдЭреЗ рдмрддрд╛рдПрдВ рдХрд┐ рдХреНрдпрд╛ рдХреБрдЫ рдЬрд╛рдирдХрд╛рд░реА рдЧрд▓рдд рд╣реИ рддрд╛рдХрд┐ рдореИрдВ рдЗрд╕реЗ рдареАрдХ рдХрд░ рд╕рдХреВрдВред

GAT рдХреЗ рд╕рдВрдмрдВрдз рдореЗрдВ рдХрд╛рд░реНрдпрд╛рдиреНрд╡рдпрди рдкреНрд░рдпрд╛рд╕реЛрдВ рдХрд╛ рд╕рд╛рд░рд╛рдВрд╢

рддрдм рд╕реЗ рдХреЛрдИ UI рдкрд░реАрдХреНрд╖рдг рдирд╣реАрдВ рдЬреЛрдбрд╝рд╛ рдЧрдпрд╛ ред рдФрд░ рдореБрдЭреЗ рд╕реАрдзреЗ GAT рд╕реЗ рд╕рдВрдмрдВрдзрд┐рдд рдХреЛрдИ рдЕрдиреНрдп рдкреАрдЖрд░ рдирд╣реАрдВ рдорд┐рд▓ рд░рд╣рд╛ рд╣реИред

рд╣рд╛рд▓рд╛рдВрдХрд┐ , рдКрдкрд░ рд╕реЗ рдмрд┐рдВрджреБ (рд╕реА) (рд╡рд┐рд╢реЗрд╖рддрд╛ рдкреНрд░рдгрд╛рд▓реА) рдкрд░ "рдЧреБрдкреНрдд рд░реВрдк рд╕реЗ" рдХрд╛рдо рдХрд┐рдпрд╛ рдЬрд╛ рд░рд╣рд╛ рд╣реИред рдЬрд╣рд╛рдВ рддрдХ тАЛтАЛрдореИрдВ рдЗрд╕реЗ рд╕рдордЭрддрд╛ рд╣реВрдВ, рдпреЛрдЬрдирд╛ рдЬрд▓реНрдж рд╣реА рдирдП рдЪрд╛рдХ-рдЖрдзрд╛рд░рд┐рдд рд╡рд┐рд╢реЗрд╖рддрд╛ рд╕реЙрд▓реНрд╡рд░ рдореЗрдВ рдорд╛рдЗрдЧреНрд░реЗрдЯ рдХрд░рдиреЗ рдХреА рд╣реИ рди рдХрд┐ рдкреБрд░рд╛рдиреЗ рд╕рд┐рд╕реНрдЯрдо рдкрд░ GAT рдХреЛ рдХрд╛рдо рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдПред рдирдП рд╡рд┐рд╢реЗрд╖рддрд╛ рд╕реЙрд▓реНрд╡рд░ рдХрд╛ рдПрдХреАрдХрд░рдг "рдЪреЙрдХреАрдлрд┐рдХреЗрд╢рди" рдЯреНрд░реИрдХрд┐рдВрдЧ рд╕рдорд╕реНрдпрд╛ рджреНрд╡рд╛рд░рд╛ рдЯреНрд░реИрдХ рдХрд┐рдпрд╛ рдЬрд╛ рд░рд╣рд╛ рд╣реИред рдЪрд╛рдХ рдФрд░ рдЪрд╛рдХреАрдХрд░рдг рд╕реЗ рд╕рдВрдмрдВрдзрд┐рдд рдХрд╛рдлреА рдХреБрдЫ рдкреАрдЖрд░ рд╣реИрдВред рд╡рд┐рд╢реЗрд╖ рд░реВрдк рд╕реЗ, рдПрдХ рдЪрд╛рдХ рдкреАрдЖрд░ рд╣реИ рдЬрд┐рд╕реЗ "рдЬреАрдПрдЯреА рд▓рд╛рдЧреВ рдХрд░рдирд╛ рд╕рдорд╛рдкреНрдд рдХрд░реЗрдВ" (рдорд░реНрдЬ 2018-05-24) рдХрд╣рд╛ рдЬрд╛рддрд╛ рд╣реИред рддреЛ рдРрд╕рд╛ рд▓рдЧрддрд╛ рд╣реИ рдХрд┐ GAT рдХреЗ рд▓рд┐рдП рдХреЛрд░ рд╕рд┐рд╕реНрдЯрдо рдкрд╣рд▓реЗ рд╕реЗ рд╣реА рдореМрдЬреВрдж рд╣реИред

рдЙрд╕ рдиреЗ рдХрд╣рд╛, рдЪрд╛рдХ рдореЗрдВ "GATs" рдПрдХ рдкреНрд░реЛрдЯреЛрдЯрд╛рдЗрдк рдХрд╛рд░реНрдпрд╛рдиреНрд╡рдпрди рд╣реИ рдФрд░ рдЗрд╕реЗ rustc рдореЗрдВ рдЙрдкрдпреЛрдЧ рдХрд░рдирд╛ рдХреЗрд╡рд▓ use chalk; рдирд╣реАрдВ рд╣реИред рдЬреИрд╕рд╛ рдХрд┐ @scalexm рдиреЗ рдореБрдЭреЗ рдмрддрд╛рдпрд╛: "рдРрд╕рд╛ рд▓рдЧрддрд╛ рд╣реИ рдХрд┐ рдмрд╣реБрдд рдХреБрдЫ [рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП]" рд╣реИред


рдЕрдзрд┐рдХ рдЬрд╛рдирдХрд╛рд░реА рдХреЗ рд▓рд┐рдП рдФрд░ рдорджрдж рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП, #wg-traits рдбрд┐рд╕реНрдХреЙрд░реНрдб рдЪреИрдирд▓ рдФрд░ WG рдЯреНрд░реИрдХрд┐рдВрдЧ рд╕рдорд╕реНрдпрд╛ рдХреЗ рд▓рдХреНрд╖рдгреЛрдВ рдкрд░ рдПрдХ рдирдЬрд╝рд░ рдбрд╛рд▓рдирд╛ рд╕рдВрднрд╡рддрдГ рдЙрдкрдпреЛрдЧреА рд╣реИред

рддреЛ @nikomatsakis рдиреЗ рд░рд╕реНрдЯ-рд▓реИрдВрдЧ рдбрд┐рд╕реЙрд░реНрдбрд░ рд╕рд░реНрд╡рд░ рдкрд░ #wg-traits-gat рдЪреИрдирд▓ рдмрдирд╛рдпрд╛ ( рдпрд╣рд╛рдВ рд╢рд╛рдорд┐рд▓ рд╣реЛрдВ )ред рдпрд╣ рдмрд╣реБрдд рдЕрдЪреНрдЫрд╛ рд╣реЛрдЧрд╛ рдпрджрд┐ рд╣рдо рд╣рд░ рдЙрд╕ рд╡реНрдпрдХреНрддрд┐ рдХреЛ рдкреНрд░рд╛рдкреНрдд рдХрд░ рд╕рдХреЗрдВ рдЬреЛ рд╡рд╣рд╛рдВ рдорджрдж рдХрд░рдирд╛ рдЪрд╛рд╣рддрд╛ рд╣реИред рд╕рд╛рде рд╣реА рдХреБрдЫ рд▓реЛрдЧ рдЬреЛ рдЗрд╕ рд╕реБрд╡рд┐рдзрд╛ рдХреА рд╕реНрдерд┐рддрд┐ рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рдЬрд╛рдирддреЗ рд╣реИрдВ (рд╡рд┐рд╢реЗрд╖ рд░реВрдк рд╕реЗ, рдЕрднреА рднреА рдХреНрдпрд╛ рдХрд░рдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реИ рдФрд░ рд╣рдо рдХрд╣рд╛рдБ рдорджрдж рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ)ред рдЗрд╕рд╕реЗ рд╕рдВрдЪрд╛рд░ рдЖрд╕рд╛рди рдФрд░ рддреЗрдЬрд╝ рд╣реЛрдирд╛ рдЪрд╛рд╣рд┐рдП, рдЦрд╛рд╕рдХрд░ рдореЗрд░реЗ рдЬреИрд╕реЗ рд▓реЛрдЧреЛрдВ рдХреЗ рд▓рд┐рдП рдЬреЛ рдЕрднреА рддрдХ рдЧрд╣рд░рд╛рдИ рд╕реЗ рд╢рд╛рдорд┐рд▓ рдирд╣реАрдВ рд╣реИрдВ/WG рдХреЗ рд▓рдХреНрд╖рдгреЛрдВ рдХрд╛ рд╣рд┐рд╕реНрд╕рд╛ рд╣реИрдВ :)

рдХреНрдпрд╛ рдЗрд╕ рдкрд░ рд╣рд╛рд▓ рд╣реА рдореЗрдВ рдХреЛрдИ рдЕрдкрдбреЗрдЯ рдЖрдпрд╛ рд╣реИ? рдХреНрдпрд╛ рд╣рдо рд╕рдВрдХрд▓рдХ рдореЗрдВ рдЪрд╛рдХ рдПрдХреАрдХрд░рдг рдХреА рдкреНрд░рддреАрдХреНрд╖рд╛ рдХрд░ рд░рд╣реЗ рд╣реИрдВ? (рд╢рд╛рдпрдж рдЗрд╕рдХреЗ рд▓рд┐рдП рдПрдХ рдЕрд▓рдЧ рдореБрджреНрджрд╛ рд╣реИред)

рд╢рд╛рдпрдж рдЗрд╕рдХреЗ рд▓рд┐рдП рдПрдХ рдЕрд▓рдЧ рдореБрджреНрджрд╛ рд╣реИред

48049

рдПрдХ рдиреЛрдЯ рдХреЗ рд░реВрдк рдореЗрдВ (рд╕рдВрднрд╡рддрдГ рдЬреНрдЮрд╛рдд), рдпрд╣ рдХреЛрдб рд╕рдВрдХрд▓рдХ рдХреЛ рдбрд░рд╛рддрд╛ рд╣реИ:

use typenum::{U1,U2,U3,Unsigned};

trait Array {
    type Of<Elem> ;
}

impl Array for U1 { type Of<T> = [T;1]; }
impl Array for U2 { type Of<T> = [T;2]; }
impl Array for U3 { type Of<T> = [T;3]; }

@wdanilo : рдореЗрд░рд╛ рдорд╛рдирдирд╛ тАЛтАЛрд╣реИ рдХрд┐ рдпрд╣ https://github.com/rust-lang/rust/issues/64755 рд╣реИред

@varkor рдХрдорд╛рд▓, рдзрдиреНрдпрд╡рд╛рдж!

рдлрд┐рд░ рднреА рдПрдХ рдФрд░ рдиреЛрдЯ (рдлрд┐рд░ рд╕реЗ, рд╕рдВрднрд╡рддрдГ рдЬреНрдЮрд╛рдд)ред GAT рд╣реЛрдиреЗ рд╕реЗ, рд╣рдо & рдФрд░ &mut рдкреНрд░рдХрд╛рд░реЛрдВ рдХреЛ рдЕрдЪреНрдЫреА рддрд░рд╣ рд╕реЗ рд╕рд╛рд░рдЧрд░реНрднрд┐рдд рдХрд░рдиреЗ рдореЗрдВ рд╕рдХреНрд╖рдо рд╣реЛрдВрдЧреЗ, рддрд╛рдХрд┐ рд╣рдо my_func рдФрд░ my_func_mut рдлрд╝рдВрдХреНрд╢рди рдХреЗ рдмреАрдЪ рд▓рдЧрд╛рддрд╛рд░ рдХреЙрдкреА-рдкреЗрд╕реНрдЯ рдХреЛрдб рдХреЛ рд░реЛрдХ рд╕рдХреЗрдВред

#![feature(arbitrary_self_types)]
#![feature(generic_associated_types)]

use std::marker::PhantomData;

struct Pure <'t> (PhantomData<&'t()>);
struct Mut  <'t> (PhantomData<&'t()>);

type Ref<M, T> = <M as Acc>::Pat<T>;

trait Acc { type Pat<T: ?Sized>; }
impl<'t> Acc for Pure <'t> { type Pat<T> = PureRef <'t, T>; }
impl<'t> Acc for Mut  <'t> { type Pat<T> = MutRef  <'t, T>; }

struct PureRef <'t, T: ?Sized> (&'t     T);
struct MutRef  <'t, T: ?Sized> (&'t mut T);


/// USAGE ///

struct Buf<T> {
    data: Vec<T>
}

impl<T> Buf<T> {
    fn as_mut<M: Acc>(s: Ref<M, Self>) -> Ref<M, [f32]>
    {
        unimplemented!()
    }
}

рдпрд╣ рд▓рдЧрднрдЧ рд╕рдВрдХрд▓рд┐рдд рд╣реИред рд╣рдо рдЗрд╕реЗ GAT рдХреЗ рдмрд┐рдирд╛ рднреА рд▓рд╛рдЧреВ рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ рд▓реЗрдХрд┐рди рдкреНрд░рдХрд╛рд░ рд╡рд┐рд╕реНрдлреЛрдЯ рд╣реЛ рдЬрд╛рддреЗ рд╣реИрдВ:

#![feature(arbitrary_self_types)]

use std::marker::PhantomData;
use std::ops::Deref;

struct Pure <'t> (PhantomData<&'t()>);
struct Mut  <'t> (PhantomData<&'t()>);

type Ref<M, T> = <M as Acc<T>>::Pat;

trait Acc<T: ?Sized> { type Pat; }
impl<'t, T: 't + ?Sized> Acc<T> for Pure <'t> { type Pat = PureRef <'t, T>; }
impl<'t, T: 't + ?Sized> Acc<T> for Mut  <'t> { type Pat = MutRef  <'t, T>; }

struct PureRef <'t, T: ?Sized> (&'t     T);
struct MutRef  <'t, T: ?Sized> (&'t mut T);


/// USAGE ///

struct Buf<T> {
    data: Vec<T>
}

impl<T> Buf<T> {
    fn as_mut<M>(self: Ref<M, Self>) -> Ref<M, [f32]>
    where M: Acc<Self> + Acc<[f32]>,
          Ref<M, Self>: Deref<Target = Self>
    {
        unimplemented!()
    }
}

(рдпрд╣ рд╡рд╛рд╕реНрддрд╡ рдореЗрдВ рд╕рдВрдХрд▓рд┐рдд рдХрд░рддрд╛ рд╣реИ)

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

1.41 рд░рд╛рдд рдХреЗ рд╕рд╛рде, рдореИрдВрдиреЗ рдирд┐рдореНрдирд▓рд┐рдЦрд┐рдд рдХреЛрд╢рд┐рд╢ рдХреА:

pub trait MyTrait {
    type MyType<U>;

    fn f<U>(self, x : <Self as MyTrait>::MyType<U>);
}

рдФрд░ рдпрд╣ рд╕рдВрдХрд▓рд┐рдд рдХрд░рдиреЗ рдореЗрдВ рд╡рд┐рдлрд▓ рд░рд╣рддрд╛ рд╣реИ, рддреНрд░реБрдЯрд┐ "рдкреНрд░рдХрд╛рд░ рддрд░реНрдХ рдХреА рдЕрдиреБрдорддрд┐ рдирд╣реАрдВ рд╣реИ" MyType ред

рдлрд┐рд░ рдореИрдВрдиреЗ <U> рд╣рдЯрд╛ рджрд┐рдпрд╛, рдЬреЛ рд╕рдВрджрд┐рдЧреНрдз рд▓рдЧ рд░рд╣рд╛ рдерд╛ рд▓реЗрдХрд┐рди рдореИрдВрдиреЗ рд╕реЛрдЪрд╛ рдХрд┐ рдореИрдВ рдЗрд╕реЗ рдЖрдЬрд╝рдорд╛ рджреВрдВрдЧрд╛:

pub trait MyTrait {
    type MyType<U>;

    fn f<U>(self, x : <Self as MyTrait>::MyType);
}

рдЬрд┐рд╕рдиреЗ рдЖрд╢реНрдЪрд░реНрдпрдЬрдирдХ рд░реВрдк рд╕реЗ рд╕рдВрдХрд▓рди рдХрд┐рдпрд╛ред рд▓реЗрдХрд┐рди рдлрд┐рд░ рдЬрдм рдореИрдВрдиреЗ рдПрдХ рдЗрдореНрдкреНрд▓рд╛рдВрдЯ рд▓рд┐рдЦрд╛:

impl MyTrait for u64 {
    type MyType<U> = U;

    fn f<U>(self, x : <Self as MyTrait>::MyType) -> <Self as MyTrait>::MyType {
        x;
    }
}

рдЗрд╕рд╕реЗ рд╕рдВрдХрд▓рдХ рдШрдмрд░рд╛ рдЧрдпрд╛ред

рдореЗрд░реЗ рдкреНрд░рд╢реНрди рд╣реИрдВ:

  1. рдХреНрдпрд╛ рдЗрд╕ рддрд░рд╣ рдХреА рдпреЛрдЬрдирд╛ рдЕрднреА рд╕рдВрднрд╡ рд╣реИ рд▓реЗрдХрд┐рди рдореИрдВ рдЗрд╕реЗ рдЧрд▓рдд рдХрд░ рд░рд╣рд╛ рд╣реВрдВ?
  2. рдпрджрд┐ рдпрд╣ рдЕрднреА рд╕рдВрднрд╡ рдирд╣реАрдВ рд╣реИ, рддреЛ рдХреНрдпрд╛ рдЗрд╕ рдкреНрд░рд╕реНрддрд╛рд╡ рдХреЗ рддрд╣рдд рдпрд╣ рдХрднреА рд╕рдВрднрд╡ рд╣реЛрдЧрд╛?
  3. рдпрджрд┐ рд╣рд╛рдВ, рддреЛ рдХреНрдпрд╛ рдЗрд╕ рддрд░рд╣ рдХреА рдЯрд╛рдЗрдорд▓рд╛рдЗрди рдХрд╛ рдХреЛрдИ рдЕрдВрджрд╛рдЬрд╛ рд╣реИ рдХрд┐ рдореИрдВ рдЗрд╕реЗ рд░рд╛рдд рдореЗрдВ рдХрд░ рдкрд╛рдКрдВрдЧрд╛?

рдЗрд╕рдХрд╛ рдЙрддреНрддрд░ рджреЗрдиреЗ рдореЗрдВ рдЖрдкрдХреЗ рд╕рдордп рдХреЗ рд▓рд┐рдП рдЕрдЧреНрд░рд┐рдо рдзрдиреНрдпрд╡рд╛рджред

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

рд╣реЛ рд╕рдХрддрд╛ рд╣реИ рдХрд┐ рдЪрд╛рдХ рд▓реЛрдЧреЛрдВ рдХреЗ рд╕рд╛рде рдпрд╣ рджреЗрдЦрдиреЗ рд▓рд╛рдпрдХ рд╣реЛ рдХрд┐ рдХреНрдпрд╛ рдЗрд╕ рд╕реБрд╡рд┐рдзрд╛ рдкрд░ рдХрд╛рдо рдлрд┐рд░ рд╕реЗ рд╢реБрд░реВ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдПрдХреАрдХрд░рдг рдкрд░реНрдпрд╛рдкреНрдд рд░реВрдк рд╕реЗ рдЙрдиреНрдирдд рд╣реИ?

рдЗрд╕ рдкрд░ рдЕрдм рд░реЛрдХ рд▓рдЧрд╛ рджреА рдЧрдИ рд╣реИ

  • #30472
  • #67509
  • #67510
  • #67512
  • #67513

рдХреНрдпрд╛ рд╣рдо рд╕рдорд╕реНрдпрд╛ рд╡рд┐рд╡рд░рдг рдХреЛ рд╡рд░реНрддрдорд╛рди рдЕрд╡рд░реЛрдзрдХреЛрдВ рдХреЗ рд╕рд╛рде рдЕрджреНрдпрддрди рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ?

@DuchGhost рджреНрд╡рд╛рд░рд╛ рдЙрдард╛рдП рдЧрдП рдЕрдзрд┐рдХ рдЕрд╡рд░реЛрдзрди рдореБрджреНрджреЛрдВ рдХреЛ рдЬреЛрдбрд╝рд╛ рдЧрдпрд╛

рдпрд╣ рдЙрдЪреНрдЪ рдкреНрд░рдХрд╛рд░ рдХреЗ рдкреНрд░рдХрд╛рд░реЛрдВ рдХреЗ рдЕрдиреБрдХрд░рдг рдореЗрдВ рдПрдХ рдкреНрд░рдореБрдЦ рдХрджрдо рд╣реЛрдЧрд╛ред

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

// the plug/unplug idea is from https://gist.github.com/edmundsmith/855fcf0cb35dd467c29a9350481f0ecf

trait Monad /* : Applicative (for pure/return, doesn't matter for this example) */ {
    // Self is like the "f a" in haskell

    /// extract the "a" from "f a"
    type Unplug;

    /// exchange the "a" in "f a" in the type of Self with B
    type Plug<B>: Monad;

    fn bind<B, F>(this: Self, f: F) -> Self::Plug<B>
    where
        F: Fn(Self::Unplug) -> Self::Plug<B>;
}

impl<A> Monad for Option<A> {
    type Unplug = A;
    type Plug<B> = Option<B>;
    fn bind<B, F>(this: Self, f: F) -> Option<B>
    where
        F: Fn(A) -> Option<B> {
        this.and_then(f)
    }
}

рдкреНрд░рд╕реНрддрд╛рд╡рд┐рдд рдХрд╛рд░реНрдпрд╛рдиреНрд╡рдпрди рдкрд░ рдкреНрд░рд╢реНрди:

рдореЗрд░реЗ рдкрд╛рд╕ рдПрдХ рд╡рд┐рд╢реЗрд╖рддрд╛ рд╣реИ рдЬреЛ рдЗрд╕ рддрд░рд╣ рджрд┐рдЦрддреА рд╣реИ

trait TradeableResource{
}

рдФрд░ рдПрдХ рдХрд╛рд░реНрдпрд╛рдиреНрд╡рдпрдирдХрд░реНрддрд╛ рдЬреЛ рдЗрд╕ рддрд░рд╣ рджрд┐рдЦрддрд╛ рд╣реИ

struct Food(f64);
impl TradeableResource for Food{}

рдореИрдВ рдЕрдкрдиреА рд╡рд┐рд╢реЗрд╖рддрд╛ рдХреЗ рд╕рднреА рдХрд╛рд░реНрдпрд╛рдиреНрд╡рдпрдирдХрд░реНрддрд╛рдУрдВ рдХреЛ "рдирдпрд╛ рдкреНрд░рдХрд╛рд░" (рдПрдХрд▓ рддрддреНрд╡ рдЯреБрдкрд▓ рд╕реНрдЯреНрд░рдХреНрдЪрд░ рд░реИрдкрд┐рдВрдЧ f64) рд╣реЛрдиреЗ рдХреЗ рд▓рд┐рдП рд╕реАрдорд┐рдд рдХрд░рдиреЗ рдореЗрдВ рд╕рдХреНрд╖рдо рд╣реЛрдирд╛ рдЪрд╛рд╣рддрд╛ рд╣реВрдВред

рдХреНрдпрд╛ рдпрд╣рд╛рдВ рдкреНрд░рд╕реНрддрд╛рд╡рд┐рдд рдХрд╛рд░реНрдпрд╛рдиреНрд╡рдпрди рдкрд░ рд╡рд┐рдЪрд╛рд░ рдХрд┐рдП рдЬрд╛рдиреЗ рд╕реЗ рдпрд╣ рд╕рдВрднрд╡ рд╣реЛрдЧрд╛?

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

trait TradeableResource{
    type Wrapper<T>:T(f64)
}

@ChechyLevas рдЬрд╣рд╛рдБ рддрдХ рдореБрдЭреЗ рдкрддрд╛ рд╣реИ рдпрд╣ GADTs рдХреЗ рджрд╛рдпрд░реЗ рдореЗрдВ рдирд╣реАрдВ рд╣реИред

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

рддреЛ рдЖрдк рдирд┐рдореНрди рдХрд╛рд░реНрдп рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ:

trait Traceable resource: From<f64> + Into<f64> { }

(рдЗрд╕рдХреЗ рд▓рд┐рдП рдЖрдкрдХреЛ рджреЛрдиреЛрдВ рджрд┐рд╢рд╛рдУрдВ рдореЗрдВ From рдХреЛ рднреА рд▓рд╛рдЧреВ рдХрд░рдирд╛ рд╣реЛрдЧрд╛, рдЬреЛ рдореИрдВ рдПрдХ рдореИрдХреНрд░реЛ рдХреЗ рдорд╛рдзреНрдпрдо рд╕реЗ рдХрд░реВрдВрдЧрд╛)

рдореИрдВ рдЗрд╕ рдХреА рд╡рд░реНрддрдорд╛рди рд╕реНрдерд┐рддрд┐ рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рдереЛрдбрд╝рд╛ рдорд╣рд╕реВрд╕ рдХрд░рдирд╛ рдЪрд╛рд╣рддрд╛ рд╣реВрдВред рдореИрдВ async рд▓рдХреНрд╖рдгреЛрдВ рдФрд░ рдЬреАрд╡рдирдХрд╛рд▓ рдХреЗ рд╕рд╛рде рдереЛрдбрд╝рд╛ рд╕рд╛ рдЦреЗрд▓ рд░рд╣рд╛ рд╣реВрдВред
рдПрдХ рдЪреАрдЬ рдЬреЛ рдореИрдВ рдХрд░рдирд╛ рдЪрд╛рд╣рддрд╛ рдерд╛, рд╡рд╣ рдереА trait ReadAt<'r> рдХреЛ рдПрдХ рд╕рдВрдмрджреНрдз ReadAt: Future рдкреНрд░рдХрд╛рд░ рдХреЗ рд╕рд╛рде рдмрдирд╛рдирд╛ред рдЬреЛ рдХрдИ рдорд╛рдорд▓реЛрдВ рдХреЗ рд▓рд┐рдП рдХрд╛рдо рдХрд░рддрд╛ рд╣реИ, рд╕рд┐рд╡рд╛рдп рдЗрд╕рдХреЗ рдХрд┐ рдЬрдм рдореИрдВ рд╡рд┐рд╢реЗрд╖рддрд╛ рд╡рд╕реНрддреБрдУрдВ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдирд╛ рдЪрд╛рд╣рддрд╛ рд╣реВрдВред

рдЕрдзрд┐рдХрддрд░ рдХреНрдпреЛрдВрдХрд┐ рдирд┐рдореНрдирд▓рд┐рдЦрд┐рдд рдХрд░рдиреЗ рд╕реЗ рдореБрдЭреЗ R рдкрд░ рдПрдХ рд╕рд╛рдорд╛рдиреНрдп-рдкрд░реНрдпрд╛рдкреНрдд рдЬреАрд╡рдирдХрд╛рд▓ рд╕рдВрд▓рдЧреНрди рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдордЬрдмреВрд░ рдирд╣реАрдВ рдХрд┐рдпрд╛ рдЬрд╛рдПрдЧрд╛:

impl<'a, 'r, R> ReadAt<'r> for &'a dyn for<'z> ReadAt<'z, ReadAt = R> + 'a {
    type ReadAt = R; // cannot have an `impl<R<'lifetime>>`
    ...
}

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

рдкрд╕рдВрдж:

trait ReadAt {
    type ReadAt<'r>: Future<Output = io::Result<usize>>;

    fn read_at<'a>(&'a self, buf: &'a mut [u8], at: u64) -> Self::ReadAt<'a>;
}

impl<'d> ReadAt for &'d (dyn ReadAt<HERE> + 'd) {
}

рдореБрдЭреЗ рдЬреАрд╡рдирдХрд╛рд▓ рдХреЛ HERE рдореЗрдВ рд╢рд╛рдорд┐рд▓ рдХрд░рдиреЗ рдХрд╛ рдПрдХ рддрд░реАрдХрд╛ рдЪрд╛рд╣рд┐рдПред рдЙрджрд╛рд╣рд░рдг рдХреЗ рд▓рд┐рдП, рдпрд╣ рд╕реНрд╡реАрдХрд╛рд░ рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИ, рд▓реЗрдХрд┐рди рдЖрдИрдПрдордУ рдкрд░реНрдпрд╛рдкреНрдд рдирд╣реАрдВ рд╣реЛрдЧрд╛, рдХреНрдпреЛрдВрдХрд┐ R рдмрд╣реБрдд рдареЛрд╕ рд╣реИ:

impl<'d, R> ReadAt for &'d (dyn ReadAt<ReadAt = R> + 'd) {
    type ReadAt<'r> = R;

    fn read_at<'a>(&'a self, buf: &'a mut [u8], at: u64) -> Self::ReadAt<'a> {
        (**self).read_at(buf, at)
    }
}

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

struct Test<T: ReadAt>(T);

impl<T: ReadAt> Test<T> {
    fn into_trait_object<'a>(&'a self) -> Test<&'a dyn ReadAt<ReadAt = T::ReadAt>> {
        todo!();
    }
}

рдЪреВрдВрдХрд┐ T::ReadAt рдПрдХ рдЬреАрд╡рди рднрд░ рд▓реЗрддрд╛ рд╣реИ рдЬреЛ рдореИрдВ рдкреНрд░рджрд╛рди рдирд╣реАрдВ рдХрд░ рд╕рдХрддрд╛, рдЗрд╕рд▓рд┐рдП рдпрд╣ dyn ReadAt<ReadAt<'r> = T::ReadAt<'r>> рдХреЗ рд▓рд┐рдП рд╕рд┐рдВрдЯреИрдХреНрд╕ рдПрдХреНрд╕рдЯреЗрдВрд╢рди рдХреЛ рдпрд╛рдж рдХрд░реЗрдЧрд╛ред (рдпрд╛ рдЬреАрд╡рди рднрд░ рдХреЗ рдорд╛рдкрджрдВрдбреЛрдВ рдХреЗ рдорд┐рд▓рд╛рди рдХреЗ рд▓рд┐рдП IMO рдЙрдкрд░реЛрдХреНрдд рд╕реНрдирд┐рдкреЗрдЯ рдмрд╕ рдХрд╛рдо рдХрд░ рд╕рдХрддрд╛ рд╣реИ ;-))

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

@jendrikw рдЖрдкрдХрд╛ рдХреЛрдб рдирд╡реАрдирддрдо рд░рд╛рдд (1.46) рдХреЗ рд╕рд╛рде рд╕рдВрдХрд▓рд┐рдд рдФрд░ рдЪрд▓рддрд╛ рд╣реИред рдореИрдВрдиреЗ рдХрд╕реНрдЯрдо рдкреНрд░рдХрд╛рд░ рдЖрджрд┐ рдХреЗ рд╕рд╛рде рдХреБрдЫ рдкрд░реАрдХреНрд╖рдг рдХрд┐рдП .. рд▓реЗрдХрд┐рди рдореБрдЭреЗ рдФрд░ рдЕрдзрд┐рдХ рдЬрд╛рдВрдЪрдиреЗ рдХреЗ рд▓рд┐рдП рдПрдлрдкреА рдЬреНрдЮрд╛рди рдХреА рдХрдореА рд╣реИред

рдЖрдЬ, рдореИрдВрдиреЗ рдХрд┐рд╕реА рдРрд╕реА рдЪреАрдЬрд╝ рдХреЗ рд▓рд┐рдП GATs рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдиреЗ рдХреА рдХреЛрд╢рд┐рд╢ рдХреА, рдЬрд╣рд╛рдБ рдореБрдЭреЗ рд▓рдЧрд╛ рдХрд┐ рд╢рд╛рдпрдж рдЬреАрд╡рди рднрд░ рд╕рд╛рдорд╛рдиреНрдп рдирд╣реАрдВ рд╣реЛрдЧрд╛ (рдХрд╛рдо рдХрд░рдиреЗ рд╡рд╛рд▓рд╛ рдХреЛрдб рдЗрд╕ рдкреНрд░рдХрд╛рд░ рд╣реИ; рдкреВрд░реНрдг рдХреЛрдб рдлрд╝рд╛рдЗрд▓ ):

/// Helper trait for "stripping indention" from an object reference
pub trait AsUnindented<'ast> {
    type Output;

    /// Returns a reference to the unindented part of `Self`
    fn as_unindented(&'ast self) -> Self::Output;
}

impl<'ast, T: 'ast> AsUnindented<'ast> for Indented<T> {
    type Output = &'ast T;

    #[inline]
    fn as_unindented(&'ast self) -> &'ast T {
        &self.data
    }
}

impl<'ast, T: 'ast> AsUnindented<'ast> for crate::Block<T>
where
    T: AsUnindented<'ast> + 'ast,
{
    type Output = crate::View<'ast, T, fn(&'ast T) -> T::Output>;

    #[inline]
    fn as_unindented(&'ast self) -> Self::Output {
        crate::View::new(self, T::as_unindented)
    }
}

рдлрд┐рд░, рдореИрдВрдиреЗ рдирд┐рдореНрдирд▓рд┐рдЦрд┐рдд рдХреЛрдб рдореЗрдВ GAT рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдиреЗ рдХрд╛ рдкреНрд░рдпрд╛рд╕ рдХрд┐рдпрд╛:

pub trait AsUnindented {
    type Output<'ast>;

    /// Returns a reference to the unindented part of `Self`
    fn as_unindented<'ast>(&'ast self) -> Self::Output<'ast>;
}

impl<T> AsUnindented for Indented<T> {
    type Output<'ast> = &'ast T;

    #[inline]
    fn as_unindented<'ast>(&'ast self) -> &'ast T {
        &self.data
    }
}

impl<T> AsUnindented for crate::Block<T>
where
    T: AsUnindented,
{
    type Output<'ast> = crate::View<'ast, T, fn(&'ast T) -> T::Output<'ast>>;

    #[inline]
    fn as_unindented<'ast>(&'ast self) -> Self::Output<'ast> {
        crate::View::new(self, T::as_unindented)
    }
}

рдпрд╣ рдХрд╛рдо рдирд╣реАрдВ рдХрд░рддрд╛ рд╣реИред рдпрд╣ рджреЛрдиреЛрдВ рд╡рд┐рд╢реЗрд╖рддрд╛ рдХрд╛рд░реНрдпрд╛рдиреНрд╡рдпрди рдХреЗ рд▓рд┐рдП E0309 ( the parameter type 'T' may not live long enough ) рдХреЗ рд╕рд╛рде рд╡рд┐рдлрд▓ рд░рд╣рддрд╛ рд╣реИред рдореБрдЭреЗ рдпрдХреАрди рдирд╣реАрдВ рд╣реИ рдХрд┐ рдЗрд╕реЗ рдХреИрд╕реЗ рдареАрдХ рдХрд┐рдпрд╛ рдЬрд╛рдП рдпрд╛ рдЕрдЧрд░ рдореБрдЭреЗ рдХреБрдЫ рдЧрд▓рдд рдзрд╛рд░рдгрд╛ рд╣реИред рдХрдВрдкрд╛рдЗрд▓рд░ рдЪрд╛рд╣рддрд╛ рд╣реИ рдХрд┐ рдореИрдВ T рдкрд░ impl рд╕реНрддрд░ рдкрд░ рдПрдХ рдмрд╛рдЙрдВрдб рд╕рдВрд▓рдЧреНрди рдХрд░реВрдВ, рд▓реЗрдХрд┐рди рдЙрд╕ рд╕реНрддрд░ рдкрд░, рдХреЛрдИ рдЖрдЬреАрд╡рди 'ast рдирд╣реАрдВ рд╣реИ, рдФрд░ рдореИрдВ T: 'static рдХреЛ рдмрд╛рдзрд┐рдд рдирд╣реАрдВ рдХрд░рдирд╛ рдЪрд╛рд╣рддрд╛ for<'ast> T: 'ast рдЬреИрд╕рд╛ рдХреБрдЫ рдХрд╛рдо рдирд╣реАрдВ рдХрд░рддрд╛)ред

рд╕рдВрдкрд╛рджрд┐рдд рдХрд░реЗрдВ : рдореИрдВрдиреЗ рдЕрдкрдиреЗ рдХреЛрдб рдмреЗрд╕ рдХреЗ рджреВрд╕рд░реЗ рд╣рд┐рд╕реНрд╕реЗ рдореЗрдВ GAT рд▓рдЧрд╛рдиреЗ рдХреА рдХреЛрд╢рд┐рд╢ рдХреА, рдпрд╣ рдХреЗрд╡рд▓ рдПрдХ рддреНрд░реБрдЯрд┐ (рдЕрднреА рдХреЗ рд▓рд┐рдП) рдХреЛ рдлреЗрдВрдХрддрд╛ рд╣реИ, рд▓реЗрдХрд┐рди рдЗрд╕реЗ рдХреЗрд╡рд▓ рдареАрдХ рдирд╣реАрдВ рдХрд┐рдпрд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИ рдХреНрдпреЛрдВрдХрд┐ рдпрд╣ рдореЗрд░реА рдкреВрд░реНрд╡рдЧрд╛рдореА рд╕рдорд╕реНрдпрд╛ рдХреЗ рд╕рдорд╛рдзрд╛рди рдкрд░ рдирд┐рд░реНрднрд░ рдХрд░рддрд╛ рд╣реИред

рдЖрдЙрдЯрд▓рд╛рдЗрд╡реНрд╕ рдмрд╛рдЙрдВрдб рдХреЛ рд╕рдВрдмрдВрдзрд┐рдд рдкреНрд░рдХрд╛рд░ рдореЗрдВ рдЬреЛрдбрд╝рд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИ (рд╡рд┐рд╢реЗрд╖рддрд╛ рдХреЗ рд╕рдВрд╕реНрдХрд░рдг рдкрд░ Self: 'ast рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдХреЗ)ред рдпрд╣ рдкрд░реАрдХреНрд╖рдг рджрд┐рдЦрд╛рддрд╛ рд╣реИ рдХрд┐ рдпрд╣ рдХреИрд╕рд╛ рджрд┐рдЦрдирд╛ рдЪрд╛рд╣рд┐рдП:
https://github.com/rust-lang/rust/blob/db4826dd6ca48663a0b4c5ab0681258999017c7d/src/test/ui/generic-associated-types/iterable.rs#L6 -L21

рдареАрдХ рд╣реИ, рдпрд╣ рдХреЗрд╡рд▓ рдЖрдВрд╢рд┐рдХ рд░реВрдк рд╕реЗ рдХрд╛рдо рдХрд░рддрд╛ рд╣реИ ...


рддреНрд░реБрдЯрд┐ рд╕рдВрджреЗрд╢

error[E0309]: the parameter type `T` may not live long enough
  --> src/indention.rs:33:5
   |
33 |     type Output<'ast> where T: 'ast = &'ast T;
   |     ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
   |
   = help: consider adding an explicit lifetime bound `T: 'ast`...
   = note: ...so that the type `T` will meet its required lifetime bounds

error[E0309]: the parameter type `T` may not live long enough
  --> src/indention.rs:45:5
   |
45 |     type Output<'ast> where T: 'ast = crate::View<'ast, T, fn(&'ast T) -> T::Output<'ast>>;
   |     ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
   |
   = help: consider adding an explicit lifetime bound `T: 'ast`...
   = note: ...so that the type `T` will meet its required lifetime bounds

error[E0309]: the parameter type `T` may not live long enough
  --> src/indention.rs:59:5
   |
59 | /     type Output<'ast2>
60 | |         where
61 | |             T: 'ast2,
62 | |             O: 'ast2
63 | |         = crate::View<'ast2, T, crate::view::MapViewFn<F, fn(F::Output<'ast2>) -> O::Output<'ast2>>>;
   | |_____________________________________________________________________________________________________^
   |
   = help: consider adding an explicit lifetime bound `T: 'ast2`...
   = note: ...so that the type `T` will meet its required lifetime bounds

error[E0309]: the parameter type `O` may not live long enough
  --> src/indention.rs:59:5
   |
59 | /     type Output<'ast2>
60 | |         where
61 | |             T: 'ast2,
62 | |             O: 'ast2
63 | |         = crate::View<'ast2, T, crate::view::MapViewFn<F, fn(F::Output<'ast2>) -> O::Output<'ast2>>>;
   | |_____________________________________________________________________________________________________^
   |
   = help: consider adding an explicit lifetime bound `O: 'ast2`...
   = note: ...so that the type `O` will meet its required lifetime bounds

рдРрд╕рд╛ рд▓рдЧрддрд╛ рд╣реИ рдЬреИрд╕реЗ рдХреЛрдб рдПрдХ рдЪрд░рдг рд╕реЗ рдЧреБрдЬрд░рддрд╛ рд╣реИ (рдкрд╣рд▓реЗ, рдпрд╣ рд╕рдорд╛рди рддреНрд░реБрдЯрд┐рдпреЛрдВ рдХреЗ рд╕рд╛рде рддреНрд░реБрдЯрд┐рдкреВрд░реНрдг рдерд╛, рд▓реЗрдХрд┐рди рдЙрдирдХреЗ рдмреАрдЪ, рддреНрд░реБрдЯрд┐ рдХреА рдПрдХ рдФрд░ рд╢реНрд░реЗрдгреА рджрд┐рдЦрд╛рдИ рджреА рдЬрд┐рд╕рдореЗрдВ рдХреЗрд╡рд▓ E0107 s рд╢рд╛рдорд┐рд▓ рдерд╛) рдПрдЪрдПрдоред

рд╕рдВрдкрд╛рджрд┐рдд рдХрд░реЗрдВ : рдореБрдЭреЗ рдкрд╣рд▓рд╛ рдХрдерди рдпрд╛рдж рдЖрдпрд╛ ( where Self: 'ast )ред рд╡рд╣ рд╣рд┐рд╕реНрд╕рд╛ рдЕрдм рддрдп рд╣реЛ рдЧрдпрд╛ рд╣реИред рдореИрдВ рдЬрд╛рд░реА рд░рдЦрдиреЗ рдХреА рдХреЛрд╢рд┐рд╢ рдХрд░рддрд╛ рд╣реВрдВред


рдЕрддрд┐рд░рд┐рдХреНрдд рд╕рдВрджрд░реНрдн

рдареАрдХ рд╣реИ, рдирд┐рдореНрдирд▓рд┐рдЦрд┐рдд рд╕реНрдирд┐рдкреЗрдЯ:

impl<'ast, T, F, O> AsUnindented for crate::View<'ast, T, F>
where
    Self: Clone,
    F: crate::view::ViewFn<T, Output = &'ast O>,
    O: AsUnindented + 'ast,
{
    type Output<'ast2>
        where
            T: 'ast2,
        = crate::View<'ast, T, crate::view::MapViewFn<F, fn(&'ast O) -> O::Output<'ast>>>;

    #[inline]
    fn as_unindented<'ast2>(&'ast2 self) -> Self::Output<'ast2> {
        self.clone().map::<for<'x> fn(&'x O) -> O::Output<'x>, _>(O::as_unindented)
    }
}

рдЗрд╕рдХреЗ рд╕рд╛рде рддреНрд░реБрдЯрд┐рдпрд╛рдВ:

error[E0631]: type mismatch in function arguments
  --> src/indention.rs:66:67
   |
66 |         self.clone().map::<for<'x> fn(&'x O) -> O::Output<'x>, _>(O::as_unindented)
   |                                                                   ^^^^^^^^^^^^^^^^
   |                                                                   |
   |                                                                   expected signature of `for<'x> fn(<F as view::ViewFn<T>>::Output<'x>) -> _`
   |                                                                   found signature of `for<'x> fn(&'x O) -> _`

рдФрд░ рдореБрдЭреЗ рдкрддрд╛ рд╣реИ рдХрд┐ <F as view::ViewFn<T>>::Output<'x> ==> &'ast O рдФрд░ &'x O рдмрд░рд╛рдмрд░ рдирд╣реАрдВ рд╣реИрдВ, рд▓реЗрдХрд┐рди рдореБрдЭреЗ рдирд╣реАрдВ рдкрддрд╛ рдХрд┐ рдЗрд╕реЗ рдХреИрд╕реЗ рдареАрдХ рдХрд┐рдпрд╛ рдЬрд╛рдП (рд╕рдВрдХрд▓рдХ рдмрд╛рдзреНрдп F: for<'x> crate::view::ViewFn<T, Output = &'x O> рдХреЛ рд╕реНрд╡реАрдХрд╛рд░ рдирд╣реАрдВ рдХрд░рддрд╛ рд╣реИ)ред
рдЕрдиреНрдп рдкреНрд░рдпрд╛рд╕ рддреНрд░реБрдЯрд┐рдпреЛрдВ рдХреЗ рд╕рд╛рде:

error[E0582]: binding for associated type `Output` references lifetime `'x`, which does not appear in the trait input types
  --> src/indention.rs:56:39
   |
56 |     F: for<'x> crate::view::ViewFn<T, Output = &'x O>,
   |                                       ^^^^^^^^^^^^^^

рдореБрдЭреЗ рдирд╣реАрдВ рдкрддрд╛ рдХрд┐ рдПрдХ рд╡рд┐рд╢реЗрд╖рддрд╛ рдЖрдЙрдЯрдкреБрдЯ рдкреНрд░рдХрд╛рд░ рдЕрд╕рд╛рдЗрдирдореЗрдВрдЯ рдореЗрдВ forall<'x> рдмрд╛рдзреНрдп рдХреИрд╕реЗ рд╡реНрдпрдХреНрдд рдХрд┐рдпрд╛ рдЬрд╛рдП, рдЙрджрд╛рд╣рд░рдг рдХреЗ рд▓рд┐рдП

where
    F: crate::view::ViewFn<T, for<'x> Output<'x> = &'x O>,

рдкрд╛рд░реНрд╕ рднреА рдирд╣реАрдВ рдХрд░рддрд╛ (" + , , , :: , рдпрд╛ > рдореЗрдВ рд╕реЗ рдПрдХ рдХреА рдЕрдкреЗрдХреНрд╖рд╛ рдХреА рдЧрдИ, $ = рдорд┐рд▓рд╛")ред

67510 рдЯреНрд░реИрдХ рдЙрд╕ рдмрд╛рдЙрдВрдб рдХреЛ рд▓рд┐рдЦрдиреЗ рдореЗрдВ рд╕рдХреНрд╖рдо рд╣реИрдВред рдЙрд╕ рдЙрджрд╛рд╣рд░рдг рдХреЛ рдЖрд▓рд╕реА рд╕рд╛рдорд╛рдиреНрдпреАрдХрд░рдг (#60471) рдХреА рднреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реЛ рд╕рдХрддреА рд╣реИред

рдХреНрдпрд╛ рд╡рд┐рд╢реЗрд╖рддрд╛ рдЖрдЙрдЯрдкреБрдЯ рдкреНрд░рдХрд╛рд░ self.clone().map рд╡рд╛рд╕реНрддрд╡ рдореЗрдВ O::as_unindented рдХрд╛ рдкреНрд░рдХрд╛рд░ рд╣реИ, рдЕрд░реНрдерд╛рдд рдорд╛рдирдЪрд┐рддреНрд░ рдХрд╛ рддрд░реНрдХ рдкреНрд░рдХрд╛рд░
рдирд╣реАрдВ рдЬрд╛рдирддреЗ рдХрд┐ crate::View рдХреНрдпрд╛ рд╣реИ, рд▓реЗрдХрд┐рди map рдлрд╝рдВрдХреНрд╢рди рдПрдХ рдЕрд▓рдЧ рддрд░реНрдХ рдХреА рдЕрдкреЗрдХреНрд╖рд╛ рдХрд░ рд╕рдХрддрд╛ рд╣реИ, рдЗрд╕рд▓рд┐рдП рдкреНрд░рдХрд╛рд░ рдмреЗрдореЗрд▓ рд╣реИред

@ рд╕рд┐рдШреЛрдпрд╛ рдореИрдВрдиреЗ рдкрд┐рдЫрд▓реА рдкреЛрд╕реНрдЯ рдореЗрдВ рд░рд┐рдкреЙрдЬрд┐рдЯрд░реА рдХреЛ рд▓рд┐рдВрдХ рдХрд┐рдпрд╛ рд╣реИ, рдпрд╣рд╛рдБ crate::view::ViewFn::map рдХреЗ рдЗрдореНрдкреНрд▓рд╛рдВрдЯ рдХрд╛ рд╕реАрдзрд╛ рд▓рд┐рдВрдХ рд╣реИ

рдЗрд╕ рдмрд╛рд░реЗ рдореЗрдВ рд╕рдВрдХрд▓рдХ рдиреЗ рдХреНрдпрд╛ рдХрд╣рд╛ ?:

where
    for<'x> F: crate::view::ViewFn<T, Output<'x> = &'x O>,

рдпрд╣ рдкрд╛рд░реНрд╕ рдирд╣реАрдВ рдХрд░рддрд╛ рд╣реИ (рдЕрднреА рддрдХ)ред

@matthewjasper ,

рд░рд╕реНрдЯ рдиреЛрдорд┐рдХреЙрди рд╕реЗ, рдирд┐рдореНрдирд▓рд┐рдЦрд┐рдд рдкрд╛рд░реНрд╕:

where for<'a> F: Fn(&'a (u8, u16)) -> &'a u8,

рдХреНрдпрд╛ рдпрд╣ Output<'x> = &'x 0> рдХреЗ рдЙрдкрдпреЛрдЧ рдХреЗ рдХрд╛рд░рдг рд╣реИ рдХрд┐ рдпрд╣ рдкрд╛рд░реНрд╕ рдирд╣реАрдВ рдХрд░рддрд╛ рд╣реИ?

рд╣рд╛рдВ, Output<'x>=... рдЙрд╕ рд╕реНрдерд┐рддрд┐ рдореЗрдВ рдкрд╛рд░реНрд╕ рдирд╣реАрдВ рдХрд░рддрд╛ рд╣реИред

рдореЗрд░реЗ рдкрд╛рд╕ рдПрдХ create, grdf рд╣реИ рдЬреЛ рдЕрдм rustc 1.46.0-nightly рдХреЗ рд╕рд╛рде рд╕рдВрдХрд▓рд┐рдд рдирд╣реАрдВ рдХрд░рддрд╛ рд╣реИред рдХреНрдпрд╛ рд╣рд╛рд▓ рд╣реА рдореЗрдВ GAT рдХреЗ рдЖрд╕рдкрд╛рд╕ рдХреБрдЫ рдмрджрд▓рд╛ рд╣реИ?

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

pub trait Iter<'a, T: 'a> {
    type Triples: Iterator<Item = Triple<&'a T>>;
    type Subjects: Iterator<Item = (&'a T, Self::Predicates)>;
    type Predicates: Iterator<Item = (&'a T, Self::Objects)>;
    type Objects: Iterator<Item = &'a T>;
}

pub trait Graph<T = crate::Term> {
    /// Iterators.
    type Iter<'a>: Iter<'a, T>;

    ...
}

рдореЗрд░реЗ рдкрд╛рд╕ Graph рдХрд╛ рдПрдХ рдХрд╛рд░реНрдпрд╛рдиреНрд╡рдпрди рд╣реИ рдЬреЛ рдЕрдм рддрдХ рдареАрдХ рдХрд╛рдо рдХрд░рддрд╛ рд╣реИ:

impl<'a, T: 'a + Hash + Eq> crate::Iter<'a, T> for Iterators {
    type Objects = Objects<'a, T>;
    type Predicates = Predicates<'a, T>;
    type Subjects = Subjects<'a, T>;
    type Triples = Iter<'a, T>;
}

impl<T: Hash + Eq> crate::Graph<T> for HashGraph<T> {
    type Iter<'a> = Iterators;

    ...
}

рдЕрдм рдЬрдм рдореИрдВрдиреЗ rustc рдХреЛ рдЕрдкрдбреЗрдЯ рдХрд░ рджрд┐рдпрд╛ рд╣реИ рддреЛ рдпрд╣ рдирд┐рдореНрдирд▓рд┐рдЦрд┐рдд рдХреЗ рд╕рд╛рде рд╡рд┐рдлрд▓ рд╣реЛ рдЬрд╛рддрд╛ рд╣реИ:

error[E0309]: the parameter type `T` may not live long enough
  --> src/hash_dataset.rs:50:2
   |
50 |     type Iter<'a> = Iterators;
   |     ^^^^^^^^^^^^^^^^^^^^^^^^^^
   |
   = help: consider adding an explicit lifetime bound `T: 'a`...
   = note: ...so that the type `T` will meet its required lifetime bounds

рдпрд╣ рдореЗрд░реЗ рд▓рд┐рдП рдмрд╣реБрдд рдорд╛рдпрдиреЗ рдирд╣реАрдВ рд░рдЦрддрд╛ рдХреНрдпреЛрдВрдХрд┐ T рдкрд╣рд▓реЗ рд╕реЗ рд╣реА 'a рд╕реЗ Iter рдореЗрдВ рдмрдВрдзрд╛ рд╣реБрдЖ рд╣реИ ...

рдареАрдХ рд╣реИ рдореИрдВрдиреЗ рдХреБрдЫ where рд╕реАрдорд╛ рдЬреЛрдбрд╝рдХрд░ рдЗрд╕реЗ рдлрд┐рд░ рд╕реЗ рдХрд╛рдо рдХрд┐рдпрд╛ред
рд╡рд┐рд╢реЗрд╖рддрд╛ рдореЗрдВ:

type Iter<'a>: Iter<'a, T> where T: 'a;

рдФрд░ рдХрд╛рд░реНрдпрд╛рдиреНрд╡рдпрди рдореЗрдВ:

type Iter<'a> where T: 'a = Iterators;

рд▓реЗрдХрд┐рди рдореБрдЭреЗ рдирд┐рд╢реНрдЪрд┐рдд рд░реВрдк рд╕реЗ where рд╕реАрдорд╛ рдХреЗ рд╕рдЯреАрдХ рд╢рдмреНрджрд╛рд░реНрде рдХреЛ рд╕рдордЭрдирд╛ рдирд┐рд╢реНрдЪрд┐рдд рдирд╣реАрдВ рд╣реИ, рд╡рд┐рд╢реЗрд╖ рд░реВрдк рд╕реЗ рдХрд╛рд░реНрдпрд╛рдиреНрд╡рдпрди рдореЗрдВ (рдкрд╣рд▓реА рдмрд╛рд░ рдореИрдВрдиреЗ рдЗрд╕реЗ рджреЗрдЦрд╛ рд╣реИ)ред рдФрд░ рдпрд╣ рднреА рдХрд┐ рдпрд╣ рдкрд╣рд▓реЗ рдХреНрдпреЛрдВ рдХрд╛рдо рдХрд░рддрд╛ рдерд╛ред

рд╕рдВрдкрд╛рджрд┐рдд рдХрд░реЗрдВ: рдореИрдВ рднреА рдЕрдкрдиреЗ рдЦрд░рд╛рдм рд╣реИрдХ рдХреЛ рд╣рдЯрд╛рдиреЗ рдореЗрдВ рд╕рдХреНрд╖рдо рд╣реВрдВ рдФрд░ рд╕рдВрдмрдВрдзрд┐рдд рдЗрдЯрд░реЗрдЯрд░реНрд╕ рдХреЛ рд╡рд┐рд╢реЗрд╖рддрд╛ рдореЗрдВ рд╣реА рдбрд╛рд▓ рджрд┐рдпрд╛ рд╣реИред

@DuchGhost рджреНрд╡рд╛рд░рд╛ рдЙрдард╛рдП рдЧрдП рдЕрдзрд┐рдХ рдЕрд╡рд░реЛрдзрди рдореБрджреНрджреЛрдВ рдХреЛ рдЬреЛрдбрд╝рд╛ рдЧрдпрд╛

рдЖрдк https://github.com/rust-lang/rust/issues/74684 рднреА рдЬреЛрдбрд╝ рд╕рдХрддреЗ рд╣реИрдВ :)

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

рд╣рдо рдЗрд╕рдХреЗ рд╕рд╛рде рдХрд╣рд╛рдВ рд╣реИрдВ? рдпрд╣рд╛рдВ рд╕рдмрд╕реЗ рд╣рд╛рд▓рд┐рдпрд╛ рд╕реНрдерд┐рддрд┐ рд╕рд╛рд░рд╛рдВрд╢ рдЬреВрди 2018 рд╕реЗ @LukasKalbertodt рджреНрд╡рд╛рд░рд╛ рджрд┐рдпрд╛ рдЧрдпрд╛ рд╣реИред рдХреНрдпрд╛ рдпрд╣ "рдЪреЙрдХрд┐рдлрд┐рдХреЗрд╢рди" рдХреА рдкреНрд░рддреАрдХреНрд╖рд╛ рдХрд░ рд░рд╣рд╛ рд╣реИ?

рдЕрдиреБрднрд╡рд╣реАрди рдЕрд╡рд▓реЛрдХрди: GAT рдХреЗ рд▓рд┐рдП рдореЗрд░реЗ рд▓рдЧрднрдЧ рд╕рднреА рд╡рд╛рдВрдЫрд┐рдд рдЙрдкрдпреЛрдЧреЛрдВ рдХреЗ рд▓рд┐рдП рдХреЗрд╡рд▓ рдПрдХ рдЖрдЬреАрд╡рди рдкреИрд░рд╛рдореАрдЯрд░ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реЛрддреА рд╣реИред рдХреНрдпрд╛ GAT рдХрд╛ рдПрдХ рдХрдЯ-рдбрд╛рдЙрди рд▓рд╛рдЗрдлрд╝рдЯрд╛рдЗрдо-рдУрдирд▓реА рд╕рдВрд╕реНрдХрд░рдг рд╡рд┐рддрд░рд┐рдд рдХрд░рдирд╛ рдЖрд╕рд╛рди рд╣реЛрдЧрд╛?

https://github.com/rust-lang/rust/issues/44265#issuecomment -568247656 рдПрдХ (рдХреБрдЫ рд╣рдж рддрдХ рд╕рдВрдХреНрд╖рд┐рдкреНрдд) рдЕрдкрдбреЗрдЯ рд╣реИред

67510 рдЕрдВрддрд┐рдо рдкреНрд░рдореБрдЦ ICE/рд▓рд╛рдкрддрд╛ рд╡рд┐рд╢реЗрд╖рддрд╛ рд╣реИ рдЬрд┐рд╕реЗ рд▓рд╛рдЧреВ рдХрд░рдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реИред

рдХреНрдпрд╛ рдпрд╣ RFC Monad рдФрд░ Functor рдХреЛ рд╕реАрдзреЗ рд╕рдВрднрд╡ рдмрдирд╛ рджреЗрдЧрд╛? рдпрд╛ рдХреНрдпрд╛ рдПрдЪрдХреЗрдЯреА рдкрд░ рдФрд░ рдХрд╛рдо рдХрд░рдиреЗ рдХреА рдЬрд░реВрд░рдд рд╣реИ?

рдХреНрдпрд╛ рдпрд╣ рдЖрд░рдПрдлрд╕реА рдореЛрдирд╛рдб рдФрд░ рдлрдирдХреНрдЯрд░ рдХреЛ рд╕реАрдзреЗ рд╕рдВрднрд╡ рдмрдирд╛ рджреЗрдЧрд╛? рдпрд╛ рдХреНрдпрд╛ рдПрдЪрдХреЗрдЯреА рдкрд░ рдФрд░ рдХрд╛рдо рдХрд░рдиреЗ рдХреА рдЬрд░реВрд░рдд рд╣реИ?

@ibraheemdev рдЖрд░рдПрдлрд╕реА рдХрд╣рддрд╛ рд╣реИ

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

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

рдХреНрдпрд╛ Monad рдХреЗ рд▓рд┐рдП рдХреЛрдИ рд░рд╛рд╕реНрддрд╛ рд╣реИ рдЬрд┐рд╕рдХреЗ рд▓рд┐рдП GAT рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рдирд╣реАрдВ рд╣реИ?

@ibraheemdev рд╣рд╛рдЗрдкреЛрдереЗрдЯрд┐рдХ рд░реВрдк рд╕реЗ рд╣рд╛рдВ, рдПрдЪрдХреЗрдЯреА рдХреЛ рд╕реАрдзреЗ рд▓рд╛рдЧреВ рдХрд░рдирд╛ рдФрд░ рдлрд┐рд░ рд╢реАрд░реНрд╖ рдкрд░ Monad рд╡рд┐рд╢реЗрд╖рддрд╛ рд▓рд╛рдЧреВ рдХрд░рдирд╛ рд╕рдВрднрд╡ рд╣реЛрдЧрд╛ред рд╣рд╛рд▓рд╛рдБрдХрд┐, рдЙрд╕ рджрд┐рд╢рд╛ рдореЗрдВ рдХреЛрдИ рдХрд╛рдо рдирд╣реАрдВ рд╣реЛ рд░рд╣рд╛ рд╣реИ, рдФрд░ рд╢рд╛рдпрдж рдХрднреА рдирд╣реАрдВ рд╣реЛрдЧрд╛, рдХреНрдпреЛрдВрдХрд┐ рдпрд╣ рджреГрд╖реНрдЯрд┐рдХреЛрдг рд╡рд╛рд╕реНрддрд╡ рдореЗрдВ рд░рд╕реНрдЯ рдХреА рд╕рдорд╕реНрдпрд╛рдУрдВ рдХрд╛ рд╕рдорд╛рдзрд╛рди рдирд╣реАрдВ рдХрд░рддрд╛ рд╣реИ: https://twitter.com/withoutboats/status/1027702531361857536

рд╢рд╛рдпрдж рдореИрдВ рдЧрд▓рдд рд╣реВрдБ, рд▓реЗрдХрд┐рди рдореБрдЭреЗ рд▓рдЧрддрд╛ рд╣реИ рдХрд┐ GAT рдХреБрдЫ рдЗрд╕ рддрд░рд╣ рдХреА рдЕрдиреБрдорддрд┐ рджреЗрддрд╛ рд╣реИ

trait MonadFamily {
    type Monad<T>;
    fn pure<T>(inner: T) -> Self::Monad<T>;
    fn bind<T, U, F: FnOnce(T) -> U>(this: Self::Monad<T>, f: F) -> Self::Monad<U>;
}

@рдЗрдмреНрд░рд╛рд╣реАрдорджреЗрд╡

рдХреНрдпрд╛ Monad рдХреЗ рд▓рд┐рдП рдХреЛрдИ рд░рд╛рд╕реНрддрд╛ рд╣реИ рдЬрд┐рд╕рдХреЗ рд▓рд┐рдП GAT рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рдирд╣реАрдВ рд╣реИ?

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

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

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

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

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

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

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

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