рдпрд╣ рд╕рд╛рдорд╛рдиреНрдп рд╕рдВрдмрджреНрдз рдкреНрд░рдХрд╛рд░реЛрдВ рдХреЗ рд▓рд┐рдП рдПрдХ рдЯреНрд░реИрдХрд┐рдВрдЧ рд╕рдорд╕реНрдпрд╛ рд╣реИ (рд░рд╕реНрдЯ-рд▓реИрдВрдЧ/рдЖрд░рдПрдлрд╕реАрдПрд╕#1598)
рдРрд╕рд╛ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП:
рдпрд╣рд╛рдВ рдПрдХ рдкреНрд░рдХрд╛рд░ рдХреА рдХрд╛рд░реНрдпрд╛рдиреНрд╡рдпрди рдпреЛрдЬрдирд╛ рд╣реИ рдЬрд┐рд╕реЗ рдореИрдВ рдЕрджреНрдпрддрди рд░рдЦрдиреЗ рдХрд╛ рдкреНрд░рдпрд╛рд╕ рдХрд░реВрдВрдЧрд╛ред
рдореИрдВ рдПрдПрд╕рдЯреА рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рдЕрдзрд┐рдХ рд╡рд┐рд╕реНрддрд╛рд░ рд╕реЗ рд▓рд┐рдЦрдХрд░ рд╢реБрд░реВ рдХрд░рддрд╛ рд╣реВрдВред рдЖрдЗрдП рдкрд╣рд▓реЗ рдЪрд░реНрдЪрд╛ рдХрд░реЗрдВ рдХрд┐ рдпрд╣ рдЖрдЬ рдХреИрд╕реЗ рдХрд╛рдо рдХрд░рддрд╛ рд╣реИ:
рдПрдХ рд╡рд┐рд╢реЗрд╖рддрд╛ рдкрд░рд┐рднрд╛рд╖рд╛ рдореЗрдВ рдПрдХ 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)
рд╕рд╛рдорд╛рдиреНрдп рддреМрд░ рдкрд░, рддрд░реАрдХреЛрдВ рдХреЗ рдХрд╛рдо рдХрд░рдиреЗ рдХреЗ рддрд░реАрдХреЗ рдкрд░ рдореЙрдбрд▓рд┐рдВрдЧ рдХрд░рдирд╛ рдПрдХ рдмреБрд░рд╛ рд╡рд┐рдЪрд╛рд░ рдирд╣реАрдВ рд╣реИред рдореБрдЭреЗ рд▓рдЧрддрд╛ рд╣реИ рдХрд┐ рд╣рдо рдпрд╣рд╛рдВ рдХреБрдЫ "рднрд╡рд┐рд╖реНрдп рдХрд╛ рдкреНрд░реВрдлрд┐рдВрдЧ" рднреА рдХрд░ рд╕рдХрддреЗ рд╣реИрдВред
рдпрд╣рд╛рдВ рд╡рд╣ рдХреЛрдб рд╣реИ рдЬреЛ рдПрдХ рд╡рд┐рдзрд┐ рдХреЗ рдкреНрд░рдХрд╛рд░ рдкреИрд░рд╛рдореАрдЯрд░ рдХреЛ рджрд╛рдпрд░реЗ рдореЗрдВ рд▓рд╛рддрд╛ рд╣реИ (рдпрд╣ рдПрдХ рд╡рд┐рд╢реЗрд╖рддрд╛ рдореЗрдВ рдкрд░рд┐рднрд╛рд╖рд┐рдд рд╡рд┐рдзрд┐ рдХреЗ рд▓рд┐рдП рд╣реИ):
рдЬрдмрдХрд┐ рдПрдХ рд╡рд┐рд╢реЗрд╖рддрд╛ рдореЗрдВ рдкрд░рд┐рднрд╛рд╖рд┐рдд type
рдХреЗ рд▓рд┐рдП, рд╣рдореЗрдВ рдПрдХ рдЦрд╛рд▓реА рдкреНрд░рдХрд╛рд░ рдкреИрд░рд╛рдореАрдЯрд░ рд░рд┐рдм ( NoTypeParameters
) рдЬреЛрдбрд╝рдиреЗ рдХреЗ рд▓рд┐рдП рд╣рд╛рд░реНрдбрдХреЛрдб рдХрд┐рдпрд╛ рдЧрдпрд╛ рд╣реИ:
рдЕрдм рдЬрдм рдЬреЗрдирд░рд┐рдХ рдкреНрд░рддреНрдпреЗрдХ рд╡рд┐рд╢реЗрд╖рддрд╛/рдирд┐рд╣рд┐рдд рд╡рд╕реНрддреБ рдкрд░ рдореМрдЬреВрдж рд╣реИрдВ, рддреЛ рдореБрдЭреЗ рд▓рдЧрддрд╛ рд╣реИ рдХрд┐ рд╣рдо рд╢рд╛рдпрдж type
рдХреЗ рд▓рд┐рдП рд╣реИрдВрдбрд▓рд┐рдВрдЧ рдХреЛ рд╣рдЯрд╛рдирд╛ рдЪрд╛рд╣рддреЗ рд╣реИрдВ рдФрд░ рд╡рд┐рдзрд┐ рдкреНрд░рдмрдВрдзрди рдХреЛ рдирд┐рдХрд╛рд▓рдирд╛ рдЪрд╛рд╣рддреЗ рд╣реИрдВ рддрд╛рдХрд┐ рдпрд╣ рдЙрдЪреНрдЪ рд╕реНрддрд░ рдкрд░ рд╣реЛред рд╡рд╕реНрддреБрдУрдВ рдХреЗ рд▓рд┐рдП (рдЙрджрд╛рд╣рд░рдг рдХреЗ рд▓рд┐рдП, const
) рдЬрд╣рд╛рдВ рдХреЛрдИ рдЬреЗрдирд░рд┐рдХ рдирд╣реАрдВ рд╣реИрдВ, рддреЛ рдирдИ рдкреЗрд╢ рдХреА рдЧрдИ рдкрд╕рд▓реА рдЦрд╛рд▓реА рд╣реЛрдиреА рдЪрд╛рд╣рд┐рдП рдФрд░ рдЗрд╕рд▓рд┐рдП рд╣рд╛рдирд┐рд░рд╣рд┐рдд (рдореБрдЭреЗ рдЖрд╢рд╛ рд╣реИ)ред
рд░реБрдЪрд┐ рдХреЗ рдЕрдиреНрдп рдмрд┐рдВрджреБ:
type
impls рдореЗрдВ рд╕реЗрдЯрдЕрдк рд╣реИрдВрддреБрдореНрд╣реЗрдВ рдирдпрд╛ рддрд░реАрдХрд╛ рдорд┐рд▓ рдЧрдпрд╛ рд╣реИред
@petrochenkov - рд╕рд╣реА рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рдзреНрд╡рдирд┐?
@nikomatsakis
рд╕рд╣реА рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рдзреНрд╡рдирд┐?
рд╕рдм рдХреБрдЫ рд╕рд╣реА рджрд┐рдЦрддрд╛ рд╣реИред
рдЕрдЧрд▓рд╛ рдХрджрдоред рдЖрдЬреАрд╡рди рд╕рдВрдХрд▓реНрдкред
рдмреЗрд╣рддрд░ рдпрд╛ рдмрджрддрд░ рдХреЗ рд▓рд┐рдП, рдпрд╣ рд╡рд░реНрддрдорд╛рди рдореЗрдВ рдЕрдиреНрдп рдирд╛рдо рд╕рдорд╛рдзрд╛рди рд╕реЗ рдкреВрд░реА рддрд░рд╣ рд╕реЗ рдЕрд▓рдЧ рдХреЛрдб рдореЗрдВ рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИред рдРрд╕рд╛ рдЗрд╕рд▓рд┐рдП рд╣реИ рдХреНрдпреЛрдВрдХрд┐ рдпрд╣ рдПрдЪрдЖрдИрдЖрд░ рдХреЗ рдирд┐рд░реНрдорд╛рдг рдХреЗ рдмрд╛рдж рд╣реЛрддрд╛ рд╣реИред рд▓рдЧрднрдЧ рдирд┐рд╢реНрдЪрд┐рдд рд░реВрдк рд╕реЗ рдпрд╣ рдмрджрд▓реЗрдЧрд╛ рд▓реЗрдХрд┐рди рдпрд╣ рдЕрднреА рддрдХ рдирд╣реАрдВ рдмрджрд▓рд╛ рд╣реИред
рдореВрд▓ рд╡рд┐рдЪрд╛рд░ рд╕рд╛рдорд╛рдиреНрдп рдирд╛рдо рд╕рдВрдХрд▓реНрдк рдХреЗ рд╕рдорд╛рди рд╣реИрдВ, рд╣рд╛рд▓рд╛рдВрдХрд┐, рд╕рд┐рд╡рд╛рдп рдЗрд╕рдХреЗ рдХрд┐ рд╣рдо рдЪреАрдЬреЛрдВ рдХреЛ "рдкрд╕рд▓рд┐рдпрд╛рдВ" рдирд╣реАрдВ рдХрд╣рддреЗ рд╣реИрдВ, рдмрд▓реНрдХрд┐ "рд╕реНрдХреЛрдк" рдХрд╣рддреЗ рд╣реИрдВред =)
"рджреЗрд░ рд╕реЗ рдмрдВрдзреЗ" рдЬреАрд╡рди рдХрд╛рд▓ рдХреА рдЗрд╕ рдЕрд╡рдзрд╛рд░рдгрд╛ рдХреЗ рдХрд╛рд░рдг рдХреБрдЫ рд╣рд▓реНрдХреА рдЬрдЯрд┐рд▓рддрд╛рдПрдБ рд╣реИрдВред рд╣рд╛рд▓рд╛рдВрдХрд┐ рдпрд╣ рд╡рд╛рд╕реНрддрд╡ рдореЗрдВ рдкреНрд░рд╛рд╕рдВрдЧрд┐рдХ рдирд╣реАрдВ рд╣реИ - рдПрдХ рд╕рд╛рдорд╛рдиреНрдп рд╕рдВрдмрджреНрдз рдкреНрд░рдХрд╛рд░ рдХреЗ рд▓рд┐рдП рд╕рднреА рдЬреАрд╡рдирдХрд╛рд▓ "рдкреНрд░рд╛рд░рдВрднрд┐рдХ-рдмрд╛рдзреНрдп" рд╣реЛрдВрдЧреЗ, рдЬреЛ рдХрд┐ рд╕рд╛рдзрд╛рд░рдг рдорд╛рдорд▓рд╛ рд╣реИред рдПрдХ "рджреЗрд░ рд╕реЗ рдмрд╛рдзреНрдп" рдЬреАрд╡рдирдХрд╛рд▓ рдПрдХ рд╡рд┐рдзрд┐ рдпрд╛ рдХрд╛рд░реНрдп рдкрд░ рдШреЛрд╖рд┐рдд рдЬреАрд╡рдирдХрд╛рд▓ рд╣реИ рдЬрд┐рд╕рдХрд╛ рдореВрд▓реНрдп рд╡рд┐рдзрд┐ рд▓рд╛рдЧреВ рд╣реЛрдиреЗ рддрдХ рдЖрдкреВрд░реНрддрд┐ рдирд╣реАрдВ рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИред рдореИрдВ рдпрд╣рд╛рдВ рд╡рд┐рд╡рд░рдг рдореЗрдВ рдирд╣реАрдВ рдЬрд╛рдКрдВрдЧрд╛ рдХреНрдпреЛрдВрдХрд┐ рдпрд╣ рдЙрддрдирд╛ рдкреНрд░рд╛рд╕рдВрдЧрд┐рдХ рдирд╣реАрдВ рд╣реИ - рдореБрдЦреНрдп рдмрд╛рдд рдпрд╣ рд╣реИ рдХрд┐ рд╣рдо рд╡рд┐рдзрд┐рдпреЛрдВ рдХреЗ рд▓рд┐рдП рдареАрдХ рдЙрд╕реА рдореЙрдбрд▓ рдХрд╛ рдкрд╛рд▓рди рдирд╣реАрдВ рдХрд░рдирд╛ рдЪрд╛рд╣рддреЗ рд╣реИрдВ рдЬреИрд╕рд╛ рдХрд┐ рд╣рдо рдЕрдиреНрдп рдкреНрд░рдХрд╛рд░ рдХреЗ рд╕рд╛рдорд╛рдиреНрдп рд╡рд╕реНрддреБрдУрдВ рдХреЗ рд▓рд┐рдП рдХрд░рддреЗ рд╣реИрдВ, рдЕрдиреНрдп рдирд╛рдо рд╕рдВрдХрд▓реНрдк рдХреЗ рд╡рд┐рдкрд░реАрдд рдорд╛рдорд▓реЗ
рдХреЛрдб рдХрд╛ рдПрдХ рдЙрджрд╛рд╣рд░рдг рдмрд┐рдЯ рдпрд╣рд╛рдВ рджрд┐рдпрд╛ рдЧрдпрд╛ рд╣реИред рдпрд╣ рд╡рд╣ рдХреЛрдб рд╣реИ рдЬреЛ impl
, struct
рдпрд╛ рдЕрдиреНрдп рдЧреИрд░-рдХрд╛рд░реНрдпрд╛рддреНрдордХ рдЖрдЗрдЯрдо рдкрд░ рдЬрд╛рддрд╛ рд╣реИред рдЗрди рдорд╛рдорд▓реЛрдВ рдореЗрдВ, рдЬреИрд╕рд╛ рдХрд┐ GAT рдореЗрдВ рд╣реЛрддрд╛ рд╣реИ, рд╣рдо рдореВрд▓ рд░реВрдк рд╕реЗ Generics
рд╕реЗ рд╕рднреА рдЖрдЬреАрд╡рди рдорд╛рдкрджрдВрдбреЛрдВ рдХреЛ рджрд╛рдпрд░реЗ рдореЗрдВ рд▓рд╛рдирд╛ рдЪрд╛рд╣рддреЗ рд╣реИрдВ рдФрд░ рдЙрдиреНрд╣реЗрдВ "рдкреНрд░рд╛рд░рдВрднрд┐рдХ-рдмрд╛рдзреНрдп" рдЬреАрд╡рдирдХрд╛рд▓ рдореЗрдВ рдореИрдк рдХрд░рдирд╛ рдЪрд╛рд╣рддреЗ рд╣реИрдВ:
рдЖрдк рджреЗрдЦ рд╕рдХрддреЗ рд╣реИрдВ рдХрд┐ рдпрд╣ рдкрд╣рд▓реЗ рдЬреАрд╡рдирдХрд╛рд▓ рдХрд╛ рдПрдХ рд╡реЗрдХреНрдЯрд░ рдмрдирд╛рддрд╛ рд╣реИ, рдкреНрд░рддреНрдпреЗрдХ рдХреЗ рд▓рд┐рдП Region::early
рдЖрд╣реНрд╡рд╛рди рдХрд░рддрд╛ рд╣реИ:
рдЗрд╕рдХреЗ рдмрд╛рдж рдпрд╣ Scope
рдмрдирд╛рддрд╛ рд╣реИред next_early_index
рдЪрд░ рдХреЗрд╡рд▓ рдпрд╣ рдЧрд┐рди рд░рд╣рд╛ рд╣реИ рдХрд┐ рдХрд┐рддрдиреЗ рдкреНрд░рд╛рд░рдВрднрд┐рдХ-рдмрд╛рдзреНрдп рдЬреАрд╡рдирдХрд╛рд▓ рджрд╛рдпрд░реЗ рдореЗрдВ рд╣реИрдВред рдЪреВрдВрдХрд┐ рдпрд╣ рдХреЛрдб рдЖрдЗрдЯрдо рдХреЗ рд▓рд┐рдП рд╡рд┐рд╢рд┐рд╖реНрдЯ рд╣реИ, рдпрд╣ рд╣рдореЗрд╢рд╛ рдЗрд╕ рд╡рд░реНрддрдорд╛рди рдЖрдЗрдЯрдо рдкрд░ рдШреЛрд╖рд┐рдд рдкреНрд░рд╛рд░рдВрднрд┐рдХ-рдмрд╛рдзреНрдп рдЬреАрд╡рдирдХрд╛рд▓ рдХреА рд╕рдВрдЦреНрдпрд╛ рд╣реЛрдЧреАред (рдмрд╛рдж рдореЗрдВ рд╣рдо рдПрдХ рдРрд╕реЗ рдорд╛рдорд▓реЗ рдХреЛ рджреЗрдЦреЗрдВрдЧреЗ рдЬрд╣рд╛рдВ рд╣рдо рдЕрддрд┐рд░рд┐рдХреНрдд рдЬреАрд╡рди рдХрд╛рд▓ рдХреЛ рджрд╛рдпрд░реЗ рдореЗрдВ рд▓рд╛ рд░рд╣реЗ рд╣реИрдВ, рдЬреЛ рдХрд┐ рд╣рдо GAT рдХреЗ рд▓рд┐рдП рдЕрдзрд┐рдХ рдЪрд╛рд╣рддреЗ рд╣реИрдВред)
рдЕрдВрдд рдореЗрдВ, рд╣рдо with()
рдХрд╛ рдЖрд╣реНрд╡рд╛рди рдХрд░рддреЗ рд╣реИрдВред рдпрд╣ рд╡рд┐рдзрд┐ рджрд╛рдпрд░реЗ рдХреЛ рджрд╛рдпрд░реЗ рдореЗрдВ рд▓рд╛рдПрдЧреА рдФрд░ рдмрдВрдж рдХрд░рдиреЗ рдХрд╛ рдЖрд╣реНрд╡рд╛рди рдХрд░реЗрдЧреАред рдЗрд╕ рдХреНрд▓реЛрдЬрд░ рдХреЗ рдЕрдВрджрд░ рд╣рдо рдЬрд┐рди рднреА рдЬреАрд╡рдирдХрд╛рд▓реЛрдВ рдХрд╛ рджреМрд░рд╛ рдХрд░рддреЗ рд╣реИрдВ, рдЙрдирдореЗрдВ рд╡реЗ рдирд╛рдо рджрд┐рдЦрд╛рдИ рджреЗрдВрдЧреЗ рдЬрд┐рдиреНрд╣реЗрдВ рд╣рдордиреЗ рдЕрднреА-рдЕрднреА рдкрд░рд┐рднрд╛рд╖рд┐рдд рдХрд┐рдпрд╛ рд╣реИ:
рдареАрдХ рд╣реИ, рдЕрдм рдПрдХ рдФрд░ рдЙрджрд╛рд╣рд░рдг рджреЗрдЦрддреЗ рд╣реИрдВред рдЗрд╕ рдорд╛рдорд▓реЗ рдореЗрдВ "рдирд┐рд╣рд┐рдд рд▓рдХреНрд╖рдг" рд╢рд╛рдорд┐рд▓ рд╣реИрдВред рдпрд╣ рдЬреЛ рдХрд░ рд░рд╣рд╛ рд╣реИ рдЙрд╕рдХрд╛ рд╡рд┐рд╡рд░рдг рдЙрддрдирд╛ рдорд╣рддреНрд╡рдкреВрд░реНрдг рдирд╣реАрдВ рд╣реИ (рдЕрд░реНрдерд╛рдд, рдЖрдкрдХреЛ impl Trait
рдкреНрд░рддрд┐ рд╕реЗ рдХрдо рдХрд░рдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рдирд╣реАрдВ рд╣реИ)ред рдпрд╣ рдХрд╣рдирд╛ рдХрд╛рдлреА рд╣реИ рдХрд┐ рдпрд╣ рдХреБрдЫ рдирдП рд╢реБрд░реБрдЖрддреА рдЬреАрд╡рдиреЛрдВ рдХреЛ рджрд╛рдпрд░реЗ рдореЗрдВ рд▓рд╛ рд░рд╣рд╛ рд╣реИ - рдареАрдХ рдпрд╣реА рд╣рдо GAT рдХреЗ рд▓рд┐рдП рдХрд░рдирд╛ рдЪрд╛рд╣рддреЗ рд╣реИрдВред
рдореБрдЭреЗ рдХреБрдЫ рдмрд╛рддреЛрдВ рдкрд░ рдкреНрд░рдХрд╛рд╢ рдбрд╛рд▓рдиреЗ рджреЛред рд╕рдмрд╕реЗ рдкрд╣рд▓реЗ, рд╡рд┐рдзрд┐ next_early_index
рдЕрдЧрд▓реА рдмрд┐рдирд╛ рдЕрд╕рд╛рдЗрди рдХреА рдЧрдИ рдкреНрд░рд╛рд░рдВрднрд┐рдХ-рдмрд╛рдЙрдВрдб рдЗрдВрдбреЗрдХреНрд╕ рд▓реМрдЯрд╛рддреА рд╣реИ:
рдпрд╣ рдПрдХ рдкреНрд░рд╛рд░рдВрднрд┐рдХ рдмрд┐рдВрджреБ рдкреНрд░рджрд╛рди рдХрд░рддрд╛ рд╣реИред рдЗрд╕рдХреЗ рдмрд╛рдж, рд╣рдо рдирдИ рдкреНрд░рд╛рд░рдВрднрд┐рдХ-рдмрд╛рдЙрдВрдб рд▓рд╛рдЗрдлрд╝рдЯрд╛рдЗрдо рдкрд░рд┐рднрд╛рд╖рд╛рдПрдБ рдмрдирд╛рдиреЗ рдХреЗ рд▓рд┐рдП рдлрд┐рд░ рд╕реЗ Region::early
рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рддреЗ рд╣реИрдВ рдЬрд┐рдирдХрд╛ рд╕рдорд╛рдзрд╛рди рдЗрд╕рдХреЗ рд╡рд┐рд░реБрджреНрдз рдХрд┐рдпрд╛ рдЬрд╛рдПрдЧрд╛:
рдЕрдВрдд рдореЗрдВ, рд╣рдо рдлрд┐рд░ рд╕реЗ with
рдкрд░ рдХреЙрд▓ рдХрд░рдХреЗ рдЙрдиреНрд╣реЗрдВ рджрд╛рдпрд░реЗ рдореЗрдВ рд▓рд╛рддреЗ рд╣реИрдВ:
рдареАрдХ рд╣реИ, рд╡реЗ рджреЛ рдЙрджрд╛рд╣рд░рдг рд╣реИрдВред рд╣рдо рджреВрд╕рд░реЗ рд╡рд╛рд▓реЗ рдХреА рддрд░рд╣ рд╣реА рдХреБрдЫ рдХрд░рдирд╛ рдЪрд╛рд╣рддреЗ рд╣реИрдВред рд╣рдо рдЗрди рджреЛ рд╡рд┐рдзрд┐рдпреЛрдВ рдХреА рдкрд░рд┐рднрд╛рд╖рд╛рдУрдВ рдХреЛ рд╕рдВрд╢реЛрдзрд┐рдд рдХрд░рдирд╛ рдЪрд╛рд╣реЗрдВрдЧреЗ:
рджреЛрдиреЛрдВ рдХреЛ, рд╕рдВрдмрджреНрдз рдкреНрд░рдХрд╛рд░реЛрдВ рдХреЗ рд▓рд┐рдП, рд╕рдВрдмрджреНрдз рдЬреЗрдирд░рд┐рдХ рдХреЛ рд╕рдВрд╕рд╛рдзрд┐рдд рдХрд░рдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реЛрдЧреАред (рдЕрдиреНрдп рдорд╛рдорд▓реЛрдВ рдореЗрдВ, рдЙрдиреНрд╣реЗрдВ рд╕рдВрднрд╡рддрдГ рдЬреЛрд░ рджреЗрдирд╛ рдЪрд╛рд╣рд┐рдП рдХрд┐ рдЬреЗрдирд░рд┐рдХ рдЦрд╛рд▓реА рд╣реИрдВред)
рддреЛ рдореИрдВ рдЖрдЬ рдкрд╣рд▓реЗ рдЗрд╕ рдкрд░ рдХреВрдж рдкрдбрд╝рд╛ред рдореИрдВ рдпрд╣ рд╕реБрдирд┐рд╢реНрдЪрд┐рдд рдХрд░рдирд╛ рдЪрд╛рд╣рддрд╛ рд╣реВрдВ рдХрд┐ рдореИрдВ рд╕рд╣реА рд░рд╛рд╕реНрддреЗ рдкрд░ рд╣реВрдВ:
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 рддреНрд░реБрдЯрд┐ рджреЗрддрд╛ рд╣реИempty_generics
-- рдЬрд╛рдВрдЪрддрд╛ рд╣реИ рдХрд┐ type Bar<,>
рддреНрд░реБрдЯрд┐ рджреЗрддрд╛ рд╣реИ, рдареАрдХ рд▓рдЧрддрд╛ рд╣реИ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>
рдирд╣реАрдВ рд╣реИ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 prohibit_type_params
рджреНрд╡рд╛рд░рд╛ рд░рд┐рдкреЛрд░реНрдЯ рдХреА рдЧрдИ рд╣реИ:
рдкрд╣рд▓рд╛ рдХрджрдо рдпрд╣ рдкрддрд╛ рд▓рдЧрд╛рдирд╛ рд╣реИ рдХрд┐ рдЗрд╕реЗ рдХрд╣рд╛рдВ рд╕реЗ рдмреБрд▓рд╛рдпрд╛ рдЧрдпрд╛ рд╣реИред рдРрд╕рд╛ рдХрд░рдиреЗ рдХрд╛ рдореЗрд░рд╛ рдкрд╕рдВрджреАрджрд╛ рддрд░реАрдХрд╛ рд╕реНрдерд╛рдиреАрдп рдирд┐рд░реНрдорд╛рдг рдкреНрд░рд╛рдкреНрдд рдХрд░рдирд╛ рдФрд░ -Ztreat-err-as-bug
рдХреЗ рд╕рд╛рде рд╕рдВрдпреБрдХреНрдд RUST_BACKTRACE=1
рдЙрдкрдпреЛрдЧ рдХрд░рдирд╛ рд╣реИред рд▓реЗрдХрд┐рди рдореИрдВ рдЖрдкрдХреЛ рд╡реЗ рдкрд░рд┐рдгрд╛рдо рдирд╣реАрдВ рджрд┐рдЦрд╛ рд╕рдХрддрд╛ рдХреНрдпреЛрдВрдХрд┐ рдЬрдВрдЧ рдЕрднреА рднреА рдмрди рд░рд╣реА рд╣реИред :P рддреЛ рдЗрд╕рдХреЗ рдмрдЬрд╛рдп рдореИрдВрдиреЗ рдПрдХ рддреНрд╡рд░рд┐рдд rg prohibit_type_params
рдХрд┐рдпрд╛, рдореБрдЭреЗ рдЬрд▓реНрджреА рд╕реЗ рдПрдХ рд╕рдВрджрд┐рдЧреНрдз рдорд╛рдорд▓реЗ рдХреЛ рдЗрдВрдЧрд┐рдд рдХрд░рдиреЗ рджреЗрдВ рдЬреЛ рдореБрдЭреЗ рджрд┐рдЦрд╛рдИ рджреЗ рд░рд╣рд╛ рд╣реИред
рдПрдХ рдЖрд╣реНрд╡рд╛рди associated_path_def_to_ty
рд╕реЗ рд╣реИ:
рдЬреИрд╕рд╛ рдХрд┐ рдЯрд┐рдкреНрдкрдгреА рдЗрдВрдЧрд┐рдд рдХрд░рддреА рд╣реИ, рдЗрд╕реЗ Pointer<T>
рдШрдЯрдХ рдХреЛ Self::Pointer<T>
рдЬреИрд╕реЗ рдкрде рдореЗрдВ рд╣рд▓ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдЖрдордВрддреНрд░рд┐рдд рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИ (рдзреНрдпрд╛рди рджреЗрдВ рдХрд┐ рдЯрд╛рдЗрдк рдкреИрд░рд╛рдореАрдЯрд░ рдХреЛ рдкрде рдЦрдВрдб рдХрд╛ рд╣рд┐рд╕реНрд╕рд╛ рдорд╛рдирд╛ рдЬрд╛рддрд╛ рд╣реИ, рд╕рд╛рде рд╣реА рд╡реЗ рдЬрд┐рд╕ рдирд╛рдо рд╕реЗ рдЬреБрдбрд╝реЗ рд╣реЛрддреЗ рд╣реИрдВ ) GATs рддрдХ, рдЯрд╛рдЗрдк рдкреИрд░рд╛рдореАрдЯрд░ рд╡рд╣рд╛рдВ рдХрд╛рдиреВрдиреА рдирд╣реАрдВ рдереЗ (рдЙрджрд╛рд╣рд░рдг рдХреЗ рд▓рд┐рдП, T::Item
), рдЗрд╕рд▓рд┐рдП рд╣рдорд╛рд░реЗ рдкрд╛рд╕ рдХреЗрд╡рд▓ рдПрдХ рдХрдВрдмрд▓ рдкреНрд░рддрд┐рдмрдВрдз рд╣реИ:
рд╕реНрдкрд╖реНрдЯ рд░реВрдк рд╕реЗ рдпрд╣ рдирд╣реАрдВ рдЪрд▓реЗрдЧрд╛ред рд╣рдореЗрдВ рдЙрд╕ рд░реЗрдЦрд╛ рдХреЛ рд╣рдЯрд╛ рджреЗрдирд╛ рдЪрд╛рд╣рд┐рдП рдФрд░ рдЗрд╕реЗ рдХрд┐рд╕реА рдкреНрд░рдХрд╛рд░ рдХреЗ рдЪреЗрдХ рд╕реЗ рдмрджрд▓рдирд╛ рдЪрд╛рд╣рд┐рдП, рдпрджрд┐ рдкреИрд░рд╛рдореАрдЯрд░ рдкреНрд░рджрд╛рди рдХрд┐рдП рдЬрд╛рддреЗ рд╣реИрдВ, рддреЛ рд╡реЗ рдЕрдкреЗрдХреНрд╖рд┐рдд рд╕рдВрдЦреНрдпрд╛ рд╕реЗ рдореЗрд▓ рдЦрд╛рддреЗ рд╣реИрдВред рдРрд╕рд╛ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП, рд╣рдо рд╕рдВрднрд╡рддрдГ рдХреБрдЫ рддреНрд░реБрдЯрд┐-рдЬрд╛рдВрдЪ рдХреЛрдб рдЪрд╛рд╣рддреЗ рд╣реИрдВ рдЬреЛ 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 рд╕реЗ рд╕рдВрдмрдВрдзрд┐рдд рд╣рд░ рдЪреАрдЬ рдХреА рдЦреЛрдЬ рдХреАред рдЗрд╕рд▓рд┐рдП рдореИрдВ рдЗрд╕ рд╕реБрд╡рд┐рдзрд╛ рдХреЗ рд╕рдВрдмрдВрдз рдореЗрдВ рд╕рднреА рдЬрд╛рдирдХрд╛рд░реА рдХреЛ рд╕рдВрдХреНрд╖реЗрдк рдореЗрдВ рдкреНрд░рд╕реНрддреБрдд рдХрд░рдиреЗ рдХрд╛ рдкреНрд░рдпрд╛рд╕ рдХрд░реВрдВрдЧрд╛; рд╢рд╛рдпрдж рдпрд╣ рдХреБрдЫ рд▓реЛрдЧреЛрдВ рдХреЗ рд▓рд┐рдП рдЙрдкрдпреЛрдЧреА рд╣реИред рд▓реЗрдХрд┐рди рдореИрдВ рдХреБрдЫ рдирд╣реАрдВ рдЬрд╛рдирддрд╛, рдЗрд╕рд▓рд┐рдП рдЗрд╕реЗ рдирдордХ рдХреЗ рджрд╛рдиреЗ рдХреЗ рд╕рд╛рде рд▓реЗ рд▓реЛ! рдЗрд╕рдХреЗ рдЕрд▓рд╛рд╡рд╛: рдХреГрдкрдпрд╛ рдореБрдЭреЗ рдмрддрд╛рдПрдВ рдХрд┐ рдХреНрдпрд╛ рдХреБрдЫ рдЬрд╛рдирдХрд╛рд░реА рдЧрд▓рдд рд╣реИ рддрд╛рдХрд┐ рдореИрдВ рдЗрд╕реЗ рдареАрдХ рдХрд░ рд╕рдХреВрдВред
@sunjay рдиреЗ рджреЛ рд╢рд╛рдирджрд╛рд░ PR рдХреЛ рдЙрддрд╛рд░рд╛:
рдлрд┐рд░, рдХреБрдЫ рд╕рдордп рдХреЗ рд▓рд┐рдП, рдмрд╣реБрдд рдХреБрдЫ рдирд╣реАрдВ рд╣реБрдЖред рдЗрд╕рдХреЗ рдмрд╛рдж рдирд┐рдХреЛ рдиреЗ рд╕рдВрдХреНрд╖реЗрдк рдореЗрдВ рдмрддрд╛рдпрд╛ рдХрд┐ рдЗрд╕ рдЯрд┐рдкреНрдкрдгреА рдореЗрдВ рдЕрднреА рдХреНрдпрд╛ рд╣реЛрдиреЗ рдХреА рдЬрд░реВрд░рдд рд╣реИ (2018-03-12)ред рдореВрд▓ рд░реВрдк рд╕реЗ (рдП) рдкрд░реАрдХреНрд╖рдг рд▓рд┐рдЦреЗрдВ, (рдмреА) рдкрд╛рд░реНрд╕рд░/рдлреНрд░рдВрдЯ-рдПрдВрдб рдореЗрдВ рдмрдЧ рдХреЛ рдареАрдХ рдХрд░реЗрдВ/рд╕реБрдзрд╛рд░реЗрдВ рдФрд░ (рд╕реА) рд╡рд┐рд╢реЗрд╖рддрд╛ рдкреНрд░рдгрд╛рд▓реА рдореЗрдВ рдХрд╛рд░реНрдпрд╛рдиреНрд╡рдпрдиред рдЗрд╕ рдЯрд┐рдкреНрдкрдгреА (2018-03-13) рдореЗрдВ рдмрд┐рдВрджреБ (рдП) рдХреЛ рдФрд░ рд╕рдордЭрд╛рдпрд╛ рдЧрдпрд╛ рдерд╛ред
@gavento RFC1598 (GAT) рдХреЗ рд▓рд┐рдП рдкрд░реАрдХреНрд╖рдг рдмрдврд╝рд╛рдПрдБ ( 2018-05-11 рдореЗрдВ рд╡рд┐рд▓рдп)
рддрдм рд╕реЗ рдХреЛрдИ UI рдкрд░реАрдХреНрд╖рдг рдирд╣реАрдВ рдЬреЛрдбрд╝рд╛ рдЧрдпрд╛ ред рдФрд░ рдореБрдЭреЗ рд╕реАрдзреЗ GAT рд╕реЗ рд╕рдВрдмрдВрдзрд┐рдд рдХреЛрдИ рдЕрдиреНрдп рдкреАрдЖрд░ рдирд╣реАрдВ рдорд┐рд▓ рд░рд╣рд╛ рд╣реИред
рд╣рд╛рд▓рд╛рдВрдХрд┐ , рдКрдкрд░ рд╕реЗ рдмрд┐рдВрджреБ (рд╕реА) (рд╡рд┐рд╢реЗрд╖рддрд╛ рдкреНрд░рдгрд╛рд▓реА) рдкрд░ "рдЧреБрдкреНрдд рд░реВрдк рд╕реЗ" рдХрд╛рдо рдХрд┐рдпрд╛ рдЬрд╛ рд░рд╣рд╛ рд╣реИред рдЬрд╣рд╛рдВ рддрдХ тАЛтАЛрдореИрдВ рдЗрд╕реЗ рд╕рдордЭрддрд╛ рд╣реВрдВ, рдпреЛрдЬрдирд╛ рдЬрд▓реНрдж рд╣реА рдирдП рдЪрд╛рдХ-рдЖрдзрд╛рд░рд┐рдд рд╡рд┐рд╢реЗрд╖рддрд╛ рд╕реЙрд▓реНрд╡рд░ рдореЗрдВ рдорд╛рдЗрдЧреНрд░реЗрдЯ рдХрд░рдиреЗ рдХреА рд╣реИ рди рдХрд┐ рдкреБрд░рд╛рдиреЗ рд╕рд┐рд╕реНрдЯрдо рдкрд░ GAT рдХреЛ рдХрд╛рдо рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдПред рдирдП рд╡рд┐рд╢реЗрд╖рддрд╛ рд╕реЙрд▓реНрд╡рд░ рдХрд╛ рдПрдХреАрдХрд░рдг "рдЪреЙрдХреАрдлрд┐рдХреЗрд╢рди" рдЯреНрд░реИрдХрд┐рдВрдЧ рд╕рдорд╕реНрдпрд╛ рджреНрд╡рд╛рд░рд╛ рдЯреНрд░реИрдХ рдХрд┐рдпрд╛ рдЬрд╛ рд░рд╣рд╛ рд╣реИред рдЪрд╛рдХ рдФрд░ рдЪрд╛рдХреАрдХрд░рдг рд╕реЗ рд╕рдВрдмрдВрдзрд┐рдд рдХрд╛рдлреА рдХреБрдЫ рдкреАрдЖрд░ рд╣реИрдВред рд╡рд┐рд╢реЗрд╖ рд░реВрдк рд╕реЗ, рдПрдХ рдЪрд╛рдХ рдкреАрдЖрд░ рд╣реИ рдЬрд┐рд╕реЗ "рдЬреАрдПрдЯреА рд▓рд╛рдЧреВ рдХрд░рдирд╛ рд╕рдорд╛рдкреНрдд рдХрд░реЗрдВ" (рдорд░реНрдЬ 2018-05-24) рдХрд╣рд╛ рдЬрд╛рддрд╛ рд╣реИред рддреЛ рдРрд╕рд╛ рд▓рдЧрддрд╛ рд╣реИ рдХрд┐ GAT рдХреЗ рд▓рд┐рдП рдХреЛрд░ рд╕рд┐рд╕реНрдЯрдо рдкрд╣рд▓реЗ рд╕реЗ рд╣реА рдореМрдЬреВрдж рд╣реИред
рдЙрд╕ рдиреЗ рдХрд╣рд╛, рдЪрд╛рдХ рдореЗрдВ "GATs" рдПрдХ рдкреНрд░реЛрдЯреЛрдЯрд╛рдЗрдк рдХрд╛рд░реНрдпрд╛рдиреНрд╡рдпрди рд╣реИ рдФрд░ рдЗрд╕реЗ rustc рдореЗрдВ рдЙрдкрдпреЛрдЧ рдХрд░рдирд╛ рдХреЗрд╡рд▓ use chalk;
рдирд╣реАрдВ рд╣реИред рдЬреИрд╕рд╛ рдХрд┐ @scalexm рдиреЗ рдореБрдЭреЗ рдмрддрд╛рдпрд╛: "рдРрд╕рд╛ рд▓рдЧрддрд╛ рд╣реИ рдХрд┐ рдмрд╣реБрдд рдХреБрдЫ [рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП]" рд╣реИред
рдЕрдзрд┐рдХ рдЬрд╛рдирдХрд╛рд░реА рдХреЗ рд▓рд┐рдП рдФрд░ рдорджрдж рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП, #wg-traits
рдбрд┐рд╕реНрдХреЙрд░реНрдб рдЪреИрдирд▓ рдФрд░ WG рдЯреНрд░реИрдХрд┐рдВрдЧ рд╕рдорд╕реНрдпрд╛ рдХреЗ рд▓рдХреНрд╖рдгреЛрдВ рдкрд░ рдПрдХ рдирдЬрд╝рд░ рдбрд╛рд▓рдирд╛ рд╕рдВрднрд╡рддрдГ рдЙрдкрдпреЛрдЧреА рд╣реИред
рддреЛ @nikomatsakis рдиреЗ рд░рд╕реНрдЯ-рд▓реИрдВрдЧ рдбрд┐рд╕реЙрд░реНрдбрд░ рд╕рд░реНрд╡рд░ рдкрд░ #wg-traits-gat
рдЪреИрдирд▓ рдмрдирд╛рдпрд╛ ( рдпрд╣рд╛рдВ рд╢рд╛рдорд┐рд▓ рд╣реЛрдВ )ред рдпрд╣ рдмрд╣реБрдд рдЕрдЪреНрдЫрд╛ рд╣реЛрдЧрд╛ рдпрджрд┐ рд╣рдо рд╣рд░ рдЙрд╕ рд╡реНрдпрдХреНрддрд┐ рдХреЛ рдкреНрд░рд╛рдкреНрдд рдХрд░ рд╕рдХреЗрдВ рдЬреЛ рд╡рд╣рд╛рдВ рдорджрдж рдХрд░рдирд╛ рдЪрд╛рд╣рддрд╛ рд╣реИред рд╕рд╛рде рд╣реА рдХреБрдЫ рд▓реЛрдЧ рдЬреЛ рдЗрд╕ рд╕реБрд╡рд┐рдзрд╛ рдХреА рд╕реНрдерд┐рддрд┐ рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рдЬрд╛рдирддреЗ рд╣реИрдВ (рд╡рд┐рд╢реЗрд╖ рд░реВрдк рд╕реЗ, рдЕрднреА рднреА рдХреНрдпрд╛ рдХрд░рдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реИ рдФрд░ рд╣рдо рдХрд╣рд╛рдБ рдорджрдж рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ)ред рдЗрд╕рд╕реЗ рд╕рдВрдЪрд╛рд░ рдЖрд╕рд╛рди рдФрд░ рддреЗрдЬрд╝ рд╣реЛрдирд╛ рдЪрд╛рд╣рд┐рдП, рдЦрд╛рд╕рдХрд░ рдореЗрд░реЗ рдЬреИрд╕реЗ рд▓реЛрдЧреЛрдВ рдХреЗ рд▓рд┐рдП рдЬреЛ рдЕрднреА рддрдХ рдЧрд╣рд░рд╛рдИ рд╕реЗ рд╢рд╛рдорд┐рд▓ рдирд╣реАрдВ рд╣реИрдВ/WG рдХреЗ рд▓рдХреНрд╖рдгреЛрдВ рдХрд╛ рд╣рд┐рд╕реНрд╕рд╛ рд╣реИрдВ :)
рдХреНрдпрд╛ рдЗрд╕ рдкрд░ рд╣рд╛рд▓ рд╣реА рдореЗрдВ рдХреЛрдИ рдЕрдкрдбреЗрдЯ рдЖрдпрд╛ рд╣реИ? рдХреНрдпрд╛ рд╣рдо рд╕рдВрдХрд▓рдХ рдореЗрдВ рдЪрд╛рдХ рдПрдХреАрдХрд░рдг рдХреА рдкреНрд░рддреАрдХреНрд╖рд╛ рдХрд░ рд░рд╣реЗ рд╣реИрдВ? (рд╢рд╛рдпрдж рдЗрд╕рдХреЗ рд▓рд┐рдП рдПрдХ рдЕрд▓рдЧ рдореБрджреНрджрд╛ рд╣реИред)
рд╢рд╛рдпрдж рдЗрд╕рдХреЗ рд▓рд┐рдП рдПрдХ рдЕрд▓рдЧ рдореБрджреНрджрд╛ рд╣реИред
рдПрдХ рдиреЛрдЯ рдХреЗ рд░реВрдк рдореЗрдВ (рд╕рдВрднрд╡рддрдГ рдЬреНрдЮрд╛рдд), рдпрд╣ рдХреЛрдб рд╕рдВрдХрд▓рдХ рдХреЛ рдбрд░рд╛рддрд╛ рд╣реИ:
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;
}
}
рдЗрд╕рд╕реЗ рд╕рдВрдХрд▓рдХ рдШрдмрд░рд╛ рдЧрдпрд╛ред
рдореЗрд░реЗ рдкреНрд░рд╢реНрди рд╣реИрдВ:
рдЗрд╕рдХрд╛ рдЙрддреНрддрд░ рджреЗрдиреЗ рдореЗрдВ рдЖрдкрдХреЗ рд╕рдордп рдХреЗ рд▓рд┐рдП рдЕрдЧреНрд░рд┐рдо рдзрдиреНрдпрд╡рд╛рджред
@clintonmead рдореЗрд░рд╛ рдорд╛рдирдирд╛ тАЛтАЛтАЛтАЛрд╣реИ рдХрд┐ рдЕрдВрддрддрдГ рд╕рдВрднрд╡ рд╣реЛрдирд╛ рдЪрд╛рд╣рд┐рдП, рд▓реЗрдХрд┐рди рд╕реБрд╡рд┐рдзрд╛ рдХрд╛рд░реНрдпрд╛рдиреНрд╡рдпрди рдЕрднреА рддрдХ рд╕рдорд╛рдкреНрдд рдирд╣реАрдВ рд╣реБрдЖ рд╣реИ (рд╡рд╛рд╕реНрддрд╡ рдореЗрдВ, рд╕рдВрдХрд▓рдХ рдЖрдкрдХреЛ рдЪреЗрддрд╛рд╡рдиреА рджреЗрддрд╛ рд╣реИ рдХрд┐ рдЬрдм рдЖрдк рдЗрд╕рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдиреЗ рдХрд╛ рдкреНрд░рдпрд╛рд╕ рдХрд░рддреЗ рд╣реИрдВ рддреЛ рдпрд╣ рдХреНрд░реИрд╢ рд╣реЛ рд╕рдХрддрд╛ рд╣реИ!) рдореБрдЭреЗ рдирд╣реАрдВ рдкрддрд╛ рдХрд┐ рдЯрд╛рдЗрдорд▓рд╛рдЗрди рдХреНрдпрд╛ рд╣реИред
рд╣реЛ рд╕рдХрддрд╛ рд╣реИ рдХрд┐ рдЪрд╛рдХ рд▓реЛрдЧреЛрдВ рдХреЗ рд╕рд╛рде рдпрд╣ рджреЗрдЦрдиреЗ рд▓рд╛рдпрдХ рд╣реЛ рдХрд┐ рдХреНрдпрд╛ рдЗрд╕ рд╕реБрд╡рд┐рдзрд╛ рдкрд░ рдХрд╛рдо рдлрд┐рд░ рд╕реЗ рд╢реБрд░реВ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдПрдХреАрдХрд░рдг рдкрд░реНрдпрд╛рдкреНрдд рд░реВрдк рд╕реЗ рдЙрдиреНрдирдд рд╣реИ?
рдЗрд╕ рдкрд░ рдЕрдм рд░реЛрдХ рд▓рдЧрд╛ рджреА рдЧрдИ рд╣реИ
рдХреНрдпрд╛ рд╣рдо рд╕рдорд╕реНрдпрд╛ рд╡рд┐рд╡рд░рдг рдХреЛ рд╡рд░реНрддрдорд╛рди рдЕрд╡рд░реЛрдзрдХреЛрдВ рдХреЗ рд╕рд╛рде рдЕрджреНрдпрддрди рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ?
@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>,
рдкрд╛рд░реНрд╕ рднреА рдирд╣реАрдВ рдХрд░рддрд╛ (" +
, ,
, ::
, рдпрд╛ >
рдореЗрдВ рд╕реЗ рдПрдХ рдХреА рдЕрдкреЗрдХреНрд╖рд╛ рдХреА рдЧрдИ, $ =
рдорд┐рд▓рд╛")ред
рдХреНрдпрд╛ рд╡рд┐рд╢реЗрд╖рддрд╛ рдЖрдЙрдЯрдкреБрдЯ рдкреНрд░рдХрд╛рд░ 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 рдПрдХ (рдХреБрдЫ рд╣рдж рддрдХ рд╕рдВрдХреНрд╖рд┐рдкреНрдд) рдЕрдкрдбреЗрдЯ рд╣реИред
рдХреНрдпрд╛ рдпрд╣ 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 рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рдирд╣реАрдВ рд╣реИ?
рд╣рд╛рдБ, рдЬрдВрдЧ рдореЗрдВ рдЙрдЪреНрдЪ-рдкреНрд░рдХрд╛рд░ рдХреЗ рдкреНрд░рдХрд╛рд░реЛрдВ рдХрд╛ рдЕрдиреБрдХрд░рдг рдХрд░рдиреЗ рдХреА рд╡рд┐рдзрд┐ рджреЗрдЦреЗрдВред рдпрд╣ рдЕрдм рд╕реНрдерд┐рд░ рдкрд░ рднреА рдХрд╛рдо рдХрд░рддрд╛ рд╣реИред
рд╕рдмрд╕реЗ рдЙрдкрдпреЛрдЧреА рдЯрд┐рдкреНрдкрдгреА
https://github.com/rust-lang/rust/issues/44265#issuecomment -568247656 рдПрдХ (рдХреБрдЫ рд╣рдж рддрдХ рд╕рдВрдХреНрд╖рд┐рдкреНрдд) рдЕрдкрдбреЗрдЯ рд╣реИред
67510 рдЕрдВрддрд┐рдо рдкреНрд░рдореБрдЦ ICE/рд▓рд╛рдкрддрд╛ рд╡рд┐рд╢реЗрд╖рддрд╛ рд╣реИ рдЬрд┐рд╕реЗ рд▓рд╛рдЧреВ рдХрд░рдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реИред