рд░рд╕реНрдЯ рд╕реЗ рдЬреБрдбрд╝реЗ рдкреНрд░рдХрд╛рд░ рдХреНрдпреЛрдВ рд╣реИрдВ, рдФрд░ рдЙрдирдХреЗ рдмреАрдЪ рдЕрдВрддрд░ рдХреНрдпрд╛ рд╣реИ рдФрд░ рдкреНрд░рдХрд╛рд░ рддрд░реНрдХ рдЙрд░реНрдл тАЛтАЛрдЬреЗрдирд░рд┐рдХ, рдХреНрдпреЛрдВрдХрд┐ рд╡реЗ рд╕рдорд╛рди рд╣реИрдВ? рдХреНрдпрд╛ рдпрд╣ рдХреЗрд╡рд▓ рдмрд╛рдж рдХреА рдмрд╛рдд рдирд╣реАрдВ рд╣реИ, рдЬреИрд╕рд╛ рдХрд┐ рд╕рднреА рд╕рд╛рдорд╛рдиреНрдп рднрд╛рд╖рд╛рдУрдВ рдореЗрдВ рд╣реЛрддрд╛ рд╣реИ? рдЙрди рд▓реЛрдЧреЛрдВ рдХреЗ рд▓рд┐рдП рдЬреЛ рдмрд╕ рдЬрдВрдЧ рд╕реАрдЦрдирд╛ рд╢реБрд░реВ рдХрд░ рд░рд╣реЗ рд╣реИрдВ, рдФрд░ рд╡рд┐рд╢реЗрд╖ рд░реВрдк рд╕реЗ рдЙрди рд▓реЛрдЧреЛрдВ рдХреЗ рд▓рд┐рдП рдЬреЛ рдЕрдиреНрдп рднрд╛рд╖рд╛рдУрдВ рд╕реЗ рдЖрддреЗ рд╣реИрдВ ("рдпрд╣ рдЬреЗрдирд░рд┐рдХ рд╣реИ!" - рд╡рд░реНрд╖реЛрдВ рдХреЗ рд▓рд┐рдП рдЬреНрдЮрд╛рдиреА, рдХрд╣реЗрдВрдЧреЗ), рдРрд╕рд╛ рдкреНрд░рд╢реНрди рдирд┐рдпрдорд┐рдд рд░реВрдк рд╕реЗ рдЙрдарддрд╛ рд╣реИред рдЪрд▓реЛ рдареАрдХ рд╣реИред
рдЯреАрдПрд▓; рдбреАрдЖрд░ рдкреВрд░реНрд╡ рдХреЛрдб рдХреЛ рдирд┐рдпрдВрддреНрд░рд┐рдд рдХрд░рддрд╛ рд╣реИ, рдмрд╛рдж рд╡рд╛рд▓рд╛ рдХреЙрд▓рд░ред
рдЬреЗрдирд░рд┐рдХ рдмрдирд╛рдо рд╕рдВрдмрджреНрдз рдкреНрд░рдХрд╛рд░
рдЗрд╕рд▓рд┐рдП, рд╣рдорд╛рд░реЗ рдкрд╛рд╕ рдкрд╣рд▓реЗ рд╕реЗ рд╣реА рдкреНрд░рдХрд╛рд░ рдХреЗ рддрд░реНрдХ рд╣реИрдВ, рдпрд╛ рд╕рднреА рдХреЗ рдкрд╕рдВрджреАрджрд╛ рдЬреЗрдиреЗрд░рд┐рдХ рд╣реИрдВред рдпрд╣ рдХреБрдЫ рдЗрд╕ рддрд░рд╣ рджрд┐рдЦрддрд╛ рд╣реИ:
trait Foo<T> { fn bar(self, x: T); }
рдпрд╣рд╛рдБ T
рдареАрдХ рдкреНрд░рдХрд╛рд░ рдХрд╛ рддрд░реНрдХ рд╣реИред рдРрд╕рд╛ рд▓рдЧрддрд╛ рд╣реИ рдХрд┐ рдпрд╣ рд╕рднреА рдХреЗ рд▓рд┐рдП рдкрд░реНрдпрд╛рдкреНрдд рд╣реЛрдирд╛ рдЪрд╛рд╣рд┐рдП (рдЬреИрд╕реЗ рдХрд┐ 640 рдХрд┐рд▓реЛрдмрд╛рдЗрдЯ рдореЗрдореЛрд░реА)ред рд▓реЗрдХрд┐рди рдЬрдВрдЧ рдореЗрдВ, рдХреБрдЫ рдЬреБрдбрд╝реЗ рд╣реБрдП рдкреНрд░рдХрд╛рд░ рднреА рд╣реЛрддреЗ рд╣реИрдВ:
trait Foo { type Bar;
рдкрд╣рд▓реА рдирдЬрд╝рд░ рдореЗрдВ, рдПрдХ рд╣реА рдЕрдВрдбреЗ, рд▓реЗрдХрд┐рди рдПрдХ рдЕрд▓рдЧ рдХреЛрдг рд╕реЗред рдЖрдкрдХреЛ рднрд╛рд╖рд╛ рдореЗрдВ рджреВрд╕рд░реА рдЗрдХрд╛рдИ рд╢реБрд░реВ рдХрд░рдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рдХреНрдпреЛрдВ рдкрдбрд╝реА? (рдЬреЛ, рд╡реИрд╕реЗ, рднрд╛рд╖рд╛ рдХреЗ рд╢реБрд░реБрдЖрддреА рд╕рдВрд╕реНрдХрд░рдгреЛрдВ рдореЗрдВ рдирд╣реАрдВ рдерд╛ред)
рдЯрд╛рдЗрдк рдЖрд░реНрдЧреНрдпреБрдореЗрдВрдЯреНрд╕ рддрд░реНрдХ рд╣реИрдВ , рдЬрд┐рд╕рдХрд╛ рдЕрд░реНрде рд╣реИ рдХрд┐ рд╡реЗ рдХреЙрд▓ рдХреЗ рд╕реНрдерд╛рди рдкрд░ рд╡рд┐рд╢реЗрд╖рддрд╛ рдХреЛ рдкрд╛рд╕ рдХрд░ рд░рд╣реЗ рд╣реИрдВ, рдФрд░ T
рдмрдЬрд╛рдп рдХрд┐рд╕ рдкреНрд░рдХрд╛рд░ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд┐рдпрд╛ рдЬрд╛рдПрдЧрд╛ рдЗрд╕ рдкрд░ рдирд┐рдпрдВрддреНрд░рдг рдХреЙрд▓ рдХрд░рдиреЗ рд╡рд╛рд▓реЗ рдХрд╛ рд╣реИред рднрд▓реЗ рд╣реА рд╣рдо рдХреЙрд▓ рд╕реНрдерд╛рди рдкрд░ T
рдХреЛ рд╕реНрдкрд╖реНрдЯ рд░реВрдк рд╕реЗ рдирд┐рд░реНрджрд┐рд╖реНрдЯ рдирд╣реАрдВ рдХрд░рддреЗ рд╣реИрдВ, рд▓реЗрдХрд┐рди рдХрдВрдкрд╛рдЗрд▓рд░ рд╣рдорд╛рд░реЗ рд▓рд┐рдП рдЯрд╛рдЗрдк рдЗрдВрдЯреНрд░реЗрдВрд╕ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░реЗрдЧрд╛ред рдпрд╣реА рд╣реИ, рд╕реНрдкрд╖реНрдЯ рд░реВрдк рд╕реЗ, рд╡реИрд╕реЗ рднреА, рдЗрд╕ рдкреНрд░рдХрд╛рд░ рдХреЛ рдХреЙрд▓рд░ рдкрд░ рдЕрдиреБрдорд╛рди рд▓рдЧрд╛рдпрд╛ рдЬрд╛рдПрдЧрд╛ рдФрд░ рдПрдХ рддрд░реНрдХ рдХреЗ рд░реВрдк рдореЗрдВ рдкрд╛рд░рд┐рдд рдХрд┐рдпрд╛ рдЬрд╛рдПрдЧрд╛ред (рдмреЗрд╢рдХ, рдпрд╣ рд╕рдм рд╕рдВрдХрд▓рди рдХреЗ рджреМрд░рд╛рди рд╣реЛрддрд╛ рд╣реИ, рд░рдирдЯрд╛рдЗрдо рдореЗрдВ рдирд╣реАрдВред)
рдПрдХ рдЙрджрд╛рд╣рд░рдг рдкрд░ рд╡рд┐рдЪрд╛рд░ рдХрд░реЗрдВред рд╕реНрдЯреИрдгреНрдбрд░реНрдб рд▓рд╛рдЗрдмреНрд░реЗрд░реА рдореЗрдВ рдПрдХ AsRef AsRef
, рдЬреЛ рдПрдХ рдкреНрд░рдХрд╛рд░ рдХреЛ рдХреБрдЫ рд╕рдордп рдХреЗ рд▓рд┐рдП рджреВрд╕рд░реА рдХрдбрд╝реА рдореЗрдВ рдкрд░рд┐рд╡рд░реНрддрд┐рдд рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдПрдХ рдЕрдиреНрдп рдкреНрд░рдХрд╛рд░ рдХрд╛ рджрд┐рдЦрд╛рд╡рд╛ рдХрд░рдиреЗ рдХреА рдЕрдиреБрдорддрд┐ рджреЗрддреА рд╣реИред рд╕рд░рд▓реАрдХреГрдд, рдпрд╣ рд▓рдХреНрд╖рдг рдЗрд╕ рддрд░рд╣ рджрд┐рдЦрддрд╛ рд╣реИ (рд╡рд╛рд╕реНрддрд╡ рдореЗрдВ, рдпрд╣ рдереЛрдбрд╝рд╛ рдЕрдзрд┐рдХ рдЬрдЯрд┐рд▓ рд╣реИ, рдореИрдВрдиреЗ рдЬрд╛рдирдмреВрдЭрдХрд░ рд╕рдм рдХреБрдЫ рдЕрдирд╛рд╡рд╢реНрдпрдХ рд╣рдЯрд╛ рджрд┐рдпрд╛, рдХреЗрд╡рд▓ рд╕рдордЭрдиреЗ рдХреЗ рд▓рд┐рдП рдЖрд╡рд╢реНрдпрдХ рдиреНрдпреВрдирддрдо рдЫреЛрдбрд╝ рджрд┐рдпрд╛):
trait AsRef<T> { fn as_ref(&self) -> &T; }
рдпрд╣рд╛рдВ T
рдХреЙрд▓рдЧрд░реНрд▓ рджреНрд╡рд╛рд░рд╛ рдПрдХ рддрд░реНрдХ рдХреЗ рд░реВрдк рдореЗрдВ рдкрд╛рд░рд┐рдд рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИ, рднрд▓реЗ рд╣реА рдпрд╣ рдЕрдВрддрд░реНрдирд┐рд╣рд┐рдд рд░реВрдк рд╕реЗ рд╣реЛрддрд╛ рд╣реЛ (рдпрджрд┐ рдХрдВрдкрд╛рдЗрд▓рд░ рдЖрдкрдХреЗ рд▓рд┐рдП рдЗрд╕ рдкреНрд░рдХрд╛рд░ рдХреЛ рд╕рдВрдХреНрд░рдорд┐рдд рдХрд░рддрд╛ рд╣реИ)ред рджреВрд╕рд░реЗ рд╢рдмреНрджреЛрдВ рдореЗрдВ, рдпрд╣ рдХреЙрд▓ рдХрд░рдиреЗ рд╡рд╛рд▓рд╛ рд╣реИ рдЬреЛ рддрдп рдХрд░рддрд╛ рд╣реИ рдХрд┐ рдХреМрди рд╕рд╛ рдирдпрд╛ рдкреНрд░рдХрд╛рд░ T
рд╣рдорд╛рд░реЗ рдкреНрд░рдХрд╛рд░ рдХрд╛ рджрд┐рдЦрд╛рд╡рд╛ рдХрд░реЗрдЧрд╛ рдЬреЛ рдЗрд╕ рд╡рд┐рд╢реЗрд╖рддрд╛ рдХреЛ рд▓рд╛рдЧреВ рдХрд░рддрд╛ рд╣реИ:
let foo = Foo::new(); let bar: &Bar = foo.as_ref();
рдпрд╣рд╛рдВ, рд╕рдВрдХрд▓рдХ, bar: &Bar
рдЬреНрдЮрд╛рди рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рддреЗ рд╣реБрдП bar: &Bar
, AsRef<Bar>
рдХрд╛рд░реНрдпрд╛рдиреНрд╡рдпрди рдХрд╛ рдЙрдкрдпреЛрдЧ as_ref()
рд╡рд┐рдзрд┐ рдХреЛ рдХреЙрд▓ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП as_ref()
, рдХреНрдпреЛрдВрдХрд┐ рдпрд╣ Bar
рдХрд╛ рдкреНрд░рдХрд╛рд░ рд╣реИ рдЬреЛ рдХреЙрд▓рд░ рджреНрд╡рд╛рд░рд╛ рдЖрд╡рд╢реНрдпрдХ рд╣реИред рдпрд╣ рдмрд┐рдирд╛ рдпрд╣ рдХрд╣реЗ рдЪрд▓рд╛ рдЬрд╛рддрд╛ рд╣реИ рдХрд┐ Foo
рдкреНрд░рдХрд╛рд░ рдХреЛ AsRef AsRef<Bar>
рдХреЛ рд▓рд╛рдЧреВ рдХрд░рдирд╛ рдЪрд╛рд╣рд┐рдП, рдФрд░ рдЗрд╕рдХреЗ рдЕрд▓рд╛рд╡рд╛, рдпрд╣ рдХрдИ рдЕрдиреНрдп AsRef<T>
рд╡рд┐рдХрд▓реНрдкреЛрдВ рдХреЛ рд▓рд╛рдЧреВ рдХрд░ рд╕рдХрддрд╛ рд╣реИ, рдЬрд┐рдирдореЗрдВ рд╕реЗ рдХреЙрд▓ рдХрд░рдиреЗ рд╡рд╛рд▓рд╛ рд╡рд╛рдВрдЫрд┐рдд рдХрд╛ рдЪрдпрди рдХрд░рддрд╛ рд╣реИред
рд╕рдВрдмрджреНрдз рдкреНрд░рдХрд╛рд░ рдХреЗ рдорд╛рдорд▓реЗ рдореЗрдВ, рд╕рдм рдХреБрдЫ рдмрд┐рд▓реНрдХреБрд▓ рд╡рд┐рдкрд░реАрдд рд╣реИред рд╕рдВрдмрдВрдзрд┐рдд рдкреНрд░рдХрд╛рд░ рдкреВрд░реА рддрд░рд╣ рд╕реЗ рдЙрди рд▓реЛрдЧреЛрдВ рджреНрд╡рд╛рд░рд╛ рдирд┐рдпрдВрддреНрд░рд┐рдд рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИ рдЬреЛ рдЗрд╕ рд╡рд┐рд╢реЗрд╖рддрд╛ рдХреЛ рд▓рд╛рдЧреВ рдХрд░рддреЗ рд╣реИрдВ, рдФрд░ рдХреЙрд▓рд░ рджреНрд╡рд╛рд░рд╛ рдирд╣реАрдВред
рдПрдХ рд╕рд╛рдорд╛рдиреНрдп рдЙрджрд╛рд╣рд░рдг рдПрдХ рдкреБрдирд░рд╛рд╡реГрддреНрдд рд╣реИред рдорд╛рди рд▓реАрдЬрд┐рдП рдХрд┐ рд╣рдорд╛рд░реЗ рдкрд╛рд╕ рдПрдХ рд╕рдВрдЧреНрд░рд╣ рд╣реИ, рдФрд░ рд╣рдо рдЗрд╕рд╕реЗ рдПрдХ рдкреБрдирд░рд╛рд╡реГрддреНрддрд┐ рдкреНрд░рд╛рдкреНрдд рдХрд░рдирд╛ рдЪрд╛рд╣рддреЗ рд╣реИрдВред рдкреБрдирд░рд╛рд╡реГрддрд┐рдХрд░реНрддрд╛ рдХреЛ рдХрд┐рд╕ рдкреНрд░рдХрд╛рд░ рдХреЗ рдорд╛рди рд╣реЛрдиреЗ рдЪрд╛рд╣рд┐рдП? рд╡рд╛рд╕реНрддрд╡ рдореЗрдВ рдЗрд╕ рд╕рдВрдЧреНрд░рд╣ рдореЗрдВ рдирд┐рд╣рд┐рдд рдПрдХ! рдпрд╣ рдирд┐рд░реНрдзрд╛рд░рд┐рдд рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдХреЙрд▓ рдХрд░рдиреЗ рд╡рд╛рд▓реЗ рдкрд░ рдирд┐рд░реНрднрд░ рдирд╣реАрдВ рд╣реИ рдХрд┐ рдкреБрдирд░рд╛рд╡реГрддреНрдд рдХреНрдпрд╛ рд▓реМрдЯреЗрдЧрд╛, рдФрд░ рдкреБрдирд░рд╛рд╡реГрддреНрддрд┐ рдХрд░рдиреЗ рд╡рд╛рд▓рд╛ рдЦреБрдж рд╣реА рдмреЗрд╣рддрд░ рдЬрд╛рдирддрд╛ рд╣реИ рдХрд┐ рд╡рд╣ рд╡рд╛рд╕реНрддрд╡ рдореЗрдВ рдХреНрдпрд╛ рдЬрд╛рдирддрд╛ рд╣реИ рдХрд┐ рдХреИрд╕реЗ рд▓реМрдЯрдирд╛ рд╣реИред рдпрд╣рд╛рдБ рдорд╛рдирдХ рдкреБрд╕реНрддрдХрд╛рд▓рдп рд╕реЗ рд╕рдВрдХреНрд╖рд┐рдкреНрдд рдХреЛрдб рд╣реИ:
trait Iterator { type Item; fn next(&mut self) -> Option<Self::Item>; }
рдзреНрдпрд╛рди рджреЗрдВ рдХрд┐ рдкреБрдирд░рд╛рд╡реГрддреНрдд рдореЗрдВ рдПрдХ рдкреНрд░рдХрд╛рд░ рдХрд╛ рдкреИрд░рд╛рдореАрдЯрд░ рдирд╣реАрдВ рд╣реИ рдЬреЛ рдХреЙрд▓рд░ рдХреЛ рдпрд╣ рдЪреБрдирдиреЗ рдХреА рдЕрдиреБрдорддрд┐ рджреЗрддрд╛ рд╣реИ рдХрд┐ рдкреБрдирд░рд╛рд╡реГрддреНрдд рдХреНрдпрд╛ рд▓реМрдЯрдирд╛ рдЪрд╛рд╣рд┐рдПред рдЗрд╕рдХреЗ рдмрдЬрд╛рдп, next()
рд╡рд┐рдзрд┐ рд╕реЗ рд▓реМрдЯрд╛рдП рдЧрдП рдорд╛рди рдХрд╛ рдкреНрд░рдХрд╛рд░ рд╕рдВрдмрдВрдзрд┐рдд рдкреНрд░рдХрд╛рд░ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдХреЗ рдЗрдЯреЗрдЯрд░ рджреНрд╡рд╛рд░рд╛ рдирд┐рд░реНрдзрд╛рд░рд┐рдд рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИ, рд▓реЗрдХрд┐рди рдпрд╣ рдирд╛рдЦреВрдиреЛрдВ рдХреЗ рд╕рд╛рде рдЕрдЯрдХ рдирд╣реАрдВ рд╣реИ, рдЕрд░реНрдерд╛рддред рдкреНрд░рддреНрдпреЗрдХ рдкреБрдирд░рд╛рд╡реГрддреНрддрд┐ рдХрд╛рд░реНрдпрд╛рдиреНрд╡рдпрди рдЕрдкрдиреЗ рдкреНрд░рдХрд╛рд░ рдХрд╛ рдЪрдпрди рдХрд░ рд╕рдХрддрд╛ рд╣реИред
рдмрдВрдж рдХрд░реЛред рддреЛ рдХреНрдпрд╛? рд╕рднреА рд╕рдорд╛рди рд╣реИ, рдпрд╣ рд╕реНрдкрд╖реНрдЯ рдирд╣реАрдВ рд╣реИ рдХрд┐ рдпрд╣ рд╕рд╛рдорд╛рдиреНрдп рд╕реЗ рдмреЗрд╣рддрд░ рдХреНрдпреЛрдВ рд╣реИред рдПрдХ рдкрд▓ рдХреЗ рд▓рд┐рдП рдХрд▓реНрдкрдирд╛ рдХрд░реЗрдВ рдХрд┐ рд╣рдо рд╕рдВрдмрджреНрдз рдкреНрд░рдХрд╛рд░ рдХреЗ рдмрдЬрд╛рдп рд╕рд╛рдорд╛рдиреНрдп рдЬреЗрдиреЗрд░рд┐рдХ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рддреЗ рд╣реИрдВред рдкреБрдирд░рд╛рд╡реГрддрд┐ рдХреА рд╡рд┐рд╢реЗрд╖рддрд╛ рдХреБрдЫ рдЗрд╕ рддрд░рд╣ рджрд┐рдЦрд╛рдИ рджреЗрдЧреА:
trait GenericIterator<T> { fn next(&mut self) -> Option<T>; }
рд▓реЗрдХрд┐рди рдЕрдм, рд╕рдмрд╕реЗ рдкрд╣рд▓реЗ, рдЯрд╛рдЗрдк T
рдХреЛ рдмрд╛рд░-рдмрд╛рд░ рд╣рд░ рдЙрд╕ рдЬрдЧрд╣ рдкрд░ рдЗрдВрдЧрд┐рдд рдХрд░рдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реЛрддреА рд╣реИ, рдЬрд╣рд╛рдВ рдЗрдЯреНрд░реЗрдЯрд░ рдХрд╛ рдЙрд▓реНрд▓реЗрдЦ рдХрд┐рдпрд╛ рдЧрдпрд╛ рд╣реИ, рдФрд░ рджреВрд╕рд░реА рдмрд╛рдд, рдЕрдм рдЗрд╕ рд╡рд┐рд╢реЗрд╖рддрд╛ рдХреЛ рдХрдИ рдмрд╛рд░ рдЕрд▓рдЧ-рдЕрд▓рдЧ рдкреНрд░рдХрд╛рд░реЛрдВ рд╕реЗ рд▓рд╛рдЧреВ рдХрд░рдирд╛ рд╕рдВрднрд╡ рд╣реЛ рдЧрдпрд╛ рд╣реИ, рдЬреЛ рдЗрдЯреНрд░реЗрдЯрд░ рдХреЗ рд▓рд┐рдП рдХрд┐рд╕реА рддрд░рд╣ рдЕрдЬреАрдм рд▓рдЧрддрд╛ рд╣реИред рдпрд╣рд╛рдБ рдПрдХ рдЙрджрд╛рд╣рд░рдг рд╣реИ:
struct MyIterator; impl GenericIterator<i32> for MyIterator { fn next(&mut self) -> Option<i32> { unimplemented!() } } impl GenericIterator<String> for MyIterator { fn next(&mut self) -> Option<String> { unimplemented!() } } fn test() { let mut iter = MyIterator; let lolwhat: Option<_> = iter.next();
рдХреИрдЪ рджреЗрдЦреЗрдВ? рд╣рдо iter.next()
рдмрд┐рдирд╛ iter.next()
рдХреЛ рдХреЗрд╡рд▓ рд▓реЗ рдФрд░ рдХреЙрд▓ рдирд╣реАрдВ рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ - рд╣рдореЗрдВ рд╕рдВрдХрд▓рдХ рдХреЛ рдпрд╣ рдмрддрд╛рдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реИ, рд╕реНрдкрд╖реНрдЯ рд░реВрдк рд╕реЗ рдпрд╛ рд╕реНрдкрд╖реНрдЯ рд░реВрдк рд╕реЗ, рдХрд┐рд╕ рдкреНрд░рдХрд╛рд░ рд╡рд╛рдкрд╕ рдХрд┐рдпрд╛ рдЬрд╛рдПрдЧрд╛ред рдФрд░ рдпрд╣ рдЕрдЬреАрдм рд▓рдЧ рд░рд╣рд╛ рд╣реИ: рд╣рдореЗрдВ рдХреЙрд▓ рдкрдХреНрд╖ рдкрд░ рдХреНрдпреЛрдВ, рдкрддрд╛ рд╣реЛрдирд╛ рдЪрд╛рд╣рд┐рдП (рдФрд░ рд╕рдВрдХрд▓рдХ рдХреЛ рдмрддрд╛рдирд╛ рдЪрд╛рд╣рд┐рдП!) рдЯрд╛рдЗрдк рдХрд░рдиреЗ рд╡рд╛рд▓рд╛ рдЗрдЯрд░реЗрдЯрд░ рд╡рд╛рдкрд╕ рдЖ рдЬрд╛рдПрдЧрд╛, рдЬрдмрдХрд┐ рдЗрд╕ рдЗрдЯрд░реЗрдЯрд░ рдХреЛ рдмреЗрд╣рддрд░ рдкрддрд╛ рд╣реЛрдирд╛ рдЪрд╛рд╣рд┐рдП рдХрд┐ рд╡рд╣ рдХрд┐рд╕ рдкреНрд░рдХрд╛рд░ рдХрд╛ рд░рд┐рдЯрд░реНрди рджреЗрддрд╛ рд╣реИ ?; рдФрд░ рд╕рднреА рдХреНрдпреЛрдВрдХрд┐ рд╣рдо рдПрдХ рд╣реА MyIterator
рд▓рд┐рдП рдПрдХ рдЕрд▓рдЧ рдкреИрд░рд╛рдореАрдЯрд░ рдХреЗ рд╕рд╛рде рджреЛ рдмрд╛рд░ MyIterator
GenericIterator
рдХреЛ рд▓рд╛рдЧреВ рдХрд░рдиреЗ рдореЗрдВ рд╕рдХреНрд╖рдо рдереЗ, рдЬреЛ рдХрд┐ рдЗрдЯрд░реЗрдЯрд░ рд╢рдмреНрджрд╛рд░реНрде рдХреЗ рджреГрд╖реНрдЯрд┐рдХреЛрдг рд╕реЗ рднреА рд╣рд╛рд╕реНрдпрд╛рд╕реНрдкрдж рд▓рдЧрддрд╛ рд╣реИ: рдРрд╕рд╛ рдХреНрдпреЛрдВ рд╣реИ рдХрд┐ рдПрдХ рд╣реА рдЗрдЯреНрд░реЗрдЯрд░ рд╡рд┐рднрд┐рдиреНрди рдкреНрд░рдХрд╛рд░реЛрдВ рдХреЗ рдорд╛рди рд▓реМрдЯрд╛ рд╕рдХрддрд╛ рд╣реИ?
рдпрджрд┐ рд╣рдо рд╕рдВрдмрдВрдзрд┐рдд рдкреНрд░рдХрд╛рд░ рдХреЗ рд╕рд╛рде рд╕рдВрд╕реНрдХрд░рдг рдореЗрдВ рд▓реМрдЯрддреЗ рд╣реИрдВ, рддреЛ рдЗрди рд╕рднреА рд╕рдорд╕реНрдпрд╛рдУрдВ рд╕реЗ рдмрдЪрд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИ:
struct MyIter; impl Iterator for MyIter { type Item = String; fn next(&mut self) -> Option<Self::Item> { unimplemented!() } } fn test() { let mut iter = MyIter; let value = iter.next(); }
рдпрд╣рд╛рдВ, рд╕рдмрд╕реЗ рдкрд╣рд▓реЗ, рдХрдВрдкрд╛рдЗрд▓рд░ рд╕рд╣реА рддрд░реАрдХреЗ рд╕реЗ рдЖрдЙрдЯрдкреБрдЯ рдХрд╛ рдЙрддреНрдкрд╛рджрди рдХрд░реЗрдЧрд╛ value: Option<String>
рдкреНрд░рдХрд╛рд░ рдмрд┐рдирд╛ рдЕрдирд╛рд╡рд╢реНрдпрдХ рд╢рдмреНрджреЛрдВ рдХреЗ, рдФрд░ рджреВрд╕рд░реА рдмрд╛рдд, рдпрд╣ рдПрдХ рдЕрд▓рдЧ рд░рд┐рдЯрд░реНрди рдкреНрд░рдХрд╛рд░ рдХреЗ рд╕рд╛рде рджреВрд╕рд░реА рдмрд╛рд░ MyIter
рд▓рд┐рдП Iterator
MyIter
рдХреЛ рд▓рд╛рдЧреВ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдХрд╛рдо рдирд╣реАрдВ рдХрд░реЗрдЧрд╛, рдФрд░ рдЗрд╕ рддрд░рд╣ рд╕рдм рдХреБрдЫ рдмрд░реНрдмрд╛рдж рдХрд░ рджреЗрдЧрд╛ред
рдлрд┐рдХреНрд╕рд┐рдВрдЧ рдХреЗ рд▓рд┐рдПред рдПрдХ рд╕рдВрдЧреНрд░рд╣ рдЗрд╕ рддрд░рд╣ рдХреЗ рдПрдХ рд▓рдХреНрд╖рдг рдХреЛ рд▓рд╛рдЧреВ рдХрд░ рд╕рдХрддрд╛ рд╣реИ рддрд╛рдХрд┐ рд╡рд╣ рдЦреБрдж рдХреЛ рдкреБрдирд░рд╛рд╡реГрддрд┐ рдореЗрдВ рдмрджрд▓ рд╕рдХреЗ:
trait IntoIterator { type Item; type IntoIter: Iterator<Item=Self::Item>; fn into_iter(self) -> Self::IntoIter; }
рдФрд░ рдлрд┐рд░, рдпрд╣рд╛рдВ рдпрд╣ рд╕рдВрдЧреНрд░рд╣ рд╣реИ рдЬреЛ рдпрд╣ рддрдп рдХрд░рддрд╛ рд╣реИ рдХрд┐ рдкреБрдирд░рд╛рд╡реГрддреНрдд рдХреНрдпрд╛ рд╣реЛрдЧрд╛, рдЕрд░реНрдерд╛рддреН: рдПрдХ рдкреБрдирд░рд╛рд╡реГрддреНрддрд┐ рдЬрд┐рд╕рдХрд╛ рд╡рд╛рдкрд╕реА рдкреНрд░рдХрд╛рд░ рд╕рдВрдЧреНрд░рд╣ рдореЗрдВ рддрддреНрд╡реЛрдВ рдХреЗ рдкреНрд░рдХрд╛рд░ рд╕реЗ рдореЗрд▓ рдЦрд╛рддрд╛ рд╣реИ, рдФрд░ рдХреЛрдИ рдЕрдиреНрдп рдирд╣реАрдВред
рдЙрдВрдЧрд▓рд┐рдпреЛрдВ рдкрд░ рдЕрдзрд┐рдХ
рдпрджрд┐ рдЙрдкрд░реЛрдХреНрдд рдЙрджрд╛рд╣рд░рдг рдЕрднреА рднреА рд╕рдордЭ рд╕реЗ рдмрд╛рд╣рд░ рд╣реИрдВ, рддреЛ рдпрд╣рд╛рдВ рдПрдХ рдХрдо рд╡реИрдЬреНрдЮрд╛рдирд┐рдХ рд▓реЗрдХрд┐рди рдЕрдзрд┐рдХ рд╕рдордЭрджрд╛рд░ рд╡реНрдпрд╛рдЦреНрдпрд╛ рд╣реИред рдкреНрд░рдХрд╛рд░ рдХреЗ рддрд░реНрдХреЛрдВ рдХреЛ "рдЗрдирдкреБрдЯ" рдЬрд╛рдирдХрд╛рд░реА рдХреЗ рд░реВрдк рдореЗрдВ рдорд╛рдирд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИ рдЬреЛ рд╣рдо рдХрд╛рд░реНрдп рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рд╡рд┐рд╢реЗрд╖рддрд╛ рдкреНрд░рджрд╛рди рдХрд░рддреЗ рд╣реИрдВред рд╕рдВрдмрджреНрдз рдкреНрд░рдХрд╛рд░реЛрдВ рдХреЛ "рдЖрдЙрдЯрдкреБрдЯ" рдЬрд╛рдирдХрд╛рд░реА рдХреЗ рд░реВрдк рдореЗрдВ рдорд╛рдирд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИ рдЬреЛ рд╡рд┐рд╢реЗрд╖рддрд╛ рд╣рдореЗрдВ рдкреНрд░рджрд╛рди рдХрд░рддреА рд╣реИ рддрд╛рдХрд┐ рд╣рдо рдЗрд╕рдХреЗ рдХрд╛рдо рдХреЗ рдкрд░рд┐рдгрд╛рдореЛрдВ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░ рд╕рдХреЗрдВред
рдорд╛рдирдХ рдкреБрд╕реНрддрдХрд╛рд▓рдп рдореЗрдВ рдЧрдгрд┐рддреАрдп рдСрдкрд░реЗрдЯрд░реЛрдВ рдХреЛ рдЗрд╕рдХреЗ рдкреНрд░рдХрд╛рд░реЛрдВ (рдЗрд╕рдХреЗ рдЕрд▓рд╛рд╡рд╛, рдШрдЯрд╛рд╡, рдЧреБрдгрд╛, рднрд╛рдЧ рдФрд░ рдЗрд╕реА рддрд░рд╣) рдХреЗ рд▓рд┐рдП рдЕрдзрд┐рднрд╛рд░рд┐рдд рдХрд░рдиреЗ рдХреА рдХреНрд╖рдорддрд╛ рд╣реИред рдРрд╕рд╛ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП, рдЖрдкрдХреЛ рдорд╛рдирдХ рдкреБрд╕реНрддрдХрд╛рд▓рдп рд╕реЗ рд╕рдВрдмрдВрдзрд┐рдд рд▓рдХреНрд╖рдгреЛрдВ рдореЗрдВ рд╕реЗ рдПрдХ рдХреЛ рд▓рд╛рдЧреВ рдХрд░рдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реИред рдпрд╣рд╛рдВ, рдЙрджрд╛рд╣рд░рдг рдХреЗ рд▓рд┐рдП, рдпрд╣ рд╡рд┐рд╢реЗрд╖рддрд╛ рдЕрддрд┐рд░рд┐рдХреНрдд рд╕рдВрдЪрд╛рд▓рди рдХреЗ рд▓рд┐рдП рдХреИрд╕реЗ рджрд┐рдЦрддреА рд╣реИ (рдлрд┐рд░ рд╕реЗ, рд╕рд░рд▓реАрдХреГрдд):
trait Add<RHS> { type Output; fn add(self, rhs: RHS) -> Self::Output; }
рдпрд╣рд╛рдВ рд╣рдорд╛рд░реЗ рдкрд╛рд╕ "рдЗрдирдкреБрдЯ" RHS
рддрд░реНрдХ рд╣реИ - рдпрд╣ рд╡рд╣ рдкреНрд░рдХрд╛рд░ рд╣реИ рдЬрд┐рд╕рдХреЗ рд╕рд╛рде рд╣рдо рдЕрдкрдиреЗ рдкреНрд░рдХрд╛рд░ рдХреЗ рд╕рд╛рде рдЕрддрд┐рд░рд┐рдХреНрдд рд╕рдВрдЪрд╛рд▓рди рд▓рд╛рдЧреВ рдХрд░реЗрдВрдЧреЗред рдФрд░ рдПрдХ "рдЖрдЙрдЯрдкреБрдЯ" рддрд░реНрдХ рд╣реИ Add::Output
- рдпрд╣ рд╡рд╣ рдкреНрд░рдХрд╛рд░ рд╣реИ рдЬреЛ рдкрд░рд┐рдгрд╛рдо рдХреЗ рдЕрддрд┐рд░рд┐рдХреНрдд рд╣реЛрдЧрд╛ред рд╕рд╛рдорд╛рдиреНрдп рдорд╛рдорд▓реЗ рдореЗрдВ, рдпрд╣ рд╢рдмреНрджреЛрдВ рдХреЗ рдкреНрд░рдХрд╛рд░ рд╕реЗ рднрд┐рдиреНрди рд╣реЛ рд╕рдХрддрд╛ рд╣реИ, рдЬреЛ рдмрджрд▓реЗ рдореЗрдВ, рд╡рд┐рднрд┐рдиреНрди рдкреНрд░рдХрд╛рд░реЛрдВ рдХрд╛ рднреА рд╣реЛ рд╕рдХрддрд╛ рд╣реИ (рдиреАрд▓реЗ рдореЗрдВ рд╕реНрд╡рд╛рджрд┐рд╖реНрдЯ рдЬреЛрдбрд╝реЗрдВ рдФрд░ рдирд░рдо рд╣реЛ рдЬрд╛рдПрдВ - рд▓реЗрдХрд┐рди рдХреНрдпрд╛, рдореИрдВ рд╣рд░ рд╕рдордп рдРрд╕рд╛ рдХрд░рддрд╛ рд╣реВрдВ)ред рдкрд╣рд▓рд╛ рдкреНрд░рдХрд╛рд░ рддрд░реНрдХ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдХреЗ рдирд┐рд░реНрджрд┐рд╖реНрдЯ рдХрд┐рдпрд╛ рдЧрдпрд╛ рд╣реИ, рджреВрд╕рд░рд╛ рд╕рдВрдмрдВрдзрд┐рдд рдкреНрд░рдХрд╛рд░ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдХреЗ рдирд┐рд░реНрджрд┐рд╖реНрдЯ рдХрд┐рдпрд╛ рдЧрдпрд╛ рд╣реИред
рдЖрдк рд╡рд┐рднрд┐рдиреНрди рдкреНрд░рдХрд╛рд░ рдХреЗ рджреВрд╕рд░реЗ рддрд░реНрдХ рдХреЗ рд╕рд╛рде рдХрд┐рд╕реА рднреА рд╕рдВрдЦреНрдпрд╛ рдХреЛ рдЬреЛрдбрд╝ рд╕рдХрддреЗ рд╣реИрдВ, рд▓реЗрдХрд┐рди рд╣рд░ рдмрд╛рд░ рдХреЗрд╡рд▓ рдПрдХ рдкреНрд░рдХрд╛рд░ рдХрд╛ рдкрд░рд┐рдгрд╛рдо рд╣реЛрдЧрд╛, рдФрд░ рдпрд╣ рдЗрд╕рдХреЗ рдЕрддрд┐рд░рд┐рдХреНрдд рдХреЗ рдХрд╛рд░реНрдпрд╛рдиреНрд╡рдпрди рд╕реЗ рдирд┐рд░реНрдзрд╛рд░рд┐рдд рд╣реЛрддрд╛ рд╣реИред
рдЖрдЗрдП рдЗрд╕ рд╡рд┐рд╢реЗрд╖рддрд╛ рдХреЛ рд▓рд╛рдЧреВ рдХрд░рдиреЗ рдХрд╛ рдкреНрд░рдпрд╛рд╕ рдХрд░реЗрдВ:
use std::ops::Add; struct Foo(&'static str); #[derive(PartialEq, Debug)] struct Bar(&'static str, i32); impl Add<i32> for Foo { type Output = Bar; fn add(self, rhs: i32) -> Bar { Bar(self.0, rhs) } } fn test() { let x = Foo("test"); let y = x + 42;
рдЗрд╕ рдЙрджрд╛рд╣рд░рдг рдореЗрдВ, рдЪрд░ y
рдХрд╛ рдкреНрд░рдХрд╛рд░ рдЕрддрд┐рд░рд┐рдХреНрдд рдПрд▓реНрдЧреЛрд░рд┐рдереНрдо рджреНрд╡рд╛рд░рд╛ рдирд┐рд░реНрдзрд╛рд░рд┐рдд рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИ, рдХреЙрд▓рд┐рдВрдЧ рдХреЛрдб рдирд╣реАрдВред рдпрд╣ рдмрд╣реБрдд рдЕрдЬреАрдм рд╣реЛрдЧрд╛ рдЕрдЧрд░ рдпрд╣ рд╕рдВрднрд╡ рд╣реЛ рддреЛ рдХреБрдЫ рд▓рд┐рдЦрдиреЗ рджреЗрдВ рдЬреИрд╕реЗ let y: Baz = x + 42
, рдЕрд░реНрдерд╛рддреН, рдХреБрдЫ рдмрд╛рд╣рд░реА рдкреНрд░рдХрд╛рд░ рдХреЗ рдкрд░рд┐рдгрд╛рдо рдХреЛ рд╡рд╛рдкрд╕ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдЕрддрд┐рд░рд┐рдХреНрдд рдСрдкрд░реЗрд╢рди рдХреЛ рдордЬрдмреВрд░ рдХрд░реЗрдВред рдпрд╣ рдРрд╕реА рдЪреАрдЬреЛрдВ рд╕реЗ рд╣реИ рдЬреЛ рд╕рдВрдмрдВрдзрд┐рдд рдкреНрд░рдХрд╛рд░ Add::Output
рд╣рдореЗрдВ рдкреНрд░реЗрд░рд┐рдд рдХрд░рддрд╛ рд╣реИред
рдХреБрд▓ рдорд┐рд▓рд╛рдХрд░
рд╣рдо рдЬреЗрдирд░рд┐рдХ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рддреЗ рд╣реИрдВ рдЬрд╣рд╛рдВ рд╣рдореЗрдВ рдПрдХ рд╣реА рдкреНрд░рдХрд╛рд░ рдХреЗ рдХрдИ рдЧреБрдгрди рдХрд╛рд░реНрдпрд╛рдиреНрд╡рдпрди рдХрд░рдиреЗ рд╕реЗ рдХреЛрдИ рдлрд░реНрдХ рдирд╣реАрдВ рдкрдбрд╝рддрд╛ рд╣реИ, рдФрд░ рдЬрд╣рд╛рдВ рдХреЙрд▓ рдкрдХреНрд╖ рдкрд░ рдПрдХ рд╡рд┐рд╢рд┐рд╖реНрдЯ рдХрд╛рд░реНрдпрд╛рдиреНрд╡рдпрди рдирд┐рд░реНрджрд┐рд╖реНрдЯ рдХрд░рдирд╛ рд╕реНрд╡реАрдХрд╛рд░реНрдп рд╣реИред рд╣рдо рд╕рдВрдмрджреНрдз рдкреНрд░рдХрд╛рд░реЛрдВ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рддреЗ рд╣реИрдВ рдЬрд╣рд╛рдВ рд╣рдо рдПрдХ "рдХреИрдиреЛрдирд┐рдХрд▓" рдХрд╛рд░реНрдпрд╛рдиреНрд╡рдпрди рдЪрд╛рд╣рддреЗ рд╣реИрдВ, рдЬреЛ рд╕реНрд╡рдпрдВ рдкреНрд░рдХрд╛рд░реЛрдВ рдХреЛ рдирд┐рдпрдВрддреНрд░рд┐рдд рдХрд░рддрд╛ рд╣реИред рдЕрдВрддрд┐рдо рдЕрдиреБрдкрд╛рдд рдореЗрдВ рд╕рд╣реА рдЕрдиреБрдкрд╛рдд рдореЗрдВ рдорд┐рд▓рд╛рдПрдВ рдФрд░ рдорд┐рд▓рд╛рдПрдВред
рдХреНрдпрд╛ рд╕рд┐рдХреНрдХрд╛ рдлреЗрд▓ рд╣реЛ рдЧрдпрд╛? рдореБрдЭреЗ рдЯрд┐рдкреНрдкрдгрд┐рдпреЛрдВ рдХреЗ рд╕рд╛рде рдорд╛рд░ рдбрд╛рд▓реЛред