Rust: 'рдЗрдореНрдкреНрд▓ рдЯреНрд░реИрдЯ' рдХреЗ рд▓рд┐рдП рдЯреНрд░реИрдХрд┐рдВрдЧ рд╕рдорд╕реНрдпрд╛ (RFC 1522, RFC 1951, RFC 2071)

рдХреЛ рдирд┐рд░реНрдорд┐рдд 27 рдЬреВрди 2016  ┬╖  417рдЯрд┐рдкреНрдкрдгрд┐рдпрд╛рдБ  ┬╖  рд╕реНрд░реЛрдд: rust-lang/rust

рдирдИ рдЯреНрд░реИрдХрд┐рдВрдЧ рд╕рдорд╕реНрдпрд╛ = https://github.com/rust-lang/rust/issues/63066

рдХрд╛рд░реНрдпрд╛рдиреНрд╡рдпрди рдХреА рд╕реНрдерд┐рддрд┐

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

  • [x] [рддрд░реНрдХ рдХреА рд╕реНрдерд┐рддрд┐ рдореЗрдВ рдирд┐рд╣рд┐рдд рд▓рдХреНрд╖рдг](https://github.com/rust-lang/rust/issues/44721)
  • [x] рд╡рд╛рдкрд╕реА рдХреА рд╕реНрдерд┐рддрд┐ рдореЗрдВ рдирд┐рд╣рд┐рдд рд╡рд┐рд╢реЗрд╖рддрд╛ рдореВрд▓ рд░реВрдк рд╕реЗ рд▓рд╛рдЧреВ рдХреА рдЧрдИ рд╣реИ, рд▓реЗрдХрд┐рди:
  • [рдПрдХреНрд╕] let x: impl Trait
  • [x] static рдФрд░ const T: impl Trait
  • [ ] abstract type

    • [x] [рдкреНрд░рд╛рд░рдВрднрд┐рдХ рд░рд┐рдлреИрдХреНрдЯрд░рд┐рдВрдЧ рд╕рдВрднрд╛рд╡рдирд╛](https://github.com/rust-lang/rust/issues/44727)

    • [x] рдореЙрдбреНрдпреВрд▓ рдореЗрдВ

    • [x] рд▓рдХреНрд╖рдгреЛрдВ рдореЗрдВ

RFC,

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

  • https://github.com/rust-lang/rfcs/pull/1522

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

  • https://github.com/rust-lang/rfcs/pull/1951

    • рдПрдХ рд╡рд┐рд╢реЗрд╖ рд╡рд╛рдХреНрдп рд░рдЪрдирд╛ рдбрд┐рдЬрд╛рдЗрди рдкрд░ рд╕рдордЭреМрддрд╛ рдХрд░рдирд╛, рдХреБрдЫ/рдХрд┐рд╕реА рдкреНрд░рд╕реНрддрд╛рд╡ рдФрд░ рдЕрдиреНрдп рдХреЗ рдЖрд╕рдкрд╛рд╕ рдХреЗ рдкреНрд░рд╢реНрдиреЛрдВ рдХреЛ рд╣рд▓ рдХрд░рдирд╛ред

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

    • рддрд░реНрдХ рдХреА рд╕реНрдерд┐рддрд┐ рдореЗрдВ рдирд┐рд╣рд┐рдд рд╡рд┐рд╢реЗрд╖рддрд╛ рдЬреЛрдбрд╝рдирд╛ред

  • https://github.com/rust-lang/rfcs/pull/2071

    • рдореЙрдбреНрдпреВрд▓ рдФрд░ impls рдореЗрдВ рдирд╛рдорд┐рдд abstract type



      • [x] рд╕рд┐рдВрдЯреИрдХреНрд╕ рдХреЛ рдЕрдВрддрд┐рдо рд░реВрдк рджреЗрдВ (https://github.com/rust-lang/rfcs/pull/2515)


      • [ ] RFC рдХреЛ рдЕрдкрдбреЗрдЯ рдХрд░реЗрдВ https://github.com/rust-lang/rfcs/pull/2289 рдпрджрд┐ рд╡рд╣ RFC рдорд░реНрдЬ рд╣реЛ рдЬрд╛рддрд╛ рд╣реИ рддреЛ рдЙрд╕ рд╕рд┐рдВрдЯреИрдХреНрд╕ рд╕реЗ рдорд┐рд▓рд╛рди рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдПред



    • let , const , рдФрд░ static рдкрджреЛрдВ рдореЗрдВ impl рд╡рд┐рд╢реЗрд╖рддрд╛ рдХрд╛ рдЙрдкрдпреЛрдЧ

  • https://github.com/rust-lang/rfcs/pull/2250

    • рдПрдХрд╛рдзрд┐рдХ рд╕реАрдорд╛рдУрдВ рдХреЗ рд╕рд╛рде impl Trait рдФрд░ dyn Trait рдХреЗ рд╕рд┐рдВрдЯреИрдХреНрд╕ рдХреЛ рдЕрдВрддрд┐рдо рд░реВрдк рджреЗрдирд╛

рдЕрдирд╕реБрд▓рдЭреЗ рд╕рд╡рд╛рд▓

рдХрд╛рд░реНрдпрд╛рдиреНрд╡рдпрди рдиреЗ рдХрдИ рджрд┐рд▓рдЪрд╕реНрдк рдкреНрд░рд╢реНрди рднреА рдЙрдард╛рдП рд╣реИрдВ:

  • [x] рдкреНрд░рдХрд╛рд░ рдХреЛ рдкрд╛рд░реНрд╕ рдХрд░рддреЗ рд╕рдордп impl рдХреАрд╡рд░реНрдб рдХреА рдкреНрд░рд╛рдердорд┐рдХрддрд╛ рдХреНрдпрд╛ рд╣реИ? рдЪрд░реНрдЪрд╛: 1

    • рдЙрджрд╛рд╣рд░рдг рдХреЗ рд▓рд┐рдП, Send рдХреЛ where F: Fn() -> impl Foo + Send рд▓рд┐рдП рдХреИрд╕реЗ рд╕рдВрдмрджреНрдз рдХрд░реЗрдВ?

    • https://github.com/rust-lang/rfcs/pull/2250 рджреНрд╡рд╛рд░рд╛ рд╣рд▓ рдХрд┐рдпрд╛ рдЧрдпрд╛

    • [x] https://github.com/rust-lang/rust/pull/45294 рдореЗрдВ рдХрд╛рд░реНрдпрд╛рдиреНрд╡рд┐рдд (?)

  • [ ] рдХреНрдпрд╛ рд╣рдореЗрдВ impl Trait рдмрд╛рдж -> рдХреЗ рдмрд╛рдж fn рдкреНрд░рдХрд╛рд░ рдпрд╛ рдХреЛрд╖реНрдардХ рдЪреАрдиреА рдореЗрдВ рдЕрдиреБрдорддрд┐ рджреЗрдиреА рдЪрд╛рд╣рд┐рдП? #45994
  • [ ] рдХреНрдпрд╛ рд╣рдореЗрдВ рд╕реНрд╡рдд: рд╕реБрд░рдХреНрд╖рд┐рдд рд░рд┐рд╕рд╛рд╡ рдХреА рдЕрдиреБрдорддрд┐ рджреЗрдиреЗ рдХреЗ рд▓рд┐рдП рд╕рднреА рдХрд╛рд░реНрдпреЛрдВ рдореЗрдВ рдПрдХ рдбреАрдПрдЬреА рд▓рдЧрд╛рдирд╛ рд╣реЛрдЧрд╛, рдпрд╛ рд╣рдо рдХрд┐рд╕реА рдкреНрд░рдХрд╛рд░ рдХреЗ рдЖрд╕реНрдердЧрди рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░ рд╕рдХрддреЗ рд╣реИрдВред рдЪрд░реНрдЪрд╛: 1

    • рд╡рд░реНрддрдорд╛рди рд╢рдмреНрджрд╛рд░реНрде: рдбреАрдПрдЬреАред

  • [x] рд╣рдореЗрдВ рдЗрдореНрдкреНрд▓рд╛рдВрдЯ рд╡рд┐рд╢реЗрд╖рддрд╛ рдХреЛ рд░реАрдЬрдиреИрдХ рдореЗрдВ рдХреИрд╕реЗ рдПрдХреАрдХреГрдд рдХрд░рдирд╛ рдЪрд╛рд╣рд┐рдП? рдЪрд░реНрдЪрд╛: 1 , 2
  • [ ] рдпрджрд┐ рдХреБрдЫ рдкреИрд░рд╛рдореАрдЯрд░ рдирд┐рд╣рд┐рдд рд╣реИрдВ рдФрд░ рдХреБрдЫ рд╕реНрдкрд╖реНрдЯ рд╣реИрдВ рддреЛ рдХреНрдпрд╛ рд╣рдореЗрдВ рдкреНрд░рдХрд╛рд░реЛрдВ рдХреЛ рдирд┐рд░реНрджрд┐рд╖реНрдЯ рдХрд░рдиреЗ рдХреА рдЕрдиреБрдорддрд┐ рджреЗрдиреА рдЪрд╛рд╣рд┐рдП? рдЙрджрд╛рд╣рд░рдг рдХреЗ рд▓рд┐рдП, fn foo<T>(x: impl Iterator<Item = T>>) ?
  • [ ] [рдиреЗрд╕реНрдЯреЗрдб рдЗрдВрдкреНрд▓рд╛рдВрдЯ рд╡рд┐рд╢реЗрд╖рддрд╛ рдЙрдкрдпреЛрдЧ рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рдХреБрдЫ рдЪрд┐рдВрддрд╛рдПрдВ](https://github.com/rust-lang/rust/issues/34511#issuecomment-350715858)
  • [x] рдХреНрдпрд╛ рдХрд┐рд╕реА рдЗрдореНрдкреНрд▓рд╛рдВрдЯ рдореЗрдВ рд╕рд┐рдВрдЯреИрдХреНрд╕ existential type Foo: Bar рдпрд╛ type Foo = impl Bar ? ( рдЪрд░реНрдЪрд╛ рдХреЗ рд▓рд┐рдП рдпрд╣рд╛рдВ рджреЗрдЦреЗрдВ )
  • [ ] рдХреНрдпрд╛ рдПрдХ рдЗрдореНрдкреНрд▓рд╛рдВрдЯ рдореЗрдВ existential type рд▓рд┐рдП "рдбрд┐рдлрд╛рдЗрдирд┐рдВрдЧ рдпреВрдЬрд╝" рдХрд╛ рд╕реЗрдЯ рдХреЗрд╡рд▓ рдЗрдореНрдкреНрд▓рд╛рдВрдЯ рдХреЗ рдЖрдЗрдЯрдо рд╣реЛрдирд╛ рдЪрд╛рд╣рд┐рдП, рдпрд╛ рдЗрдВрдкреНрд▓рд╛рдВрдЯ рдлрд╝рдВрдХреНрд╢рдВрд╕ рдЖрджрд┐ рдХреЗ рднреАрддрд░ рдиреЗрд╕реНрдЯреЗрдб рдЖрдЗрдЯрдо рд╢рд╛рдорд┐рд▓ рдХрд░рдирд╛ рдЪрд╛рд╣рд┐рдП? ( рдЙрджрд╛рд╣рд░рдг рдХреЗ рд▓рд┐рдП рдпрд╣рд╛рдВ рджреЗрдЦреЗрдВ )
B-RFC-implemented B-unstable C-tracking-issue T-lang disposition-merge finished-final-comment-period

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

рдЪреВрдВрдХрд┐ рдпрд╣ рдЖрдЦрд┐рд░реА рдореМрдХрд╛ рд╣реИ рдЗрд╕рд╕реЗ рдкрд╣рд▓реЗ FCP рдмрдВрдж рд╣реЛ рдЬрд╛рддрд╛ рд╣реИ, рдореИрдВ рд╕реНрд╡рдЪрд╛рд▓рд┐рдд рдСрдЯреЛ рд▓рдХреНрд╖рдгреЛрдВ рдХреЗ рдЦрд┐рд▓рд╛рдл рдПрдХ рдЖрдЦрд┐рд░реА рддрд░реНрдХ рджреЗрдирд╛ рдЪрд╛рд╣рддрд╛ рд╣реВрдВред рдореБрдЭреЗ рдПрд╣рд╕рд╛рд╕ рд╣реИ рдХрд┐ рдпрд╣ рдереЛрдбрд╝рд╛ рдЖрдЦрд┐рд░реА рдорд┐рдирдЯ рд╣реИ, рдЗрд╕рд▓рд┐рдП рд╡рд░реНрддрдорд╛рди рдХрд╛рд░реНрдпрд╛рдиреНрд╡рдпрди рдХреЗ рд▓рд┐рдП рдкреНрд░рддрд┐рдмрджреНрдз рд╣реЛрдиреЗ рд╕реЗ рдкрд╣рд▓реЗ рдореИрдВ рдЗрд╕ рдореБрджреНрджреЗ рдХреЛ рдФрдкрдЪрд╛рд░рд┐рдХ рд░реВрдк рд╕реЗ рд╕рдВрдмреЛрдзрд┐рдд рдХрд░рдирд╛ рдЪрд╛рд╣рддрд╛ рд╣реВрдВред

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

 fn does_some_operation() -> impl Future<Item=(), Error=()> {
-    let data_stored = Arc::new("hello");
+    let data_stored = Rc::new("hello");

     return some_long_operation.and_then(|other_stuff| {
         do_other_calculation_with(data_stored)
     });
}

(рд╕рд░рд▓ рдЙрджрд╛рд╣рд░рдг: рдХрд╛рдо рдХрд░рдирд╛ , рдЖрдВрддрд░рд┐рдХ рдкрд░рд┐рд╡рд░реНрддрди рд╡рд┐рдлрд▓рддрд╛ рдХрд╛ рдХрд╛рд░рдг рдмрдирддреЗ рд╣реИрдВ )

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

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

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

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

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


рдореИрдВ рдХрд╣рддрд╛ рд╣реВрдВ рдХрд┐ рдпрд╣рд╛рдВ рдЗрд╕рдХреЗ рдЦрд░рд╛рдм рд╣реЛрдиреЗ рдХреА рдХреЗрд╡рд▓ "рдмрдбрд╝реА рд╕рдВрднрд╛рд╡рдирд╛" рд╣реИ рдХреНрдпреЛрдВрдХрд┐ рдлрд┐рд░ рд╕реЗ, рдпрд╣ рдореБрджреНрджрд╛ рд╕реНрдкрд╖реНрдЯ рдирд╣реАрдВ рд╣реИред рдкрд╣рд▓реА рдЬрдЧрд╣ рдореЗрдВ 'рдСрдЯреЛ рд▓рдХреНрд╖рдг' рдХрд╛ рдкреВрд░рд╛ рд╡рд┐рдЪрд╛рд░ рдЧреИрд░-рд╕реНрдкрд╖реНрдЯ рд╣реИред рднреЗрдЬреЗрдВ рдФрд░ рд╕рд┐рдВрдХ рдХреЛ рдХрд┐рд╕реА рд╕рдВрд░рдЪрдирд╛ рдХреА рд╕рд╛рдордЧреНрд░реА рдХреЗ рдЖрдзрд╛рд░ рдкрд░ рд▓рд╛рдЧреВ рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИ, рди рдХрд┐ рд╕рд╛рд░реНрд╡рдЬрдирд┐рдХ рдШреЛрд╖рдгрд╛ рдХреЗ рдЖрдзрд╛рд░ рдкрд░ред рдЪреВрдВрдХрд┐ рдпрд╣ рдирд┐рд░реНрдгрдп рдЬрдВрдЧ рдХреЗ рд▓рд┐рдП рдХрд╛рд░рдЧрд░ рд░рд╣рд╛, impl Trait рдЗрд╕реА рддрд░рд╣ рдХрд╛рд░реНрдп рдХрд░рдирд╛ рднреА рдЕрдЪреНрдЫрд╛ рдХрд╛рдо рдХрд░ рд╕рдХрддрд╛ рд╣реИред

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

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

рдХрд┐рд╕реА рдлрд╝рдВрдХреНрд╢рди рдХреЗ рдЖрдВрддрд░рд┐рдХ рдХреЛ рд╕рдВрд╢реЛрдзрд┐рдд рдХрд░рддреЗ рд╕рдордп, рдпрд╣ рдирд┐рд╢реНрдЪрд┐рдд рд░реВрдк рд╕реЗ рд╕реНрдкрд╖реНрдЯ рд╣реИ рдХрд┐ рдХреЛрдИ рдкреНрд░рджрд░реНрд╢рди рдФрд░ рд╢реБрджреНрдзрддрд╛ рджреЛрдиреЛрдВ рдХреЛ рдкреНрд░рднрд╛рд╡рд┐рдд рдХрд░ рд╕рдХрддрд╛ рд╣реИред рд╣рд╛рд▓рд╛рдБрдХрд┐, рд░рд╕реНрдЯ рдореЗрдВ, рд╣рдореЗрдВ рдпрд╣ рдЬрд╛рдБрдЪрдиреЗ рдХреА рдЬрд╝рд░реВрд░рдд рдирд╣реАрдВ рд╣реИ рдХрд┐ рд╣рдо рд╕рд╣реА рдкреНрд░рдХрд╛рд░ рд▓реМрдЯрд╛ рд░рд╣реЗ рд╣реИрдВред рдлрд╝рдВрдХреНрд╢рди рдШреЛрд╖рдгрд╛рдПрдВ рдПрдХ рдХрдард┐рди рдЕрдиреБрдмрдВрдз рд╣реИ рдЬрд┐рд╕реЗ рд╣рдореЗрдВ рдмрдирд╛рдП рд░рдЦрдирд╛ рдЪрд╛рд╣рд┐рдП, рдФрд░ rustc рд╣рдорд╛рд░реА рдкреАрда рджреЗрдЦрддрд╛ рд╣реИред рдпрд╣ рд╕реНрдЯреНрд░рдХреНрдЪрд░реНрд╕ рдФрд░ рдлрд╝рдВрдХреНрд╢рди рд░рд┐рдЯрд░реНрди рдореЗрдВ рдСрдЯреЛ рд▓рдХреНрд╖рдгреЛрдВ рдХреЗ рдмреАрдЪ рдПрдХ рдкрддрд▓реА рд░реЗрдЦрд╛ рд╣реИ, рд▓реЗрдХрд┐рди рдХрд┐рд╕реА рдлрд╝рдВрдХреНрд╢рди рдХреЗ рдЖрдВрддрд░рд┐рдХ рдХреЛ рдмрджрд▓рдирд╛ рдЕрдзрд┐рдХ рдирд┐рдпрдорд┐рдд рд╣реИред рдПрдХ рдмрд╛рд░ рд╣рдорд╛рд░реЗ рдкрд╛рд╕ рдкреВрд░реНрдг рдЬрдирд░реЗрдЯрд░-рд╕рдВрдЪрд╛рд▓рд┐рдд Future s рд╣реЛ рдЬрд╛рдиреЗ рдХреЗ рдмрд╛рдж, -> impl Future рд▓реМрдЯрдиреЗ рд╡рд╛рд▓реЗ рдХрд╛рд░реНрдпреЛрдВ рдХреЛ рд╕рдВрд╢реЛрдзрд┐рдд рдХрд░рдирд╛ рдФрд░ рднреА рдЕрдзрд┐рдХ рдирд┐рдпрдорд┐рдд рд╣реЛрдЧрд╛ред рдпреЗ рд╕рднреА рдкрд░рд┐рд╡рд░реНрддрди рд╣реЛрдВрдЧреЗ рдЬреЛ рд▓реЗрдЦрдХреЛрдВ рдХреЛ рд╕рдВрд╢реЛрдзрд┐рдд рднреЗрдЬреЗрдВ/рд╕рд┐рдВрдХ рдХрд╛рд░реНрдпрд╛рдиреНрд╡рдпрди рдХреЗ рд▓рд┐рдП рд╕реНрдХреНрд░реАрди рдХрд░рдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реЛрдЧреА рдпрджрд┐ рд╕рдВрдХрд▓рдХ рдЗрд╕реЗ рдкрдХрдбрд╝ рдирд╣реАрдВ рдкрд╛рддрд╛ рд╣реИред

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

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


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

рд╣рдореЗрдВ рдЧреИрд░-рднреЗрдЬреЗрдВ/рдЧреИрд░-рд╕рд┐рдВрдХ рдЖрдЗрдЯрдо рд▓реМрдЯрдиреЗ рд╡рд╛рд▓реЗ рдХрд╛рд░реНрдпреЛрдВ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реЛ рд╕рдХрддреА рд╣реИ рдпрд╛ рддреЛ + !Send + !Sync рдпрд╛ рдПрдХ рд╡рд┐рд╢реЗрд╖рддрд╛ (рдЙрдкрдирд╛рдо рд╕рдВрднрд╡рддрдГ?) рдпрд╣ рдПрдХ рдЕрдЪреНрдЫрд╛ рдирд┐рд░реНрдгрдп рдирд╣реАрдВ рд╣реЛрдЧрд╛, рд▓реЗрдХрд┐рди рдпрд╣ рдЙрд╕ рдирд┐рд░реНрдгрдп рд╕реЗ рдмреЗрд╣рддрд░ рд╣реЛ рд╕рдХрддрд╛ рд╣реИ рдЬрд┐рд╕реЗ рд╣рдо рд╡рд░реНрддрдорд╛рди рдореЗрдВ рдЪреБрди рд░рд╣реЗ рд╣реИрдВред

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


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

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

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

@aturon рдХреНрдпрд╛ рд╣рдо рд╡рд╛рд╕реНрддрд╡ рдореЗрдВ RFC рдХреЛ рд░рд┐рдкреЙрдЬрд┐рдЯрд░реА рдореЗрдВ рд░рдЦ рд╕рдХрддреЗ рд╣реИрдВ? ( @mbrubeck рдиреЗ рд╡рд╣рд╛рдВ рдЯрд┐рдкреНрдкрдгреА рдХреА рдХрд┐ рдпрд╣ рдПрдХ рд╕рдорд╕реНрдпрд╛ рдереАред)

рдХрд┐рдпрд╛ рд╣реБрдЖред

рдХрд╛рд░реНрдпрд╛рдиреНрд╡рдпрди рдХрд╛ рдкрд╣рд▓рд╛ рдкреНрд░рдпрд╛рд╕ #35091 рд╣реИ (рджреВрд╕рд░рд╛, рдпрджрд┐ рдЖрдк рдкрд┐рдЫрд▓реЗ рд╡рд░реНрд╖ рд╕реЗ рдореЗрд░реА рд╢рд╛рдЦрд╛ рдХреА рдЧрдгрдирд╛ рдХрд░рддреЗ рд╣реИрдВ)ред

рдПрдХ рд╕рдорд╕реНрдпрд╛ рдЬрд┐рд╕рдХрд╛ рдореИрдВ рд╕рд╛рдордирд╛ рдХрд░ рд░рд╣рд╛ рдерд╛, рд╡рд╣ рд╣реИ рдЬреАрд╡рди рдХрд╛рд▓ рдХреЗ рд╕рд╛рдеред рдЯрд╛рдЗрдк рдЕрдиреБрдорд╛рди рдХреНрд╖реЗрддреНрд░ рдЪрд░ _everywhere_ рд░рдЦрдирд╛ рдкрд╕рдВрдж рдХрд░рддрд╛ рд╣реИ рдФрд░ рдмрд┐рдирд╛ рдХрд┐рд╕реА рдХреНрд╖реЗрддреНрд░-рдЬрд╛рдВрдЪ рдкрд░рд┐рд╡рд░реНрддрди рдХреЗ, рд╡реЗ рдЪрд░ рд╕реНрдерд╛рдиреАрдп рдХреНрд╖реЗрддреНрд░реЛрдВ рдХреЗ рдЕрд▓рд╛рд╡рд╛ рдХрд┐рд╕реА рдЕрдиреНрдп рдЪреАрдЬрд╝ рдХрд╛ рдЕрдиреБрдорд╛рди рдирд╣реАрдВ рд▓рдЧрд╛рддреЗ рд╣реИрдВред
рд╣рд╛рд▓рд╛рдВрдХрд┐, рдареЛрд╕ рдкреНрд░рдХрд╛рд░ _must_ рдирд┐рд░реНрдпрд╛рдд рдпреЛрдЧреНрдп рд╣реЛрдирд╛ рдЪрд╛рд╣рд┐рдП, рдЗрд╕рд▓рд┐рдП рдореИрдВрдиреЗ рдЗрд╕реЗ 'static рд╕реАрдорд┐рдд рдХрд░ рджрд┐рдпрд╛ рдФрд░ рд╕реНрдкрд╖реНрдЯ рд░реВрдк рд╕реЗ рдкреНрд░рд╛рд░рдВрднрд┐рдХ-рдмрд╛рдзреНрдп рдЬреАрд╡рдирдХрд╛рд▓ рдкреИрд░рд╛рдореАрдЯрд░ рдирд╛рдорд┐рдд рдХрд┐рдпрд╛, рд▓реЗрдХрд┐рди рдпрджрд┐ рдХреЛрдИ рдлрд╝рдВрдХреНрд╢рди рд╢рд╛рдорд┐рд▓ рд╣реИ рддреЛ рдпрд╣ _never_ рдЙрдирдореЗрдВ рд╕реЗ рдХреЛрдИ рднреА рд╣реИ - рдпрд╣рд╛рдВ рддрдХ тАЛтАЛтАЛтАЛрдХрд┐ рдПрдХ рд╕реНрдЯреНрд░рд┐рдВрдЧ рдЕрдХреНрд╖рд░ рднреА рдЕрдиреБрдорд╛рди рдирд╣реАрдВ рд▓рдЧрд╛рддрд╛ рд╣реИ 'static , рдпрд╣ рдХрд╛рдлреА рд╣рдж рддрдХ рдкреВрд░реА рддрд░рд╣ рд╕реЗ рдмреЗрдХрд╛рд░ рд╣реИред

рдПрдХ рдмрд╛рдд рдЬреЛ рдореИрдВрдиреЗ рд╕реЛрдЪреА рдереА, рдЙрд╕рдХрд╛ рдХреНрд╖реЗрддреНрд░-рдЬрд╛рдБрдЪ рдкрд░ 0 рдкреНрд░рднрд╛рд╡ рдкрдбрд╝реЗрдЧрд╛, рд╡рд╣ рд╣реИ рдЬреАрд╡рди рдХрд╛рд▓ рдХреЛ рдорд┐рдЯрд╛рдирд╛:

  • impl Trait рдХреЗ рдареЛрд╕ рдкреНрд░рдХрд╛рд░ рдХреЛ рдЙрдЬрд╛рдЧрд░ рдХрд░рдиреЗ рд╡рд╛рд▓рд╛ рдХреБрдЫ рднреА рдЬреАрд╡рди рдХрд╛рд▓ рдХреА рдкрд░рд╡рд╛рд╣ рдирд╣реАрдВ рдХрд░рдирд╛ рдЪрд╛рд╣рд┐рдП - Reveal::All рд▓рд┐рдП рдПрдХ рддреНрд╡рд░рд┐рдд рдЦреЛрдЬ рд╕реЗ рдкрддрд╛ рдЪрд▓рддрд╛ рд╣реИ рдХрд┐ рдкрд╣рд▓реЗ рд╕реЗ рд╣реА рд╕рдВрдХрд▓рдХ рдореЗрдВ рдорд╛рдорд▓рд╛ рд╣реИ
  • рдХрд┐рд╕реА рдлрд╝рдВрдХреНрд╢рди рдХреЗ рд░рд┐рдЯрд░реНрди рдкреНрд░рдХрд╛рд░ рдореЗрдВ impl Trait рд╕рднреА рдареЛрд╕ рдкреНрд░рдХрд╛рд░реЛрдВ рдкрд░ рдПрдХ рдмрд╛рдзреНрдпрддрд╛ рд░рдЦреА рдЬрд╛рдиреА рдЪрд╛рд╣рд┐рдП, рдХрд┐ рдпрд╣ рдЙрд╕ рдлрд╝рдВрдХреНрд╢рди рдХреА рдХреЙрд▓ рдХреЛ рд░реЗрдЦрд╛рдВрдХрд┐рдд рдХрд░рддрд╛ рд╣реИ - рдЗрд╕рдХрд╛ рдорддрд▓рдм рд╣реИ рдХрд┐ рдХреЛрдИ рднреА рдЬреАрд╡рдирдХрд╛рд▓, рдЖрд╡рд╢реНрдпрдХрддрд╛ рдХреЗ рдЕрдиреБрд╕рд╛рд░, 'static рдпрд╛ рдлрд╝рдВрдХреНрд╢рди рдХреЗ рдЖрдЬреАрд╡рди рдорд╛рдкрджрдВрдбреЛрдВ рдореЗрдВ рд╕реЗ рдПрдХ - _even_ рдЕрдЧрд░ рд╣рдо рдпрд╣ рдирд╣реАрдВ рдЬрд╛рди рд╕рдХрддреЗ рд╣реИрдВ рдХрд┐ рдХреМрди рд╕рд╛ (рдЬреИрд╕реЗ " 'a рдФрд░ 'b ")
  • рд╣рдореЗрдВ impl Trait рдХреЗ рдЕрдВрддрд░реНрдирд┐рд╣рд┐рдд рдЖрдЬреАрд╡рди рдкреИрд░рд╛рдореАрдЯреНрд░рд┐рд╕реНрдо рдХреЗ рд▓рд┐рдП рдПрдХ рд╡рд┐рдЪрд░рдг рдХрд╛ рдЪрдпрди рдХрд░рдирд╛ рдЪрд╛рд╣рд┐рдП (рдЕрд░реНрдерд╛рдд рджрд╛рдпрд░реЗ рдореЗрдВ рд╕рднреА рдЖрдЬреАрд╡рди рдорд╛рдкрджрдВрдбреЛрдВ рдкрд░, рдкреНрд░рдХрд╛рд░ рдХреЗ рдорд╛рдкрджрдВрдбреЛрдВ рдХреЗ рд╕рдорд╛рди): рдЗрдирд╡реЗрд░рд┐рдПрдВрд╕ рд╕рдмрд╕реЗ рдЖрд╕рд╛рди рд╣реИ рдФрд░ рдХреИрд▓реА рдХреЛ рдЕрдзрд┐рдХ рдирд┐рдпрдВрддреНрд░рдг рджреЗрддрд╛ рд╣реИ, рдЬрдмрдХрд┐ рдХреЙрдиреНрдЯреНрд░рд╛рд╡реЗрд░рд┐рдПрдВрд╕ рдХреЙрд▓ рдХрд░рдиреЗ рд╡рд╛рд▓реЗ рдХреЛ рдХрд░рдиреЗ рджреЗрддрд╛ рд╣реИ рдЕрдзрд┐рдХ рдФрд░ рдпрд╣ рдЬрд╛рдБрдЪрдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реЛрдЧреА рдХрд┐ рд░рд┐рдЯрд░реНрди рдкреНрд░рдХрд╛рд░ рдореЗрдВ рд╣рд░ рдЬреАрд╡рдирдХрд╛рд▓ рдПрдХ рд╡рд┐рдкрд░реАрдд рд╕реНрдерд┐рддрд┐ рдореЗрдВ рд╣реИ (рд╕рдорд╛рди рд░реВрдк рд╕реЗ рдЕрдкрд░рд┐рд╡рд░реНрддрдиреАрдп рдХреЗ рдмрдЬрд╛рдп рд╕рд╣рд╕рдВрдпреЛрдЬрдХ рдкреНрд░рдХрд╛рд░ рдХреЗ рдкреИрд░рд╛рдореАрдЯреНрд░рд┐рд╕реНрдо рдХреЗ рд╕рд╛рде)
  • рдСрдЯреЛ рдЯреНрд░реИрдЯ рд▓реАрдХрд┐рдВрдЧ рдореИрдХреЗрдирд┐рдЬреНрдо рдХреЗ рд▓рд┐рдП рдЖрд╡рд╢реНрдпрдХ рд╣реИ рдХрд┐ рдПрдХ рд╡рд┐рд╢реЗрд╖рддрд╛ рдмрд╛рдзреНрдп рдХреЛ рдХрдВрдХреНрд░реАрдЯ рдкреНрд░рдХрд╛рд░ рдкрд░ рд░рдЦрд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИ, рджреВрд╕рд░реЗ рдлрд╝рдВрдХреНрд╢рди рдореЗрдВ - рдЪреВрдВрдХрд┐ рд╣рдордиреЗ рдЬреАрд╡рдирдХрд╛рд▓ рдорд┐рдЯрд╛ рджрд┐рдпрд╛ рд╣реИ рдФрд░ рдкрддрд╛ рдирд╣реАрдВ рд╣реИ рдХрд┐ рдЬреАрд╡рдирдХрд╛рд▓ рдХрд╣рд╛рдВ рдЬрд╛рддрд╛ рд╣реИ, рдХрдВрдХреНрд░реАрдЯ рдкреНрд░рдХрд╛рд░ рдореЗрдВ рд╣рд░ рдорд┐рдЯрд╛рдП рдЧрдП рдЬреАрд╡рдирдХрд╛рд▓ рдХреЛ рдкреНрд░рддрд┐рд╕реНрдерд╛рдкрд┐рдд рдХрд░рдирд╛ рд╣реЛрдЧрд╛ рдПрдХ рддрд╛рдЬрд╛ рдЕрдиреБрдорд╛рди рдЪрд░ рдХреЗ рд╕рд╛рде рдЬреЛ рд╕рднреА рд╡рд╛рд╕реНрддрд╡рд┐рдХ рдЬреАрд╡рдирдХрд╛рд▓ рдорд╛рдкрджрдВрдбреЛрдВ рдореЗрдВ рд╕реЗ рд╕рдмрд╕реЗ рдХрдо рдЬреАрд╡рдирдХрд╛рд▓ рд╕реЗ рдХрдо рдирд╣реАрдВ рд╣реЛрдиреЗ рдХреА рдЧрд╛рд░рдВрдЯреА рд╣реИ; рд╕рдорд╕реНрдпрд╛ рдЗрд╕ рддрдереНрдп рдореЗрдВ рдирд┐рд╣рд┐рдд рд╣реИ рдХрд┐ рд╡рд┐рд╢реЗрд╖рддрд╛ рдирд┐рд╣рд┐рддрд╛рд░реНрдереЛрдВ рдХреЛ рдордЬрдмреВрдд рдЖрдЬреАрд╡рди рд╕рдВрдмрдВрдзреЛрдВ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реЛ рд╕рдХрддреА рд╣реИ (рдЙрджрд╛рд╣рд░рдг рдХреЗ рд▓рд┐рдП X<'a, 'a> рдпрд╛ X<'static> ), рдЬрд┐рд╕рдХрд╛ рдкрддрд╛ рд▓рдЧрд╛рдпрд╛ рдЬрд╛рдирд╛ рдЪрд╛рд╣рд┐рдП рдФрд░ рддреНрд░реБрдЯрд┐рдкреВрд░реНрдг рд╣реЛрдирд╛ рдЪрд╛рд╣рд┐рдП, рдХреНрдпреЛрдВрдХрд┐ рд╡реЗ рдЙрди рд▓реЛрдЧреЛрдВ рдХреЗ рд▓рд┐рдП рд╕рд┐рджреНрдз рдирд╣реАрдВ рд╣реЛ рд╕рдХрддреЗ рд╣реИрдВ рдЬреАрд╡рди рдХрд╛рд▓

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

cc @rust-lang/lang

@eddyb

рд▓реЗрдХрд┐рди рдЬреАрд╡рдирдХрд╛рд▓ _are_ impl Trait рд╕рд╛рде рдорд╣рддреНрд╡рдкреВрд░реНрдг - рдЬреИрд╕реЗ

fn get_debug_str(s: &str) -> impl fmt::Debug {
    s
}

fn get_debug_string(s: &str) -> impl fmt::Debug {
    s.to_string()
}

fn good(s: &str) -> Box<fmt::Debug+'static> {
    // if this does not compile, that would be quite annoying
    Box::new(get_debug_string())
}

fn bad(s: &str) -> Box<fmt::Debug+'static> {
    // if this *does* compile, we have a problem
    Box::new(get_debug_str())
}

рдореИрдВрдиреЗ рдЙрд▓реНрд▓реЗрдЦ рдХрд┐рдпрд╛ рд╣реИ рдХрд┐ RFC рдереНрд░реЗрдбреНрд╕ рдореЗрдВ рдХрдИ рдмрд╛рд░

рд╡рд┐рд╢реЗрд╖рддрд╛-рд╡рд╕реНрддреБ-рд░рд╣рд┐рдд рд╕рдВрд╕реНрдХрд░рдг:

fn as_debug(s: &str) -> impl fmt::Debug;

fn example() {
    let mut s = String::new("hello");
    let debug = as_debug(&s);
    s.truncate(0);
    println!("{:?}", debug);
}

рдпрд╣ as_debug рдХреА рдкрд░рд┐рднрд╛рд╖рд╛ рдХреЗ рдЖрдзрд╛рд░ рдкрд░ рдпрд╛ рддреЛ рдпреВрдмреА рд╣реИ рдпрд╛ рдирд╣реАрдВред

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

@ arielb1 рдХреНрдпрд╛ рд╣рдорд╛рд░реЗ рдкрд╛рд╕ рдПрдХ рд╕рдЦреНрдд 'a outlives 'b рдЗрдВрд╕реНрдЯрд╛-рдлреЗрд▓ рдХрд░рдирд╛ рдПрдХ рдмреБрд░рд╛ рд╡рд┐рдЪрд╛рд░ рдирд╣реАрдВ рд╣реЛ рд╕рдХрддрд╛ рд╣реИ, рдЬрд╣рд╛рдВ 'a _anything_ 'static рдпрд╛ рдЖрдЬреАрд╡рди рдкреИрд░рд╛рдореАрдЯрд░ рдХреЗ рдЕрд▓рд╛рд╡рд╛ рдЕрдиреНрдп рд╣реИ рдФрд░ 'b рдПрдХ рдареЛрд╕ рдкреНрд░рдХрд╛рд░ рдХреЗ impl Trait рдореЗрдВ рдкреНрд░рдХрдЯ рд╣реЛрддрд╛ рд╣реИред

рдпрд╣рд╛рдБ рд╡рд╛рдкрд╕ рд▓рд┐рдЦрдиреЗ рдХреЗ рд▓рд┐рдП рдХреБрдЫ рд╕рдордп рджреЗрдиреЗ рдХреЗ рд▓рд┐рдП рдХреНрд╖рдорд╛ рдХрд░реЗрдВред рддреЛ рдореИрдВ рд╕реЛрдЪ рд░рд╣рд╛ рдерд╛
рдЗрд╕ рд╕рдорд╕реНрдпрд╛ рдХреЗ рдмрд╛рд░реЗ рдореЗрдВред рдореЗрд░реА рднрд╛рд╡рдирд╛ рдпрд╣ рд╣реИ рдХрд┐ рд╣рдореЗрдВ рдЕрдВрддрддрдГ (рдФрд░ .) рдХрд░рдирд╛ рдкрдбрд╝рддрд╛ рд╣реИ
рдПрдХ рдирдИ рддрд░рд╣ рдХреА рдмрд╛рдзрд╛ рдХреЗ рд╕рд╛рде рд░реАрдЬрди рдХрд╛ рд╡рд┐рд╕реНрддрд╛рд░ рдХрд░рдирд╛ рдЪрд╛рд╣рддреЗ рд╣реИрдВ - рдореИрдВ рдЗрд╕реЗ рдХреЙрд▓ рдХрд░реВрдВрдЧрд╛
рдПрдХ \in рдмрд╛рдзрд╛, рдХреНрдпреЛрдВрдХрд┐ рдпрд╣ рдЖрдкрдХреЛ '0 \in {'a, 'b, 'c} рдЬреИрд╕рд╛ рдХреБрдЫ рдХрд╣рдиреЗ рдХреА рдЕрдиреБрдорддрд┐ рджреЗрддрд╛ рд╣реИ, рдЬрд┐рд╕рдХрд╛ рдЕрд░реНрде рд╣реИ рдХрд┐ '0 рд▓рд┐рдП рдЙрдкрдпреЛрдЧ рдХрд┐рдпрд╛ рдЬрд╛рдиреЗ рд╡рд╛рд▓рд╛ рдХреНрд╖реЗрддреНрд░ рд╣реЛрдирд╛ рдЪрд╛рд╣рд┐рдП
рдпрд╛ рддреЛ 'a , 'b , рдпрд╛ 'c ред рдореБрдЭреЗ рдпрдХреАрди рдирд╣реАрдВ рд╣реИ рдХрд┐ рдПрдХреАрдХреГрдд рдХрд░рдиреЗ рдХрд╛ рд╕рдмрд╕реЗ рдЕрдЪреНрдЫрд╛ рддрд░реАрдХрд╛ рд╣реИ
рдЗрд╕реЗ рд╕реНрд╡рдпрдВ рд╣рд▓ рдХрд░рдиреЗ рдореЗрдВ - рдирд┐рд╢реНрдЪрд┐рдд рд░реВрдк рд╕реЗ рдпрджрд┐ \in рд╕реЗрдЯ рдПрдХ рд╕рд┐рдВрдЧрд▓рдЯрди рд╣реИ
рд╕реЗрдЯ, рдпрд╣ рд╕рд┐рд░реНрдл рдПрдХ рд╕рдорд╛рди рд╕рдВрдмрдВрдз рд╣реИ (рдЬреЛ рд╡рд░реНрддрдорд╛рди рдореЗрдВ рд╣рдорд╛рд░реЗ рдкрд╛рд╕ рдирд╣реАрдВ рд╣реИ a
рдкреНрд░рдердо рд╢реНрд░реЗрдгреА рдХреА рдЪреАрдЬ, рд▓реЗрдХрд┐рди рдЬрд┐рд╕реЗ рджреЛ рд╕реАрдорд╛рдУрдВ рд╕реЗ рдмрдирд╛рдпрд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИ), рд▓реЗрдХрд┐рди
рдЕрдиреНрдпрдерд╛ рдпрд╣ рдЪреАрдЬреЛрдВ рдХреЛ рдЬрдЯрд┐рд▓ рдмрдирд╛ рджреЗрддрд╛ рд╣реИред

рдпрд╣ рд╕рдм рдХреНрд╖реЗрддреНрд░ рдХреА рдмрд╛рдзрд╛рдУрдВ рдХреЗ рд╕рдореВрд╣ рдХреЛ рдмрдирд╛рдиреЗ рдХреА рдореЗрд░реА рдЗрдЪреНрдЫрд╛ рд╕реЗ рд╕рдВрдмрдВрдзрд┐рдд рд╣реИ
рдЖрдЬ рд╣рдорд╛рд░реЗ рдкрд╛рд╕ рдЬреЛ рд╣реИ рдЙрд╕рд╕реЗ рдХрд╣реАрдВ рдЕрдзрд┐рдХ рдЕрднрд┐рд╡реНрдпрдВрдЬрдХред рдирд┐рд╢реНрдЪрд┐рдд рд░реВрдк рд╕реЗ рдХреЛрдИ рдПрдХ рдХреА рд░рдЪрдирд╛ рдХрд░ рд╕рдХрддрд╛ рд╣реИ
\in рдмрд╛рдзрд╛ OR рдФрд░ == рдмрд╛рдзрд╛рдУрдВ рдореЗрдВ рд╕реЗред рд▓реЗрдХрд┐рди рдирд┐рд╢реНрдЪрд┐рдд рд░реВрдк рд╕реЗ рдЕрдзрд┐рдХ
рдЕрднрд┐рд╡реНрдпрдВрдЬрдХ рдмрд╛рдзрд╛рдУрдВ рдХреЛ рд╣рд▓ рдХрд░рдирд╛ рдХрдард┐рди рд╣реИ рдФрд░ \in рдЕрд▓рдЧ рдирд╣реАрдВ рд╣реИред

рдЬреЛ рднреА рд╣реЛ, рдореИрдВ рдпрд╣рд╛рдБ рдЕрдкрдиреА рд╕реЛрдЪ рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рдХреБрдЫ рдмрддрд╛ рджреВрдБред рдЖрдЗрдП рдЗрд╕рдХреЗ рд╕рд╛рде рдХрд╛рдо рдХрд░реЗрдВ
рдЙрджрд╛рд╣рд░рдг:

pub fn foo<'a,'b>(x: &'a [u32], y: &'b [u32]) -> impl Iterator<Item=u32> {...}

рдореБрдЭреЗ рд▓рдЧрддрд╛ рд╣реИ рдХрд┐ impl Trait рд▓рд┐рдП рд╕рдмрд╕реЗ рд╕рдЯреАрдХ рдбрд┐рд╕реБрдЧрд░рд┐рдВрдЧ рд╢рд╛рдпрдж рдПрдХ рд╣реИ
рдирдпрд╛ рдкреНрд░рдХрд╛рд░:

pub struct FooReturn<'a, 'b> {
    field: XXX // for some suitable type XXX
}

impl<'a,'b> Iterator for FooReturn<'a,'b> {
    type Item = <XXX as Iterator>::Item;
}

рдЕрдм impl Iterator<Item=u32> рдореЗрдВ foo рдХреЛ рд╡реИрд╕рд╛ рд╣реА рд╡реНрдпрд╡рд╣рд╛рд░ рдХрд░рдирд╛ рдЪрд╛рд╣рд┐рдП рдЬреИрд╕рд╛
FooReturn<'a,'b> рд╡реНрдпрд╡рд╣рд╛рд░ рдХрд░реЗрдЧрд╛ред рд╣рд╛рд▓рд╛рдВрдХрд┐ рдпрд╣ рдПрдХ рдкрд░рдлреЗрдХреНрдЯ рдореИрдЪ рдирд╣реАрдВ рд╣реИред рдПрдХ
рдЕрдВрддрд░, рдЙрджрд╛рд╣рд░рдг рдХреЗ рд▓рд┐рдП, рд╡рд┐рдЪрд░рдг рд╣реИ, рдЬреИрд╕рд╛ рдХрд┐ eddyb рд▓рд╛рдпрд╛ рдЧрдпрд╛ - рдореИрдВ рд╣реВрдБ
рдпрд╣ рдорд╛рдирддреЗ рд╣реБрдП рдХрд┐ рд╣рдо impl Foo -рд╕рдорд╛рди рдкреНрд░рдХрд╛рд░ рдХреЛ рдкреНрд░рдХрд╛рд░ рдкрд░ рдЕрдкрд░рд┐рд╡рд░реНрддрдиреАрдп рдмрдирд╛ рджреЗрдВрдЧреЗ
foo рдкреИрд░рд╛рдореАрдЯрд░ред рд╣рд╛рд▓рд╛рдБрдХрд┐, рдСрдЯреЛ рд╡рд┐рд╢реЗрд╖рддрд╛ рд╡реНрдпрд╡рд╣рд╛рд░ рдХрд╛рдо рдХрд░рддрд╛ рд╣реИред
(рдПрдХ рдЕрдиреНрдп рдХреНрд╖реЗрддреНрд░ рдЬрд╣рд╛рдВ рдореИрдЪ рдЖрджрд░реНрд╢ рдирд╣реАрдВ рд╣реЛ рд╕рдХрддрд╛ рд╣реИ рдпрджрд┐ рд╣рдо рдХрднреА рднреА рдЬреЛрдбрд╝ рджреЗрдВ
impl Iterator рдЕрдореВрд░реНрддрддрд╛ рдХреЛ "рдЫреЗрджрдиреЗ" рдХреА рдХреНрд╖рдорддрд╛, рддрд╛рдХрд┐ рдХреЛрдб
"рдЕрдВрджрд░" рдЕрдореВрд░реНрдд рд╕рдЯреАрдХ рдкреНрд░рдХрд╛рд░ рдЬрд╛рдирддрд╛ рд╣реИ - рдлрд┐рд░ рдпрд╣ рдХреНрд░рдордмрджреНрдз рд╣реЛрдЧрд╛
рдХрд╛ рдПрдХ рдЕрдВрддрд░реНрдирд┐рд╣рд┐рдд "рдЕрдирд░реИрдк" рдСрдкрд░реЗрд╢рди рд╣реЛ рд░рд╣рд╛ рд╣реИред)

рдХреБрдЫ рдорд╛рдпрдиреЛрдВ рдореЗрдВ рдПрдХ рдмреЗрд╣рддрд░ рдореИрдЪ рдПрдХ рддрд░рд╣ рдХреЗ рд╕рд┐рдВрдереЗрдЯрд┐рдХ рдЧреБрдг рдкрд░ рд╡рд┐рдЪрд╛рд░ рдХрд░рдирд╛ рд╣реИ:

trait FooReturn<'a,'b> {
    type Type: Iterator<Item=u32>;
}

impl<'a,'b> FooReturn<'a,'b> for () {
    type Type = XXX;
}

рдЕрдм рд╣рдо impl Iterator рдкреНрд░рдХрд╛рд░ рдХреЛ <() as FooReturn<'a,'b>>::Type рдЬреИрд╕рд╛ рдорд╛рди рд╕рдХрддреЗ рд╣реИрдВред рдпрд╣ рднреА рдПрдХ рд╕рдВрдкреВрд░реНрдг рдореИрдЪ рдирд╣реАрдВ рд╣реИ, рдХреНрдпреЛрдВрдХрд┐ рд╣рдо
рд╕рд╛рдорд╛рдиреНрдп рд░реВрдк рд╕реЗ рдЗрд╕реЗ рд╕рд╛рдорд╛рдиреНрдп рдХрд░ рджреЗрдЧрд╛ред рдЖрдк рд╡рд┐рд╢реЗрд╖рдЬреНрдЮрддрд╛ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдиреЗ рдХреА рдХрд▓реНрдкрдирд╛ рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ
рд╣рд╛рд▓рд╛рдВрдХрд┐ рдЗрд╕реЗ рд░реЛрдХрдиреЗ рдХреЗ рд▓рд┐рдП:

trait FooReturn<'a,'b> {
    type Type: Iterator<Item=u32>;
}

impl<'a,'b> FooReturn<'a,'b> for () {
    default type Type = XXX; // can't really be specialized, but wev
}

рдЗрд╕ рдорд╛рдорд▓реЗ рдореЗрдВ, <() as FooReturn<'a,'b>>::Type рд╕рд╛рдорд╛рдиреНрдп рдирд╣реАрдВ рд╣реЛрдЧрд╛,
рдФрд░ рд╣рдорд╛рд░реЗ рдкрд╛рд╕ рдмрд╣реБрдд рдХрд░реАрдмреА рдореИрдЪ рд╣реИред рд╡рд┐рдЪрд░рдг, рд╡рд┐рд╢реЗрд╖ рд░реВрдк рд╕реЗ, рд╡реНрдпрд╡рд╣рд╛рд░ рдХрд░рддрд╛ рд╣реИ
рдЕрдзрд┐рдХрд╛рд░; рдЕрдЧрд░ рд╣рдо рдХрднреА рдХреБрдЫ рдкреНрд░рдХрд╛рд░ рдЪрд╛рд╣рддреЗ рд╣реИрдВ рдЬреЛ "рдЕрдВрджрд░" рд╣реЛрдВ
рдЕрдореВрд░реНрдд, рд╡реЗ рд╡рд╣реА рд╣реЛрдВрдЧреЗ рд▓реЗрдХрд┐рди рдЙрдиреНрд╣реЗрдВ рдЕрдиреБрдорддрд┐ рд╣реИ
рд╕рд╛рдорд╛рдиреНрдп рдХрд░рдирд╛ред рд╣рд╛рд▓рд╛рдВрдХрд┐, рдПрдХ рдкрдХрдбрд╝ рд╣реИ: рдСрдЯреЛ рд╡рд┐рд╢реЗрд╖рддрд╛ рд╕рд╛рдорд╛рди рдирд╣реАрдВ рд╣реИ
рдХрд╛рдлреА рдХрд╛рдоред (рд╣рдо рдпрд╣рд╛рдВ рд╕рд╛рдордВрдЬрд╕реНрдп рдмрд┐рдард╛рдиреЗ рдкрд░ рд╡рд┐рдЪрд╛рд░ рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ,
рд╡рд╛рд╕реНрддрд╡ рдореЗрдВред)

рд╡реИрд╕реЗ рднреА, рдЗрди рд╕рдВрднрд╛рд╡рд┐рдд desugarings рдХреА рдЦреЛрдЬ рдореЗрдВ рдореЗрд░реА рдмрд╛рдд рдпрд╣ рдирд╣реАрдВ рд╣реИ
рд╕реБрдЭрд╛рд╡ рд╣реИ рдХрд┐ рд╣рдо "рдкреНрд░рддреНрдпрд╛рд░реЛрдкрд┐рдд рд╡рд┐рд╢реЗрд╖рддрд╛" рдХреЛ рдПрдХ _actual_ desugaring . рдХреЗ рд░реВрдк рдореЗрдВ рд▓рд╛рдЧреВ рдХрд░рддреЗ рд╣реИрдВ
(рд╣рд╛рд▓рд╛рдВрдХрд┐ рдпрд╣ рдЕрдЪреНрдЫрд╛ рд╣реЛ рд╕рдХрддрд╛ рд╣реИ...) рд▓реЗрдХрд┐рди рд╣рдорд╛рд░реЗ рдХрд╛рдо рдХреЗ рд▓рд┐рдП рдПрдХ рдЕрдВрддрд░реНрдЬреНрдЮрд╛рди рджреЗрдиреЗ рдХреЗ рд▓рд┐рдПред рдореИрдВ
рд▓рдЧрддрд╛ рд╣реИ рдХрд┐ рджреВрд╕рд░рд╛ desugaring -- рдЕрдиреБрдорд╛рдиреЛрдВ рдХреЗ рд╕рдВрджрд░реНрдн рдореЗрдВ -- рд╣реИ a
рд╣рдореЗрдВ рдЖрдЧреЗ рдмрдврд╝рд╛рдиреЗ рдХреЗ рд▓рд┐рдП рдХрд╛рдлреА рдорджрджрдЧрд╛рд░ред

рдПрдХ рдЬрдЧрд╣ рд╣реИ рдХрд┐ рдпрд╣ рдкреНрд░рдХреНрд╖реЗрдкрдг desugaring рд╡рд╛рд╕реНрддрд╡ рдореЗрдВ рдПрдХ рдЙрдкрдпреЛрдЧреА рдЧрд╛рдЗрдб рд╣реИ
"рдЬреАрд╡рди рдХрд╛рд▓" рд╕рдВрдмрдВрдзред рдЕрдЧрд░ рд╣рдо рдЬрд╛рдВрдЪрдирд╛ рдЪрд╛рд╣рддреЗ рд╣реИрдВ рдХрд┐ рдХреНрдпрд╛ <() as FooReturn<'a,'b>>::Type: 'x , RFC 1214 рд╣рдореЗрдВ рдмрддрд╛рддрд╛ рд╣реИ рдХрд┐ рд╣рдо рдЗрд╕реЗ рд╕рд╛рдмрд┐рдд рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ
рдЬрдм рддрдХ 'a: 'x _рдФрд░_ 'b: 'x рдзрд╛рд░рдг рдХрд░рддрд╛ рд╣реИред рдпрд╣ рдореБрдЭреЗ рд▓рдЧрддрд╛ рд╣реИ рдХрд┐ рд╣рдо рдХреИрд╕реЗ рдЪрд╛рд╣рддреЗ рд╣реИрдВ
рдЗрдореНрдкреНрд▓рд╛рдВрдЯ рд╡рд┐рд╢реЗрд╖рддрд╛ рдХреЗ рд▓рд┐рдП рдЪреАрдЬреЛрдВ рдХреЛ рд╕рдВрднрд╛рд▓рдиреЗ рдХреЗ рд▓рд┐рдП рднреАред

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

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

рдпрд╣реАрдВ рд╕реЗ \in рдмрд╛рдзрд╛ рдЖрддреА рд╣реИред рдХреЛрдИ рдЬреЛрдбрд╝рдиреЗ рдХреА рдХрд▓реНрдкрдирд╛ рдХрд░ рд╕рдХрддрд╛ рд╣реИ
рдПрдХ рдЯрд╛рдЗрдк-рдЪреЗрдХ рдирд┐рдпрдо рдЬреЛ (рдореВрд▓ рд░реВрдк рд╕реЗ) FR(XXX) \subset {'a, 'b} --
рдЬрд┐рд╕рдХрд╛ рдЕрд░реНрде рд╣реИ рдХрд┐ XXX рдореЗрдВ рдкреНрд░рджрд░реНрд╢рд┐рдд рд╣реЛрдиреЗ рд╡рд╛рд▓реЗ "рдореБрдХреНрдд рдХреНрд╖реЗрддреНрд░" рдХреЗрд╡рд▓ 'a рдФрд░
'b ред рдпрд╣ \in рдЖрд╡рд╢реНрдпрдХрддрд╛рдУрдВ рдХреЗ рд▓рд┐рдП рдЕрдиреБрд╡рд╛рдж рдХрд░рдирд╛ рд╕рдорд╛рдкреНрдд рдХрд░ рджреЗрдЧрд╛
рд╡рд┐рднрд┐рдиреНрди рдХреНрд╖реЗрддреНрд░ рдЬреЛ XXX рдореЗрдВ рджрд┐рдЦрд╛рдИ рджреЗрддреЗ рд╣реИрдВред

рдЖрдЗрдП рдПрдХ рд╡рд╛рд╕реНрддрд╡рд┐рдХ рдЙрджрд╛рд╣рд░рдг рджреЗрдЦреЗрдВ:

fn foo<'a,'b>(x: &'a [u32], y: &'b [u32]) -> impl Iterator<Item=u32> {
    if condition { x.iter().cloned() } else { y.iter().cloned() }
}

рдпрд╣рд╛рдВ, рдЕрдЧрд░ condition рд╕рдЪ рд╣реИ рддреЛ рдЯрд╛рдЗрдк рдХреБрдЫ рдЗрд╕ рддрд░рд╣ рд╣реЛрдЧрд╛
Cloned<SliceIter<'a, i32>> ред рд▓реЗрдХрд┐рди рдЕрдЧрд░ condition рдЧрд▓рдд рд╣реИ, рддреЛ рд╣рдо рдХрд░реЗрдВрдЧреЗ
Cloned<SliceIter<'b, i32>> ред рдмреЗрд╢рдХ рджреЛрдиреЛрдВ рд╣реА рдорд╛рдорд▓реЛрдВ рдореЗрдВ рд╣рдо рдХрд░реЗрдВрдЧреЗ
рдХреБрдЫ рдЗрд╕ рддрд░рд╣ рд╕реЗ рд╣рд╡рд╛ рджреЗрдВ (рдкреНрд░рдХрд╛рд░/рдХреНрд╖реЗрддреНрд░ рдЪрд░ рдХреЗ рд▓рд┐рдП рд╕рдВрдЦреНрдпрд╛рдУрдВ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдХреЗ):

Cloned<SliceIter<'0, i32>> <: 0
'a: '0 // because the source is x.iter()
Cloned<SliceIter<'1, i32>> <: 0
'b: '1 // because the source is y.iter()

рдЕрдЧрд░ рд╣рдо рд╡реЗрд░рд┐рдПрдмрд▓ 0 рд╕реЗ Cloned<SliceIter<'2, i32>> рдХреЛ рдЗрдВрд╕реНрдЯреЗрдВрдЯ рдХрд░рддреЗ рд╣реИрдВ,
рд╣рдорд╛рд░реЗ рдкрд╛рд╕ '0: '2 рдФрд░ '1: '2 , рдпрд╛ рдХреНрд╖реЗрддреНрд░ рд╕рдВрдмрдВрдзреЛрдВ рдХрд╛ рдХреБрд▓ рд╕реЗрдЯ рд╣реИ
рдкрд╕рдВрдж:

'a: '0
'0: '2
'b: '1
'1: '2
'2: 'body // the lifetime of the fn body

рддреЛ рд╣рдореЗрдВ '2 рд▓рд┐рдП рдХрд┐рд╕ рдореВрд▓реНрдп рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдирд╛ рдЪрд╛рд╣рд┐рдП? рд╣рдорд╛рд░реЗ рдкрд╛рд╕ рдЕрддрд┐рд░рд┐рдХреНрдд рднреА рд╣реИ
рдмрд╛рдзрд╛ рд╣реИ рдХрд┐ '2 in {'a, 'b} ред рдПрдлрдПрди рдХреЗ рд░реВрдк рдореЗрдВ рд▓рд┐рдЦрд╛ рдХреЗ рд╕рд╛рде, рдореБрдЭреЗ рд▓рдЧрддрд╛ рд╣реИ рдХрд┐ рд╣рдо
рдПрдХ рддреНрд░реБрдЯрд┐ рдХреА рд░рд┐рдкреЛрд░реНрдЯ рдХрд░рдиреА рд╣реЛрдЧреА, рдХреНрдпреЛрдВрдХрд┐ рди рддреЛ 'a рдФрд░ рди рд╣реА 'b рдПрдХ рд╣реИ
рд╕рд╣реА рд╡рд┐рдХрд▓реНрдкред рджрд┐рд▓рдЪрд╕реНрдк рд╣реИ, рд╣рд╛рд▓рд╛рдВрдХрд┐, рдЕрдЧрд░ рд╣рдо рдмрд╛рдзрд╛ 'a: 'b рдЬреЛрдбрд╝рддреЗ рд╣реИрдВ, рддреЛ рдПрдХ рд╕рд╣реА рдореВрд▓реНрдп ( 'b ) рд╣реЛрдЧрд╛ред

рдзреНрдпрд╛рди рджреЗрдВ рдХрд┐ рдЕрдЧрд░ рд╣рдо рд╕рд┐рд░реНрдл _рд╕рд╛рдорд╛рдиреНрдп_ рдПрд▓реНрдЧреЛрд░рд┐рджрдо рдЪрд▓рд╛рддреЗ рд╣реИрдВ, рддреЛ рд╣рдо рдЗрд╕рдХреЗ рд╕рд╛рде рд╕рдорд╛рдкреНрдд рд╣реЛ рдЬрд╛рдПрдВрдЧреЗ
'2 рд╣реЛрдиреЗ рдХреЗ рдирд╛рддреЗ 'body ред рдореБрдЭреЗ рдпрдХреАрди рдирд╣реАрдВ рд╣реИ рдХрд┐ \in рд╕рдВрдмрдВрдзреЛрдВ рдХреЛ рдХреИрд╕реЗ рд╕рдВрднрд╛рд▓рдирд╛ рд╣реИ
рд╕рдВрдкреВрд░реНрдг рдЦреЛрдЬ рдХреЛ рдЫреЛрдбрд╝рдХрд░ (рд╣рд╛рд▓рд╛рдВрдХрд┐ рдореИрдВ рдХреБрдЫ рд╡рд┐рд╢реЗрд╖ рдХреА рдХрд▓реНрдкрдирд╛ рдХрд░ рд╕рдХрддрд╛ рд╣реВрдВ
рдорд╛рдорд▓реЗ)ред

рдареАрдХ рд╣реИ, рд╡рд╣ рдЙрддрдирд╛ рд╣реА рджреВрд░ рд╣реИ рдЬрд┐рддрдирд╛ рдореБрдЭреЗ рдорд┐рд▓рд╛ рд╣реИред =)

рдкреАрдЖрд░ #35091 рдкрд░, @arielb1 рдиреЗ рд▓рд┐рдЦрд╛:

рдореБрдЭреЗ "рд╕рднреА рдЬреАрд╡рдирдХрд╛рд▓реЛрдВ рдХреЛ рдирд┐рд╣рд┐рдд рд╡рд┐рд╢реЗрд╖рддрд╛ рдореЗрдВ рдХреИрдкреНрдЪрд░ рдХрд░рдирд╛" рджреГрд╖реНрдЯрд┐рдХреЛрдг рдкрд╕рдВрдж рдирд╣реАрдВ рд╣реИ рдФрд░ рдореИрдВ рдЖрдЬреАрд╡рди elision рдХреА рддрд░рд╣ рдХреБрдЫ рдФрд░ рдкрд╕рдВрдж рдХрд░реВрдВрдЧрд╛ред

рдореИрдВрдиреЗ рд╕реЛрдЪрд╛ рдХрд┐ рдпрд╣рд╛рдБ рдЪрд░реНрдЪрд╛ рдХрд░рдирд╛ рдЕрдзрд┐рдХ рдЙрдЪрд┐рдд рд╣реЛрдЧрд╛ред @ arielb1 , рдХреНрдпрд╛ рдЖрдк рдЕрдкрдиреЗ рдорди рдореЗрдВ рдЬреЛ рдХреБрдЫ рднреА рд╕реЛрдЪ рд░рд╣реЗ рд╣реИрдВ рдЙрд╕ рдкрд░ рдФрд░ рд╡рд┐рд╕реНрддрд╛рд░ рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ? рдЙрдкрдорд╛ рдореИрдВ рдКрдкрд░ рдмрдирд╛ рдХреЗ рд╕рдВрджрд░реНрдн рдореЗрдВ, рдореБрдЭреЗ рд▓рдЧрддрд╛ рд╣реИ рдХрд┐ рдЖрдк рдореВрд▓ рд░реВрдк рд╕реЗ, рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ "рдкреНрд░реВрдирд┐рдВрдЧ" рдЬреАрд╡рди рдХрд╛рд▓ рдХреЗ рдЙрд╕ рд╕рдореВрд╣ рдХреЗ newtype рдкрд░ рдпрд╛ рдореЗрдВ рдкреНрд░рдХреНрд╖реЗрдкрдг рдорд╛рдирдХреЛрдВ (рдпрд╛рдиреА рдХреЗ рд░реВрдк рдореЗрдВ рдпрд╛ рддреЛ рдкреНрд░рдХрдЯ рд╣реЛрддрд╛ рдмрд╛рдд рдХрд░ рд░рд╣реЗ рд╣реИрдВ <() as FooReturn<'a>>::Type рдХреЗ рдмрдЬрд╛рдп <() as FooReturn<'a,'b>>::Type рдпрд╛ рдХреБрдЫ рдФрд░?

рдореБрдЭреЗ рдирд╣реАрдВ рд▓рдЧрддрд╛ рдХрд┐ рд▓рд╛рдЗрдлрдЯрд╛рдЗрдо рдПрд▓рд┐рдЬрди рдирд┐рдпрдо рдЗрд╕ рд╕рдВрдмрдВрдз рдореЗрдВ рдПрдХ рдЕрдЪреНрдЫрд╛ рдорд╛рд░реНрдЧрджрд░реНрд╢рдХ рд╣реЛрдЧрд╛: рдпрджрд┐ рд╣рдордиреЗ рдХреЗрд╡рд▓ &self рдХреЗ рдЬреАрд╡рдирдХрд╛рд▓ рдХреЛ рдХреЗрд╡рд▓ рд╢рд╛рдорд┐рд▓ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдЪреБрдирд╛ рд╣реИ, рддреЛ рд╣рдо рдЬрд░реВрд░реА рдирд╣реАрдВ рдХрд┐ рдЗрд╕рдореЗрдВ рд╢рд╛рдорд┐рд▓ рд╣реЛ рд╕рдХреЗрдВ Self рд╕рдВрд░рдЪрдирд╛ рд╕реЗ рдкреИрд░рд╛рдореАрдЯрд░ рдЯрд╛рдЗрдк рдХрд░реЗрдВ, рди рд╣реА рд╡рд┐рдзрд┐ рд╕реЗ рдкреИрд░рд╛рдореАрдЯрд░ рдЯрд╛рдЗрдк рдХрд░реЗрдВ, рдХреНрдпреЛрдВрдХрд┐ рдЙрдирдХреЗ рдкрд╛рд╕ WF рд╕реНрдерд┐рддрд┐рдпрд╛рдВ рд╣реЛ рд╕рдХрддреА рд╣реИрдВ рдЬрд┐рдирдХреЗ рд▓рд┐рдП рд╣рдореЗрдВ рдХреБрдЫ рдЕрдиреНрдп рдЬреАрд╡рдирдХрд╛рд▓реЛрдВ рдХрд╛ рдирд╛рдо рджреЗрдирд╛ рд╣реЛрдЧрд╛ред

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

рдореИрдВрдиреЗ рдХрд╣реАрдВ рднреА рдЪрд░реНрдЪрд╛ рдХреА рдЧрдИ рдЧреЛрдкрдиреАрдпрддрд╛ рдХреЗ рд╕рд╛рде impl Trait рдмрд╛рддрдЪреАрдд рдирд╣реАрдВ рджреЗрдЦреАред
рдЕрдм fn f() -> impl Trait рдПрдХ рдирд┐рдЬреА рдкреНрд░рдХрд╛рд░ S: Trait рд╕рдорд╛рди рд░реВрдк рд╕реЗ рд╡рд┐рд╢реЗрд╖рддрд╛ рд╡рд╕реНрддреБрдУрдВ fn f() -> Box<Trait> рд▓реМрдЯрд╛ рд╕рдХрддрд╛ рд╣реИред рдпрд╛рдиреА рдирд┐рдЬреА рдкреНрд░рдХрд╛рд░ рдХреА рд╡рд╕реНрддреБрдПрдВ рдЧреБрдордирд╛рдо рд░реВрдк рдореЗрдВ рдЕрдкрдиреЗ рдореЙрдбреНрдпреВрд▓ рдХреЗ рдмрд╛рд╣рд░ рд╕реНрд╡рддрдВрддреНрд░ рд░реВрдк рд╕реЗ рдЪрд▓ рд╕рдХрддреА рд╣реИрдВред
рдпрд╣ рдЙрдЪрд┐рдд рдФрд░ рд╡рд╛рдВрдЫрдиреАрдп рд▓рдЧрддрд╛ рд╣реИ - рдкреНрд░рдХрд╛рд░ рд╣реА рдПрдХ рдХрд╛рд░реНрдпрд╛рдиреНрд╡рдпрди рд╡рд┐рд╡рд░рдг рд╣реИ, рдХреЗрд╡рд▓ рдЗрд╕рдХрд╛ рдЗрдВрдЯрд░рдлрд╝реЗрд╕, рд╕рд╛рд░реНрд╡рдЬрдирд┐рдХ рд╡рд┐рд╢реЗрд╖рддрд╛ рдХреЗ рдорд╛рдзреНрдпрдо рд╕реЗ рдЙрдкрд▓рдмреНрдз Trait рд╕рд╛рд░реНрд╡рдЬрдирд┐рдХ рд╣реИред
рд╣рд╛рд▓рд╛рдВрдХрд┐ рд╡рд┐рд╢реЗрд╖рддрд╛ рд╡рд╕реНрддреБрдУрдВ рдФрд░ impl Trait рдмреАрдЪ рдПрдХ рдЕрдВрддрд░ рд╣реИред рдЕрдХреЗрд▓реЗ рд╡рд┐рд╢реЗрд╖рддрд╛ рд╡рд╕реНрддреБрдУрдВ рдХреЗ рд╕рд╛рде рдирд┐рдЬреА рдкреНрд░рдХрд╛рд░ рдХреА рд╕рднреА рд╡рд┐рд╢реЗрд╖рддрд╛ рд╡рд┐рдзрд┐рдпреЛрдВ рдХреЛ рдЖрдВрддрд░рд┐рдХ рд╕рдВрдмрдВрдз рдорд┐рд▓ рд╕рдХрддрд╛ рд╣реИ, рд╡реЗ рдЕрднреА рднреА рдлрд╝рдВрдХреНрд╢рди рдкреЙрдЗрдВрдЯрд░реНрд╕ рдХреЗ рдорд╛рдзреНрдпрдо рд╕реЗ рдХреЙрд▓ рдХрд░рдиреЗ рдпреЛрдЧреНрдп рд╣реЛрдВрдЧреЗред impl Trait рдХреЗ рд╕рд╛рде рдирд┐рдЬреА рдкреНрд░рдХрд╛рд░ рдХреА рд╡рд┐рд╢реЗрд╖рддрд╛ рд╡рд┐рдзрд┐рдпрд╛рдВ рдЕрдиреНрдп рдЕрдиреБрд╡рд╛рдж рдЗрдХрд╛рдЗрдпреЛрдВ рд╕реЗ рд╕реАрдзреЗ рдХреЙрд▓ рдХрд░рдиреЗ рдпреЛрдЧреНрдп рд╣реИрдВред рдкреНрд░рддреАрдХреЛрдВ рдХреЗ "рдЖрдВрддрд░рд┐рдХрдХрд░рдг" рдХрд░рдиреЗ рд╡рд╛рд▓реЗ рдПрд▓реНрдЧреЛрд░рд┐рджрдо рдХреЛ рдХреЗрд╡рд▓ impl Trait рд╕рд╛рде рдЕрдЬреНрдЮрд╛рдд рдирд╣реАрдВ рдХрд┐рдП рдЧрдП рдкреНрд░рдХрд╛рд░реЛрдВ рдХреЗ рд▓рд┐рдП, рдпрд╛ рдмрд╣реБрдд рдирд┐рд░рд╛рд╢рд╛рд╡рд╛рджреА рд╣реЛрдиреЗ рдХреЗ рддрд░реАрдХреЛрдВ рдХреЛ рдЖрдВрддрд░рд┐рдХ рдмрдирд╛рдиреЗ рдХреЗ рд▓рд┐рдП рдХрдард┐рди рдкреНрд░рдпрд╛рд╕ рдХрд░рдирд╛ рд╣реЛрдЧрд╛ред

@nikomatsakis

foo рд▓рд┐рдЦрдиреЗ рдХрд╛ "рд╕реНрдкрд╖реНрдЯ" рддрд░реАрдХрд╛ рд╣реЛрдЧрд╛

fn foo<'a: 'c,'b: 'c,'c>(x: &'a [u32], y: &'b [u32]) -> impl Iterator<Item=u32> + 'c {
    if condition { x.iter().cloned() } else { y.iter().cloned() }
}

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

рдореИрдВ рдЦреЛрдЬрдХрд░реНрддрд╛ -рд╕рдВрд╡реЗрджреА рдЖрдЬреАрд╡рди @eddyb рдиреЗ рдХреЗрд╡рд▓ impl Trait рдХреЗ рд╡рд┐рд╢рд┐рд╖реНрдЯ рдорд╛рдорд▓реЗ рдореЗрдВ рдХрд┐рдпрд╛ рдерд╛ рдФрд░ рдЕрдиреНрдпрдерд╛ рдирд╣реАрдВред

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

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

fn foo<'a, 'b>(x: &'a [u32], y: &'b [u32]) -> impl Iterator<Item=u32> {
    x.iter().chain(y).cloned()
}

рдЗрд╕ рдорд╛рдорд▓реЗ рдореЗрдВ, рдЫреБрдкрд╛ рдЗрдЯрд░реЗрдЯрд░ рдкреНрд░рдХрд╛рд░ 'a рдФрд░ 'b рджреЛрдиреЛрдВ рдХреЛ рд╕рдВрджрд░реНрднрд┐рдд рдХрд░рддрд╛ рд╣реИ (рд╣рд╛рд▓рд╛рдВрдХрд┐ рдпрд╣ рдЙрди рджреЛрдиреЛрдВ рдореЗрдВ _is_ рдкреНрд░рдХрд╛рд░ рд╣реИ, рд▓реЗрдХрд┐рди рдореБрдЭреЗ рд▓рдЧрддрд╛ рд╣реИ рдХрд┐ рд╣рдо рдПрдХ рдЙрджрд╛рд╣рд░рдг рдХреЗ рд╕рд╛рде рдЖ рд╕рдХрддреЗ рд╣реИрдВ рдЬреЛ рдЕрдкрд░рд┐рд╡рд░реНрддрдиреАрдп рд╣реИ)ред

рддреЛ @aturon рдФрд░ рдореИрдВрдиреЗ рдЗрд╕ рдореБрджреНрджреЗ рдкрд░ рдХреБрдЫ рдЪрд░реНрдЪрд╛ рдХреА рдФрд░ рдореИрдВ рд╕рд╛рдЭрд╛ рдХрд░рдирд╛ рдЪрд╛рд╣рддрд╛ рдерд╛ред рдпрд╣рд╛рдБ рд╡рд╛рд╕реНрддрд╡ рдореЗрдВ рдХреБрдЫ рдСрд░реНрдереЛрдЧреЛрдирд▓ рдкреНрд░рд╢реНрди рд╣реИрдВ рдФрд░ рдореИрдВ рдЙрдиреНрд╣реЗрдВ рдЕрд▓рдЧ рдХрд░рдирд╛ рдЪрд╛рд╣рддрд╛ рд╣реВрдБред рдкрд╣рд▓рд╛ рд╕рд╡рд╛рд▓ рдпрд╣ рд╣реИ рдХрд┐ "рдЫрд┐рдкреЗ рд╣реБрдП рдкреНрд░рдХрд╛рд░ рдореЗрдВ рд╕рдВрднрд╛рд╡рд┐рдд рд░реВрдк рд╕реЗ рдХрд┐рд╕ рдкреНрд░рдХрд╛рд░/рдЖрдЬреАрд╡рди рдкреИрд░рд╛рдореАрдЯрд░ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд┐рдпрд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИ?" default type рдореЗрдВ (рдЕрд░реНрдз-) desugaring рдХреЗ рд╕рдВрджрд░реНрдн рдореЗрдВ, рдпрд╣ "рд╣рдорд╛рд░реЗ рджреНрд╡рд╛рд░рд╛ рдкреЗрд╢ рдХреА рдЬрд╛рдиреЗ рд╡рд╛рд▓реА рд╡рд┐рд╢реЗрд╖рддрд╛ рдкрд░ рдХрд┐рд╕ рдкреНрд░рдХрд╛рд░ рдХреЗ рдкреИрд░рд╛рдореАрдЯрд░ рджрд┐рдЦрд╛рдИ рджреЗрддреЗ рд╣реИрдВ" рдХреЗ рд▓рд┐рдП рдиреАрдЪреЗ рдЖрддрд╛ рд╣реИред рддреЛ, рдЙрджрд╛рд╣рд░рдг рдХреЗ рд▓рд┐рдП, рдпрджрд┐ рдпрд╣ рдлрд╝рдВрдХреНрд╢рди:

fn foo<'a, 'b, T>() -> impl Trait { ... }

рдХреБрдЫ рдЗрд╕ рддрд░рд╣ рд╕реЗ desugared рд╣реЛ рдЬрд╛рдПрдЧрд╛:

fn foo<'a, 'b, T>() -> <() as Foo<...>>::Type { ... }
trait Foo<...> {
  type Type: Trait;
}
impl<...> Foo<...> for () {
  default type Type = /* inferred */;
}

рддреЛ рдпрд╣ рдкреНрд░рд╢реНрди рдиреАрдЪреЗ рдЖрддрд╛ рд╣реИ " Foo рдФрд░ рдЙрд╕рдХреЗ рдирд┐рд╣рд┐рддрд╛рд░реНрде рдкрд░ рдХрд┐рд╕ рдкреНрд░рдХрд╛рд░ рдХреЗ рдкреИрд░рд╛рдореАрдЯрд░ рджрд┐рдЦрд╛рдИ рджреЗрддреЗ рд╣реИрдВ"? рдореВрд▓ рд░реВрдк рд╕реЗ, рдпрд╣рд╛рдВ ... ред рд╕реНрдкрд╖реНрдЯ рд░реВрдк рд╕реЗ рдЗрд╕рдореЗрдВ Trait рджреНрд╡рд╛рд░рд╛ рдЙрдкрдпреЛрдЧ рдХрд┐рдП рдЬрд╛рдиреЗ рд╡рд╛рд▓реЗ рдкреНрд░рдХрд╛рд░ рдкреИрд░рд╛рдореАрдЯрд░ рдХрд╛ рд╕реЗрдЯ рд╢рд╛рдорд┐рд▓ рд╣реИ, рд▓реЗрдХрд┐рди рдЕрддрд┐рд░рд┐рдХреНрдд рдкреНрд░рдХрд╛рд░ рдкреИрд░рд╛рдореАрдЯрд░ рдХреНрдпрд╛ рд╣реИрдВ? (рдЬреИрд╕рд╛ рдХрд┐ рдореИрдВрдиреЗ рдкрд╣рд▓реЗ рдЙрд▓реНрд▓реЗрдЦ рдХрд┐рдпрд╛ рд╣реИ, рдСрдЯреЛ рд▓рдХреНрд╖рдгреЛрдВ рдХреЗ рд░рд┐рд╕рд╛рд╡ рдХреЛ рдЫреЛрдбрд╝рдХрд░ рдпрд╣ desugaring 100% рд╡рдлрд╛рджрд╛рд░ рд╣реИ, рдФрд░ рдореИрдВ рддрд░реНрдХ рджреВрдВрдЧрд╛ рдХрд┐ рд╣рдореЗрдВ рд╡рд┐рд╢реЗрд╖ рдЗрдореНрдкреНрд▓рд╛рдВрдЯреНрд╕ рдХреЗ рд▓рд┐рдП рдСрдЯреЛ рд▓рдХреНрд╖рдг рднреА рд▓реАрдХ рдХрд░рдирд╛ рдЪрд╛рд╣рд┐рдПред)

рд╣рдо рдЬрд┐рд╕ рдбрд┐рдлрд╝реЙрд▓реНрдЯ рдЙрддреНрддрд░ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░ рд░рд╣реЗ рд╣реИрдВ рд╡рд╣ "рд╕рднреА" рд╣реИ, рдЗрд╕рд▓рд┐рдП рдпрд╣рд╛рдВ ... 'a, 'b, T (рдХрд┐рд╕реА рднреА рдЕрдЬреНрдЮрд╛рдд рдкреИрд░рд╛рдореАрдЯрд░ рдХреЗ рд╕рд╛рде рдЬреЛ рдкреНрд░рдХрдЯ рд╣реЛ рд╕рдХрддрд╛ рд╣реИ) рд╣реЛрдЧрд╛ред рдпрд╣ _may_ рдПрдХ рдЙрдЪрд┐рдд рдбрд┐рдлрд╝реЙрд▓реНрдЯ рд╣реЛ, рд▓реЗрдХрд┐рди рдпрд╣ _necessily_ рд╕рд░реНрд╡реЛрддреНрддрдо рдбрд┐рдлрд╝реЙрд▓реНрдЯ рдирд╣реАрдВ рд╣реИред (рдЬреИрд╕рд╛ рдХрд┐ @ arielb1 рдиреЗ рдмрддрд╛рдпрд╛ред)

рдпрд╣ рдЬреАрд╡рди рдХреЗ рд╕рдВрдмрдВрдз рдкрд░ рдкреНрд░рднрд╛рд╡ рдбрд╛рд▓рддрд╛ рд╣реИ, рдХреНрдпреЛрдВрдХрд┐, рдпрд╣ рдирд┐рд░реНрдзрд╛рд░рд┐рдд рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдХрд┐ <() as Foo<...>>::Type ( impl Trait рдХреБрдЫ рд╡рд┐рд╢реЗрд╖, рдЕрдкрд╛рд░рджрд░реНрд╢реА рддрд╛рддреНрдХрд╛рд▓рд┐рдХрддрд╛ рдХрд╛ рдЬрд┐рдХреНрд░ рдХрд░рддреЗ рд╣реБрдП) 'x рдЬреАрд╡рд┐рдд рд╣реИ, рд╣рдореЗрдВ рдкреНрд░рднрд╛рд╡реА рд░реВрдк рд╕реЗ рджрд┐рдЦрд╛рдирд╛ рдЪрд╛рд╣рд┐рдП рд╡рд╣ ...: 'x (рдЕрд░реНрдерд╛рдд, рдкреНрд░рддреНрдпреЗрдХ рдЬреАрд╡рдирдХрд╛рд▓ рдФрд░ рдкреНрд░рдХрд╛рд░ рдкреИрд░рд╛рдореАрдЯрд░)ред

рдпрд╣реА рдХрд╛рд░рдг рд╣реИ рдХрд┐ рдореИрдВ рдХрд╣рддрд╛ рд╣реВрдВ рдХрд┐ рдпрд╣ рдЬреАрд╡рди рднрд░ рдХреЗ рдорд╛рдкрджрдВрдбреЛрдВ рдкрд░ рд╡рд┐рдЪрд╛рд░ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдкрд░реНрдпрд╛рдкреНрдд рдирд╣реАрдВ рд╣реИ: рдХрд▓реНрдкрдирд╛ рдХрд░реЗрдВ рдХрд┐ рд╣рдорд╛рд░реЗ рдкрд╛рд╕ foo рдЬреИрд╕реЗ foo::<'a0, 'b0, &'c0 i32> рд▓рд┐рдП рдХреБрдЫ рдХреЙрд▓ рд╣реИред рдЗрд╕рдХрд╛ рддрд╛рддреНрдкрд░реНрдп рдпрд╣ рд╣реИ рдХрд┐ рд╕рднреА рддреАрди рдЬреАрд╡рдирдХрд╛рд▓, '[abc]0 , 'x рдирд┐рдХрд▓ рдЬрд╛рдирд╛ рдЪрд╛рд╣рд┐рдП - рджреВрд╕рд░реЗ рд╢рдмреНрджреЛрдВ рдореЗрдВ, рдЬрдм рддрдХ рд╡рд╛рдкрд╕реА рдореВрд▓реНрдп рдЙрдкрдпреЛрдЧ рдореЗрдВ рд╣реИ, рдпрд╣ рдлрд╝рдВрдХреНрд╢рди рдореЗрдВ рджрд┐рдП рдЧрдП рд╕рднреА рдбреЗрдЯрд╛ рдХреЗ рдЛрдг рдХреЛ рдмрдврд╝рд╛ рджреЗрдЧрд╛ . рд▓реЗрдХрд┐рди, рдЬреИрд╕рд╛ рдХрд┐ @ arielb1 рдиреЗ рдмрддрд╛рдпрд╛, рдПрд▓рд┐рд╕рди рдмрддрд╛рддрд╛ рд╣реИ рдХрд┐ рдпрд╣ рдЖрдорддреМрд░ рдкрд░ рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╕реЗ рдЕрдзрд┐рдХ рд▓рдВрдмрд╛ рд╣реЛрдЧрд╛ред

рддреЛ рдореИрдВ рдХрд▓реНрдкрдирд╛ рдХрд░рддрд╛ рд╣реВрдВ рдХрд┐ рд╣рдореЗрдВ рдЬреЛ рдЪрд╛рд╣рд┐рдП рд╡рд╣ рд╣реИ:

  • рдПрдХ рдЙрдЪрд┐рдд рдбрд┐рдлрд╝реЙрд▓реНрдЯ рдкрд░ рд╕рдордЭреМрддрд╛ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП, рд╢рд╛рдпрдж рдПрд▓рд┐рд╢рди рд╕реЗ рдЕрдВрддрд░реНрдЬреНрдЮрд╛рди рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдирд╛;
  • рдбрд┐рдлрд╝реЙрд▓реНрдЯ рдЙрдкрдпреБрдХреНрдд рдирд╣реАрдВ рд╣реЛрдиреЗ рдкрд░ рдПрдХ рд╕реНрдкрд╖реНрдЯ рд╡рд╛рдХреНрдпрд╡рд┐рдиреНрдпрд╛рд╕ рд░рдЦрдиреЗ рдХреЗ рд▓рд┐рдПред

@aturon рдиреЗ рд╕реНрдкрд╖реНрдЯ рд╡рд╛рдХреНрдп рд░рдЪрдирд╛ рдХреЗ рд░реВрдк рдореЗрдВ impl<...> Trait рдЬреИрд╕рд╛ рдХреБрдЫ рд╕реНрдкрд┐рдЯрдмреЙрд▓ рдХрд┐рдпрд╛, рдЬреЛ рдЙрдЪрд┐рдд рд▓рдЧрддрд╛ рд╣реИред рдЗрд╕рд▓рд┐рдП, рдХреЛрдИ рд▓рд┐рдЦ рд╕рдХрддрд╛ рд╣реИ:

fn foo<'a, 'b, T>(...) -> impl<T> Trait { }

рдпрд╣ рдЗрдВрдЧрд┐рдд рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдХрд┐ рдЫреБрдкрд╛ рдкреНрд░рдХрд╛рд░ рд╡рд╛рд╕реНрддрд╡ рдореЗрдВ 'a рдпрд╛ 'b рдХреЛ рд╕рдВрджрд░реНрднрд┐рдд рдирд╣реАрдВ рдХрд░рддрд╛ рдмрд▓реНрдХрд┐ рдХреЗрд╡рд▓ T рдХреЛ рд╕рдВрджрд░реНрднрд┐рдд рдХрд░рддрд╛ рд╣реИред рдпрд╛ рдХреЛрдИ рдпрд╣ рдЗрдВрдЧрд┐рдд рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП impl<'a> Trait рд▓рд┐рдЦ рд╕рдХрддрд╛ рд╣реИ рдХрд┐ рди рддреЛ 'b рдФрд░ рди рд╣реА T рдкрд░ рдХрдмреНрдЬрд╛ рдХрд░ рд▓рд┐рдпрд╛ рдЧрдпрд╛ рд╣реИред

рдбрд┐рдлрд╝реЙрд▓реНрдЯ рдХреЗ рд▓рд┐рдП, рдРрд╕рд╛ рд▓рдЧрддрд╛ рд╣реИ рдХрд┐ рдЕрдзрд┐рдХ рдбреЗрдЯрд╛ рд╣реЛрдирд╛ рдмрд╣реБрдд рдЙрдкрдпреЛрдЧреА рд╣реЛрдЧрд╛ - рд▓реЗрдХрд┐рди рдПрд▓рд┐рдЬрди рдХреЗ рд╕рд╛рдорд╛рдиреНрдп рддрд░реНрдХ рд╕реЗ рдкрддрд╛ рдЪрд▓рддрд╛ рд╣реИ рдХрд┐ рд╣рдо рд▓рд╛рдЧреВ рд╣реЛрдиреЗ рдкрд░ self рдХреЗ рдкреНрд░рдХрд╛рд░ рдореЗрдВ рдирд╛рдорд┐рдд рд╕рднреА рдкреИрд░рд╛рдореАрдЯрд░ рдХреЛ рдХреИрдкреНрдЪрд░ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдЕрдЪреНрдЫрд╛ рдкреНрд░рджрд░реНрд╢рди рдХрд░реЗрдВрдЧреЗред рдЙрджрд╛рд╣рд░рдг рдХреЗ рд▓рд┐рдП, рдпрджрд┐ рдЖрдкрдХреЗ рдкрд╛рд╕ fn foo<'a,'b>(&'a self, v: &'b [u8]) рдФрд░ рдкреНрд░рдХрд╛рд░ Bar<'c, X> , рддреЛ self рдХрд╛ рдкреНрд░рдХрд╛рд░ &'a Bar<'c, X> рдФрд░ рдЗрд╕рд▓рд┐рдП рд╣рдо 'a рдкрд░ рдХрдмреНрдЬрд╛ рдХрд░реЗрдВрдЧреЗ 'c , рдФрд░ X рдбрд┐рдлрд╝реЙрд▓реНрдЯ рд░реВрдк рд╕реЗ, рд▓реЗрдХрд┐рди 'b ред


рдПрдХ рдФрд░ рд╕рдВрдмрдВрдзрд┐рдд рдиреЛрдЯ рдпрд╣ рд╣реИ рдХрд┐ рдЖрдЬреАрд╡рди рдмрд╛рдзреНрдп рдХрд╛ рдЕрд░реНрде рдХреНрдпрд╛ рд╣реИред рдореБрдЭреЗ рд▓рдЧрддрд╛ рд╣реИ рдХрд┐ рдзреНрд╡рдирд┐ рдЬреАрд╡рдирдХрд╛рд▓ рд╕реАрдорд╛рдУрдВ рдХрд╛ рдПрдХ рдореМрдЬреВрджрд╛ рдЕрд░реНрде рд╣реИ рдЬрд┐рд╕реЗ рдмрджрд▓рд╛ рдирд╣реАрдВ рдЬрд╛рдирд╛ рдЪрд╛рд╣рд┐рдП: рдпрджрд┐ рд╣рдо impl (Trait+'a) рд▓рд┐рдЦрддреЗ рд╣реИрдВ рддреЛ рдЗрд╕рдХрд╛ рдорддрд▓рдм рд╣реИ рдХрд┐ рдЫреБрдкрд╛ рдкреНрд░рдХрд╛рд░ T 'a ред рдЗрд╕реА рддрд░рд╣ рдХреЛрдИ рдпрд╣ рдЗрдВрдЧрд┐рдд рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП impl (Trait+'static) рд▓рд┐рдЦ рд╕рдХрддрд╛ рд╣реИ рдХрд┐ рдХреЛрдИ рдЙрдзрд╛рд░ рд╕рдВрдХреЗрдд рдореМрдЬреВрдж рдирд╣реАрдВ рд╣реИрдВ (рднрд▓реЗ рд╣реА рдХреБрдЫ рдЬреАрд╡рдирдХрд╛рд▓ рдХреИрдкреНрдЪрд░ рдХрд┐рдП рдЧрдП рд╣реЛрдВ)ред рдЫрд┐рдкреЗ рд╣реБрдП рдкреНрд░рдХрд╛рд░ рдХрд╛ рдЙрд▓реНрд▓реЗрдЦ рдХрд░рддреЗ рд╕рдордп T , рдпрд╣ $T: 'static рддрд░рд╣ рдЬреАрд╡рди рднрд░ рдмрд╛рдзреНрдп рд╣реЛрдЧрд╛, рдЬрд╣рд╛рдВ $T рд╡рд╣ рдЕрдиреБрдорд╛рди рдЪрд░ рд╣реИ рдЬрд┐рд╕реЗ рд╣рдо рдЫрд┐рдкреЗ рд╣реБрдП рдкреНрд░рдХрд╛рд░ рдХреЗ рд▓рд┐рдП рдмрдирд╛рддреЗ рд╣реИрдВред рдЗрд╕реЗ рд╕рд╛рдорд╛рдиреНрдп рддрд░реАрдХреЗ рд╕реЗ рд╕рдВрднрд╛рд▓рд╛ рдЬрд╛рдПрдЧрд╛ред рдПрдХ рдХреЙрд▓рд░ рдХреЗ рджреГрд╖реНрдЯрд┐рдХреЛрдг рд╕реЗ, рдЬрд╣рд╛рдВ рдЫрд┐рдкрд╛ рд╣реБрдЖ рдкреНрд░рдХрд╛рд░ рд╣реИ, рдареАрдХ рд╣реИ, рдЫрд┐рдкрд╛ рд╣реБрдЖ рд╣реИ, 'static рдмрд╛рдЙрдВрдб рд╣рдореЗрдВ рдпрд╣ рдирд┐рд╖реНрдХрд░реНрд╖ рдирд┐рдХрд╛рд▓рдиреЗ рдХреА рдЕрдиреБрдорддрд┐ рджреЗрдЧрд╛ рдХрд┐ impl (Trait+'static) 'static рдЬреАрд╡рд┐рдд рд╣реИ, рднрд▓реЗ рд╣реА рдЖрдЬреАрд╡рди рдкреИрд░рд╛рдореАрдЯрд░ рдХреИрдкреНрдЪрд░ рдХрд┐рдП рдЧрдП рд╣реЛрдВред

рдпрд╣рд╛рдБ рдпрд╣ рдареАрдХ рд╡реИрд╕рд╛ рд╣реА рд╡реНрдпрд╡рд╣рд╛рд░ рдХрд░рддрд╛ рд╣реИ рдЬреИрд╕рд╛ рдХрд┐ desugaring рд╡реНрдпрд╡рд╣рд╛рд░ рдХрд░реЗрдЧрд╛:

fn foo<'a, 'b, T>() -> <() as Foo<'a, 'b, 'T>>::Type { ... }
trait Foo<'a, 'b, T> {
  type Type: Trait + 'static; // <-- note the `'static` bound appears here
}
impl<'a, 'b, T> Foo<...> for () {
  default type Type = /* something that doesn't reference `'a`, `'b`, or `T` */;
}

рдпрд╣ рд╕рдм рдЕрдиреБрдорд╛рди рд╕реЗ рдСрд░реНрдереЛрдЧреЛрдирд▓ рд╣реИред рд╣рдо рдЕрднреА рднреА рдЪрд╛рд╣рддреЗ рд╣реИрдВ (рдореБрдЭреЗ рд▓рдЧрддрд╛ рд╣реИ) "рд╕реЗ рдЪреБрдиреЗрдВ" рдмрд╛рдзрд╛ рдХреА рдзрд╛рд░рдгрд╛ рдХреЛ рдЬреЛрдбрд╝рдиреЗ рдХреЗ рд▓рд┐рдП рдФрд░ рдХреБрдЫ рдЕрдиреБрдорд╛рдирд┐рдпреЛрдВ рдХреЗ рд╕рд╛рде рдЕрдиреБрдорд╛рди рдХреЛ рд╕рдВрд╢реЛрдзрд┐рдд рдХрд░реЗрдВ рдФрд░ рд╕рдВрднрд╡рддрдГ, рд╕рдВрдкреВрд░реНрдг рдЦреЛрдЬ (рдЖрд░рдПрдлрд╕реА 1214 рд╕реЗ рдЕрдиреБрднрд╡ рдмрддрд╛рддрд╛ рд╣реИ рдХрд┐ рд░реВрдврд╝рд┐рд╡рд╛рджреА рдлреЙрд▓рдмреИрдХ рдХреЗ рд╕рд╛рде рд╣реЗрд░рд┐рд╕реНрдЯрд┐рдХ рд╡рд╛рд╕реНрддрд╡ рдореЗрдВ рд╣рдореЗрдВ рдмрд╣реБрдд рджреВрд░ рд▓реЗ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИ; рдореБрдЭреЗ рдЗрд╕ рд╕рдВрдмрдВрдз рдореЗрдВ рд╕реАрдорд╛рдУрдВ рдореЗрдВ рдЪрд▓ рд░рд╣реЗ рд▓реЛрдЧреЛрдВ рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рдкрддрд╛ рдирд╣реАрдВ рд╣реИ, рд╣рд╛рд▓рд╛рдВрдХрд┐ рд╢рд╛рдпрдж рдХрд╣реАрдВ рди рдХрд╣реАрдВ рдХреЛрдИ рд╕рдорд╕реНрдпрд╛ рд╣реИ)ред рдирд┐рд╢реНрдЪрд┐рдд рд░реВрдк рд╕реЗ, 'static рдпрд╛ 'a' рдЬреИрд╕реА рдЖрдЬреАрд╡рди рд╕реАрдорд╛ рдЬреЛрдбрд╝рдиреЗ рд╕реЗ рдЕрдиреБрдорд╛рди рдкреНрд░рднрд╛рд╡рд┐рдд рд╣реЛ рд╕рдХрддрд╛ рд╣реИ, рдФрд░ рдЗрд╕ рдкреНрд░рдХрд╛рд░ рд╕рд╣рд╛рдпрдХ рд╣реЛ рд╕рдХрддрд╛ рд╣реИ, рд▓реЗрдХрд┐рди рдпрд╣ рдПрдХ рд╕рд╣реА рд╕рдорд╛рдзрд╛рди рдирд╣реАрдВ рд╣реИ: рдПрдХ рдмрд╛рдд рдХреЗ рд▓рд┐рдП, рд╡реЗ рдХреЙрд▓рд░ рдХреЛ рджрд┐рдЦрд╛рдИ рджреЗрддреЗ рд╣реИрдВ рдФрд░ API рдХрд╛ рд╣рд┐рд╕реНрд╕рд╛ рдмрди рдЬрд╛рддреЗ рд╣реИрдВ, рдЬреЛ рд╡рд╛рдВрдЫрд┐рдд рдирд╣реАрдВ рд╣реЛ рд╕рдХрддрд╛ рд╣реИред

рд╕рдВрднрд╛рд╡рд┐рдд рд╡рд┐рдХрд▓реНрдк:

рдЖрдЙрдЯрдкреБрдЯ рдкреИрд░рд╛рдореАрдЯрд░ elision рдХреЗ рд╕рд╛рде рд╕реНрдкрд╖реНрдЯ рдЬреАрд╡рдирдХрд╛рд▓ рдмрд╛рдзреНрдп

рдЖрдЬ рдХреА рд╡рд┐рд╢реЗрд╖рддрд╛ рд╡рд╕реНрддреБрдУрдВ рдХреА рддрд░рд╣, impl Trait рд╡рд╕реНрддреБрдУрдВ рдореЗрдВ рдПрдХ рдЖрдЬреАрд╡рди рдмрд╛рдзреНрдп рдкреИрд░рд╛рдореАрдЯрд░ рд╣реЛрддрд╛ рд╣реИ, рдЬрд┐рд╕рдХрд╛ рдЕрдиреБрдорд╛рди elision рдирд┐рдпрдореЛрдВ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдХреЗ рд▓рдЧрд╛рдпрд╛ рдЬрд╛рддрд╛ рд╣реИред

рдиреБрдХрд╕рд╛рди: рдЕрдирд░реНрдЧреЛрдиреЛрдорд┐рдХ
рд▓рд╛рдн: рд╕реНрдкрд╖реНрдЯ

"рд╕рднреА рд╕рд╛рдорд╛рдиреНрдп" elision рдХреЗ рд╕рд╛рде рд╕реНрдкрд╖реНрдЯ рдЬреАрд╡рдирдХрд╛рд▓ рд╕реАрдорд╛

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

рд╣рд╛рд▓рд╛рдВрдХрд┐, elision рдПрдХ рдирдпрд╛ рдкреНрд░рд╛рд░рдВрднрд┐рдХ-рдмрд╛рдзреНрдп рдкреИрд░рд╛рдореАрдЯрд░ рдмрдирд╛рддрд╛ рд╣реИ рдЬреЛ рд╕рднреА рд╕реНрдкрд╖реНрдЯ рдкреИрд░рд╛рдореАрдЯрд░ рд╕реЗ рдЕрдзрд┐рдХ рд░рд╣рддрд╛ рд╣реИ:

fn foo<T>(&T) -> impl Foo
-->
fn foo<'total, T: 'total>(&T) -> impl Foo + 'total

рдиреБрдХрд╕рд╛рди: рдПрдХ рдкреНрд░рд╛рд░рдВрднрд┐рдХ-рдмрд╛рдзреНрдп рдкреИрд░рд╛рдореАрдЯрд░ рдЬреЛрдбрд╝рддрд╛ рд╣реИ

рдЕрдзрд┐рдХред

рдореИрдВ рдЗрд╕ рдореБрджреНрджреЗ рдореЗрдВ рдирд┐рд╣рд┐рдд рд╡рд┐рд╢реЗрд╖рддрд╛ +'рдП рдФрд░ рдЙрдзрд╛рд░ рдХреЗ рд╕рд╛рде рднрд╛рдЧ рдЧрдпрд╛: https://github.com/rust-lang/rust/issues/37790

рдЕрдЧрд░ рдореИрдВ рдЗрд╕ рдмрджрд▓рд╛рд╡ рдХреЛ рд╕рд╣реА рдврдВрдЧ рд╕реЗ рд╕рдордЭ рд░рд╣рд╛ рд╣реВрдВ (рдФрд░ рдЗрд╕рдХреА рд╕рдВрднрд╛рд╡рдирд╛ рд╢рд╛рдпрдж рдХрдо рд╣реИ!), рддреЛ рдореБрдЭреЗ рд▓рдЧрддрд╛ рд╣реИ рдХрд┐ рдпрд╣ рдЦреЗрд▓ рдХрд╛ рдореИрджрд╛рди рдХреЛрдб рдХрд╛рдо рдХрд░рдирд╛ рдЪрд╛рд╣рд┐рдП:

https://play.rust-lang.org/?gist=496ec05e6fa9d3a761df09c95297aa2a&version=nightly&backtrace=0

ThingOne рдФрд░ ThingTwo Thing рд╡рд┐рд╢реЗрд╖рддрд╛ рдХреЛ рд▓рд╛рдЧреВ рдХрд░рддреЗ рд╣реИрдВред build рдХрд╣рдирд╛ рд╣реИ рдХрд┐ рдпрд╣ рдХреБрдЫ рдРрд╕рд╛ рд▓реМрдЯрд╛рдПрдЧрд╛ рдЬреЛ Thing рд▓рд╛рдЧреВ рдХрд░рддрд╛ рд╣реИ, рдЬреЛ рдпрд╣ рдХрд░рддрд╛ рд╣реИред рдлрд┐рд░ рднреА рдпрд╣ рд╕рдВрдХрд▓рд┐рдд рдирд╣реАрдВ рдХрд░рддрд╛ рд╣реИред рддреЛ рдореИрдВ рд╕реНрдкрд╖реНрдЯ рд░реВрдк рд╕реЗ рдХреБрдЫ рдЧрд▓рдд рд╕рдордЭ рд░рд╣рд╛ рд╣реВрдБред

рдЙрд╕ "рдХреБрдЫ" рдореЗрдВ рдПрдХ рдкреНрд░рдХрд╛рд░ рд╣реЛрдирд╛ рдЪрд╛рд╣рд┐рдП, рд▓реЗрдХрд┐рди рдЖрдкрдХреЗ рдорд╛рдорд▓реЗ рдореЗрдВ рдЖрдкрдХреЗ рдкрд╛рд╕ рджреЛ рдкрд░рд╕реНрдкрд░ рд╡рд┐рд░реЛрдзреА рдкреНрд░рдХрд╛рд░ рд╣реИрдВред @nikomatsakis рдиреЗ рдкрд╣рд▓реЗ рдЗрд╕ рдХрд╛рдо рдХреЛ рд╕рд╛рдорд╛рдиреНрдп рд░реВрдк рд╕реЗ рдмрдирд╛рдиреЗ рдХрд╛ рд╕реБрдЭрд╛рд╡ рджрд┐рдпрд╛ рд╣реИ рдЬреИрд╕реЗ ThingOne | ThingTwo рдЯрд╛рдЗрдк рдмреЗрдореЗрд▓ рджрд┐рдЦрд╛рдИ рджреЗрддреЗ рд╣реИрдВред

@eddyb рдХреНрдпрд╛ рдЖрдк ThingOne | ThingTwo рдкрд░ рд╡рд┐рд╕реНрддрд╛рд░ рд╕реЗ рдмрддрд╛ рд╕рдХрддреЗ рд╣реИрдВ? рдХреНрдпрд╛ рдЖрдкрдХреЛ Box рдпрджрд┐ рд╣рдо рдХреЗрд╡рд▓ рд░рди-рдЯрд╛рдЗрдо рдХреЗ рдкреНрд░рдХрд╛рд░ рдХреЛ рдЬрд╛рдирддреЗ рд╣реИрдВ? рдпрд╛ рдпрд╣ рдПрдХ рдкреНрд░рдХрд╛рд░ рдХрд╛ enum ?

рд╣рд╛рдБ, рдпрд╣ рдПрдХ рддрджрд░реНрде enum рдЬреИрд╕рд╛ рдкреНрд░рдХрд╛рд░ рд╣реЛ рд╕рдХрддрд╛ рд╣реИ рдЬреЛ рдкреНрд░рддреНрдпрд╛рдпреЛрдЬрд┐рдд рд╡рд┐рд╢реЗрд╖рддрд╛ рд╡рд┐рдзрд┐ рдХреЙрд▓, рдЬрд╣рд╛рдВ рд╕рдВрднрд╡ рд╣реЛ, рдЗрд╕рдХреЗ рд░реВрдкреЛрдВ рдХреЗ рд▓рд┐рдПред

рдореИрдВ рдкрд╣рд▓реЗ рднреА рдРрд╕рд╛ рдХреБрдЫ рдЪрд╛рд╣рддрд╛ рдерд╛ред рдЕрдирд╛рдо рдПрдирдо рдЖрд░рдПрдлрд╕реА: https://github.com/rust-lang/rfcs/pull/1154

рдпрд╣ рдХреБрдЫ рдРрд╕рд╛ рджреБрд░реНрд▓рдн рдорд╛рдорд▓рд╛ рд╣реИ рдЬреЛ рдЕрдиреБрдорд╛рди рд╕реЗ рдкреНрд░реЗрд░рд┐рдд рд╣реЛрдиреЗ рдкрд░ рдмреЗрд╣рддрд░ рдХрд╛рдо рдХрд░рддрд╛ рд╣реИ, рдХреНрдпреЛрдВрдХрд┐ рдпрджрд┐ рдЖрдк рдХреЗрд╡рд▓ рдЗрди рдкреНрд░рдХрд╛рд░реЛрдВ рдХреЛ рдмреЗрдореЗрд▓ рдкрд░ рдмрдирд╛рддреЗ рд╣реИрдВ, рддреЛ рд╡реЗрд░рд┐рдПрдВрдЯ рдЕрд▓рдЧ рд╣реЛрддреЗ рд╣реИрдВ (рдЬреЛ рд╕рд╛рдорд╛рдиреНрдпреАрдХреГрдд рд░реВрдк рдореЗрдВ рдПрдХ рд╕рдорд╕реНрдпрд╛ рд╣реИ)ред
рдЗрд╕рдХреЗ рдЕрд▓рд╛рд╡рд╛ рдЖрдк рдкреИрдЯрд░реНрди-рдорд┐рд▓рд╛рди рдирд╣реАрдВ рд╣реЛрдиреЗ рд╕реЗ рдХреБрдЫ рдкреНрд░рд╛рдкреНрдд рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ (рд╕реНрдкрд╖реНрдЯ рд░реВрдк рд╕реЗ рдЕрд▓рдЧ рдорд╛рдорд▓реЛрдВ рдХреЛ рдЫреЛрдбрд╝рдХрд░?)
рд▓реЗрдХрд┐рди рдЖрдИрдПрдордУ рдкреНрд░рддрд┐рдирд┐рдзрд┐рдордВрдбрд▓ рдЪреАрдиреА рд╕рднреА рдкреНрд░рд╛рд╕рдВрдЧрд┐рдХ рдорд╛рдорд▓реЛрдВ рдореЗрдВ "рдмрд╕ рдХрд╛рдо рдХрд░реЗрдЧрд╛", рднрд▓реЗ рд╣реА рдЖрдк T | T рдкреНрд░рд╛рдкреНрдд рдХрд░рдиреЗ рдХрд╛ рдкреНрд░рдмрдВрдзрди рдХрд░реЗрдВред

рдХреНрдпрд╛ рдЖрдк рдЙрди рд╡рд╛рдХреНрдпреЛрдВ рдХреЗ рджреВрд╕рд░реЗ, рдирд┐рд╣рд┐рдд рд╣рд┐рд╕реНрд╕реЛрдВ рдХреА рд╡реНрдпрд╛рдЦреНрдпрд╛ рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ? рдореИрдВ рдЗрд╕рдореЗрдВ рд╕реЗ рдЕрдзрд┐рдХрд╛рдВрд╢ рдХреЛ рдирд╣реАрдВ рд╕рдордЭрддрд╛, рдФрд░ рдореБрдЭреЗ рд╕рдВрджреЗрд╣ рд╣реИ рдХрд┐ рдореБрдЭреЗ рдХреБрдЫ рд╕рдВрджрд░реНрдн рдпрд╛рдж рдЖ рд░рд╣рд╛ рд╣реИред рдХреНрдпрд╛ рдЖрдк рд╕рдВрдШ рдХреЗ рдкреНрд░рдХрд╛рд░реЛрдВ рдХреЗ рд╕рд╛рде рд╕рдорд╕реНрдпрд╛рдУрдВ рдХрд╛ рд╕реНрдкрд╖реНрдЯ рд░реВрдк рд╕реЗ рдЬрд╡рд╛рдм рджреЗ рд░рд╣реЗ рдереЗ? рд╡рд╣ RFC рдХреЗрд╡рд▓ рдЕрдирд╛рдо рдПрдирдо рд╣реИ, рдпреВрдирд┐рдпрди рдкреНрд░рдХрд╛рд░ рдирд╣реАрдВ - (T|T) рдмрд┐рд▓реНрдХреБрд▓ рд╕рдорд╕реНрдпрд╛рдЧреНрд░рд╕реНрдд рд╣реЛрдЧрд╛ Result<T, T> ред

рдУрд╣, рдХреЛрдИ рдмрд╛рдд рдирд╣реАрдВ, рдореБрдЭреЗ рдкреНрд░рд╕реНрддрд╛рд╡ рднреНрд░рдорд┐рдд рд╣реЛ рдЧрдП (рдореЛрдмрд╛рдЗрд▓ рдкрд░ рддрдм рддрдХ рдЕрдЯрдХрд╛ рд░рд╣рд╛ рдЬрдм рддрдХ рдХрд┐ рдореИрдВ рдЕрдкрдиреЗ рдЕрд╕рдлрд▓ рдПрдЪрдбреАрдбреА рдХреЛ рд╕реБрд▓рдЭрд╛ рдирд╣реАрдВ рд▓реЗрддрд╛, рдЗрд╕рд▓рд┐рдП рдЯреНрд╡рд┐рдЯрд░ рдкрд░ рд▓рдЧрдиреЗ рдХреЗ рд▓рд┐рдП рдХреНрд╖рдорд╛ рдЪрд╛рд╣рддрд╛ рд╣реВрдВ)ред

рдореБрдЭреЗ рд▓рдЧрддрд╛ рд╣реИ (рд╕реНрдерд┐рддрд┐рдЧрдд, рдпрд╛рдиреА T|U != U|T ) рдЕрдЬреНрдЮрд╛рдд рдПрдирдо рджрд┐рд▓рдЪрд╕реНрдк рд╣реИрдВ, рдФрд░ рдореЗрд░рд╛ рдорд╛рдирдирд╛ тАЛтАЛтАЛтАЛрд╣реИ рдХрд┐ рдпрджрд┐ рд╣рдорд╛рд░реЗ рдкрд╛рд╕ рд╡рд┐рд╡рд┐рдз рдЬреЗрдирд░рд┐рдХ рдереЗ (рдЖрдк hlist рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдХреЗ рдЗрд╕реЗ рд╕рд╛рдЗрдб-рд╕реНрдЯреЗрдк рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ) рдФрд░ рдореЗрд░рд╛ рдорд╛рдирдирд╛ тАЛтАЛтАЛтАЛрд╣реИ рдХрд┐ рдЙрдиреНрд╣реЗрдВ рд▓рд╛рдЗрдмреНрд░реЗрд░реА рдореЗрдВ рдкреНрд░рдпреЛрдЧ рдХрд┐рдпрд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИред рдХреЙрдиреНрд╕реНрдЯ рдЬреЗрдирд░рд┐рдХ (рдареАрдХ рдЗрд╕реА рддрд░рд╣, рдкреАрдиреЛ рдирдВрдмрд░реЛрдВ рдХреЗ рд╕рд╛рде)ред

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

рдореБрдЭреЗ рдпрдХреАрди рдирд╣реАрдВ рд╣реИ рдХрд┐ рдпрд╣ рдкреВрдЫрдиреЗ рдХреЗ рд▓рд┐рдП рд╕рд╣реА рдЬрдЧрд╣ рд╣реИ, рд▓реЗрдХрд┐рди impl рдЬреИрд╕реЗ рдХреАрд╡рд░реНрдб рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рдХреНрдпреЛрдВ рд╣реИ? рдореБрдЭреЗ рдХреЛрдИ рдЪрд░реНрдЪрд╛ рдирд╣реАрдВ рдорд┐рд▓реА (рдореЗрд░реА рдЧрд▓рддреА рд╣реЛ рд╕рдХрддреА рд╣реИ)ред

рдпрджрд┐ рдХреЛрдИ рдлрд╝рдВрдХреНрд╢рди рдЗрдВрдкреНрд▓рд╛рдВрдЯ рдЯреНрд░реИрдЯ рд▓реМрдЯрд╛рддрд╛ рд╣реИ, рддреЛ рдЙрд╕рдХрд╛ рд╢рд░реАрд░ рдХрд┐рд╕реА рднреА рдкреНрд░рдХрд╛рд░ рдХреЗ рдорд╛рди рд▓реМрдЯрд╛ рд╕рдХрддрд╛ рд╣реИ рдЬреЛ рдЯреНрд░реИрдЯ рдХреЛ рд▓рд╛рдЧреВ рдХрд░рддрд╛ рд╣реИ

рддрдм рд╕реЗ

fn bar(a: &Foo) {
  ...
}

рдЗрд╕рдХрд╛ рдорддрд▓рдм рд╣реИ "рдПрдХ рдкреНрд░рдХрд╛рд░ рдХреЗ рд╕рдВрджрд░реНрдн рдХреЛ рд╕реНрд╡реАрдХрд╛рд░ рдХрд░реЗрдВ рдЬреЛ Foo рд╡рд┐рд╢реЗрд╖рддрд╛ рдХреЛ рд▓рд╛рдЧреВ рдХрд░рддрд╛ рд╣реИ" рдореИрдВ рдЙрдореНрдореАрдж рдХрд░рддрд╛ рд╣реВрдВ

fn bar() -> Foo {
  ...
}

рдЗрд╕рдХрд╛ рдорддрд▓рдм рд╣реИ "рдПрдХ рдкреНрд░рдХрд╛рд░ рд▓реМрдЯрд╛рдПрдВ рдЬреЛ рд╡рд┐рд╢реЗрд╖рддрд╛ Foo " рд▓рд╛рдЧреВ рдХрд░рддрд╛ рд╣реИред рдХреНрдпрд╛ рдпрд╣ рдЕрд╕рдВрднрд╡ рд╣реИ?

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

рд╕рдВрдкрд╛рджрд┐рдд рдХрд░реЗрдВ: рдЗрд╕рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рд▓рд┐рдВрдХ рдХрд┐рдП рдЧрдП рдЖрд░рдПрдлрд╕реА рдереНрд░реЗрдб рдкрд░ рдХреБрдЫ рдЪрд░реНрдЪрд╛ рд╣реИред

рдареАрдХ рд╣реИ, рдПрдХ рдХреЗ рд▓рд┐рдП, рдЗрд╕ рдкрд░ рдзреНрдпрд╛рди рджрд┐рдП рдмрд┐рдирд╛ рдХрд┐ рдЧрддрд┐рд╢реАрд▓ рд░реВрдк рд╕реЗ рдЖрдХрд╛рд░ рдХреЗ рд░рд┐рдЯрд░реНрди рдорд╛рди рдЬреЛрдбрд╝реЗ рдЬрд╛рдПрдВрдЧреЗ, рдореИрдВ рд╡рд░реНрддрдорд╛рди рд╡рд╛рдХреНрдпрд╡рд┐рдиреНрдпрд╛рд╕ рдкрд╕рдВрдж рдХрд░рддрд╛ рд╣реВрдВред рд╡рд┐рд╢реЗрд╖рддрд╛ рд╡рд╕реНрддреБрдУрдВ рдХреЗ рд╕рд╛рде рдХреНрдпрд╛ рд╣реЛрддрд╛ рд╣реИ, рдЗрд╕рдХреЗ рд╡рд┐рдкрд░реАрдд, рдпрд╣ рдЯрд╛рдЗрдк рдЗрд░реЗрдЬрд╝рд░ рдирд╣реАрдВ рд╣реИ, рдФрд░ рдХреЛрдИ рднреА рд╕рдВрдпреЛрдЧ рдЬреИрд╕реЗ "рдкреИрд░рд╛рдореАрдЯрд░ f: &Foo рдХреБрдЫ рдРрд╕рд╛ рд▓реЗрддрд╛ рд╣реИ рдЬреЛ Foo рдХреЛ рджрд░реНрд╢рд╛рддрд╛ рд╣реИ, рдЬрдмрдХрд┐ рдпрд╣ рдХреБрдЫ рдРрд╕рд╛ рджреЗрддрд╛ рд╣реИ рдЬреЛ Foo рджрд░реНрд╢рд╛рддрд╛ рд╣реИ " рднреНрд░рд╛рдордХ рд╣реЛ рд╕рдХрддрд╛ рд╣реИред

рдореИрдВ рдЖрд░рдПрдлрд╕реА рдЪрд░реНрдЪрд╛ рд╕реЗ рдЗрдХрдЯреНрдард╛ рд╣реБрдЖ рдХрд┐ рдЕрднреА impl рдПрдХ рдкреНрд▓реЗрд╕рд╣реЛрд▓реНрдбрд░ рдХрд╛рд░реНрдпрд╛рдиреНрд╡рдпрди рд╣реИ, рдФрд░ рдХреЛрдИ impl рдмрд╣реБрдд рд╡рд╛рдВрдЫрд┐рдд рдирд╣реАрдВ рд╣реИред рдХреНрдпрд╛ _not_ рдХреЗ рд▓рд┐рдП impl рд╡рд┐рд╢реЗрд╖рддрд╛ рдЪрд╛рд╣рдиреЗ рдХрд╛ рдХреЛрдИ рдХрд╛рд░рдг рд╣реИ рдпрджрд┐ рд╡рд╛рдкрд╕реА рдореВрд▓реНрдп рдбреАрдПрд╕рдЯреА рдирд╣реАрдВ рд╣реИ?

рдореБрдЭреЗ рд▓рдЧрддрд╛ рд╣реИ рдХрд┐ "рдСрдЯреЛ рд╡рд┐рд╢реЗрд╖рддрд╛ рд░рд┐рд╕рд╛рд╡" рдХреЛ рд╕рдВрднрд╛рд▓рдиреЗ рдХреЗ рд▓рд┐рдП рд╡рд░реНрддрдорд╛рди рдирд┐рд╣рд┐рдд рддрдХрдиреАрдХ рд╕рдорд╕реНрдпрд╛рдЧреНрд░рд╕реНрдд рд╣реИред рдЗрд╕рдХреЗ рдмрдЬрд╛рдп рд╣рдореЗрдВ рдПрдХ рдбреАрдПрдЬреА рдЖрджреЗрд╢ рд▓рд╛рдЧреВ рдХрд░рдирд╛ рдЪрд╛рд╣рд┐рдП рддрд╛рдХрд┐ рдпрджрд┐ рдЖрдк рдПрдХ fn fn foo() -> impl Iterator рдкрд░рд┐рднрд╛рд╖рд┐рдд рдХрд░рддреЗ рд╣реИрдВ, рдФрд░ рдЖрдкрдХреЗ рдкрд╛рд╕ рдПрдХ рдХреЙрд▓рд░ fn bar() { ... foo() ... } , рддреЛ рд╣рдореЗрдВ bar() рд╕реЗ рдкрд╣рд▓реЗ foo() рдЯрд╛рдЗрдк-рдЪреЗрдХ рдХрд░рдирд╛ рд╣реЛрдЧрд╛ bar() (рддрд╛рдХрд┐ рд╣рдо рдЬрд╛рди рд╕рдХреЗрдВ рдХрд┐ рдЫрд┐рдкрд╛ рд╣реБрдЖ рдкреНрд░рдХрд╛рд░ рдХреНрдпрд╛ рд╣реИ)ред рдпрджрд┐ рдПрдХ рдЪрдХреНрд░ рдХрд╛ рдкрд░рд┐рдгрд╛рдо рд╣реЛрддрд╛ рд╣реИ, рддреЛ рд╣рдо рдПрдХ рддреНрд░реБрдЯрд┐ рдХреА рд░рд┐рдкреЛрд░реНрдЯ рдХрд░реЗрдВрдЧреЗред рдпрд╣ рдПрдХ рд░реВрдврд╝рд┐рд╡рд╛рджреА рд░реБрдЦ рд╣реИ - рд╣рдо рд╢рд╛рдпрдж рдмреЗрд╣рддрд░ рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ - рд▓реЗрдХрд┐рди рдореБрдЭреЗ рд▓рдЧрддрд╛ рд╣реИ рдХрд┐ рд╡рд░реНрддрдорд╛рди рддрдХрдиреАрдХ, рдЬрд╣рд╛рдВ рд╣рдо рдСрдЯреЛ-рдЯреНрд░реЗрдЯ рджрд╛рдпрд┐рддреНрд╡реЛрдВ рдХреЛ рдПрдХрддреНрд░ рдХрд░рддреЗ рд╣реИрдВ рдФрд░ рдЕрдВрдд рдореЗрдВ рдЙрдирдХреА рдЬрд╛рдВрдЪ рдХрд░рддреЗ рд╣реИрдВ, рд╕рд╛рдорд╛рдиреНрдп рд░реВрдк рд╕реЗ рдХрд╛рдо рдирд╣реАрдВ рдХрд░рддреЗ рд╣реИрдВред рдЙрджрд╛рд╣рд░рдг рдХреЗ рд▓рд┐рдП, рдпрд╣ рд╡рд┐рд╢реЗрд╖рдЬреНрдЮрддрд╛ рдХреЗ рд╕рд╛рде рдЕрдЪреНрдЫрд╛ рдХрд╛рдо рдирд╣реАрдВ рдХрд░реЗрдЧрд╛ред

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

@Nercury рдореБрдЭреЗ рд╕рдордЭ рдореЗрдВ рдирд╣реАрдВ рдЖрддрд╛ред рдХреНрдпрд╛ рдЖрдк рдкреВрдЫ рд░рд╣реЗ рд╣реИрдВ рдХрд┐ рдХреНрдпрд╛ fn foo() -> Trait рдХрд╛ рдЕрд░реНрде -> impl Trait ?

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

рдЕрдВрддрд░ рдпрд╣ рд╣реИ рдХрд┐ impl Trait рд▓реМрдЯрдиреЗ рд╡рд╛рд▓реЗ рдлрд╝рдВрдХреНрд╢рди рд╣рдореЗрд╢рд╛ рдПрдХ рд╣реА рдкреНрд░рдХрд╛рд░ рд▓реМрдЯрд╛рддреЗ рд╣реИрдВ- рдпрд╣ рдореВрд▓ рд░реВрдк рд╕реЗ рд╡рд╛рдкрд╕реА рдкреНрд░рдХрд╛рд░ рдХрд╛ рдЕрдиреБрдорд╛рди рд╣реИред IIUC, рдХреЗрд╡рд▓ Trait рд▓реМрдЯрдиреЗ рд╡рд╛рд▓реЗ рдлрд╝рдВрдХреНрд╢рди рдЧрддрд┐рд╢реАрд▓ рд░реВрдк рд╕реЗ рдЙрд╕ рд╡рд┐рд╢реЗрд╖рддрд╛ рдХреЗ рдХрд┐рд╕реА рднреА рдХрд╛рд░реНрдпрд╛рдиреНрд╡рдпрди рдХреЛ рд╡рд╛рдкрд╕ рдХрд░рдиреЗ рдореЗрдВ рд╕рдХреНрд╖рдо рд╣реЛрдВрдЧреЗ, рд▓реЗрдХрд┐рди рдХреЙрд▓ рдХрд░рдиреЗ рд╡рд╛рд▓реЗ рдХреЛ box foo() рдЬреИрд╕реА рдХрд┐рд╕реА рдЪреАрдЬрд╝ рдХреЗ рдорд╛рдзреНрдпрдо рд╕реЗ рд╡рд╛рдкрд╕реА рдореВрд▓реНрдп рдХреЗ рд▓рд┐рдП рд╕реНрдерд╛рди рдЖрд╡рдВрдЯрд┐рдд рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рддреИрдпрд╛рд░ рд░рд╣рдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реЛрдЧреАред

@Nercury рд╕рд░рд▓ рдХрд╛рд░рдг рдпрд╣ рд╣реИ рдХрд┐ -> Trait рд╕рд┐рдВрдЯреИрдХреНрд╕ рдХрд╛ рдкрд╣рд▓реЗ рд╕реЗ рд╣реА рдПрдХ рдЕрд░реНрде рд╣реИ, рдЗрд╕рд▓рд┐рдП рд╣рдореЗрдВ рдЗрд╕ рд╕реБрд╡рд┐рдзрд╛ рдХреЗ рд▓рд┐рдП рдХреБрдЫ рдФрд░ рдЙрдкрдпреЛрдЧ рдХрд░рдирд╛ рд╣реЛрдЧрд╛ред

рдореИрдВрдиреЗ рд╡рд╛рд╕реНрддрд╡ рдореЗрдВ рджреЗрдЦрд╛ рд╣реИ рдХрд┐ рд▓реЛрдЧ рдбрд┐рдлрд╝реЙрд▓реНрдЯ рд░реВрдк рд╕реЗ рджреЛрдиреЛрдВ рдкреНрд░рдХрд╛рд░ рдХреЗ рд╡реНрдпрд╡рд╣рд╛рд░ рдХреА рдЕрдкреЗрдХреНрд╖рд╛ рдХрд░рддреЗ рд╣реИрдВ, рдФрд░ рдЗрд╕ рдкреНрд░рдХрд╛рд░ рдХрд╛ рднреНрд░рдо рдЕрдХреНрд╕рд░ рдкрд░реНрдпрд╛рдкреНрдд рд╣реЛрддрд╛ рд╣реИ, рдореИрдВ рдИрдорд╛рдирджрд╛рд░реА рд╕реЗ рдЪрд╛рд╣рддрд╛ рд╣реВрдВ рдХрд┐ fn foo() -> Trait рдХреЛрдИ рдорддрд▓рдм рдирд╣реАрдВ рд╣реИ (рдпрд╛ рдбрд┐рдлрд╝реЙрд▓реНрдЯ рд░реВрдк рд╕реЗ рдЪреЗрддрд╛рд╡рдиреА рд╣реЛ) рдФрд░ рд╕реНрдкрд╖реНрдЯ рдереЗ рджреЛрдиреЛрдВ рдХреЗ рд▓рд┐рдП рдХреАрд╡рд░реНрдб "рд╕рдВрдХрд▓рди рд╕рдордп рдкрд░ рдЬреНрдЮрд╛рдд рдХреБрдЫ рдкреНрд░рдХрд╛рд░ рдЬреЛ рдореБрдЭреЗ рдЪреБрдирдиреЗ рдХреЗ рд▓рд┐рдП рдорд┐рд▓рддреЗ рд╣реИрдВ рд▓реЗрдХрд┐рди рдХреЙрд▓рд░ рдирд╣реАрдВ рджреЗрдЦрддрд╛ рд╣реИ" рдорд╛рдорд▓рд╛ рдФрд░ "рд╡рд┐рд╢реЗрд╖рддрд╛ рд╡рд╕реНрддреБ рдЬреЛ рдЧрддрд┐рд╢реАрд▓ рд░реВрдк рд╕реЗ рдХрд┐рд╕реА рднреА рдкреНрд░рдХрд╛рд░ рдХреЗ рдХрд╛рд░реНрдпрд╛рдиреНрд╡рдпрди рд╡рд┐рд╢реЗрд╖рддрд╛ рдХреЛ рдкреНрд░реЗрд╖рд┐рдд рдХрд░ рд╕рдХрддреА рд╣реИ" рдорд╛рдорд▓реЗ, рдЙрджрд╛рд╣рд░рдг рдХреЗ рд▓рд┐рдП fn foo() -> impl Trait рдмрдирд╛рдо fn foo() -> dyn Trait ред рд▓реЗрдХрд┐рди рдЬрд╛рд╣рд┐рд░ рд╣реИ рдХрд┐ рд╡реЗ рдЬрд╣рд╛рдЬ рд░рд╡рд╛рдирд╛ рд╣реЛ рдЧрдП рд╣реИрдВред

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

рд╡рд╣ рдХреЗрд╡рд▓ рдПрдХ рд╡рд╛рдкрд╕реА рдкреНрд░рдХрд╛рд░ рдХреА рдЕрдиреБрдорддрд┐-рдирд┐рдпрдо рдХреЛ рдмрд╛рдпрдкрд╛рд╕ рдХрд░реЗрдЧрд╛ред

@NeoLegends рдЗрд╕реЗ рдореИрдиреНрдпреБрдЕрд▓ рд░реВрдк рд╕реЗ рдХрд░рдирд╛ рдХрд╛рдлреА рдЖрдо рд╣реИ, рдФрд░ рдЗрд╕рдХреЗ рд▓рд┐рдП рдХреБрдЫ рдЪреАрдиреА рдЕрдЪреНрдЫреА рд╣реЛ рд╕рдХрддреА рд╣реИ рдФрд░ рдЕрддреАрдд рдореЗрдВ рдкреНрд░рд╕реНрддрд╛рд╡рд┐рдд рдХреА рдЧрдИ рд╣реИ, рд▓реЗрдХрд┐рди рдпрд╣ impl Trait рдпрд╛ рдПрдХ рд╡рд┐рд╢реЗрд╖рддрд╛ рд╡рд╕реНрддреБ рдХреЛ рд╡рд╛рдкрд╕ рдХрд░рдиреЗ рд╕реЗ рдЕрд░реНрдерд╢рд╛рд╕реНрддреНрд░ рдХрд╛ рддреАрд╕рд░рд╛ рдкреВрд░реА рддрд░рд╣ рд╕реЗ рдЕрд▓рдЧ рд╕реЗрдЯ рд╣реИ, рдЗрд╕рд▓рд┐рдП рдпрд╣ рдирд╣реАрдВ рд╣реИ рдЗрд╕ рдЪрд░реНрдЪрд╛ рдХреЗ рд▓рд┐рдП рд╡рд╛рд╕реНрддрд╡ рдореЗрдВ рдкреНрд░рд╛рд╕рдВрдЧрд┐рдХред

@Ixrec рд╣рд╛рдБ, рдореБрдЭреЗ рдкрддрд╛ рд╣реИ рдХрд┐ рдпрд╣ рдореИрдиреНрдпреБрдЕрд▓ рд░реВрдк рд╕реЗ рдХрд┐рдпрд╛ рдЬрд╛ рд░рд╣рд╛ рд╣реИ, рд▓реЗрдХрд┐рди

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

рдмреЗрдирд╛рдореА, рдСрдЯреЛ-рдЬреЗрдирд░реЗрдЯреЗрдб рдПрдирдо impl Trait рдПрдХ рдЫрд┐рдкреА рд╣реБрдИ рд▓рд╛рдЧрдд рджреЗрддрд╛ рд╣реИ рдЬрд┐рд╕реЗ рдпрд╛рдж рдХрд░рдирд╛ рдЖрд╕рд╛рди рд╣реИ, рдЗрд╕рд▓рд┐рдП рдпрд╣ рд╡рд┐рдЪрд╛рд░ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдХреБрдЫ рд╣реИред

рдореБрдЭреЗ рд╕рдВрджреЗрд╣ рд╣реИ рдХрд┐ "рдСрдЯреЛ рдПрдирдо рдкрд╛рд╕-рдереНрд░реВ" рдЪреАрдЬрд╝ рдХреЗрд╡рд▓ рдСрдмреНрдЬреЗрдХреНрдЯ-рд╕реБрд░рдХреНрд╖рд┐рдд рд▓рдХреНрд╖рдгреЛрдВ рдХреЗ рд▓рд┐рдП рд╕рдордЭ рдореЗрдВ рдЖрддрд╛ рд╣реИред рдХреНрдпрд╛ impl Trait рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рднреА рдпрд╣реА рдмрд╛рдд рд╕рдЪ рд╣реИ?

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

@glaebhoerl

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

рдпрд╣ рдПрдХ рджрд┐рд▓рдЪрд╕реНрдк рдмрд┐рдВрджреБ рд╣реИ! рдореИрдВ рдЗрд╕ рдмрд╛рдд рдкрд░ рдмрд╣рд╕ рдХрд░ рд░рд╣рд╛ рд╣реВрдВ рдХрд┐ "рдбрд┐рд╕реБрдЧрд░" рдЗрдореНрдкреНрд▓рд╛рдВрдЯ рд╡рд┐рд╢реЗрд╖рддрд╛ рдХрд╛ рд╕рд╣реА рддрд░реАрдХрд╛ рдХреНрдпрд╛ рд╣реИ, рдФрд░ рд╡рд╛рд╕реНрддрд╡ рдореЗрдВ рдпрд╣ рд╕реБрдЭрд╛рд╡ рджреЗрдиреЗ рдХреЗ рдХрдЧрд╛рд░ рдкрд░ рдерд╛ рдХрд┐ рд╢рд╛рдпрдж рд╣рдо рдЗрд╕реЗ "рдирд┐рдЬреА рдХреНрд╖реЗрддреНрд░ рдХреЗ рд╕рд╛рде рд╕рдВрд░рдЪрдирд╛" рдХреЗ рд░реВрдк рдореЗрдВ "рдЕрдореВрд░реНрдд рдкреНрд░рдХрд╛рд░ рдХреЗ рдкреНрд░рдХреНрд╖реЗрдкрдг рдХреЗ рд╡рд┐рдкрд░реАрдд" рдХреЗ рд░реВрдк рдореЗрдВ рдФрд░ рдЕрдзрд┐рдХ рд╕реЛрдЪрдирд╛ рдЪрд╛рд╣рддреЗ рдереЗред " рд╡реНрдпрд╛рдЦреНрдпрд╛ред рд╣рд╛рд▓рд╛рдВрдХрд┐, рдРрд╕рд╛ рд▓рдЧрддрд╛ рд╣реИ рдХрд┐ рд╕рд╛рдорд╛рдиреНрдпреАрдХреГрдд рдиреНрдпреВрдЯрд╛рдЗрдк рд╡реНрдпреБрддреНрдкрдиреНрди рдХреА рддрд░рд╣ рдХреБрдЫ рдРрд╕рд╛ рд▓рдЧрддрд╛ рд╣реИ, рдЬреЛ рдирд┐рд╢реНрдЪрд┐рдд рд░реВрдк рд╕реЗ рдЯрд╛рдЗрдк рдкрд░рд┐рд╡рд╛рд░реЛрдВ рдХреЗ рд╕рд╛рде рд╕рдВрдпреБрдХреНрдд рд╣реЛрдиреЗ рдкрд░ рд╣рд╛рд╕реНрдХреЗрд▓ рдореЗрдВ рдкреНрд░рд╕рд┐рджреНрдз F<T> рдПрдХ рдЗрдВрдкреИрдХреНрдЯ рд╕реЗ рд╕реНрд╡рдЪрд╛рд▓рд┐рдд рд░реВрдк рд╕реЗ рдПрдХ рд╡рд┐рд╢реЗрд╖рддрд╛ рдХреЗ рдХрд╛рд░реНрдпрд╛рдиреНрд╡рдпрди рдХреЛ рдЙрддреНрдкрдиреНрди рдХрд░рдирд╛ рдЪрд╛рд╣рддреЗ рд╣реИрдВ рддреЛ рд╣рдореЗрдВ рдпрд╣рд╛рдВ рдмрд╣реБрдд рд╕рддрд░реНрдХ рд░рд╣рдирд╛ рд╣реЛрдЧрд╛ред T ред

@nikomatsakis

рд╕рдорд╕реНрдпрд╛ рд╣реИ, рдЬрдВрдЧ рдХреЗ рд╕рдВрджрд░реНрдн рдореЗрдВ

trait Foo {
    type Output;
    fn get() -> Self::Output;
}

fn foo() -> impl Foo {
    // ...
    // what is the type of return_type::get?
}

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

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

(рдореБрдЭреЗ рдпрдХреАрди рдирд╣реАрдВ рд╣реИ рдХрд┐ рдпрд╣ рдореЗрд░реЗ рдореВрд▓ рдкреНрд░рд╢реНрди рд╕реЗ рд╕рдВрдмрдВрдзрд┐рдд рд╣реИ рдпрд╛ рдирд╣реАрдВ, impl Trait , рдФрд░/рдпрд╛ рд╕реНрд╡рдЪрд╛рд▓рд┐рдд рдПрдирдо рдкрд╛рд╕рдереНрд░реВ рдХреЗ рд╕рд╛рде рдЙрдкрдпреЛрдЧ рдХрд┐рдП рдЬрд╛рдиреЗ рд╡рд╛рд▓реЗ рд▓рдХреНрд╖рдг, рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╕реЗ рдСрдмреНрдЬреЗрдХреНрдЯ-рд╕реБрд░рдХреНрд╖рд┐рдд рд╣реЛрдирд╛ рдЪрд╛рд╣рд┐рдП, рд╣рд╛рд▓рд╛рдВрдХрд┐?)

@rpjohnst рд▓рд╛рдЧрдд рдХреЛ рдЪрд┐рд╣реНрдирд┐рдд рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП

fn foo() -> enum impl Trait { ... }

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

@glaebhoerl рд╣рд╛рдБ, рдореИрдВрдиреЗ рдЗрд╕ рдореБрджреНрджреЗ рдХреЛ рдЦреЛрджрдиреЗ рдореЗрдВ рдХреБрдЫ рд╕рдордп рдмрд┐рддрд╛рдпрд╛ рдФрд░ рдХрд╛рдлреА рд╣рдж рддрдХ рдЖрд╢реНрд╡рд╕реНрдд рдорд╣рд╕реВрд╕ рдХрд┐рдпрд╛ рдХрд┐ рдХрдо рд╕реЗ рдХрдо рдпрд╣рд╛рдВ рдХреЛрдИ рд╕рдорд╕реНрдпрд╛ рдирд╣реАрдВ рд╣реЛрдЧреАред

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

trait IterInto {
    type Output;
    fn iter_into(&self) -> impl Iterator<Item=impl Into<Self::Output>>;
}

@aldanor рдпрд╣ рдкреВрд░реА рддрд░рд╣ рд╕реЗ рд╕рдордЭ рдореЗрдВ рдЖрддрд╛ рд╣реИ, рдФрд░ AFAIK рдХрд╛ рдЗрд░рд╛рджрд╛ рдЙрд╕ рдХрд╛рдо рдХреЛ рдХрд░рдирд╛ рд╣реИ, рд▓реЗрдХрд┐рди рдЗрд╕реЗ рдЕрднреА рддрдХ рд▓рд╛рдЧреВ рдирд╣реАрдВ рдХрд┐рдпрд╛ рдЧрдпрд╛ рд╣реИред

рдпрд╣ рдмрдирд╛рддрд╛ рд╣реИ рдХреА рддрд░рд╣ рд╕рдордЭ рд╣реИ, рд▓реЗрдХрд┐рди рдпрд╣ рдПрдХ рд╣реА рдЕрдВрддрд░реНрдирд┐рд╣рд┐рдд рд╡рд┐рд╢реЗрд╖рддрд╛ (рдпрд╣ рдПрдХ рдмрд╣реБрдд btw рдЪрд░реНрдЪрд╛ рдХреА рдЧрдИ) рдирд╣реАрдВ рд╣реИ:

// What that trait would desugar into:
trait IterInto {
    type Output;
    type X: Into<Self::Output>;
    type Y: Iterator<Item=Self::X>;
    fn iter_into(&self) -> Self::Y;
}

// What an implementation would desugar into:
impl InterInto for FooList {
    type Output = Foo;
    // These could potentially be left unspecified for
    // a similar effect, if we want to allow that.
    type X = impl Into<Foo>;
    type Y = impl Iterator<Item=Self::X>;
    fn iter_into(&self) -> Self::Y {...}
}

рд╡рд┐рд╢реЗрд╖ рд░реВрдк рд╕реЗ, impl Trait рдореЗрдВ impl Trait for Type рд╕рдВрдмрджреНрдз рдкреНрд░рдХрд╛рд░' RHSes рдЖрдЬ рд▓рд╛рдЧреВ рдХреА рдЧрдИ рд╕реБрд╡рд┐рдзрд╛ рдХреЗ рд╕рдорд╛рди рд╣реЛрдВрдЧреЗ, рдЬрд┐рд╕рдореЗрдВ рдЗрд╕реЗ рд╕реНрдерд┐рд░ рд░рд╕реНрдЯ рдХреЗ рд░реВрдк рдореЗрдВ рдирд╣реАрдВ рдмрджрд▓рд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИ, рдЬрдмрдХрд┐ trait рдпрд╣ рд╣реЛ рд╕рдХрддрд╛ рд╣реИред

рдореБрдЭреЗ рдкрддрд╛ рд╣реИ рдХрд┐ рдпрд╣ рд╢рд╛рдпрдж рдмрд╣реБрдд рджреЗрд░ рд╣реЛ рдЪреБрдХреА рд╣реИ, рдФрд░ рдЕрдзрд┐рдХрддрд░ рдмрд╛рдЗрдХрд╢реЗрдбрд┐рдВрдЧ рд╣реИ, рд▓реЗрдХрд┐рди рдХреНрдпрд╛ рдпрд╣ рдХрд╣реАрдВ рднреА рджрд╕реНрддрд╛рд╡реЗрдЬ рдХрд┐рдпрд╛ рдЧрдпрд╛ рд╣реИ рдХрд┐ рдХреАрд╡рд░реНрдб impl рдХреНрдпреЛрдВ рдкреЗрд╢ рдХрд┐рдпрд╛ рдЧрдпрд╛ рдерд╛? рдпрд╣ рдореБрдЭреЗ рдРрд╕рд╛ рд▓рдЧрддрд╛ рд╣реИ рдЬреИрд╕реЗ рд╣рдорд╛рд░реЗ рдкрд╛рд╕ рдкрд╣рд▓реЗ рд╕реЗ рд╣реА рдореМрдЬреВрджрд╛ рд░рд╕реНрдЯ рдХреЛрдб рдореЗрдВ рдпрд╣ рдХрд╣рдиреЗ рдХрд╛ рдПрдХ рддрд░реАрдХрд╛ рд╣реИ рдХрд┐ "рдХрдВрдкрд╛рдЗрд▓рд░ рдпрд╣ рдмрддрд╛рддрд╛ рд╣реИ рдХрд┐ рдХрд┐рд╕ рдкреНрд░рдХрд╛рд░ рдХрд╛ рдпрд╣рд╛рдБ рдЬрд╛рддрд╛ рд╣реИ", рдЕрд░реНрдерд╛рддреН _ ред рдХреНрдпрд╛ рд╣рдо рдЗрд╕реЗ рдпрд╣рд╛рдБ рд╕рд┐рдВрдЯреЗрдХреНрд╕ рджреЗрдиреЗ рдХреЗ рд▓рд┐рдП рджреЛрдмрд╛рд░рд╛ рдЗрд╕реНрддреЗрдорд╛рд▓ рдирд╣реАрдВ рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ:

fn foo() -> _ as Iterator<Item=u8> {}

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

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

рдЬреИрд╕рд╛ рдХрд┐ рдпрд╣рд╛рдВ рдмрддрд╛рдпрд╛ рдЧрдпрд╛ рд╣реИ, impl Trait рдХреЛ рдмрджрд▓рдиреЗ рдХреЗ рд▓рд┐рдП @Trait рд╕рд┐рдВрдЯреИрдХреНрд╕ рдХреЗ рдЙрдкрдпреЛрдЧ рдХрд╛ рд╕реБрдЭрд╛рд╡ рджреЗрдВред

рдЕрдиреНрдп рдкреНрд░рдХрд╛рд░ рдХреА рд╕реНрдерд┐рддрд┐рдпреЛрдВ рдФрд░ Box<@MyTrait> рдпрд╛ &@MyTrait рдЬреИрд╕реА рд╕рдВрд░рдЪрдирд╛ рдореЗрдВ рд╡рд┐рд╕реНрддрд╛рд░ рдХрд░рдирд╛ рдЖрд╕рд╛рди рд╣реИред

@Trait рд▓рд┐рдП any T where T: Trait рдФрд░ ~Trait рд▓рд┐рдП some T where T: Trait :

fn compose<T, U, V>(f: @Fn(T) -> U, g: @Fn(U) -> V) -> ~Fn(T) -> V {
    move |x| g(f(x))
}

рдореЗрдВ fn func(t: T) -> V , рдХрд┐рд╕реА рднреА рдЯреА рдпрд╛ рдХреБрдЫ рд╡реА рдХреЛ рднреЗрдж рдХрд░рдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рдирд╣реАрдВ рд╣реИ, рдЗрд╕рд▓рд┐рдП рд╡рд┐рд╢реЗрд╖рддрд╛ рдХреЗ рд░реВрдк рдореЗрдВред

fn compose<T, U, V>(f: @Fn(T) -> U, g: @Fn(U) -> V) -> @Fn(T) -> V {
    move |x| g(f(x))
}

рдЕрднреА рднреА рдХрд╛рдо рдХрд░рддрд╛ рд╣реИред

@ рдЬреЗрдПрдл-рд▓рд┐рдпреВ рдореИрдВ рд╡реНрдпрдХреНрддрд┐рдЧрдд рд░реВрдк рд╕реЗ any рдФрд░ some рдХреЛ рдПрдХ рдХреАрд╡рд░реНрдб/рд╕рд┐рдЧрд┐рд▓ рдореЗрдВ рдорд┐рд▓рд╛рдиреЗ рдХрд╛ рд╡рд┐рд░реЛрдз рдХрд░ рд░рд╣рд╛ рд╣реВрдВ рд▓реЗрдХрд┐рди рдЖрдк рддрдХрдиреАрдХреА рд░реВрдк рд╕реЗ рд╕рд╣реА рд╣реИрдВ рдХрд┐ рд╣рдорд╛рд░реЗ рдкрд╛рд╕ рдПрдХ рд╕рд┐рдВрдЧрд▓ рд╕рд┐рдЧрд┐рд▓ рд╣реЛ рд╕рдХрддрд╛ рд╣реИ рдФрд░ рдЗрд╕реЗ рдореВрд▓ impl Trait рддрд░рд╣ рдЗрд╕реНрддреЗрдорд╛рд▓ рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ

@ рдЬреЗрдПрдл-рд▓рд┐рдпреВ @eddyb рднрд╛рд╖рд╛ рд╕реЗ рд╕рд┐рдЧрд┐рд▓ рд╣рдЯрд╛ рджрд┐рдП рдЬрд╛рдиреЗ рдХрд╛ рдПрдХ рдХрд╛рд░рдг рдерд╛ред рд╡рд╣ рдХрд╛рд░рдг рдЗрд╕ рдорд╛рдорд▓реЗ рдкрд░ рд▓рд╛рдЧреВ рдХреНрдпреЛрдВ рдирд╣реАрдВ рд╣реЛрдЧрд╛?

@ рдХрд╛ рдЙрдкрдпреЛрдЧ рдкреИрдЯрд░реНрди рдорд┐рд▓рд╛рди рдореЗрдВ рднреА рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИ, рднрд╛рд╖рд╛ рд╕реЗ рд╣рдЯрд╛рдпрд╛ рдирд╣реАрдВ рдЬрд╛рддрд╛ рд╣реИред

рдореЗрд░реЗ рдорди рдореЗрдВ рдпрд╣ рдмрд╛рдд рдереА рдХрд┐ AFAIK рд╕рд┐рдЧрд┐рд▓ рдХрд╛ рдЕрдзрд┐рдХ рдЙрдкрдпреЛрдЧ рдХрд┐рдпрд╛ рдЧрдпрд╛ рдерд╛ред

рд╕рд┐рдВрдЯреИрдХреНрд╕ рдмрд╛рдЗрдХрд╢реЗрдбрд┐рдВрдЧ: рдореИрдВ impl Trait рдиреЛрдЯреЗрд╢рди рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рдЧрд╣рд░рд╛рдИ рд╕реЗ рдирд╛рдЦреБрд╢ рд╣реВрдВ, рдХреНрдпреЛрдВрдХрд┐ рдПрдХ рдкреНрд░рдХрд╛рд░ рдХрд╛ рдирд╛рдо рджреЗрдиреЗ рдХреЗ рд▓рд┐рдП рдПрдХ рдХреАрд╡рд░реНрдб (рдПрдХ рд╕рдВрдкрд╛рджрдХ рдореЗрдВ рдмреЛрд▓реНрдб рдлрд╝реЙрдиреНрдЯ) рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдирд╛ рдмрд╣реБрдд рдЬрд╝реЛрд░рджрд╛рд░ рд╣реИред C рдХрд╛ struct рдФрд░ рд╕реНрдЯреНрд░рд╛рдЙрд╕реНрдЯреНрд░реМрдк рд▓рд╛рдЙрдб рд╕рд┐рдВрдЯреИрдХреНрд╕ рдЕрд╡рд▓реЛрдХрди (рд╕реНрд▓рд╛рдЗрдб 14) рдпрд╛рдж рд░рдЦреЗрдВ?

https://internals.rust-lang.org/t/ideas-for-making-rust-easier-for-beginners/4761 рдореЗрдВ , @konstin рдиреЗ <Trait> рд╕рд┐рдВрдЯреИрдХреНрд╕ рдХрд╛ рд╕реБрдЭрд╛рд╡ рджрд┐рдпрд╛ред рдпрд╣ рд╡рд╛рд╕реНрддрд╡ рдореЗрдВ рдЕрдЪреНрдЫрд╛ рд▓рдЧ рд░рд╣рд╛ рд╣реИ, рдЦрд╛рд╕рдХрд░ рдЗрдирдкреБрдЯ рд╕реНрдерд┐рддрд┐рдпреЛрдВ рдореЗрдВ:

fn take_iterator(iterator: <Iterator<Item=i32>>)

рдореИрдВ рджреЗрдЦ рд░рд╣рд╛ рд╣реВрдБ рдХрд┐ рдпрд╣ UFCS рдХреЗ рд╕рд╛рде рдХреБрдЫ рд╣рдж рддрдХ рд╕рдВрдШрд░реНрд╖ рдХрд░реЗрдЧрд╛, рд▓реЗрдХрд┐рди рд╢рд╛рдпрдж рдЗрд╕ рдкрд░ рдХрд╛рдо рдХрд┐рдпрд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИ?

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

fn returns_iter() -> <Iterator<Item=i32>> {...}
fn returns_closure() -> <FnOnce() -> bool> {...}

<Trait> рд╕рд┐рдВрдЯреИрдХреНрд╕ рдЬреЗрдиреЗрд░рд┐рдХ рдХреЗ рд╕рд╛рде рд╕рдВрдШрд░реНрд╖ рдХрд░рддрд╛ рд╣реИ, рдЗрд╕ рдкрд░ рд╡рд┐рдЪрд╛рд░ рдХрд░реЗрдВ:

Vec<<FnOnce() -> bool>> рдмрдирд╛рдо Vec<@FnOnce() -> bool>

рдпрджрд┐ Vec<FnOnce() -> bool> рдХреА рдЕрдиреБрдорддрд┐ рд╣реИ, рддреЛ <Trait> рдЕрдЪреНрдЫрд╛ рд╡рд┐рдЪрд╛рд░ рд╣реИ, рдпрд╣ рд╕рд╛рдорд╛рдиреНрдп рдкреНрд░рдХрд╛рд░ рдкреИрд░рд╛рдореАрдЯрд░ рдХреЗ рд╕рдордХрдХреНрд╖рддрд╛ рдХреЛ рджрд░реНрд╢рд╛рддрд╛ рд╣реИред рд▓реЗрдХрд┐рди рдЪреВрдВрдХрд┐ Box<Trait> Box<@Trait> , <Trait> рд╕рд┐рдВрдЯреИрдХреНрд╕ рдХреЛ рдЫреЛрдбрд╝рдирд╛ рд╣реЛрдЧрд╛ред

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

рдореИрдВ рд╕рд┐рд░реНрдл рдпрд╣ рдорд╣рд╕реВрд╕ рдХрд░ рд░рд╣рд╛ рд╣реВрдВ рдХрд┐ рдореИрдВрдиреЗ рдЗрд╕ рдЖрд░рдПрдлрд╕реА рдХреЛ рдЖрдВрддрд░рд┐рдХ рдзрд╛рдЧреЗ рдореЗрдВ рдПрдХ рд╕реБрдкрд░рд╕реЗрдЯ рдХрд╛ рдкреНрд░рд╕реНрддрд╛рд╡ рджрд┐рдпрд╛ рдерд╛ (рдореБрдЭреЗ рдпрд╣рд╛рдВ рдЗрдВрдЧрд┐рдд рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП @matklad рдХреЗ рд▓рд┐рдП рдзрдиреНрдпрд╡рд╛рдж):

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

fn transform(iter: <Iterator>) -> <Iterator> {
    // ...
}

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

рдореИрдВ рдЗрдВрдкреИрдХреНрдЯ рдХреАрд╡рд░реНрдб рд╕рд┐рдВрдЯреИрдХреНрд╕ рдкрд╕рдВрдж рдХрд░рддрд╛ рд╣реВрдВ рдХреНрдпреЛрдВрдХрд┐ рдЬрдм рдЖрдк рддреЗрдЬреА рд╕реЗ рджрд╕реНрддрд╛рд╡реЗрдЬрд╝реАрдХрд░рдг рдкрдврд╝рддреЗ рд╣реИрдВ рддреЛ рдпрд╣ рдкреНрд░реЛрдЯреЛрдЯрд╛рдЗрдк рдХреЛ рдЧрд▓рдд рддрд░реАрдХреЗ рд╕реЗ рдкрдврд╝рдиреЗ рдХреА рдЕрдиреБрдорддрд┐ рджреЗрддрд╛ рд╣реИред

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

рд╕реНрдЯреНрд░реЙрд╕реНрдЯреНрд░реБрдк рдХрд╛ рдпрд╣ рдкреЗрдкрд░ рд╕реЗрдХреНрд╢рди 7 рдореЗрдВ C++ рдХреЙрдиреНрд╕реЗрдкреНрдЯреНрд╕ рдХреЗ рд▓рд┐рдП рд╕рдорд╛рди рд╕рд┐рдВрдЯреИрдХреНрдЯрд┐рдХ рд╡рд┐рдХрд▓реНрдкреЛрдВ рдкрд░ рдЪрд░реНрдЪрд╛ рдХрд░рддрд╛ рд╣реИ: http://www.stroustrup.com/good_concepts.pdf

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

fn transform(iter: <Iterator>) -> <Iterator>

рдпрд╛ рддреЛ рдЗрд╕рдХреЗ рдмрд░рд╛рдмрд░ рд╣реЛрдирд╛ рдЪрд╛рд╣рд┐рдП

fn transform<T: Iterator, U: Iterator>(iter: T) -> U

рдпрд╛ рдпрд╣ рдЗрд╕рдХреЗ рдмрд░рд╛рдмрд░ рд╣реЛрдирд╛ рдЪрд╛рд╣рд┐рдП

fn transform(iter: impl Iterator) -> impl Iterator

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

рд╣реЛ рд╕рдХрддрд╛ рд╣реИ рдХрд┐ рд╡рд╛рдХреНрдп-рд╡рд┐рдиреНрдпрд╛рд╕ рд╕рдорд╛рди рд╣реЛрдирд╛ рдЪрд╛рд╣рд┐рдП, рд▓реЗрдХрд┐рди рдпрд╣ рд╕рдорд╛рди рдирд╣реАрдВ рд╣реЛрдирд╛ рдЪрд╛рд╣рд┐рдПред

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

  • рдареЛрд╕ рдбреЗрдЯрд╛ рдкреНрд░рдХрд╛рд░реЛрдВ, рд╕реНрдерд┐рд░ рдкреНрд░реЗрд╖рдг рдХреЗ рд▓рд┐рдП Type , &Type , Box<Type>
  • @Trait , &@Trait , Box<@Trait> рдФрд░ рд╕рд╛рд░ рдбреЗрдЯрд╛ рдкреНрд░рдХрд╛рд░, рд╕реНрдерд┐рд░ рдкреНрд░реЗрд╖рдг рдХреЗ рд▓рд┐рдП рд╕рд╛рдорд╛рдиреНрдп рдкреНрд░рдХрд╛рд░ рдкреИрд░рд╛рдореАрдЯрд░ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░реЗрдВ
  • рдЕрдореВрд░реНрдд рдбреЗрдЯрд╛ рдкреНрд░рдХрд╛рд░, рдЧрддрд┐рд╢реАрд▓ рдкреНрд░реЗрд╖рдг рдХреЗ рд▓рд┐рдП &Trait , Box<Trait>

fn func(x: @Trait) fn func<T: Trait>(x: T) рдмрд░рд╛рдмрд░ рд╣реИред
fn func<T1: Trait, T2: Trait>(x: T1, y: T2) рдХреЛ рдХреЗрд╡рд▓ fn func(x: <strong i="22">@Trait</strong>, y: @Trait) рд░реВрдк рдореЗрдВ рд▓рд┐рдЦрд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИред
T рдкреИрд░рд╛рдореАрдЯрд░ рдХреЛ рдЕрднреА рддрдХ рдХреА рдЬрд░реВрд░рдд рд╣реИ fn func<T: Trait>(x: T, y: T) ред

struct Foo { field: <strong i="28">@Trait</strong> } struct Foo<T: Trait> { field: T } рдмрд░рд╛рдмрд░ рд╣реИред

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

рдЖрдк рдореМрдЬреВрджрд╛ рдЬреЗрдиреЗрд░рд┐рдХ рд╕рд┐рдВрдЯреИрдХреНрд╕ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдХреЗ, рд╕реНрдерд┐рд░ рд░рд╕реНрдЯ рдореЗрдВ рдЕрднреА рдХрд┐рд╕реА рднреА рд╡рд┐рд╢реЗрд╖рддрд╛ рдХреЛ рд╡рд╛рдкрд╕ рдХрд░ рд╕рдХрддреЗ рд╣реИрдВред рдпрд╣ рдмрд╣реБрдд рдЕрдзрд┐рдХ рдЙрдкрдпреЛрдЧ рдХреА рдЬрд╛рдиреЗ рд╡рд╛рд▓реА рд╡рд┐рд╢реЗрд╖рддрд╛ рд╣реИред serde_json::de::from_slice рдПрдХ рдкреИрд░рд╛рдореАрдЯрд░ рдХреЗ рд░реВрдк рдореЗрдВ &[u8] serde_json::de::from_slice рд▓реЗрддрд╛ рд╣реИ рдФрд░ T where T: Deserialize рд▓реМрдЯрд╛рддрд╛ рд╣реИред

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

рдЕрдзрд┐рдХ рдкрд░рд┐рдЪрд┐рдд рдЙрджрд╛рд╣рд░рдг рдХреЗ рд▓рд┐рдП, Iterator::collect рдХреЛрдИ рднреА T where T: FromIterator<Self::Item> рд▓реМрдЯрд╛ рд╕рдХрддрд╛ рд╣реИ, рдЬрд┐рд╕рдХрд╛ рдЕрд░реНрде рд╣реИ рдХрд┐ рдореЗрд░рд╛ рдкрд╕рдВрджреАрджрд╛ рдиреЛрдЯреЗрд╢рди: fn collect(self) -> any FromIterator<Self::Item> ред

рд╕рд┐рдВрдЯреИрдХреНрд╕ рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рдХреИрд╕реЗ
fn foo () -> _ : Trait { ... }
рд╡рд╛рдкрд╕реА рдореВрд▓реНрдпреЛрдВ рдХреЗ рд▓рд┐рдП рдФрд░
fn foo (m: _1, n: _2) -> _ : Trait where _1: Trait1, _2: Trait2 { ... }
рдорд╛рдкрджрдВрдбреЛрдВ рдХреЗ рд▓рд┐рдП?

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

рд╣рд╛рдБ, рдореМрдЬреВрджрд╛ рдЦреЛрдЬрд╢рдмреНрджреЛрдВ рдХреЗ рд╕рд╛рде рд░рд╣рдирд╛ рдореЗрд░реЗ рд▓рд┐рдП рдЖрджрд░реНрд╢ рд▓рдЧрддрд╛ рд╣реИ; рдореИрдВ рдЕрд╕реНрддрд┐рддреНрд╡ рдХреЗ рд▓рд┐рдП impl рдФрд░ рдпреВрдирд┐рд╡рд░реНрд╕рд▓ рдХреЗ рд▓рд┐рдП for рджреЗрдЦрдирд╛ рдЪрд╛рд╣рддрд╛ рд╣реВрдВред

рдореИрдВ рд╡реНрдпрдХреНрддрд┐рдЧрдд рд░реВрдк рд╕реЗ any рдФрд░ some рдХреЛ рдПрдХ рдХреАрд╡рд░реНрдб/рд╕рд┐рдЧрд┐рд▓ рдореЗрдВ рдорд┐рд▓рд╛рдиреЗ рдХрд╛ рд╡рд┐рд░реЛрдз рдХрд░рддрд╛ рд╣реВрдВ

@eddyb рдореИрдВ рдЗрд╕реЗ рдПрдХ рдорд╛рдиреВрдВрдЧрд╛ ред рдпрд╣ рдирд┐рдпрдо рд╕реЗ рд╕реНрд╡рд╛рднрд╛рд╡рд┐рдХ рд░реВрдк рд╕реЗ рдЕрдиреБрд╕рд░рдг рдХрд░рддрд╛ рд╣реИ:

((тИГ T . FтЯиTтЯй) тЖТ R)  тЖТ  тИА T . (FтЯиTтЯй тЖТ R)

рд╕рдВрдкрд╛рджрд┐рдд рдХрд░реЗрдВ: рдпрд╣ рдПрдХрддрд░рдлрд╛ рд╣реИ, рд╕рдорд░реВрдкрддрд╛ рдирд╣реАрдВред


рдЕрд╕рдВрдмрдВрдзрд┐рдд: рдХреНрдпрд╛ impl Trait рдХреЛ рдЕрдиреНрдп рд╕рд╣рд╕рдВрдпреЛрдЬрдХ рдкрджреЛрдВ рдЬреИрд╕реЗ рдореЗрдВ рднреА рдЕрдиреБрдорддрд┐ рджреЗрдиреЗ рдХреЗ рд▓рд┐рдП рдХреЛрдИ рд╕рдВрдмрдВрдзрд┐рдд рдкреНрд░рд╕реНрддрд╛рд╡ рд╣реИ

~рдЬрдВрдЧрдПрдлрдПрди рдлреВ(рдХреЙрд▓рдмреИрдХ: рдПрдл) -> рдЖрд░рдЬрд╣рд╛рдБ F: FnOnce(impl SomeTrait) -> R {рдХреЙрд▓рдмреИрдХ (create_something ())}~

рдЕрднреА , рдпрд╣ рдПрдХ рдЖрд╡рд╢реНрдпрдХ рд╡рд┐рд╢реЗрд╖рддрд╛ рдирд╣реАрдВ рд╣реИ, рдХреНрдпреЛрдВрдХрд┐ рдЖрдк рд╣рдореЗрд╢рд╛ impl SomeTrait рд▓рд┐рдП рдПрдХ рдареЛрд╕ рд╕рдордп рд▓рдЧрд╛ рд╕рдХрддреЗ рд╣реИрдВ, рдЬреЛ рдкрдардиреАрдпрддрд╛ рдХреЛ рдиреБрдХрд╕рд╛рди рдкрд╣реБрдВрдЪрд╛рддрд╛ рд╣реИ рд▓реЗрдХрд┐рди рдЕрдиреНрдпрдерд╛ рдХреЛрдИ рдмрдбрд╝реА рдмрд╛рдд рдирд╣реАрдВ рд╣реИред

рд▓реЗрдХрд┐рди рдЕрдЧрд░ RFC 1522 рдлреАрдЪрд░ рд╕реНрдерд┐рд░ рд╣реЛ рдЬрд╛рддрд╛ рд╣реИ, рддреЛ рдЙрдкрд░реЛрдХреНрдд рдХрд╛рд░реНрдпрдХреНрд░рдореЛрдВ рдХреЗ рд▓рд┐рдП рдПрдХ рдЯрд╛рдЗрдк рд╕рд┐рдЧреНрдиреЗрдЪрд░ рдЕрд╕рд╛рдЗрди рдХрд░рдирд╛ рдЕрд╕рдВрднрд╡ рд╣реЛрдЧрд╛ рдпрджрд┐ create_something рдкрд░рд┐рдгрд╛рдо impl SomeTrait (рдХрдо рд╕реЗ рдХрдо рдмреЙрдХреНрд╕рд┐рдВрдЧ рдХреЗ рдмрд┐рдирд╛) рд╣реЛред рдореБрдЭреЗ рд▓рдЧрддрд╛ рд╣реИ рдХрд┐ рдпрд╣ рд╕рдорд╕реНрдпрд╛рдЧреНрд░рд╕реНрдд рд╣реИред

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

рд▓реЗрдХрд┐рди рдлрд┐рд░ рднреА, рдЖрдкрдХреЗ рдкрд╛рд╕ рдХреЗрд╡рд▓ рдпрд╣ рдирд┐рд░реНрдзрд╛рд░рд┐рдд рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдХреЙрдиреНрд╡рд░реНрд╕рд┐рд╕ рдХрд╛ рдЙрдкрдпреЛрдЧ рд╣реЛрддрд╛ рд╣реИ рдХрд┐ impl Trait рдЕрд░реНрде рдлрд╝рдВрдХреНрд╢рди рддрд░реНрдХреЛрдВ рдХреЗ рдЕрдВрджрд░ рдФрд░ рдмрд╛рд╣рд░ рдХреНрдпрд╛ рд╣реИред

рдЗрд╕рдХреЗ рд▓рд┐рдП рдкрд░реНрдпрд╛рдкреНрдд рдирд╣реАрдВ рд╣реИ:

  • рдбрд┐рдлрд╝реЙрд▓реНрдЯ рдХреЗ рд╡рд┐рдкрд░реАрдд рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдирд╛
  • рдХрд┐рд╕реА рдлрд╝реАрд▓реНрдб рдХреЗ рдкреНрд░рдХрд╛рд░ рдХреЗ рдЕрдВрджрд░ рд╕реНрдкрд╖реНрдЯ рдХрд░рдирд╛ (рдЬрд╣рд╛рдВ any рдФрд░ some рджреЛрдиреЛрдВ рд╕рдорд╛рди рд░реВрдк рд╕реЗ рд╡рд╛рдВрдЫрдиреАрдп рд╣реИрдВ)

@Rufflewind рдЬреЛ impl Trait рд▓рд┐рдП рдЧрд▓рдд рдмреНрд░реИрдХреЗрдЯрд┐рдВрдЧ рдЬреИрд╕рд╛ рд▓рдЧрддрд╛ рд╣реИред рдореБрдЭреЗ рдкрддрд╛ рд╣реИ рдХрд┐ рд╣рд╛рд╕реНрдХреЗрд▓ рд╕рд╛рд░реНрд╡рднреМрдорд┐рдХ рдФрд░ рдЕрд╕реНрддрд┐рддреНрд╡ рджреЛрдиреЛрдВ рдХрд╛ рдкреНрд░рддрд┐рдирд┐рдзрд┐рддреНрд╡ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдХреЗрд╡рд▓ forall рдХреАрд╡рд░реНрдб рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдЗрд╕ рд╕рдВрдмрдВрдз рдХрд╛ рдлрд╛рдпрджрд╛ рдЙрдард╛рддрд╛ рд╣реИ, рд▓реЗрдХрд┐рди рдпрд╣ рдЙрд╕ рд╕рдВрджрд░реНрдн рдореЗрдВ рдХрд╛рдо рдирд╣реАрдВ рдХрд░рддрд╛ рд╣реИ рдЬрд┐рд╕ рдкрд░ рд╣рдо рдЪрд░реНрдЪрд╛ рдХрд░ рд░рд╣реЗ рд╣реИрдВред

рдЗрд╕ рдкрд░рд┐рднрд╛рд╖рд╛ рдХреЛ рд▓реЗрдВ, рдЙрджрд╛рд╣рд░рдг рдХреЗ рд▓рд┐рдП:

fn foo(x: impl ArgTrait) -> impl ReturnTrait { ... }

рдпрджрд┐ рд╣рдо рдЗрд╕ рдирд┐рдпрдо рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рддреЗ рд╣реИрдВ рдХрд┐ " impl рддрд░реНрдХреЛрдВ рдореЗрдВ рд╕рд╛рд░реНрд╡рднреМрдорд┐рдХ рд╣реИ, impl рд░рд┐рдЯрд░реНрди рдкреНрд░рдХрд╛рд░реЛрдВ рдореЗрдВ рдЕрд╕реНрддрд┐рддреНрд╡рдЧрдд рд╣реИ", рддреЛ foo рдлрд╝рдВрдХреНрд╢рди рдЖрдЗрдЯрдо рдкреНрд░рдХрд╛рд░ рдХрд╛ рдкреНрд░рдХрд╛рд░ рддрд╛рд░реНрдХрд┐рдХ рд░реВрдк рд╕реЗ рдпрд╣ рд╣реИ (рдореЗрдВ рдореЗрдб-рдЕрдк рдЯрд╛рдЗрдк рдиреЛрдЯреЗрд╢рди):

forall<T: ArgTrait>(exists<R: ReturnTrait>(fn(T) -> R))

рднреЛрд▓реЗрдкрди рд╕реЗ impl рдХреЛ рддрдХрдиреАрдХреА рд░реВрдк рд╕реЗ рдХреЗрд╡рд▓ рд╕рд╛рд░реНрд╡рднреМрдорд┐рдХ рдпрд╛ рдХреЗрд╡рд▓ рдЕрд╕реНрддрд┐рддреНрд╡рдЧрдд рдЕрд░реНрде рдХреЗ рд░реВрдк рдореЗрдВ рдорд╛рдирдирд╛ тАЛтАЛтАЛтАЛрдФрд░ рддрд░реНрдХ рдХреЛ рд╕реНрд╡рдпрдВ рдХрд╛рдо рдХрд░рдиреЗ рджреЗрдирд╛ рд╡рд╛рд╕реНрддрд╡ рдореЗрдВ рдХрд╛рдо рдирд╣реАрдВ рдХрд░рддрд╛ рд╣реИред рдЖрдкрдХреЛ рдпрд╛ рддреЛ рдпрд╣ рдорд┐рд▓реЗрдЧрд╛:

forall<T: ArgTrait, R: ReturnTrait>(fn(T) -> R)

рдпрд╛ рдпрд╣:

exists<T: ArgTrait, R: ReturnTrait>(fn(T) -> R)

рдФрд░ рдЗрдирдореЗрдВ рд╕реЗ рдХреЛрдИ рднреА рддрд╛рд░реНрдХрд┐рдХ рдирд┐рдпрдореЛрдВ рджреНрд╡рд╛рд░рд╛ рд╣рдо рдЬреЛ рдЪрд╛рд╣рддреЗ рд╣реИрдВ рдЙрд╕реЗ рдХрдо рдирд╣реАрдВ рдХрд░рддреЗ рд╣реИрдВред рддреЛ рдЕрдВрддрддрдГ any / some рдПрдХ рдорд╣рддреНрд╡рдкреВрд░реНрдг рдЕрдВрддрд░ рдХреЛ рдХреИрдкреНрдЪрд░ рдХрд░рддреЗ рд╣реИрдВ рдЬрд┐рд╕реЗ рдЖрдк рдПрдХ рдХреАрд╡рд░реНрдб рдХреЗ рд╕рд╛рде рдХреИрдкреНрдЪрд░ рдирд╣реАрдВ рдХрд░ рд╕рдХрддреЗ рд╣реИрдВред std рдореЗрдВ рднреА рдЙрдЪрд┐рдд рдЙрджрд╛рд╣рд░рдг рд╣реИрдВ рдЬрд╣рд╛рдВ рдЖрдк рд╡рд╛рдкрд╕реА рдХреА рд╕реНрдерд┐рддрд┐ рдореЗрдВ рд╕рд╛рд░реНрд╡рднреМрдорд┐рдХ рдЪрд╛рд╣рддреЗ рд╣реИрдВред рдЙрджрд╛рд╣рд░рдг рдХреЗ рд▓рд┐рдП, рдпрд╣ Iterator рд╡рд┐рдзрд┐:

fn collect<B>(self) -> B where B: FromIterator<Self::Item>;
// is equivalent to
fn collect(self) -> any FromIterator<Self::Item>;

рдФрд░ рдЗрд╕реЗ impl рдФрд░ рддрд░реНрдХ/рд╡рд╛рдкрд╕реА рдирд┐рдпрдо рдХреЗ рд╕рд╛рде рд▓рд┐рдЦрдиреЗ рдХрд╛ рдХреЛрдИ рддрд░реАрдХрд╛ рдирд╣реАрдВ рд╣реИред

tl; dr рд╣реЛрдиреЗ рдХреЗ impl рдкреНрд░рд╛рд╕рдВрдЧрд┐рдХ рд░реВрдк рд╕реЗ рдпрд╛ рддреЛ рд╕рд╛рд░реНрд╡рднреМрдорд┐рдХ рдпрд╛ рдЕрд╕реНрддрд┐рддреНрд╡рдЧрдд рд░реВрдк рд╕реЗ рдирд┐рд░реВрдкрд┐рдд рдХрд░рддреЗ рд╣реИрдВ, рд╡рд╛рд╕реНрддрд╡ рдореЗрдВ рдЗрд╕реЗ рджреЛ рдЕрд▓рдЧ-рдЕрд▓рдЧ рдЕрд░реНрде рджреЗрддреЗ рд╣реИрдВред


рд╕рдВрджрд░реНрдн рдХреЗ рд▓рд┐рдП, рдореЗрд░реЗ рдиреЛрдЯреЗрд╢рди рдореЗрдВ рдлреЛрд░рдСрд▓/рдЕрд╕реНрддрд┐рддреНрд╡ рд╕рдВрдмрдВрдз @ рд░рдлрд▓рд╡рд┐рдВрдб рдХрд╛ рдЙрд▓реНрд▓реЗрдЦ рдЗрд╕ рддрд░рд╣ рджрд┐рдЦрддрд╛ рд╣реИ:

fn(exists<T: Trait>(T)) -> R === forall<T: Trait>(fn(T) -> R)

рдЬреЛ рдЬреЗрдиреЗрд░рд┐рдХ (рд╕рд╛рд░реНрд╡рднреМрдорд┐рдХ) рдХреЗ рдмрд░рд╛рдмрд░ рд╣реЛрдиреЗ рд╡рд╛рд▓реА рд╡рд┐рд╢реЗрд╖рддрд╛ рд╡рд╕реНрддреБрдУрдВ (рдЕрд╕реНрддрд┐рддреНрд╡) рдХреА рдЕрд╡рдзрд╛рд░рдгрд╛ рд╕реЗ рд╕рдВрдмрдВрдзрд┐рдд рд╣реИ, рд▓реЗрдХрд┐рди рдЗрд╕ impl Trait рдкреНрд░рд╢реНрди рд╕реЗ рдирд╣реАрдВред

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

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

рд╕рдВрдХреНрд╖реЗрдк рдореЗрдВ, рдореБрдЭреЗ рдЗрд╕рд╕реЗ рдЦреБрд╢реА рд╣реЛрдЧреА:

  • impl Trait рджреЛрдиреЛрдВ рд╕рд╛рд░реНрд╡рднреМрдорд┐рдХ рдФрд░ рдЕрд╕реНрддрд┐рддреНрд╡ (рдкреНрд░рд╛рд╕рдВрдЧрд┐рдХ рд░реВрдк рд╕реЗ) рдХреЗ рд▓рд┐рдП рдЖрд╢реБрд▓рд┐рдкрд┐ рдХреЗ рд░реВрдк рдореЗрдВред
  • рд╕рд╛рд░реНрд╡рднреМрдорд┐рдХ рдФрд░ рдЕрд╕реНрддрд┐рддреНрд╡ рджреЛрдиреЛрдВ рдХреЗ рд▓рд┐рдП рдкреВрд░реА рддрд░рд╣ рд╕реЗ рд╕рд╛рдорд╛рдиреНрдп рд▓реЙрдиреНрдЧрд╣реИрдВрдб рдХреЗ рд░реВрдк рдореЗрдВ рдирд╛рдорд┐рдд рдкреНрд░рдХрд╛рд░ рдХреЗ рдкреИрд░рд╛рдореАрдЯрд░ред (рдХрдо рд╕рд╛рдорд╛рдиреНрдпрддрдГ рдЖрд╡рд╢реНрдпрдХред)

рднреЛрд▓реЗрдкрди рд╕реЗ impl рдХреЛ рддрдХрдиреАрдХреА рд░реВрдк рд╕реЗ рдХреЗрд╡рд▓ рд╕рд╛рд░реНрд╡рднреМрдорд┐рдХ рдпрд╛ рдХреЗрд╡рд▓ рдЕрд╕реНрддрд┐рддреНрд╡рдЧрдд рдЕрд░реНрде рдХреЗ рд░реВрдк рдореЗрдВ рдорд╛рдирдирд╛ тАЛтАЛтАЛтАЛрдФрд░ рддрд░реНрдХ рдХреЛ рд╕реНрд╡рдпрдВ рд╣реА рдХрд╛рдо рдХрд░рдиреЗ рджреЗрдирд╛ рд╡рд╛рд╕реНрддрд╡ рдореЗрдВ рдХрд╛рдо рдирд╣реАрдВ рдХрд░рддрд╛ рд╣реИред рдЖрдкрдХреЛ рдпрд╛ рддреЛ рдпрд╣ рдорд┐рд▓реЗрдЧрд╛:

@solson рдореЗрд░реЗ рд▓рд┐рдП, рдПрдХ " рдареАрдХ рдмрдЧрд▓ рдореЗрдВ рдореМрдЬреВрдж рдХреНрд╡рд╛рдВрдЯрд┐рдлрд╛рдпрд░ рдореЗрдВ

~рдЬрдВрдЧ(рдЗрдореНрдкреНрд▓ рдорд╛рдпрдЯреНрд░реЗрдЯ)~

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

~рдЬрдВрдЧ(рдореМрдЬреВрджрдЯреА)~

рдЬреЛ рдПрдХ рд╕рд╛рдзрд╛рд░рдг рд╕реНрдерд╛рдиреАрдп рдкрд░рд┐рд╡рд░реНрддрди рд╣реИред рдЗрд╕ рдкреНрд░рдХрд╛рд░, " impl рдХрд╛ рдкрд╛рд▓рди рдХрд░рдиреЗ рд╡рд╛рд▓рд╛ рдПрдХ рднреЛрд▓рд╛ рдЕрдиреБрд╡рд╛рдж рд╣рдореЗрд╢рд╛ рдПрдХ рдЕрд╕реНрддрд┐рддреНрд╡рдЧрдд рд╣реЛрддрд╛ рд╣реИ" рдирд┐рдпрдо рдХрд╛ рдкрд░рд┐рдгрд╛рдо рд╣реЛрдЧрд╛:

~рдЬрдВрдЧрдПрдлрдПрди(рдореМрдЬреВрдж рд╣реИрдЯреА) -> (рдореМрдЬреВрджрдЖрд░)~

рдлрд┐рд░, рдпрджрд┐ рдЖрдк рдХреНрд╡рд╛рдВрдЯрд┐рдлрд╛рдпрд░ рдХреЛ рдлрд╝рдВрдХреНрд╢рди рддрд░реНрдХ рд╕реЗ рдмрд╛рд╣рд░ рдирд┐рдХрд╛рд▓рддреЗ рд╣реИрдВ, рддреЛ рдпрд╣ рдмрди рдЬрд╛рддрд╛ рд╣реИ

~рдЬрдВрдЧрдХреЗ рд▓рд┐рдпреЗрдПрдлрдПрди (рдЯреА) -> (рдореМрдЬреВрдж рд╣реИрдЖрд░)~

рддреЛ рднрд▓реЗ рд╣реА T рд╣рдореЗрд╢рд╛ рд╕реНрд╡рдпрдВ рдХреЗ рд╕рд╛рдкреЗрдХреНрд╖ рдЕрд╕реНрддрд┐рддреНрд╡рдЧрдд рд╣реЛрддрд╛ рд╣реИ, рдпрд╣ рдкреВрд░реЗ рдлрд╝рдВрдХреНрд╢рди рдкреНрд░рдХрд╛рд░ рдХреЗ рд▓рд┐рдП рд╕рд╛рд░реНрд╡рднреМрдорд┐рдХ рд╕рд╛рдкреЗрдХреНрд╖ рдХреЗ рд░реВрдк рдореЗрдВ рдкреНрд░рдХрдЯ рд╣реЛрддрд╛ рд╣реИред


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

~~рдЬрдВрдЧ(рдкреНрд░рддреНрдпрдХреНрд╖(Vec, рдЯреА))~ ~

рд╕рд╛рд░реНрд╡рднреМрдорд┐рдХ рдкреНрд░рдХрд╛рд░реЛрдВ рдХреЗ рдЕрдиреБрд░реВрдк (рдПрдЪрдЖрд░рдЯреАрдмреА рдХреЗ рдорд╛рдзреНрдпрдо рд╕реЗ)

~рдЬрдВрдЧ(<'a> FnOnce(&'a T) рдХреЗ рд▓рд┐рдП)~

@Rufflewind рд╡рд╣ рджреГрд╢реНрдп рдХрд╛рдо рдирд╣реАрдВ рдХрд░рддрд╛ рдХреНрдпреЛрдВрдХрд┐ fn(T) -> (exists<R: ReturnTrait>(R)) рддрд╛рд░реНрдХрд┐рдХ рд░реВрдк рд╕реЗ exists<R: ReturnTrait>(fn(T) -> R) рдмрд░рд╛рдмрд░ рдирд╣реАрдВ рд╣реИ, рдЬреЛ рдХрд┐ рд╡рд╛рдкрд╕реА-рдкреНрд░рдХрд╛рд░ impl Trait рд╡рд╛рд╕реНрддрд╡ рдореЗрдВ рдЕрд░реНрде рд╣реИред

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

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

@solson рд╣рд╛рдБ рдЖрдк рд╕рд╣реА рд╣реИрдВ: рдЕрд╕реНрддрд┐рддреНрд╡ рдХреЛ

(T тЖТ тИГR. f(R))  теЗ  тИГR. T тЖТ f(R)

рдЬрдмрдХрд┐ рдпреЗ рд╕рд╛рдорд╛рдиреНрдп рд░реВрдк рд╕реЗ рдзрд╛рд░рдг рдХрд░рддреЗ рд╣реИрдВ:

(тИГR. T тЖТ f(R))  тЖТ   T тЖТ тИГR. f(R)
(тИАA. g(A) тЖТ T)  тЖФ  ((тИГA. g(A)) тЖТ T)

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

рд╕рдВрдкрд╛рджрд┐рдд рдХрд░реЗрдВ: рдУрд╣, (тИАA. g(A) тЖТ T) тЖТ (тИГA. g(A)) тЖТ T рдзрд╛рд░рдг рдХрд░рддрд╛ рд╣реИред

рдореИрдВрдиреЗ impl Trait рдХреЛ рд╡рд┐рд╕реНрддрд╛рд░рд┐рдд рдФрд░ рд╕реНрдерд┐рд░ рдХрд░рдиреЗ рдХреЗ рд╡рд┐рд╕реНрддреГрдд рдкреНрд░рд╕реНрддрд╛рд╡ рдХреЗ рд╕рд╛рде рдПрдХ RFC рдкреЛрд╕реНрдЯ рдХрд┐рдпрд╛ рд╣реИред рдпрд╣ рдЗрд╕ рдФрд░ рдкрд╣рд▓реЗ рдХреЗ рдзрд╛рдЧреЛрдВ рдкрд░ рдмрд╣реБрдд рд╕рд╛рд░реА рдЪрд░реНрдЪрд╛рдУрдВ рдкрд░ рдЖрдзрд╛рд░рд┐рдд рд╣реИред

рдзреНрдпрд╛рди рджреЗрдиреЗ рдпреЛрдЧреНрдп рдмрд╛рдд рдпрд╣ рд╣реИ рдХрд┐ https://github.com/rust-lang/rfcs/pull/1951 рдХреЛ рд╕реНрд╡реАрдХрд╛рд░ рдХрд░ рд▓рд┐рдпрд╛ рдЧрдпрд╛ рд╣реИред

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

рдпрд╣ #43869 рдореЗрдВ рдкрд╛рдпрд╛ рдЧрдпрд╛ рдХрд┐ -> impl Trait рдлрд╝рдВрдХреНрд╢рди рдкреВрд░реА рддрд░рд╣ рд╕реЗ рдЕрд▓рдЧ рд╣реЛрдиреЗ рд╡рд╛рд▓реЗ рд╢рд░реАрд░ рдХрд╛ рд╕рдорд░реНрдерди рдирд╣реАрдВ рдХрд░рддрд╛ рд╣реИ:

fn do_it_later_but_cannot() -> impl Iterator<Item=u8> { //~ ERROR E0227
    unimplemented!()
}

рдХреНрдпрд╛ рдпрд╣ рдЕрдкреЗрдХреНрд╖рд┐рдд рд╣реИ (рдЪреВрдВрдХрд┐ ! рдЕрд░реНрде Iterator ), рдпрд╛ рдЗрд╕реЗ рдПрдХ рдмрдЧ рдорд╛рдирд╛ рдЬрд╛рддрд╛ рд╣реИ?

рдЕрдиреБрдорд╛рдирд┐рдд рдкреНрд░рдХрд╛рд░реЛрдВ рдХреЛ рдкрд░рд┐рднрд╛рд╖рд┐рдд рдХрд░рдиреЗ рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рдХреНрдпрд╛ рд╣реИ, рдЬрд┐рд╕рдХрд╛ рдЙрдкрдпреЛрдЧ рди рдХреЗрд╡рд▓ рд╡рд╛рдкрд╕реА рдореВрд▓реНрдпреЛрдВ рдХреЗ рд░реВрдк рдореЗрдВ рдХрд┐рдпрд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИ, рдмрд▓реНрдХрд┐ рдХреБрдЫ рднреА (рдореБрдЭреЗ рд▓рдЧрддрд╛ рд╣реИ) рд╡рд░реНрддрдорд╛рди рдореЗрдВ рдПрдХ рдкреНрд░рдХрд╛рд░ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд┐рдпрд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИ?
рдХреБрдЫ рдЗрд╕ рддрд░рд╣:
type Foo: FnOnce() -> f32 = #[infer];
рдпрд╛ рдПрдХ рдХреАрд╡рд░реНрдб рдХреЗ рд╕рд╛рде:
infer Foo: FnOnce() -> f32;

рдкреНрд░рдХрд╛рд░ Foo рдЙрдкрдпреЛрдЧ рд░рд┐рдЯрд░реНрди рдкреНрд░рдХрд╛рд░, рдкреИрд░рд╛рдореАрдЯрд░ рдкреНрд░рдХрд╛рд░ рдпрд╛ рдХрд┐рд╕реА рдЕрдиреНрдп рдкреНрд░рдХрд╛рд░ рдХреЗ рд▓рд┐рдП рдЙрдкрдпреЛрдЧ рдХрд┐рдпрд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИ, рд▓реЗрдХрд┐рди рджреЛ рдЕрд▓рдЧ-рдЕрд▓рдЧ рд╕реНрдерд╛рдиреЛрдВ рдкрд░ рдЗрд╕рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдирд╛ рдЕрд╡реИрдз рд╣реЛрдЧрд╛, рдЬрд┐рд╕рдХреЗ рд▓рд┐рдП рдПрдХ рдЕрд▓рдЧ рдкреНрд░рдХрд╛рд░ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реЛрддреА рд╣реИ, рднрд▓реЗ рд╣реА рд╡рд╣ рдкреНрд░рдХрд╛рд░ рджреЛрдиреЛрдВ рд╣реА рдорд╛рдорд▓реЛрдВ рдореЗрдВ FnOnce() -> f32 рд▓рд╛рдЧреВ рдХрд░рддрд╛ рд╣реИред рдЙрджрд╛рд╣рд░рдг рдХреЗ рд▓рд┐рдП, рдирд┐рдореНрдирд▓рд┐рдЦрд┐рдд рд╕рдВрдХрд▓рд┐рдд рдирд╣реАрдВ рд╣реЛрдЧрд╛:

infer Foo: FnOnce() -> f32;

fn return_closure() -> Foo {
    || 0.1
}

fn return_closure2() -> Foo {
    || 0.2
}

fn main() {
    println!("{:?}, {:?}", return_closure()(), return_closure2()());
}

рдпрд╣ рд╕рдВрдХрд▓рди рдирд╣реАрдВ рдХрд░рдирд╛ рдЪрд╛рд╣рд┐рдП рдХреНрдпреЛрдВрдХрд┐ рднрд▓реЗ рд╕реЗ рд╡рд╛рдкрд╕реА рдкреНрд░рдХрд╛рд░ рдпрджреНрдпрдкрд┐ return_closure рдФрд░ return_closure2 рджреЛрдиреЛрдВ FnOnce() -> f32 , рдЙрдирдХреЗ рдкреНрд░рдХрд╛рд░, рд╡рд╛рд╕реНрддрд╡ рдореЗрдВ рдЕрд▓рдЧ рд╣реИрдВ, рдХреНрдпреЛрдВрдХрд┐ рдХреЛрдИ рджреЛ рдмрдВрджреА рдЬрдВрдЧ рдореЗрдВ рдПрдХ рд╣реА рдкреНрд░рдХрд╛рд░ рд╣реИ . рдЙрдкрд░реЛрдХреНрдд рдХреЛ рд╕рдВрдХрд▓рд┐рдд рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдЖрдкрдХреЛ рджреЛ рдЕрд▓рдЧ-рдЕрд▓рдЧ рдЕрдиреБрдорд╛рдирд┐рдд рдкреНрд░рдХрд╛рд░реЛрдВ рдХреЛ рдкрд░рд┐рднрд╛рд╖рд┐рдд рдХрд░рдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реЛрдЧреА:

infer Foo: FnOnce() -> f32;
infer Foo2: FnOnce() -> f32; //Added this line

fn return_closure() -> Foo {
    || 0.1
}

fn return_closure2() -> Foo2 { //Changed Foo to Foo2
    || 0.2
}

fn main() {
    println!("{:?}, {:?}", return_closure()(), return_closure2()());
}

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

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

@alvitawa рджреЗрдЦреЗрдВ https://github.com/rust-lang/rfcs/pull/2071

@cramertj рдЖрд╣ рддреЛ рдЗрд╕рд▓рд┐рдП рдпрд╣ рдореБрджреНрджрд╛ рдЗрддрдирд╛ рдЦрд╛рдореЛрд╢ рд╣реЛ рдЧрдпрд╛ рдерд╛ ..

рддреЛ, @cramertj рдореБрдЭрд╕реЗ рдЗрд╕ рдмрд╛рд░реЗ рдореЗрдВ рдкреВрдЫ рд░рд╣реЗ рдереЗ рдХрд┐ рдореИрдВрдиреЗ рдХреИрд╕реЗ рд╕реЛрдЪрд╛ рдХрд┐ рджреЗрд░ рд╕реЗ рдЖрдиреЗ рд╡рд╛рд▓реЗ рдХреНрд╖реЗрддреНрд░реЛрдВ рдХреА рд╕рдорд╕реНрдпрд╛ рдХреЛ рд╣рд▓ рдХрд░рдирд╛ рд╕рдмрд╕реЗ рдЕрдЪреНрдЫрд╛ рд╣реЛрдЧрд╛ рдЬреЛ рдЙрдиреНрд╣реЛрдВрдиреЗ рдЕрдкрдиреЗ рдкреАрдЖрд░ рдореЗрдВ рд╕рд╛рдордирд╛ рдХрд┐рдпрд╛ рдерд╛ред рдореЗрд░рд╛ рдорд╛рдирдирд╛ тАЛтАЛрд╣реИ рдХрд┐ рд╣рдо рд╢рд╛рдпрдж рдЕрдкрдиреЗ рдХрд╛рд░реНрдпрд╛рдиреНрд╡рдпрди рдХреЛ "рд░реАрдЯреВрд▓" рдХрд░рдирд╛ рдЪрд╛рд╣рддреЗ рд╣реИрдВ рдФрд░ anonymous type Foo рдореЙрдбрд▓ рдХреА рдкреНрд░рддреАрдХреНрд╖рд╛ рдХрд░ рд░рд╣реЗ рд╣реИрдВред

рд╕рдВрджрд░реНрдн рдХреЗ рд▓рд┐рдП, рд╡рд┐рдЪрд╛рд░ рдореЛрдЯреЗ рддреМрд░ рдкрд░ рдпрд╣ рд╣реИ рдХрд┐

fn foo<'a, 'b, T, U>() -> impl Debug + 'a

рд╣реЛрдЧрд╛ (рддрд░рд╣ рдХрд╛) рдЗрд╕ рддрд░рд╣ рдХреБрдЫ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП desugared

anonymous type Foo<'a, T, U>: Debug + 'a
fn foo<'a, 'b, T, U>() -> Foo<'a, T, U>

рдзреНрдпрд╛рди рджреЗрдВ рдХрд┐ рдЗрд╕ рдлреЙрд░реНрдо рдореЗрдВ, рдЖрдк рджреЗрдЦ рд╕рдХрддреЗ рд╣реИрдВ рдХрд┐ рдХреМрди рд╕реЗ рд╕рд╛рдорд╛рдиреНрдп рдкреИрд░рд╛рдореАрдЯрд░ рдХреИрдкреНрдЪрд░ рдХрд┐рдП рдЧрдП рд╣реИрдВ рдХреНрдпреЛрдВрдХрд┐ рд╡реЗ Foo рддрд░реНрдХ рдХреЗ рд░реВрдк рдореЗрдВ рдкреНрд░рдХрдЯ рд╣реЛрддреЗ рд╣реИрдВ - рд╡рд┐рд╢реЗрд╖ рд░реВрдк рд╕реЗ, 'b рдкрд░ рдХрдмреНрдЬрд╛ рдирд╣реАрдВ рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИ, рдХреНрдпреЛрдВрдХрд┐ рдпрд╣ рд╡рд┐рд╢реЗрд╖рддрд╛ рд╕рдВрджрд░реНрдн рдореЗрдВ рдкреНрд░рдХрдЯ рдирд╣реАрдВ рд╣реЛрддрд╛ рд╣реИ рдХрд┐рд╕реА рднреА рддрд░рд╣ рд╕реЗ, рд▓реЗрдХрд┐рди рдкреНрд░рдХрд╛рд░ рдкреИрд░рд╛рдореАрдЯрд░ T рдФрд░ U рд╣рдореЗрд╢рд╛ рд╣реЛрддреЗ рд╣реИрдВред

рд╡реИрд╕реЗ рднреА, рд╡рд░реНрддрдорд╛рди рдореЗрдВ рдХрдВрдкрд╛рдЗрд▓рд░ рдореЗрдВ, рдЬрдм рдЖрдкрдХреЗ рдкрд╛рд╕ impl Debug рд╕рдВрджрд░реНрдн рд╣реЛрддрд╛ рд╣реИ, рддреЛ рд╣рдо рдПрдХ def-id рдмрдирд╛рддреЗ рд╣реИрдВ рдЬреЛ - рдкреНрд░рднрд╛рд╡реА рд░реВрдк рд╕реЗ - рдЗрд╕ рдЕрдирд╛рдо рдкреНрд░рдХрд╛рд░ рдХрд╛ рдкреНрд░рддрд┐рдирд┐рдзрд┐рддреНрд╡ рдХрд░рддрд╛ рд╣реИред рдлрд┐рд░ рд╣рдорд╛рд░реЗ рдкрд╛рд╕ generics_of рдХреНрд╡реЗрд░реА рд╣реИ, рдЬреЛ рдЗрд╕рдХреЗ рд╕рд╛рдорд╛рдиреНрдп рдорд╛рдкрджрдВрдбреЛрдВ рдХреА рдЧрдгрдирд╛ рдХрд░рддреА рд╣реИред рдЕрднреА, рдпрд╣ "рд╕рдВрд▓рдЧреНрди" рд╕рдВрджрд░реНрдн рдХреЗ рд╕рдорд╛рди рд╣реИ - рдЕрд░реНрдерд╛рдд, рдлрд╝рдВрдХреНрд╢рди foo ред рдпрд╣реА рд╣рдо рдмрджрд▓рдирд╛ рдЪрд╛рд╣рддреЗ рд╣реИрдВред

"рджреВрд╕рд░реА рддрд░рдл", рдпрд╛рдиреА foo рдХреЗ рд╣рд╕реНрддрд╛рдХреНрд╖рд░ рдореЗрдВ, рд╣рдо impl Foo рдХреЛ TyAnon ред рдпрд╣ рдореВрд▓ рд░реВрдк рд╕реЗ рд╕рд╣реА рд╣реИ - TyAnon Foo рдХреЗ рд╕рдВрджрд░реНрдн рдХрд╛ рдкреНрд░рддрд┐рдирд┐рдзрд┐рддреНрд╡ рдХрд░рддрд╛ рд╣реИ рдЬрд┐рд╕реЗ рд╣рдо рдЙрдкрд░реЛрдХреНрдд desugaring рдореЗрдВ рджреЗрдЦрддреЗ рд╣реИрдВред рд▓реЗрдХрд┐рди рдЬрд┐рд╕ рддрд░рд╣ рд╕реЗ рд╣рдо рдЗрд╕ рдкреНрд░рдХрд╛рд░ рдХреЗ рд▓рд┐рдП "рд╕рдмрд╕реНрдЯреНрд╕" рдкреНрд░рд╛рдкреНрдд рдХрд░рддреЗ рд╣реИрдВ, рд╡рд╣ "рдкрд╣рдЪрд╛рди" рдлрд╝рдВрдХреНрд╢рди рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдирд╛ рд╣реИ , рдЬреЛ рд╕реНрдкрд╖реНрдЯ рд░реВрдк рд╕реЗ рдЧрд▓рдд рд╣реИ - рдпрд╛ рдХрдо рд╕реЗ рдХрдо рд╕рд╛рдорд╛рдиреНрдпреАрдХрд░рдг рдирд╣реАрдВ рдХрд░рддрд╛ рд╣реИред

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

рдореБрдЭреЗ рд▓рдЧрддрд╛ рд╣реИ рдХрд┐ рд╣рдореЗрдВ рдЬреЛ рдХрд░рдирд╛ рдЪрд╛рд╣рд┐рдП рд╡рд╣ рдХреБрдЫ рдРрд╕рд╛ рд╣реИ:

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

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

рд╢рд╛рдпрдж рд╕рдмрд╕реЗ рдЖрд╕рд╛рди рдФрд░ рд╕рдмрд╕реЗ рдЕрдЪреНрдЫрд╛ рд╡рд┐рдХрд▓реНрдк рд╕рд┐рд░реНрдл рдПрдХ Region<'tcx> рдЙрдкрдпреЛрдЧ рдХрд░рдирд╛ рд╣реЛрдЧрд╛, рд▓реЗрдХрд┐рди рдЬрдм рдЖрдк рдХрд┐рд╕реА рднреА рдмрд╛рдЗрдВрдбрд░ рдХреЛ "рд░рджреНрдж рдХрд░реЗрдВ" рдкрд░ рдЬрд╛рддреЗ рд╣реИрдВ рддреЛ рдЖрдкрдХреЛ debruijn рдЕрдиреБрдХреНрд░рдордгрд┐рдХрд╛ рдЧрд╣рд░рд╛рдИ рдХреЛ рд╕реНрдерд╛рдирд╛рдВрддрд░рд┐рдд рдХрд░рдирд╛ рд╣реЛрдЧрд╛ред рд╣рд╛рд▓рд╛рдВрдХрд┐ рдпрд╣ рд╢рд╛рдпрдж рд╕рдмрд╕реЗ рдЕрдЪреНрдЫрд╛ рд╡рд┐рдХрд▓реНрдк рд╣реИред

рдЗрд╕рд▓рд┐рдП рдореВрд▓ рд░реВрдк рд╕реЗ рдЬреИрд╕реЗ рд╣реА рд╣рдореЗрдВ visit_lifetime рдореЗрдВ рдХреЙрд▓рдмреИрдХ рдорд┐рд▓рддреЗ рд╣реИрдВ, рд╣рдо рдЙрдиреНрд╣реЗрдВ рдкреНрд░рд╛рд░рдВрднрд┐рдХ рдЧрд╣рд░рд╛рдИ рдореЗрдВ рд╡реНрдпрдХреНрдд Region<'tcx> рдореЗрдВ рдмрджрд▓ рджреЗрдВрдЧреЗ (рдЬреИрд╕реЗ рд╣реА рд╣рдо рдмрд╛рдЗрдВрдбрд░реНрд╕ рд╕реЗ рдЧреБрдЬрд░рддреЗ рд╣реИрдВ, рд╣рдореЗрдВ рдЯреНрд░реИрдХ рдХрд░рдирд╛ рд╣реЛрдЧрд╛)ред рд╣рдо рдбреБрдкреНрд▓рд┐рдХреЗрдЯ рдХреЛ рд╣рдЯрд╛рддреЗ рд╣реБрдП рдЙрдиреНрд╣реЗрдВ рдПрдХ рд╡реЗрдХреНрдЯрд░ рдореЗрдВ рдЬрдорд╛ рдХрд░ рджреЗрдВрдЧреЗред

рдЬрдм рд╣рдо рдХрд╛рдо рдкреВрд░рд╛ рдХрд░ рд▓реЗрддреЗ рд╣реИрдВ, рддреЛ рд╣рдорд╛рд░реЗ рдкрд╛рд╕ рджреЛ рдЪреАрдЬрд╝реЗрдВ рд╣реЛрддреА рд╣реИрдВ:

  • рд╕рдмрд╕реЗ рдкрд╣рд▓реЗ, рд╡реЗрдХреНрдЯрд░ рдореЗрдВ рдкреНрд░рддреНрдпреЗрдХ рдХреНрд╖реЗрддреНрд░ рдХреЗ рд▓рд┐рдП, рд╣рдореЗрдВ рдПрдХ рд╕рд╛рдорд╛рдиреНрдп рдХреНрд╖реЗрддреНрд░ рдкреИрд░рд╛рдореАрдЯрд░ рдмрдирд╛рдирд╛ рд╣реЛрдЧрд╛ред рдЙрди рд╕рднреА рдХреЗ рдЧреБрдордирд╛рдо рдирд╛рдо рд╣реЛ рд╕рдХрддреЗ рд╣реИрдВ рдпрд╛ рдЬреЛ рднреА рд╣реЛ, рдЗрд╕рд╕реЗ рдХреЛрдИ рдЦрд╛рд╕ рдлрд░реНрдХ рдирд╣реАрдВ рдкрдбрд╝рддрд╛ (рд╣рд╛рд▓рд╛рдВрдХрд┐ рд╢рд╛рдпрдж рд╣рдореЗрдВ рдЙрдиреНрд╣реЗрдВ def-id рдпрд╛ рдХреБрдЫ рдФрд░ рдЪрд╛рд╣рд┐рдП...? рдореБрдЭреЗ RegionParameterDef рдбреЗрдЯрд╛ рд╕рдВрд░рдЪрдирд╛рдУрдВ рдХреЛ рджреЗрдЦрдирд╛ рд╣реЛрдЧрд╛...) .
  • рджреВрд╕рд░рд╛, рд╡реЗрдХреНрдЯрд░ рдореЗрдВ рдХреНрд╖реЗрддреНрд░ рднреА рд╡реЗ рдЪреАрдЬреЗрдВ рд╣реИрдВ рдЬрд┐рдиреНрд╣реЗрдВ рд╣рдо "рдкрджрд╛рд░реНрде" рдХреЗ рд▓рд┐рдП рдЙрдкрдпреЛрдЧ рдХрд░рдирд╛ рдЪрд╛рд╣рддреЗ рд╣реИрдВред

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

@nikomatsakis рдореЗрд░рд╛ рдорд╛рдирдирд╛ тАЛтАЛтАЛтАЛрд╣реИ рдХрд┐ рдЗрд╕рдореЗрдВ рд╕реЗ рдмрд╣реБрдд рдХреБрдЫ рд╡реИрд╕рд╛ рд╣реА рд╣реИ рдЬреИрд╕рд╛ рдореИрдВрдиреЗ @cramertj рдХреЛ рдмрддрд╛рдпрд╛ рд╣реИ, рд▓реЗрдХрд┐рди рдЕрдзрд┐рдХ

рдореИрдВ рдЕрд╕реНрддрд┐рддреНрд╡рдЧрдд impl Trait рдмрд╛рд░реЗ рдореЗрдВ рд╕реЛрдЪ рд░рд╣рд╛ рдерд╛ рдФрд░ рдореБрдЭреЗ рдПрдХ рдЬрд┐рдЬреНрдЮрд╛рд╕реБ рдорд╛рдорд▓реЗ рдХрд╛ рд╕рд╛рдордирд╛ рдХрд░рдирд╛ рдкрдбрд╝рд╛ рдЬрд╣рд╛рдВ рдореБрдЭреЗ рд▓рдЧрддрд╛ рд╣реИ рдХрд┐ рд╣рдореЗрдВ рд╕рд╛рд╡рдзрд╛рдиреА рд╕реЗ рдЖрдЧреЗ рдмрдврд╝рдирд╛ рдЪрд╛рд╣рд┐рдПред рдЗрд╕ рд╕рдорд╛рд░реЛрд╣ рдкрд░ рд╡рд┐рдЪрд╛рд░ рдХрд░реЗрдВ:

trait Foo<T> { }
impl Foo<()> for () { }
fn foo() -> impl Foo<impl Debug> {
  ()
}

рдЬреИрд╕рд╛ рдХрд┐ рдЖрдк play рдкрд░ рдорд╛рдиреНрдп рдХрд░ рд╕рдХрддреЗ

рд╡рд┐рд╢реЗрд╖ рд░реВрдк рд╕реЗ, рдпрд╣ рд╕реНрдкрд╖реНрдЯ рд╣реИ рдХрд┐ рд╣рдо рдЙрд╕ рдкреНрд░рдХрд╛рд░ рдХреЛ рдХреИрд╕реЗ рдирд┐рдХрд╛рд▓рддреЗ рд╣реИрдВ рдЬреЛ рдпрд╣рд╛рдВ рд▓реМрдЯрд╛рдпрд╛ рдЬрд╛ рд░рд╣рд╛ рд╣реИ ( () )ред рдпрд╣ рдХрдо рд╕реНрдкрд╖реНрдЯ рд╣реИ рдХрд┐ рд╣рдо impl Debug рдкреИрд░рд╛рдореАрдЯрд░ рдХреЗ рдкреНрд░рдХрд╛рд░ рдХреЛ рдХреИрд╕реЗ рдирд┐рдХрд╛рд▓рддреЗ рд╣реИрдВред рдпрд╣реА рд╣реИ, рдЖрдк рдЗрд╕ рд╡рд╛рдкрд╕реА рдореВрд▓реНрдп рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рд╕реЛрдЪ рд╕рдХрддреЗ рд╣реИрдВ рдЬреИрд╕реЗ -> ?T рдЬрд╣рд╛рдВ ?T: Foo<?U> ред рд╣рдореЗрдВ ?T рдФрд░ ?U рдХреЗ рдореВрд▓реНрдпреЛрдВ рдХреЛ рдХреЗрд╡рд▓ рдЗрд╕ рддрдереНрдп рдХреЗ рдЖрдзрд╛рд░ рдкрд░ рдирд┐рдХрд╛рд▓рдирд╛ рд╣реЛрдЧрд╛ рдХрд┐ ?T = () ред

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

рдпрд╣ рд░рд╕реНрдЯ рдореЗрдВ рдмрд╣реБрдд рд╕рд╛рд░реЗ рдкрд░рд┐рджреГрд╢реНрдпреЛрдВ рдореЗрдВ рд╣реЛ рд╕рдХрддрд╛ рд╣реИ - рдЬреЛ рдкрд░реНрдпрд╛рдкреНрдд рд╕реЗ рд╕рдВрдмрдВрдзрд┐рдд рд╣реИ, рд▓реЗрдХрд┐рди рдСрд░реНрдереЛрдЧреЛрдирд▓ рд╣реИ - рд▓реЗрдХрд┐рди impl Trait рдорд╛рдорд▓реЗ рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рдХреБрдЫ рдЕрд▓рдЧ рд╣реИред impl Trait рдХреЗ рдорд╛рдорд▓реЗ рдореЗрдВ, рд╣рдорд╛рд░реЗ рдкрд╛рд╕ рдЕрдиреБрдорд╛рди рдХреЗ рд╕рд╛рде рдорд╛рд░реНрдЧрджрд░реНрд╢рди рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдЙрдкрдпреЛрдЧрдХрд░реНрддрд╛ рдХреЗ рдкреНрд░рдХрд╛рд░ рдПрдиреЛрдЯреЗрд╢рди рдЬреЛрдбрд╝рдиреЗ рдХрд╛ рдХреЛрдИ рддрд░реАрдХрд╛ рдирд╣реАрдВ рд╣реИ! рди рд╣реА рд╣рдорд╛рд░реЗ рдкрд╛рд╕ рд╡рд╛рд╕реНрддрд╡ рдореЗрдВ рдЗрд╕ рддрд░рд╣ рдХреА рдХреЛрдИ рдпреЛрдЬрдирд╛ рд╣реИред рдПрдХрдорд╛рддреНрд░ рд╕рдорд╛рдзрд╛рди fn рдЗрдВрдЯрд░рдлрд╝реЗрд╕ рдХреЛ impl Foo<()> рдпрд╛ рдХреБрдЫ рдФрд░ рд╕реНрдкрд╖реНрдЯ рдореЗрдВ рдмрджрд▓рдирд╛ рд╣реИред

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

abstract type X: Debug = ();
fn foo() -> impl Foo<X> {
  ()
}

рдлрд┐рд░ рднреА, рдореБрдЭреЗ рд▓рдЧрддрд╛ рд╣реИ рдХрд┐ рд╕рдВрдмрдВрдзрд┐рдд рдкреНрд░рдХрд╛рд░ рдХреА рдмрд╛рдЗрдВрдбрд┐рдВрдЧ (рдЙрджрд╛рд╣рд░рдг рдХреЗ рд▓рд┐рдП, impl Iterator<Item = impl Debug> рдЗрди рдЕрд╕реНрдкрд╖реНрдЯрддрд╛рдУрдВ рд╕реЗ рдЧреНрд░рд╕реНрдд рдирд╣реАрдВ рд╣реИ) рдХреЛ рдЫреЛрдбрд╝рдХрд░, рдЕрд╕реНрддрд┐рддреНрд╡рдкрд░рдХ рдкреНрд░рднрд╛рд╡ рд╡рд┐рд╢реЗрд╖рддрд╛ рдХреЗ "рдиреЗрд╕реНрдЯреЗрдб" рдЙрдкрдпреЛрдЧреЛрдВ рдХреЛ рд╕реНрдерд┐рд░ рдХрд░рдиреЗ рд╕реЗ рдмрдЪрдирд╛ рд╕рдордЭрджрд╛рд░реА рд╣реЛрдЧреАред

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

рд╢рд╛рдпрдж рдпрд╣ UFCS рдЬреИрд╕рд╛ рджрд┐рдЦ рд╕рдХрддрд╛ рд╣реИ? рдЙрджрд╛рд╣рд░рдг рдХреЗ рд▓рд┐рдП <() as Foo<()>> -- рдирдВрдЧреЗ as рдЬреИрд╕реЗ рдкреНрд░рдХрд╛рд░ рдХреЛ рдирд╣реАрдВ рдмрджрд▓рдирд╛ , рдмрд╕ рдЗрд╕реЗ рдЕрд╕рдВрдмрджреНрдз рдХрд░рдирд╛ред рдпрд╣ рд╡рд░реНрддрдорд╛рди рдореЗрдВ рдЕрдорд╛рдиреНрдп рд╕рд┐рдВрдЯреИрдХреНрд╕ рд╣реИ рдХреНрдпреЛрдВрдХрд┐ рдпрд╣ :: рдФрд░ рдЕрдзрд┐рдХ рдЕрдиреБрд╕рд░рдг рдХрд░рдиреЗ рдХреА рдЕрдкреЗрдХреНрд╖рд╛ рдХрд░рддрд╛ рд╣реИред

рдореБрдЭреЗ Fn рд▓рд┐рдП impl Trait рдХреЗ рд╕рд╛рде рдкреНрд░рдХрд╛рд░ рдЕрдиреБрдорд╛рди рдХреЗ рд╕рдВрдмрдВрдз рдореЗрдВ рдПрдХ рджрд┐рд▓рдЪрд╕реНрдк рдорд╛рдорд▓рд╛ рдорд┐рд▓рд╛:
рдирд┐рдореНрдирд▓рд┐рдЦрд┐рдд рдХреЛрдб рдареАрдХ рд╕рдВрдХрд▓рд┐рдд рдХрд░рддрд╛ рд╣реИ :

fn op(s: &str) -> impl Fn(i32, i32) -> i32 {
    match s {
        "+" => ::std::ops::Add::add,
        "-" => ::std::ops::Sub::sub,
        "<" => |a,b| (a < b) as i32,
        _ => unimplemented!(),
    }
}

рдпрджрд┐ рд╣рдо рдЙрдк-рдкрдВрдХреНрддрд┐ рдкрд░ рдЯрд┐рдкреНрдкрдгреА рдХрд░рддреЗ рд╣реИрдВ, рддреЛ рдПрдХ рд╕рдВрдХрд▓рди рддреНрд░реБрдЯрд┐ рдЙрддреНрдкрдиреНрди рд╣реЛрддреА рд╣реИ :

error[E0308]: match arms have incompatible types
 --> src/main.rs:4:5
  |
4 | /     match s {
5 | |         "+" => ::std::ops::Add::add,
6 | | //         "-" => ::std::ops::Sub::sub,
7 | |         "<" => |a,b| (a < b) as i32,
8 | |         _ => unimplemented!(),
9 | |     }
  | |_____^ expected fn item, found closure
  |
  = note: expected type `fn(_, _) -> <_ as std::ops::Add<_>>::Output {<_ as std::ops::Add<_>>::add}`
             found type `[closure@src/main.rs:7:16: 7:36]`
note: match arm with an incompatible type
 --> src/main.rs:7:16
  |
7 |         "<" => |a,b| (a < b) as i32,
  |                ^^^^^^^^^^^^^^^^^^^^

error: aborting due to previous error

@oberien рдпрд╣ impl Trait рд╕реЗ рд╕рдВрдмрдВрдзрд┐рдд рдкреНрд░рддреАрдд рдирд╣реАрдВ рд╣реЛрддрд╛ рд╣реИ - рдпрд╣ рд╕рд╛рдорд╛рдиреНрдп рд░реВрдк рд╕реЗ рдЕрдиреБрдорд╛рди рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рд╕рдЪ рд╣реИред рдЕрдкрдиреЗ рдЙрджрд╛рд╣рд░рдг рдХреЗ рдЗрд╕ рдорд╛рдореВрд▓реА рд╕рдВрд╢реЛрдзрди рдХрд╛ рдкреНрд░рдпрд╛рд╕ рдХрд░реЗрдВ:

fn main() {
    let _: i32 = (match "" {
        "+" => ::std::ops::Add::add,
        //"-" => ::std::ops::Sub::sub,
        "<" => |a,b| (a < b) as i32,
        _ => unimplemented!(),
    })(5, 5);
}

рдРрд╕рд╛ рд▓рдЧрддрд╛ рд╣реИ рдХрд┐ рдпрд╣ рдЕрдм рдмрдВрдж рд╣реЛ рдЧрдпрд╛ рд╣реИ:

рдПрд▓рд┐рд╕рди рдХреЗ рд╕рд╛рде рдмрд╛рддрдЪреАрдд рдХрд░рддреЗ рд╕рдордп рдЖрдИрд╕реАрдИ

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

struct Counter(impl Generator<Yield=i32, Return=!>);

impl Counter {
    fn new() -> Counter {
        Counter(|| {
            let mut x: i32 = 0;
            loop {
                yield x;
                x += 1;
            }
        })
    }
}

impl Trait рдРрд╕рд╛ рдХрд░рдиреЗ рдХрд╛ рд╕рд╣реА рддрд░реАрдХрд╛ рдирд╣реАрдВ рд╣реЛ рд╕рдХрддрд╛ рд╣реИ - рд╢рд╛рдпрдж рдЕрдореВрд░реНрдд рдкреНрд░рдХрд╛рд░, рдЕрдЧрд░ рдореИрдВрдиреЗ RFC 2071 рдХреЛ рд╕рд╣реА рдврдВрдЧ рд╕реЗ рдкрдврд╝рд╛ рдФрд░ рд╕рдордЭрд╛ рд╣реИред рд╣рдореЗрдВ рдЬреЛ рдЪрд╛рд╣рд┐рдП рд╡рд╣ рдХреБрдЫ рдРрд╕рд╛ рд╣реИ рдЬрд┐рд╕реЗ рд╣рдо рд╕рдВрд░рдЪрдирд╛ рдкрд░рд┐рднрд╛рд╖рд╛ рдореЗрдВ рд▓рд┐рдЦ рд╕рдХрддреЗ рд╣реИрдВ рддрд╛рдХрд┐ рд╡рд╛рд╕реНрддрд╡рд┐рдХ рдкреНрд░рдХрд╛рд░ ( [generator@src/main.rs:15:17: 21:10 _] ) рдХрд╛ рдЕрдиреБрдорд╛рди рд▓рдЧрд╛рдпрд╛ рдЬрд╛ рд╕рдХреЗред

@mikeyhew рдЕрдореВрд░реНрдд рдкреНрд░рдХрд╛рд░ рд╡рд╛рд╕реНрддрд╡ рдореЗрдВ рдЬрд┐рд╕ рддрд░рд╣ рд╕реЗ рд╣рдо рдЙрдореНрдореАрдж рдХрд░рддреЗ рд╣реИрдВ рдХрд┐ рдХрд╛рдо рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП, рдореБрдЭреЗ рд╡рд┐рд╢реНрд╡рд╛рд╕ рд╣реИред рд╡рд╛рдХреНрдпрд╡рд┐рдиреНрдпрд╛рд╕ рдореЛрдЯреЗ рддреМрд░ рдкрд░ рдЬреИрд╕рд╛ рджрд┐рдЦреЗрдЧрд╛

abstract type MyGenerator: Generator<Yield = i32, Return = !>;

pub struct Counter(MyGenerator);

impl Counter {
    pub fn new() -> Counter {
        Counter(|| {
            let mut x: i32 = 0;
            loop {
                yield x;
                x += 1;
            }
        })
    }
}

рдХреНрдпрд╛ рдХреЛрдИ рдлрд╝реЙрд▓рдмреИрдХ рдкрде рд╣реИ рдпрджрд┐ рдпрд╣ рдХрд┐рд╕реА рдФрд░ рдХрд╛ impl Generator рдЬрд┐рд╕реЗ рдореИрдВ рдЕрдкрдиреА рд╕рдВрд░рдЪрдирд╛ рдореЗрдВ рд░рдЦрдирд╛ рдЪрд╛рд╣рддрд╛ рд╣реВрдВ, рд▓реЗрдХрд┐рди рдЙрдиреНрд╣реЛрдВрдиреЗ рдореЗрд░реЗ рдЙрдкрдпреЛрдЧ рдХреЗ рд▓рд┐рдП abstract type рдмрдирд╛рдпрд╛?

@scottmcm рдЖрдк рдЕрднреА рднреА рдЕрдкрдирд╛ рдЦреБрдж рдХрд╛ abstract type рдШреЛрд╖рд┐рдд рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ:

// library crate:
fn foo() -> impl Generator<Yield = i32, Return = !> { ... }

// your crate:
abstract type MyGenerator: Generator<Yield = i32, Return = !>;

pub struct Counter(MyGenerator);

impl Counter {
    pub fn new() -> Counter {
        let inner: MyGenerator = foo();
        Counter(inner)
    }
}

@cramertj рд░реБрдХреЛ, рдЕрдореВрд░реНрдд рдкреНрд░рдХрд╛рд░ рдкрд╣рд▓реЗ рд╕реЗ рд╣реА рд░рд╛рдд рдореЗрдВ рд╣реИрдВ ?! рдкреАрдЖрд░ рдХрд╣рд╛рдВ рд╣реИ?

@alexreg рдирд╣реАрдВ, рд╡реЗ рдирд╣реАрдВ рд╣реИрдВред

рд╕рдВрдкрд╛рджрд┐рдд рдХрд░реЗрдВ: рдирдорд╕реНрддреЗ, рднрд╡рд┐рд╖реНрдп рдХреЗ рдЖрдЧрдВрддреБрдХ! рдиреАрдЪреЗ рджреА рдЧрдИ рд╕рдорд╕реНрдпрд╛ рдХрд╛


рдореИрдВ рдЙрдкрдпреЛрдЧ рдХреЗ рдЗрд╕ рднрдпрд╛рдирдХ рдХрд┐рдирд╛рд░реЗ рдХреЗ рдорд╛рдорд▓реЗ рдкрд░ рдзреНрдпрд╛рди рдЖрдХрд░реНрд╖рд┐рдд рдХрд░рдирд╛ рдЪрд╛рд╣рддрд╛ рд╣реВрдВ рдЬреЛ #47348 . рдореЗрдВ рджрд┐рдЦрд╛рдИ рджреЗрддрд╛ рд╣реИ

use ::std::ops::Sub;

fn test(foo: impl Sub) -> <impl Sub as Sub>::Output { foo - foo }

рдХреНрдпрд╛ рдЗрд╕ рддрд░рд╣ impl Trait рдкрд░ рдкреНрд░реЛрдЬреЗрдХреНрд╢рди рд▓реМрдЯрд╛рдиреЗ рдХреА рднреА рдЕрдиреБрдорддрд┐ рджреА рдЬрд╛рдиреА рдЪрд╛рд╣рд┐рдП? (рдХреНрдпреЛрдВрдХрд┐ рд╡рд░реНрддрдорд╛рди рдореЗрдВ, __рдпрд╣ рд╣реИред__)

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

@ExpHP рд╣рдореНрдоред рдпрд╣ рд╕рдорд╕реНрдпрд╛рдЧреНрд░рд╕реНрдд рдкреНрд░рддреАрдд рд╣реЛрддрд╛ рд╣реИ, рдЗрд╕реА рдХрд╛рд░рдг рд╕реЗ impl Foo<impl Bar> рд╕рдорд╕реНрдпрд╛рдЧреНрд░рд╕реНрдд рд╣реИред рдореВрд▓ рд░реВрдк рд╕реЗ, рд╣рдорд╛рд░реЗ рдкрд╛рд╕ рдкреНрд░рд╢реНрди рдХреЗ рдкреНрд░рдХрд╛рд░ рдкрд░ рдХреЛрдИ рд╡рд╛рд╕реНрддрд╡рд┐рдХ рдмрд╛рдзрд╛ рдирд╣реАрдВ рд╣реИ - рдХреЗрд╡рд▓ рдЗрд╕рд╕реЗ рдирд┐рдХрд▓рдиреЗ рд╡рд╛рд▓реА рдЪреАрдЬреЛрдВ рдкрд░ред

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

https://github.com/rust-lang/rust/blob/a0dcecff90c45ad5d4eb60859e22bb3f1b03842a/src/librustc_typeck/constrained_type_params.rs#L89 -L93

рдЪреЗрдХрдмреЙрдХреНрд╕ рдкрд╕рдВрдж рдХрд░рдиреЗ рд╡рд╛рд▓реЗ рд▓реЛрдЧреЛрдВ рдХреЗ рд▓рд┐рдП рдЯреНрд░рд╛рдЗрдПрдЬ рдХрд╛ рдПрдХ рдЫреЛрдЯрд╛ рд╕рд╛ рд╣рд┐рд╕реНрд╕рд╛:

  • #46464 рд╣реЛ рдЧрдпрд╛ -> рдЪреЗрдХрдмреЙрдХреНрд╕
  • #48072 рд╣реЛ рдЧрдпрд╛ -> рдЪреЗрдХрдмреЙрдХреНрд╕

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

рдореЗрд░рд╛ рдкреНрд░рд╕реНрддрд╛рд╡ рд╣реИ рдХрд┐ рд╣рдо conservative_impl_trait рдФрд░ universal_impl_trait рд╕реБрд╡рд┐рдзрд╛рдУрдВ рдХреЛ рдПрдХ рд▓рдВрдмрд┐рдд рдкрд░рд┐рд╡рд░реНрддрди (https://github.com/rust-lang/rust/issues/46541) рдХреЗ рд▓рд┐рдП рдПрдХ рд╕реБрдзрд╛рд░ рдХреЗ рд╕рд╛рде рд╕реНрдерд┐рд░ рдХрд░реЗрдВред

рдкрд░реАрдХреНрд╖рдг рдЬреЛ рд╡рд░реНрддрдорд╛рди рд╢рдмреНрджрд╛рд░реНрде рдХрд╛ рджрд╕реНрддрд╛рд╡реЗрдЬреАрдХрд░рдг рдХрд░рддреЗ рд╣реИрдВ

рдЗрди рд╕реБрд╡рд┐рдзрд╛рдУрдВ рдХреЗ рд▓рд┐рдП рдкрд░реАрдХреНрд╖рдг рдирд┐рдореНрдирд▓рд┐рдЦрд┐рдд рдирд┐рд░реНрджреЗрд╢рд┐рдХрд╛рдУрдВ рдореЗрдВ рдкрд╛рдП рдЬрд╛ рд╕рдХрддреЗ рд╣реИрдВ:

рд░рди-рдкрд╛рд╕/рдЗрдореНрдкреНрд▓-рдЯреНрд░реЗрдЯ
ui/impl-рд╡рд┐рд╢реЗрд╖рддрд╛
рд╕рдВрдХрд▓рди-рдЕрд╕рдлрд▓/рдирд┐рд╣рд┐рдд-рд╡рд┐рд╢реЗрд╖рддрд╛

рдХрд╛рд░реНрдпрд╛рдиреНрд╡рдпрди рдХреЗ рджреМрд░рд╛рди рд╣рд▓ рдХрд┐рдП рдЧрдП рдкреНрд░рд╢реНрди

impl Trait рдХреА рдкрд╛рд░реНрд╕рд┐рдВрдЧ рдХрд╛ рд╡рд┐рд╡рд░рдг RFC 2250 рдореЗрдВ рд╣рд▓ рдХрд┐рдпрд╛ https://github.com/rust-lang/rust/pull/45294 рдореЗрдВ рд▓рд╛рдЧреВ рдХрд┐рдпрд╛ рдЧрдпрд╛

рдЕрд╕реНрдкрд╖реНрдЯрддрд╛ рдХреЛ рд░реЛрдХрдиреЗ рдХреЗ рд▓рд┐рдП impl Trait рдХреЛ рдиреЗрд╕реНрдЯреЗрдб-рдЧреИрд░-рд╕рдВрдмрджреНрдз-рдкреНрд░рдХрд╛рд░ рдХреА рд╕реНрдерд┐рддрд┐ рдФрд░ рдХреБрдЫ рдпреЛрдЧреНрдп рдкрде рд╕реНрдерд┐рддрд┐рдпреЛрдВ рд╕реЗ рдкреНрд░рддрд┐рдмрдВрдзрд┐рдд рдХрд░ рджрд┐рдпрд╛ рдЧрдпрд╛ рд╣реИред рдЗрд╕реЗ https://github.com/rust-lang/rust/pull/48084 рдореЗрдВ рд▓рд╛рдЧреВ рдХрд┐рдпрд╛ рдЧрдпрд╛ рдерд╛

рд╢реЗрд╖ рдЕрд╕реНрдерд┐рд░ рд╡рд┐рд╢реЗрд╖рддрд╛рдПрдВ

рдЗрд╕ рд╕реНрдерд┐рд░реАрдХрд░рдг рдХреЗ рдмрд╛рдж, impl Trait рдХреЛ рддрд░реНрдХ рд╕реНрдерд┐рддрд┐ рдФрд░ рдЧреИрд░-рд╡рд┐рд╢реЗрд╖рддрд╛ рдХрд╛рд░реНрдпреЛрдВ рдХреА рд╡рд╛рдкрд╕реА рд╕реНрдерд┐рддрд┐ рдореЗрдВ рдЙрдкрдпреЛрдЧ рдХрд░рдирд╛ рд╕рдВрднрд╡ рд╣реЛрдЧрд╛ред рд╣рд╛рд▓рд╛рдВрдХрд┐, impl Trait рдХрд╣реАрдВ рднреА Fn рд╕рд┐рдВрдЯреИрдХреНрд╕ рдХреЗ рдЙрдкрдпреЛрдЧ рдХреА рдЕрднреА рднреА рдЕрдиреБрдорддрд┐ рдирд╣реАрдВ рд╣реИ рддрд╛рдХрд┐ рднрд╡рд┐рд╖реНрдп рдХреЗ рдбрд┐рдЬрд╝рд╛рдЗрди рдкреБрдирд░рд╛рд╡реГрддреНрддрд┐ рдХреА рдЕрдиреБрдорддрд┐ рдорд┐рд▓ рд╕рдХреЗред рдЗрд╕рдХреЗ рдЕрддрд┐рд░рд┐рдХреНрдд, рддрд░реНрдХ рд╕реНрдерд┐рддрд┐ рдореЗрдВ impl Trait рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдиреЗ рд╡рд╛рд▓реЗ рдлрд╝рдВрдХреНрд╢рдВрд╕ рдХреЗ рдкреНрд░рдХрд╛рд░ рдкреИрд░рд╛рдореАрдЯрд░ рдХреЛ рдореИрдиреНрдпреБрдЕрд▓ рд░реВрдк рд╕реЗ рдирд┐рд░реНрджрд┐рд╖реНрдЯ рдХрд░рдиреЗ рдХреА рдЕрдиреБрдорддрд┐ рдирд╣реАрдВ рд╣реИред

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

  • [x] @ рдПрдЯреНрдпреВрд░реЙрди
  • [рдПрдХреНрд╕] @ рдХреНрд░реИрдорд░реНрдЯрдЬ
  • [x] @eddyb
  • [x] @nikomatsakis
  • [рдПрдХреНрд╕] @ рдПрдирдЖрд░рд╕реА
  • [x] @pkfelix
  • [x] @ рдирд╛рд╡реЛрдВ рдХреЗ рдмрд┐рдирд╛

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

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

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

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

рдЙрд╕ рдорд╛рдорд▓реЗ рдХреЗ рд▓рд┐рдП, рд╡рд┐рд╢реЗрд╖рддрд╛ рдХрд╛рд░реНрдпреЛрдВ рдореЗрдВ impl Trait рддрд░реНрдХ/рд╡рд╛рдкрд╕реА рд╕реНрдерд┐рддрд┐ рдореЗрдВ, рдпрд╛ Fn рд╡рд╛рдХреНрдпрд╡рд┐рдиреНрдпрд╛рд╕ рдореЗрдВ рдЙрдкрдпреЛрдЧ рдХрд░рдиреЗ рдХреА рд╕реНрдерд┐рддрд┐ рдХреНрдпрд╛ рд╣реИ ?

@alexreg рд╡рд╛рдкрд╕реА-рд╕реНрдерд┐рддрд┐ impl Trait рд▓рдХреНрд╖рдгреЛрдВ рдореЗрдВ рдПрдХ RFC рдкрд░ рдЕрд╡рд░реБрджреНрдз рд╣реИ, рд╣рд╛рд▓рд╛рдВрдХрд┐ RFC 2071 рдПрдХ рдмрд╛рд░ рд▓рд╛рдЧреВ рд╣реЛрдиреЗ рдХреЗ рдмрд╛рдж рд╕рдорд╛рди рдХрд╛рд░реНрдпрдХреНрд╖рдорддрд╛ рдХреА рдЕрдиреБрдорддрд┐ рджреЗрдЧрд╛ред рддрд░реНрдХ-рд╕реНрдерд┐рддрд┐ impl Trait рд▓рдХреНрд╖рдгреЛрдВ рдореЗрдВ рдХрд┐рд╕реА рднреА рддрдХрдиреАрдХреА рд╡рд┐рд╢реЗрд╖рддрд╛ рдкрд░ рдЕрд╡рд░реБрджреНрдз рдирд╣реАрдВ рд╣реИ, рдЬрд┐рд╕рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рдореБрдЭреЗ рдкрддрд╛ рд╣реИ, рд▓реЗрдХрд┐рди RFC рдореЗрдВ рдЗрд╕рдХреА рд╕реНрдкрд╖реНрдЯ рд░реВрдк рд╕реЗ рдЕрдиреБрдорддрд┐ рдирд╣реАрдВ рдереА, рдЗрд╕рд▓рд┐рдП рдЗрд╕реЗ рдХреБрдЫ рд╕рдордп рдХреЗ рд▓рд┐рдП рдЫреЛрдбрд╝ рджрд┐рдпрд╛ рдЧрдпрд╛ рд╣реИред

impl Trait рдХреА рддрд░реНрдХ рд╕реНрдерд┐рддрд┐ рдореЗрдВ Fn рд╕рд┐рдВрдЯреИрдХреНрд╕ рдХреЛ рдЯрд╛рдЗрдк-рд▓реЗрд╡рд▓ HRTB рдкрд░ рдмреНрд▓реЙрдХ рдХрд┐рдпрд╛ рдЧрдпрд╛ рд╣реИ, рдХреНрдпреЛрдВрдХрд┐ рдХреБрдЫ рд▓реЛрдЧреЛрдВ рдХреЛ рд▓рдЧрддрд╛ рд╣реИ рдХрд┐ T: Fn(impl Trait) рдХреЛ T: for<X: Trait> Fn(X) рдбрд┐рд╕реБрдЧрд░ рдХрд░рдирд╛ рдЪрд╛рд╣рд┐рдПред impl Trait рдХреА рд╡рд╛рдкрд╕реА рдХреА рд╕реНрдерд┐рддрд┐ рдореЗрдВ Fn рд╕рд┐рдВрдЯреИрдХреНрд╕ рдХрд┐рд╕реА рднреА рддрдХрдиреАрдХреА рдХрд╛рд░рдг рд╕реЗ рдЕрд╡рд░реБрджреНрдз рдирд╣реАрдВ рд╣реИ рдЬрд┐рд╕рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рдореБрдЭреЗ рдкрддрд╛ рд╣реИ, рд▓реЗрдХрд┐рди рдЖрд░рдПрдлрд╕реА рдореЗрдВ рдЖрдЧреЗ рдХреЗ рдбрд┐рдЬрд╛рдЗрди рдХрд╛рд░реНрдп рд▓рдВрдмрд┐рдд рд╣реЛрдиреЗ рдкрд░ рдЗрд╕реЗ рдЕрд╕реНрд╡реАрдХрд╛рд░ рдХрд░ рджрд┐рдпрд╛ рдЧрдпрд╛ рдерд╛-- рдореИрдВ рдЙрдореНрдореАрдж рдХрд░рддрд╛ рд╣реВрдВ рдПрдХ рдФрд░ рдЖрд░рдПрдлрд╕реА рджреЗрдЦреЗрдВ рдпрд╛ рдХрдо рд╕реЗ рдХрдо рдПрдХ рдЕрд▓рдЧ FCP рдЗрд╕реЗ рд╕реНрдерд┐рд░ рдХрд░рдиреЗ рд╕реЗ рдкрд╣рд▓реЗред

@cramertj рдареАрдХ рд╣реИ, рдЕрдкрдбреЗрдЯ рдХреЗ рд▓рд┐рдП рдзрдиреНрдпрд╡рд╛рджред рдЙрдореНрдореАрдж рд╣реИ рдХрд┐ рд╣рдо рдЗрди рджреЛ рд╡рд┐рд╢реЗрд╖рддрд╛рдУрдВ рдХреЛ рджреЗрдЦ рд╕рдХрддреЗ рд╣реИрдВ рдЬреЛ рдХрд┐рд╕реА рднреА рдЪреАрдЬрд╝ рдкрд░ рдЕрд╡рд░реБрджреНрдз рдирд╣реАрдВ рд╣реИрдВ, рдХреБрдЫ рдЪрд░реНрдЪрд╛ рдХреЗ рдмрд╛рдж рдЬрд▓реНрдж рд╣реА рдЖрдЧреЗ рдмрдврд╝реЗрдВред Desugaring рд╕рдордЭ рдореЗрдВ рдЖрддрд╛ рд╣реИ, рддрд░реНрдХ рд╕реНрдерд┐рддрд┐ рдореЗрдВ, рдПрдХ рддрд░реНрдХ foo: T рдЬрд╣рд╛рдВ T: Trait рдмрд░рд╛рдмрд░ рд╣реИ foo: impl Trait , рдЬрдм рддрдХ рдХрд┐ рдореИрдВ рдЧрд▓рдд рдирд╣реАрдВ рд╣реВрдВред

рдЪрд┐рдВрддрд╛: https://github.com/rust-lang/rust/issues/34511#issuecomment -322340401 рдЕрднреА рднреА рд╡рд╣реА рд╣реИред рдХреНрдпрд╛ рдирд┐рдореНрдирд▓рд┐рдЦрд┐рдд рдХреА рдЕрдиреБрдорддрд┐ рджреЗрдирд╛ рд╕рдВрднрд╡ рд╣реИ?

fn do_it_later_but_cannot() -> impl Iterator<Item=u8> { //~ ERROR E0227
    unimplemented!()
}

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

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

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

рдкреНрд░реЗрд░рдгрд╛ рд╕реНрдкрд╖реНрдЯ рдЬреЗрдиреЗрд░рд┐рдХ рд╕реЗ impl Trait рддрд░реНрдХ рдХреЛ рдмрджрд▓рдХрд░ рдЙрдкрдпреЛрдЧрдХрд░реНрддрд╛рдУрдВ рдХреА рдЯрд░реНрдмреЛрдлрд┐рд╢ рдХреЛ рддреЛрдбрд╝рдиреЗ рд╕реЗ рд░реЛрдХрдиреЗ рдХреЗ рд▓рд┐рдП рд╣реИред

рдореБрдЭреЗ рдЙрдореНрдореАрдж рд╣реИ рдХрд┐ рдЬрдм рдРрд╕рд╛ рд╣реЛрдиреЗ рд▓рдЧреЗрдЧрд╛ рдФрд░ рд▓реЛрдЧ рд▓реИрдВрдЧ-рдЯреАрдо рдХреА рд╢рд┐рдХрд╛рдпрдд рдХрд░рдирд╛ рд╢реБрд░реВ рдХрд░ рджреЗрдВрдЧреЗ, рдЬреЛ рд╡рд░реНрддрдорд╛рди рдореЗрдВ рд╕рдВрджреЗрд╣ рдореЗрдВ рд╣реИрдВ, рд╡реЗ рдЖрд╢реНрд╡рд╕реНрдд рд╣реЛрдВрдЧреЗ рдХрд┐ impl Trait рдХреЛ рдЯрд░реНрдмреЛрдлрд┐рд╢ рдХреЗ рд╕рд╛рде рд╕реНрдкрд╖реНрдЯ рд░реВрдк рд╕реЗ рдЖрдкреВрд░реНрддрд┐ рдкреНрд░рдХрд╛рд░ рдХреЗ рддрд░реНрдХреЛрдВ рдХрд╛ рд╕рдорд░реНрдерди рдХрд░рдирд╛ рдЪрд╛рд╣рд┐рдПред

@leodasvacas

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

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

рдпрджрд┐ рд╣рдо рднрд╡рд┐рд╖реНрдп рдореЗрдВ рдЗрди рдХрд╛рд░реНрдпреЛрдВ рдХреЗ рд▓рд┐рдП рдЯрд░реНрдмреЛрдлрд┐рд╢ рдХреА рдЕрдиреБрдорддрд┐ рджреЗрддреЗ рд╣реИрдВ, рддреЛ рдпрд╣ рд╕рдВрднрд╡рддрдГ рдХреЗрд╡рд▓ рдЧреИрд░- impl Trait рдкреНрд░рдХрд╛рд░ рдХреЗ рдорд╛рдкрджрдВрдбреЛрдВ рдХреЛ рдирд┐рд░реНрджрд┐рд╖реНрдЯ рдХрд░рдиреЗ рдХреА рдЕрдиреБрдорддрд┐ рджреЗрдЧрд╛ред

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

рдореБрдЭреЗ рдпрд╣ рдЬреЛрдбрд╝рдирд╛ рдЪрд╛рд╣рд┐рдП рдХрд┐ рдореИрдВ https://github.com/rust-lang/rust/pull/49041 рднреВрдорд┐ рддрдХ рд╕реНрдерд┐рд░ рдирд╣реАрдВ рд╣реЛрдирд╛ рдЪрд╛рд╣рддрд╛ред (рд▓реЗрдХрд┐рди рдЙрдореНрдореАрдж рд╣реИ рдХрд┐ рдпрд╣ рдЬрд▓реНрдж рд╣реА рд╣реЛрдЧрд╛ред)

рддреЛ #49041 рдореЗрдВ #46541 рдХреЗ рд▓рд┐рдП рдПрдХ рдлрд┐рдХреНрд╕ рд╣реИ, рд▓реЗрдХрд┐рди рдЙрд╕ рдлрд┐рдХреНрд╕ рдХрд╛ рдореЗрд░реЗ рдЕрдиреБрдорд╛рди рд╕реЗ рдЕрдзрд┐рдХ рдкреНрд░рднрд╛рд╡ рд╣реИ - рдЙрджрд╛рд╣рд░рдг рдХреЗ рд▓рд┐рдП, рдХрдВрдкрд╛рдЗрд▓рд░ рдЕрдм рдмреВрдЯрд╕реНрдЯреНрд░реИрдк рдирд╣реАрдВ рдХрд░рддрд╛ рд╣реИ - рдФрд░ рдпрд╣ рдореБрдЭреЗ рдпрд╣рд╛рдВ рд╕рд╣реА рдкрд╛рдареНрдпрдХреНрд░рдо рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рдХреБрдЫ рд╡рд┐рд░рд╛рдо рджреЗ рд░рд╣рд╛ рд╣реИред #49041 рдореЗрдВ рд╕рдорд╕реНрдпрд╛ рдпрд╣ рд╣реИ рдХрд┐ рд╣рдо рдЧрд▓рддреА рд╕реЗ рдЬреАрд╡рди рднрд░ рдХреЛ рд▓реАрдХ рд╣реЛрдиреЗ рджреЗ рд╕рдХрддреЗ рд╣реИрдВ рдЬреЛ рд╣рдореЗрдВ рдирд╣реАрдВ рдХрд░рдирд╛ рдЪрд╛рд╣рд┐рдП рдерд╛ред рдпрд╣рд╛рдВ рдмрддрд╛рдпрд╛ рдЧрдпрд╛ рд╣реИ рдХрд┐ рдпрд╣ рдХрдВрдкрд╛рдЗрд▓рд░ рдореЗрдВ рдХреИрд╕реЗ рдкреНрд░рдХрдЯ рд╣реЛрддрд╛ рд╣реИред рд╣рдорд╛рд░реЗ рдкрд╛рд╕ рдЗрд╕ рддрд░рд╣ рдХреА рдПрдХ рд╡рд┐рдзрд┐ рд╣реЛ рд╕рдХрддреА рд╣реИ:

impl TyCtxt<'cx, 'gcx, 'tcx>
where 'gcx: 'tcx, 'tcx: 'cx
{
    fn foos(self) -> impl Iterator<Item = &'tcx Foo> + 'cx {
        /* returns some type `Baz<'cx, 'gcx, 'tcx>` that captures self */
    }
}

рдпрд╣рд╛рдВ рдорд╣рддреНрд╡рдкреВрд░реНрдг рдмрд╛рдд рдпрд╣ рд╣реИ рдХрд┐ TyCtxt рдЕрдкрд░рд┐рд╡рд░реНрддрдиреАрдп w/r/t 'tcx рдФрд░ 'gcx , рдЗрд╕рд▓рд┐рдП рдЙрдиреНрд╣реЗрдВ рд░рд┐рдЯрд░реНрди рдкреНрд░рдХрд╛рд░ рдореЗрдВ рджрд┐рдЦрдирд╛ рдЪрд╛рд╣рд┐рдП ред рдФрд░ рдлрд┐рд░ рднреА рдХреЗрд╡рд▓ 'cx рдФрд░ 'tcx рдирд┐рд╣рд┐рдд рд╡рд┐рд╢реЗрд╖рддрд╛ рд╕реАрдорд╛ рдореЗрдВ рджрд┐рдЦрд╛рдИ рджреЗрддреЗ рд╣реИрдВ, рдЗрд╕рд▓рд┐рдП рдХреЗрд╡рд▓ рдЙрди рджреЛ рдЬреАрд╡рдирдХрд╛рд▓реЛрдВ рдХреЛ "рдХрдмреНрдЬрд╛" рдХрд┐рдпрд╛ рдЬрд╛рдирд╛ рдЪрд╛рд╣рд┐рдПред рдкреБрд░рд╛рдирд╛ рд╕рдВрдХрд▓рдХ рдЗрд╕реЗ рд╕реНрд╡реАрдХрд╛рд░ рдХрд░ рд░рд╣рд╛ рдерд╛ рдХреНрдпреЛрдВрдХрд┐ 'gcx: 'cx , рд▓реЗрдХрд┐рди рдпрд╣ рд╡рд╛рд╕реНрддрд╡ рдореЗрдВ рд╕рд╣реА рдирд╣реАрдВ рд╣реИ рдпрджрд┐ рдЖрдк рд╣рдорд╛рд░реЗ рдорди рдореЗрдВ рдореМрдЬреВрдж рдбрд┐рд╕реБрдЧрд░рд┐рдВрдЧ рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рд╕реЛрдЪрддреЗ рд╣реИрдВред рд╡рд╣ desugaring рдЗрд╕ рддрд░рд╣ рдПрдХ рдЕрдореВрд░реНрдд рдкреНрд░рдХрд╛рд░ рддреИрдпрд╛рд░ рдХрд░реЗрдЧрд╛:

abstract type Foos<'cx, 'tcx>: Iterator<Item = &'tcx Foo> + 'cx;

рдФрд░ рдлрд┐рд░ рднреА рдЗрд╕ рдЕрдореВрд░реНрдд рдкреНрд░рдХрд╛рд░ рдХрд╛ рдореВрд▓реНрдп Baz<'cx, 'gcx, 'tcx> - рд▓реЗрдХрд┐рди 'gcx рджрд╛рдпрд░реЗ рдореЗрдВ рдирд╣реАрдВ рд╣реИ!

рдпрд╣рд╛рдВ рд╕рдорд╛рдзрд╛рди рдпрд╣ рд╣реИ рдХрд┐ рд╣рдореЗрдВ рд╕реАрдорд╛ рдореЗрдВ 'gcx рдирд╛рдо рджреЗрдирд╛ рд╣реЛрдЧрд╛ред рдРрд╕рд╛ рдХрд░рдирд╛ рдХрд╖реНрдЯрдкреНрд░рдж рд╣реИ; рд╣рдо 'cx + 'gcx рдЙрдкрдпреЛрдЧ рдирд╣реАрдВ рдХрд░ рд╕рдХрддреЗред рд╣рдо рдорд╛рди рд╕рдХрддреЗ рд╣реИрдВ рдХрд┐ рдПрдХ рдбрдореА рд╡рд┐рд╢реЗрд╖рддрд╛ рд╣реИ:

trait Captures<'a> { }
impl<T: ?Sized> Captures<'a> for T { }

рдФрд░ рдлрд┐рд░ рдХреБрдЫ рдЗрд╕ рддрд░рд╣ рд╡рд╛рдкрд╕ рдХрд░реЗрдВ impl Iterator<Item = &'tcx Foo> + Captures<'gcx> + Captures<'cx> ред

рдХреБрдЫ рдореИрдВ рдиреЛрдЯ рдХрд░рдирд╛ рднреВрд▓ рдЧрдпрд╛: рдпрджрд┐ рдШреЛрд╖рд┐рдд рд╡рд╛рдкрд╕реА рдкреНрд░рдХрд╛рд░ dyn Iterator<Item = &'tcx Foo> + 'cx , рддреЛ рдпрд╣ рдареАрдХ рд░рд╣реЗрдЧрд╛, рдХреНрдпреЛрдВрдХрд┐ dyn рдкреНрд░рдХрд╛рд░ рдЬреАрд╡рдирдХрд╛рд▓ рдорд┐рдЯрд╛рдиреЗ рдХреА рдЙрдореНрдореАрдж рд╣реИред рдЗрд╕рд▓рд┐рдП рдореБрдЭреЗ рд╡рд┐рд╢реНрд╡рд╛рд╕ рдирд╣реАрдВ рдХрд┐рд╕реА рднреА рдХрд╛рд░рдг рд╕реАрдорд┐рдд рдпрд╣рд╛рдВ рд╕рдВрднрд╡ рд╣реИ, рдпрд╣ рдорд╛рдирддреЗ рд╣реБрдП рдЖрдк рдХреЗ рд╕рд╛рде рдХреБрдЫ рднреА рд╕рдорд╕реНрдпрд╛рдЧреНрд░рд╕реНрдд рдирд╣реАрдВ рдХрд░ рд╕рдХрддреЗ рдПрдХ impl Trait рд╣реИ рдХрд┐ рдПрдХ рд╕рд╛рде рд╕рдВрднрд╡ рдирд╣реАрдВ рд╣реЛрдЧрд╛ dyn Trait ред

рдХреЛрдИ рдЗрд╕ рд╡рд┐рдЪрд╛рд░ рдХреА рдЕрд╕реНрдкрд╖реНрдЯ рдХрд▓реНрдкрдирд╛ рдХрд░ рд╕рдХрддрд╛ рд╣реИ рдХрд┐ рдЕрдореВрд░реНрдд рдкреНрд░рдХрд╛рд░ рдХрд╛ рдореВрд▓реНрдп рдПрдХ рд╕рдорд╛рди рдЕрд╕реНрддрд┐рддреНрд╡рдЧрдд рд╣реИ: exists<'gcx> Baz<'cx, 'gcx, 'tcx> ред

рд╣рд╛рд▓рд╛рдВрдХрд┐ рдореБрдЭреЗ рд▓рдЧрддрд╛ рд╣реИ рдХрд┐ рдПрдХ рд░реВрдврд╝рд┐рд╡рд╛рджреА рдЙрдкрд╕рдореБрдЪреНрдЪрдп (рдЬреЛ рдКрдкрд░ fns рдХреЛ рдирд┐рдпрдВрддреНрд░рд┐рдд рдХрд░рддрд╛ рд╣реИ) рдХреЛ рд╕реНрдерд┐рд░ рдХрд░рдирд╛ рдФрд░ рдмрд╛рдж рдореЗрдВ рд╕рдВрднрд╛рд╡рд┐рдд рд╡рд┐рд╕реНрддрд╛рд░ рдХреЗ рд░реВрдк рдореЗрдВ рдЗрд╕реЗ рдлрд┐рд░ рд╕реЗ рджреЗрдЦрдирд╛ рдареАрдХ рд╣реИ, рдПрдХ рдмрд╛рд░ рд╣рдордиреЗ рдпрд╣ рддрдп рдХрд░ рд▓рд┐рдпрд╛ рдХрд┐ рд╣рдо рдЗрд╕рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рдХреИрд╕реЗ рд╕реЛрдЪрдирд╛ рдЪрд╛рд╣рддреЗ рд╣реИрдВред

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

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

Captures рд╡рд┐рд╢реЗрд╖рддрд╛ рдЗрд╕ рд╕реНрдерд┐рддрд┐ рдХреЗ рд▓рд┐рдП рдПрдХ рдЕрдЪреНрдЫрд╛, рд╣рд▓реНрдХрд╛ рддрд░реАрдХрд╛ рд▓рдЧрддрд╛ рд╣реИред рдРрд╕рд╛ рд▓рдЧрддрд╛ рд╣реИ рдХрд┐ рдпрд╣ рдЗрд╕ рд╕рдордп рдЕрд╕реНрдерд┐рд░ рдХреЗ рд░реВрдк рдореЗрдВ std::marker рдореЗрдВ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИ?

@nikomatsakis рдЖрдкрдХреА рдЕрдиреБрд╡рд░реНрддреА рдЯрд┐рдкреНрдкрдгреА рдиреЗ рдореБрдЭреЗ рдорд╣рд╕реВрд╕ рдХрд┐рдпрд╛ рдХрд┐ рдореИрдВрдиреЗ рдпрд╣ рд╕рдордЭрдиреЗ рдХреЗ рд▓рд┐рдП рдпрд╣рд╛рдВ рд╕рднреА рдЯреБрдХрдбрд╝реЛрдВ рдХреЛ рдПрдХ рд╕рд╛рде рдирд╣реАрдВ рд░рдЦрд╛ рдерд╛ рдХрд┐ рдЖрдк рдЗрд╕ рдорд╛рдорд▓реЗ рдореЗрдВ 'gcx рдХреЛ рдЦрддреНрдо рдХрд░рдиреЗ рдХреА рдЙрдореНрдореАрдж рдХреНрдпреЛрдВ рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ, рдпрд╛рдиреА 'gcx рдПрдХ рдирд╣реАрдВ рд╣реИ рдЧреНрд░рд╛рд╣рдХ рдХреЗ рджреГрд╖реНрдЯрд┐рдХреЛрдг рд╕реЗ "рдкреНрд░рд╛рд╕рдВрдЧрд┐рдХ рдЬреАрд╡рдирдХрд╛рд▓"ред рдХрд┐рд╕реА рднреА рдорд╛рдорд▓реЗ рдореЗрдВ, рд░реВрдврд╝рд┐рд╡рд╛рджреА рд╢реБрд░реВ рдХрд░рдирд╛ рдареАрдХ рд▓рдЧрддрд╛ рд╣реИред

рдореЗрд░реА рд╡реНрдпрдХреНрддрд┐рдЧрдд рд░рд╛рдп рдпрд╣ рд╣реИ рдХрд┐ https://github.com/rust-lang/rust/issues/46541 рд╡рд╛рд╕реНрддрд╡ рдореЗрдВ рдХреЛрдИ рдмрдЧ рдирд╣реАрдВ рд╣реИ-- рдпрд╣ рд╡рд╣ рд╡реНрдпрд╡рд╣рд╛рд░ рд╣реИ рдЬрд┐рд╕рдХреА рдореИрдВ рдЕрдкреЗрдХреНрд╖рд╛ рдХрд░рддрд╛ рд╣реВрдВ, рдореИрдВ рдирд╣реАрдВ рджреЗрдЦрддрд╛ рдХрд┐ рдЗрд╕реЗ рдХреИрд╕реЗ рдЕрд╕реНрд╡рд╕реНрде рдмрдирд╛рдпрд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИ, рдФрд░ рдпрд╣ рдХрд╛рдо рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдПрдХ рджрд░реНрдж рд╣реИред рдЖрдИрдПрдордУ рдПрдХ рдкреНрд░рдХрд╛рд░ рдХреЛ рд╡рд╛рдкрд╕ рдХрд░рдирд╛ рд╕рдВрднрд╡ рд╣реЛрдирд╛ рдЪрд╛рд╣рд┐рдП рдЬреЛ Trait рдФрд░ рдЬреАрд╡рдирдХрд╛рд▓ 'a рдХреЛ impl Trait + 'a рдореЗрдВ рд░рдЦрддрд╛ рд╣реИ, рдЗрд╕рд╕реЗ рдХреЛрдИ рдлрд░реНрдХ рдирд╣реАрдВ рдкрдбрд╝рддрд╛ рдХрд┐ рдЗрд╕рдореЗрдВ рдЕрдиреНрдп рдЬреАрд╡рдирдХрд╛рд▓ рдХреНрдпрд╛ рд╣реИрдВред рд╣рд╛рд▓рд╛рдВрдХрд┐, рдореИрдВ рд╢реБрд░реВ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдПрдХ рдЕрдзрд┐рдХ рд░реВрдврд╝рд┐рд╡рд╛рджреА рджреГрд╖реНрдЯрд┐рдХреЛрдг рдХреЛ рд╕реНрдерд┐рд░ рдХрд░рдиреЗ рдХреЗ рд╕рд╛рде рдареАрдХ рд╣реВрдВ рдЕрдЧрд░ рд╡рд╣ @ рдЬрдВрдЧ-рд▓реИрдВрдЧ/рд▓реИрдВрдЧ рдкрд╕рдВрдж рдХрд░рддрд╛ рд╣реИред

(рд╕реНрдкрд╖реНрдЯ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдПрдХ рдФрд░ рдмрд╛рдд: #49041 рдореЗрдВ рдлрд┐рдХреНрд╕ рдХреЗ рд╕рд╛рде рдХреЗрд╡рд▓ рдПрдХ рдмрд╛рд░ рдЖрдкрдХреЛ рддреНрд░реБрдЯрд┐рдпрд╛рдВ рдорд┐рд▓реЗрдВрдЧреА, рдЬрдм рдЫреБрдкрд╛ рдкреНрд░рдХрд╛рд░ рд▓рд╛рдкрддрд╛ рдЬреАрд╡рдирдХрд╛рд▓ рдХреЗ рд╕рдВрдмрдВрдз рдореЗрдВ рдЕрдкрд░рд┐рд╡рд░реНрддрдиреАрдп рд╣реИ 'gcx , рдЗрд╕рд▓рд┐рдП рдпрд╣ рд╢рд╛рдпрдж рдЕрдкреЗрдХреНрд╖рд╛рдХреГрдд рдХрдо рд╣реА рд╣рдорд▓рд╛ рдХрд░рддрд╛ рд╣реИред)

@cramertj

рдореЗрд░реА рдирд┐рдЬреА рд░рд╛рдп рд╣реИ рдХрд┐ #46541 рд╡рд╛рд╕реНрддрд╡ рдореЗрдВ рдХреЛрдИ рдмрдЧ рдирд╣реАрдВ рд╣реИ-- рдпрд╣ рд╡рд╣ рд╡реНрдпрд╡рд╣рд╛рд░ рд╣реИ рдЬрд┐рд╕рдХреА рдореИрдВ рдЕрдкреЗрдХреНрд╖рд╛ рдХрд░рддрд╛ рд╣реВрдВ, рдореИрдВ рдирд╣реАрдВ рджреЗрдЦрддрд╛ рдХрд┐ рдЗрд╕реЗ рдХреИрд╕реЗ рд╡рд┐рдХреГрдд рдХрд┐рдпрд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИ, рдФрд░ рдпрд╣ рдХрд╛рдо рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдПрдХ рджрд░реНрдж рд╣реИред

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

@rfcbot рдмрд╣реБ-рд╡рд╛рдкрд╕реА-рд╕рд╛рдЗрдЯреЛрдВ рдХреА рдЪрд┐рдВрддрд╛ рдХрд░рддрд╛ рд╣реИ

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

fn foo(empty: bool) -> impl Iterator<Item = u32> {
    if empty { None.into_iter() } else { &[1, 2, 3].cloned() }
}

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

fn foo(empty: bool) -> (impl Debug, impl Debug) {
    if empty { return (22, Default::default()); }
    return (Default::default(), false);
}

рдпрд╣рд╛рдВ, рдЕрдиреБрдорд╛рдирд┐рдд рдкреНрд░рдХрд╛рд░ (i32, bool) , рдЬрд╣рд╛рдВ рдкрд╣рд▓рд╛ return i32 рднрд╛рдЧ рдХреЛ рд╕реАрдорд┐рдд рдХрд░рддрд╛ рд╣реИ, рдФрд░ рджреВрд╕рд░рд╛ return bool рднрд╛рдЧ рдХреЛ рд╕реАрдорд┐рдд рдХрд░рддрд╛ рд╣реИред

рдЗрд╕рдХрд╛ рддрд╛рддреНрдкрд░реНрдп рдпрд╣ рд╣реИ рдХрд┐ рд╣рдо рдЙрди рдорд╛рдорд▓реЛрдВ рдХрд╛ рд╕рдорд░реНрдерди рдХрднреА рдирд╣реАрдВ рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ рдЬрд╣рд╛рдВ рджреЛ return рдмрдпрд╛рди рдПрдХрдЬреБрдЯ рдирд╣реАрдВ рд╣реЛрддреЗ рд╣реИрдВ (рдЬреИрд╕рд╛ рдХрд┐ рдореЗрд░реЗ рдкрд╣рд▓реЗ рдЙрджрд╛рд╣рд░рдг рдореЗрдВ рд╣реИ) - рдЕрдиреНрдпрдерд╛ рдРрд╕рд╛ рдХрд░рдирд╛ рдмрд╣реБрдд рдХрд╖реНрдЯрдкреНрд░рдж рд╣реЛрдЧрд╛ред

рдореБрдЭреЗ рдЖрд╢реНрдЪрд░реНрдп рд╣реИ рдХрд┐ рдХреНрдпрд╛ рд╣рдореЗрдВ рдПрдХ рдмрд╛рдзрд╛ рдбрд╛рд▓рдиреА рдЪрд╛рд╣рд┐рдП рдЬрд┐рд╕рдХреЗ рд▓рд┐рдП рдкреНрд░рддреНрдпреЗрдХ return (рд╕рд╛рдорд╛рдиреНрдп рд░реВрдк рд╕реЗ, рдПрдХ рдмрд╛рдзрд╛ рдХреЗ рдкреНрд░рддреНрдпреЗрдХ рд╕реНрд░реЛрдд) рдХреЛ рд╕реНрд╡рддрдВрддреНрд░ рд░реВрдк рд╕реЗ рдкреВрд░реА рддрд░рд╣ рд╕реЗ рдирд┐рд░реНрджрд┐рд╖реНрдЯ рдХрд┐рдпрд╛ рдЬрд╛рдирд╛ рдЪрд╛рд╣рд┐рдП? (рдФрд░ рд╣рдо рдЙрдиреНрд╣реЗрдВ рдЗрд╕ рддрдереНрдп рдХреЗ рдмрд╛рдж рдПрдХрдЬреБрдЯ рдХрд░рддреЗ рд╣реИрдВ?)

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

@rfcbot рдПрдХрд╛рдзрд┐рдХ-рд╡рд╛рдкрд╕реА-рд╕рд╛рдЗрдЯреЛрдВ рдХреЛ рд╣рд▓ рдХрд░рддрд╛ рд╣реИ

рдЗрд╕рд▓рд┐рдП рдореИрдВрдиреЗ @cramertj рд╕реЗ # рдХрд╛рдлреА рд╣рдж рддрдХ рдмрд╛рдд рдХреАред рд╣рдо impl Trait рд▓рд┐рдП "рдЬрд▓реНрджреА рд╡рд╛рдкрд╕реА" рдХреЛ рдЕрд╕реНрдерд┐рд░ рдмрдирд╛рдиреЗ рдХреЗ рд╡рд┐рдЪрд╛рд░ рдкрд░ рдЪрд░реНрдЪрд╛ рдХрд░ рд░рд╣реЗ рдереЗ, рддрд╛рдХрд┐ рд╣рдо рдЕрдВрддрддрдГ рдЗрд╕реЗ рдмрджрд▓ рд╕рдХреЗрдВред

рдЙрдиреНрд╣реЛрдВрдиреЗ рдпрд╣ рдорд╛рдорд▓рд╛ рдмрдирд╛рдпрд╛ рдХрд┐ рдЗрд╕ рдкреНрд░рдХрд╛рд░ рдХреЗ рд╕рд┐рдВрдЯреИрдХреНрд╕ рдХреЗ рд▓рд┐рдП рдПрдХ рд╕реНрдкрд╖реНрдЯ рдСрдкреНрдЯ-рдЗрди рдХрд░рдирд╛ рдмреЗрд╣рддрд░ рд╣реЛрдЧрд╛, рд╡рд┐рд╢реЗрд╖ рд░реВрдк рд╕реЗ рдХреНрдпреЛрдВрдХрд┐ рдЕрдиреНрдп рдорд╛рдорд▓реЗ рд╣реИрдВ (рдЙрджрд╛рд╣рд░рдг рдХреЗ рд▓рд┐рдП, let x: impl Trait = if { ... } else { ... } ) рдЬрд╣рд╛рдВ рдХреЛрдИ рдЗрд╕реЗ рдЪрд╛рд╣реЗрдЧрд╛, рдФрд░ рд╣рдо рдЙрдореНрдореАрдж рдирд╣реАрдВ рдХрд░ рд╕рдХрддреЗ рдЙрди рд╕рднреА рдХреЛ рдирд┐рд╣рд┐рдд рд░реВрдк рд╕реЗ рд╕рдВрднрд╛рд▓рдиреЗ рдХреЗ рд▓рд┐рдП (рдирд┐рд╢реНрдЪрд┐рдд рд░реВрдк рд╕реЗ рдирд╣реАрдВ)ред

рдореБрдЭреЗ рдпрд╣ рдХрд╛рдлреА рдкреНрд░реЗрд░рдХ рд▓рдЧрддрд╛ рд╣реИред рдЗрд╕рд╕реЗ рдкрд╣рд▓реЗ, рдореИрдВ рдорд╛рди рд░рд╣рд╛ рдерд╛ рдХрд┐ рд╡реИрд╕реЗ рднреА рд╣рдорд╛рд░реЗ рдкрд╛рд╕ рдХреБрдЫ рдСрдкреНрдЯ-рдЗрди рд╕рд┐рдВрдЯреИрдХреНрд╕ рд╣реЛрдЧрд╛, рд▓реЗрдХрд┐рди рдореИрдВ рд╕рд┐рд░реНрдл рдпрд╣ рд╕реБрдирд┐рд╢реНрдЪрд┐рдд рдХрд░рдирд╛ рдЪрд╛рд╣рддрд╛ рдерд╛ рдХрд┐ рд╣рдордиреЗ рд╕рдордп рд╕реЗ рдкрд╣рд▓реЗ рдХреЛрдИ рджрд░рд╡рд╛рдЬрд╛ рдмрдВрдж рдирд╣реАрдВ рдХрд┐рдпрд╛ред рдЖрдЦрд┐рд░рдХрд╛рд░, рдЬрдм рдЖрдкрдХреЛ "рдбрд╛рдпрдиреЗрдорд┐рдХ рд╢рд┐рдо" рдбрд╛рд▓рдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реЛрддреА рд╣реИ, рддреЛ рдпрд╣ рд╕рдордЭрд╛рдирд╛ рдореБрд╢реНрдХрд┐рд▓ рд╣реИред

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

рд╡рд╣ рдкрд╣рд▓рд╛ foo рдЙрджрд╛рд╣рд░рдг, рдЬрд╣рд╛рдВ рддрдХ тАЛтАЛрдореБрдЭреЗ рд╕рдорд╕реНрдпрд╛ рд╕рдордЭ рдореЗрдВ рдЖрдИ, рдпрд╛ рддреЛ (1) рдПрдХ рдмреЙрдХреНрд╕рд┐рдВрдЧ + рдЯрд╛рдЗрдк-рдорд┐рдЯрд╛ Iterator<Item = u32> , рдпрд╛ (2) рдПрдХ рдпреЛрдЧ рдкреНрд░рдХрд╛рд░ std::option::Iter рдХреЛ рд╣рд▓ рдХрд░ рд╕рдХрддрд╛ рд╣реИ std::slice::Iter , рдЬреЛ рдмрджрд▓реЗ рдореЗрдВ Iterator рдХрд╛рд░реНрдпрд╛рдиреНрд╡рдпрди рдкреНрд░рд╛рдкреНрдд рдХрд░реЗрдЧрд╛ред рдЗрд╕реЗ рдЫреЛрдЯрд╛ рд░рдЦрдиреЗ рдХреА рдХреЛрд╢рд┐рд╢ рдХреА рдЬрд╛ рд░рд╣реА рд╣реИ, рдХреНрдпреЛрдВрдХрд┐ рдЪрд░реНрдЪрд╛ рдкрд░ рдХреБрдЫ рдЕрдкрдбреЗрдЯ рдереЗ (рдЕрд░реНрдерд╛рддреН, рдореИрдВрдиреЗ рдЕрднреА рдЖрдИрдЖрд░рд╕реА рд▓реЙрдЧ рдкрдврд╝рд╛ рд╣реИ) рдФрд░ рдЗрд╕реЗ рдЪреБрдирдирд╛ рдХрдард┐рди рд╣реЛрддрд╛ рдЬрд╛ рд░рд╣рд╛ рд╣реИ: рдореИрдВ рдирд┐рд╢реНрдЪрд┐рдд рд░реВрдк рд╕реЗ рдбрд╛рдпрдиреЗрдорд┐рдХ рд╢рд┐рдо рдХреЗ рд▓рд┐рдП рдПрдХ рдбреАрдПрди-рдЬреИрд╕реЗ рд╕рд┐рдВрдЯреИрдХреНрд╕ рд╕реЗ рд╕рд╣рдордд рд╣реВрдВ, рд╣рд╛рд▓рд╛рдВрдХрд┐ рдореИрдВ рднреА рд╕рдордЭреЗрдВ рдХрд┐ рдЗрд╕реЗ dyn рдХрд╣рдирд╛ рдЖрджрд░реНрд╢ рдирд╣реАрдВ рд╣реЛ рд╕рдХрддрд╛ рд╣реИред

рдмреЗрд╢рд░реНрдо рдкреНрд▓рдЧ рдФрд░ рд╕рд┐рд░реНрдл рд░рд┐рдХреЙрд░реНрдб рдХреЗ рд▓рд┐рдП рдПрдХ рдЫреЛрдЯрд╛ рд╕рд╛ рдиреЛрдЯ: рдЖрдк "рдЧреБрдордирд╛рдо" рдпреЛрдЧ рдкреНрд░рдХрд╛рд░ рдФрд░ рдЙрддреНрдкрд╛рдж рдЖрд╕рд╛рдиреА рд╕реЗ рдкреНрд░рд╛рдкреНрдд рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ:

@Centril рд╣рд╛рдБ, рдлреНрд░рдВрдХ рд╕реЗ рд╡рд╣ рд╕рд╛рдорд╛рди рдмрд╣реБрдд рдЕрдЪреНрдЫрд╛ рд╣реИред рд╣рд╛рд▓рд╛рдВрдХрд┐, рдзреНрдпрд╛рди рджреЗрдВ рдХрд┐ CoprodInjector::inject рдХрд╛рдо рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП, рдкрд░рд┐рдгрд╛рдореА рдкреНрд░рдХрд╛рд░ рдХреЛ рдЕрдиреБрдорд╛рдирд┐рдд рд╣реЛрдирд╛ рдЪрд╛рд╣рд┐рдП, рдЬреЛ рдЖрдорддреМрд░ рдкрд░ рдкрд░рд┐рдгрд╛рдореА рдкреНрд░рдХрд╛рд░ (рдЬреИрд╕реЗ -> Coprod!(A, B, C) ) рдХрд╛ рдирд╛рдо рд▓рд┐рдП рдмрд┐рдирд╛ рдЕрд╕рдВрднрд╡ рд╣реИред рдЕрдХреНрд╕рд░ рдРрд╕рд╛ рд╣реЛрддрд╛ рд╣реИ рдХрд┐ рдЖрдк w/рдЕрдирд╛рдо рдкреНрд░рдХрд╛рд░реЛрдВ рдкрд░ рдХрд╛рдо рдХрд░ рд░рд╣реЗ рд╣реИрдВ, рдЗрд╕рд▓рд┐рдП рдЖрдкрдХреЛ -> Coprod!(impl Trait, impl Trait, impl Trait) рд╣реЛрдЧреА, рдЬреЛ рдЕрдиреБрдорд╛рди рдореЗрдВ рд╡рд┐рдлрд▓ рд╣реЛ рдЬрд╛рдПрдЧрд╛ рдХреНрдпреЛрдВрдХрд┐ рдпрд╣ рдирд╣реАрдВ рдЬрд╛рдирддрд╛ рдХрд┐ рдХрд┐рд╕ рдкреНрд░рдХрд╛рд░ рдореЗрдВ рдХреМрди рд╕рд╛ impl Trait рдкреНрд░рдХрд╛рд░ рд╣реЛрдирд╛ рдЪрд╛рд╣рд┐рдПред

@cramertj рдмрд╣реБрдд рд╕рдЪ рд╣реИ (рд╕рд┐рдбреЗрдиреЛрдЯ: рдкреНрд░рддреНрдпреЗрдХ "рд╕рдВрд╕реНрдХрд░рдг" рдкреВрд░реА рддрд░рд╣ рд╕реЗ рдЕрдЬреНрдЮрд╛рдд рдирд╣реАрдВ рд╣реЛ рд╕рдХрддрд╛ рд╣реИ, рд▓реЗрдХрд┐рди рдХреЗрд╡рд▓ рдЖрдВрд╢рд┐рдХ рд░реВрдк рд╕реЗ, рдЙрджрд╛рд╣рд░рдг рдХреЗ рд▓рд┐рдП: Map<Namable, Unnameable> )ред

enum impl Trait рд╡рд┐рдЪрд╛рд░ рдкрд░ рдкрд╣рд▓реЗ https://internals.rust-lang.org/t/pre-rfc-anonymous-enums/5695 рдореЗрдВ рдЪрд░реНрдЪрд╛ рдХреА рдЧрдИ рд╣реИ

@ рд╕реЗрдВрдЯреНрд░рд┐рд▓ рд╣рд╛рдБ, рдпрд╣ рд╕рдЪ рд╣реИред рдореИрдВ рд╡рд┐рд╢реЗрд╖ рд░реВрдк рд╕реЗ рдлреНрдпреВрдЪрд░реНрд╕ рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рд╕реЛрдЪ рд░рд╣рд╛ рд╣реВрдВ, рдЬрд╣рд╛рдВ рдореИрдВ рдЕрдХреНрд╕рд░ рдЪреАрдЬреЗрдВ рд▓рд┐рдЦрддрд╛ рд╣реВрдВ:

fn foo(x: Foo) -> impl Future<Item = (), Error = Never> {
    match x {
        Foo::Bar => do_request().and_then(|res| ...).left().left(),
        Foo::Baz => do_other_thing().and_then(|res| ...).left().right(),
        Foo::Boo => do_third_thing().and_then(|res| ...).right(),
    }
}

@kennytm рд╣рд╛рдБ, https://github.com/rust-lang/rfcs/pull/1154 рдФрд░ https://github.com/rust-lang/rfcs/issues/294 рднреА рд╣реИрдВ

@рдХреНрд░реИрдорд░реНрдЯрдЬ рдореИрдВ рдпрд╣ рдирд╣реАрдВ рдХрд╣реВрдВрдЧрд╛ рдХрд┐ рдЕрдирд╛рдо enum impl Trait , рдХреНрдпреЛрдВрдХрд┐ рд╣рдо рдирд┐рд╖реНрдХрд░реНрд╖ рдирд╣реАрдВ рдирд┐рдХрд╛рд▓ рд╕рдХрддреЗ рд╣реИрдВ X: Tr && Y: Tr тЗТ (X|Y): Tr (рдХрд╛рдЙрдВрдЯрд░ рдЙрджрд╛рд╣рд░рдг: Default рд╡рд┐рд╢реЗрд╖рддрд╛)ред рддреЛ рдкреБрд╕реНрддрдХрд╛рд▓рдп рд▓реЗрдЦрдХреЛрдВ рдХреЛ рдореИрдиреНрдпреБрдЕрд▓ рд░реВрдк рд╕реЗ impl Future for (X|Y|Z|...) ред

@kennytm рд╕рдВрднрд╡рддрдГ рд╣рдо рдЕрдЬреНрдЮрд╛рдд рдПрдирдореЛрдВ рдХреЗ рд▓рд┐рдП рдХреБрдЫ рд╡рд┐рд╢реЗрд╖рддрд╛ рдЗрдореНрдкреНрд▓рд╛рдВрдЯреНрд╕ рдХреЛ рдЙрддреНрдкрдиреНрди рдХрд░рдирд╛ рдЪрд╛рд╣рддреЗ рд╣реИрдВ, рдЗрд╕рд▓рд┐рдП рдпрд╣ рдореВрд▓ рд░реВрдк рд╕реЗ рдПрдХ рд╣реА рд╕реБрд╡рд┐рдзрд╛ рдХреА рддрд░рд╣ рд▓рдЧрддрд╛ рд╣реИред

@cramertj рдЪреВрдВрдХрд┐ рдПрдХ рдЕрдирд╛рдо Default рд▓рд┐рдП (i32|String) рд▓рд┐рдП рдПрдХ рдЗрдореНрдкреНрд▓рд╛рдВрдЯ рдЬреЗрдирд░реЗрдЯ рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИ, рддреЛ рд╣рдо <(i32|String)>::default() рд▓рд┐рдЦ рдкрд╛рдПрдВрдЧреЗред рдУрдЯреАрдУрдПрдЪ <enum impl Default>::default() рдмрд╕ рд╕рдВрдХрд▓рд┐рдд рдирд╣реАрдВ рд╣реЛрдЧрд╛, рдЗрд╕рд▓рд┐рдП рдХреЛрдИ рдлрд░реНрдХ рдирд╣реАрдВ рдкрдбрд╝рддрд╛ рдХрд┐ рд╣рдо рдХреНрдпрд╛ рд╕реНрд╡рдд: рдЙрддреНрдкрдиреНрди рдХрд░рддреЗ рд╣реИрдВ, рдпрд╣ рдЕрднреА рднреА рд╕реБрд░рдХреНрд╖рд┐рдд рд░рд╣реЗрдЧрд╛ рдХреНрдпреЛрдВрдХрд┐ рдЗрд╕реЗ рдмрд┐рд▓реНрдХреБрд▓ рднреА рд▓рд╛рдЧреВ рдирд╣реАрдВ рдХрд┐рдпрд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИред

рдлрд┐рд░ рднреА, рдХреБрдЫ рдРрд╕реЗ рдорд╛рдорд▓реЗ рд╣реИрдВ рдЬрд╣рд╛рдВ рдСрдЯреЛ-рдЬреЗрдирд░реЗрд╢рди рдЕрднреА рднреА enum impl Trait рд╕рд╛рде рд╕рдорд╕реНрдпрд╛ рдкреИрджрд╛ рдХрд░ рд╕рдХрддрд╛ рд╣реИред рд╡рд┐рдЪрд╛рд░ рдХрд░рдирд╛

pub trait Rng {
    fn next_u32(&mut self) -> u32;
    fn gen<T: Rand>(&mut self) -> T where Self: Sized;
    fn gen_iter<'a, T: Rand>(&'a mut self) -> Generator<'a, T, Self> where Self: Sized;
}

рдпрд╣ рдкреВрд░реА рддрд░рд╣ рд╕реЗ рд╕рд╛рдорд╛рдиреНрдп рд╣реИ рдХрд┐, рдЕрдЧрд░ рд╣рдорд╛рд░реЗ рдкрд╛рд╕ mut rng: (XorShiftRng|IsaacRng) рддреЛ рд╣рдо rng.next_u32() рдпрд╛ rng.gen::<u64>() рдЧрдгрдирд╛ рдХрд░ рд╕рдХрддреЗ рд╣реИрдВред рд╣рд╛рд▓рд╛рдВрдХрд┐, rng.gen_iter::<u16>() рдирд┐рд░реНрдорд╛рдг рдирд╣реАрдВ рдХрд┐рдпрд╛ рдЬрд╛ рд╕рдХрддрд╛ рдХреНрдпреЛрдВрдХрд┐ рдСрдЯреЛ-рдЬреЗрдирд░реЗрд╢рди рдХреЗрд╡рд▓ (Generator<'a, u16, XorShiftRng>|Generator<'a, u16, IsaacRng>) рдЙрддреНрдкрд╛рджрди рдХрд░ рд╕рдХрддрд╛ рд╣реИ, рдЬрдмрдХрд┐ рд╣рдо рд╡рд╛рд╕реНрддрд╡ рдореЗрдВ рдЬреЛ рдЪрд╛рд╣рддреЗ рд╣реИрдВ рд╡рд╣ Generator<'a, u16, (XorShiftRng|IsaacRng)> ред

(рд╣реЛ рд╕рдХрддрд╛ рд╣реИ рдХрд┐ рд╕рдВрдХрд▓рдХ рд╕реНрд╡рдЪрд╛рд▓рд┐рдд рд░реВрдк рд╕реЗ Sized рдЪреЗрдХ рдХреА рддрд░рд╣ рдПрдХ рдкреНрд░рддрд┐рдирд┐рдзрд┐рдордВрдбрд▓-рдЕрд╕реБрд░рдХреНрд╖рд┐рдд рдХреЙрд▓ рдХреЛ рдЕрд╕реНрд╡реАрдХрд╛рд░ рдХрд░ рд╕рдХрддрд╛ рд╣реИред)

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

рдЕрдирд╛рдо struct s рдФрд░ enum s (tuples рдФрд░ "disjoins") рдХреЗ рд▓рд┐рдП, "рдЧреБрдордирд╛рдо" "рд╕рдВрд░рдЪрдирд╛рддреНрдордХ" ("рдирд╛рдордорд╛рддреНрд░" рдХреЗ рд╡рд┐рдкрд░реАрдд) рдкреНрд░рдХрд╛рд░реЛрдВ рдХреЗ рдЕрд░реНрде рдореЗрдВ рд╣реИ -- рд╡реЗ' рдлрд┐рд░ рд╕реЗ рдирд┐рд░реНрдорд┐рдд, рдЙрдирдХреЗ рдШрдЯрдХ рдкреНрд░рдХрд╛рд░реЛрдВ рдкрд░ рдкреВрд░реА рддрд░рд╣ рд╕реЗ рд╕рд╛рдорд╛рдиреНрдп, рдФрд░ рдХрд┐рд╕реА рднреА рд╕реНрд░реЛрдд рдлрд╝рд╛рдЗрд▓ рдореЗрдВ рдирд╛рдорд┐рдд рдШреЛрд╖рдгрд╛ рдирд╣реАрдВ рд╣реИред рд▓реЗрдХрд┐рди рдкреНрд░реЛрдЧреНрд░рд╛рдорд░ рдЕрднреА рднреА рдЙрдиреНрд╣реЗрдВ рд▓рд┐рдЦрддрд╛ рд╣реИ рдФрд░ рдХрд┐рд╕реА рдЕрдиреНрдп рдкреНрд░рдХрд╛рд░ рдХреА рддрд░рд╣ рдЙрдирдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рддрд╛ рд╣реИ, рдЙрдирдХреЗ рд▓рд┐рдП рд╡рд┐рд╢реЗрд╖рддрд╛ рдХрд╛рд░реНрдпрд╛рдиреНрд╡рдпрди рд╣рдореЗрд╢рд╛ рдХреА рддрд░рд╣ рд╕реНрдкрд╖реНрдЯ рд░реВрдк рд╕реЗ рд▓рд┐рдЦреЗ рдЧрдП рд╣реИрдВ, рдФрд░ рд╡реЗ рд╡рд┐рд╢реЗрд╖ рд░реВрдк рд╕реЗ рдЬрд╛рджреБрдИ рдирд╣реАрдВ рд╣реИрдВ (рдЕрдВрддрд░реНрдирд┐рд╣рд┐рдд рд╡рд╛рдХреНрдпрд╡рд┐рдиреНрдпрд╛рд╕ рдФрд░ 'рд╡реИрд░рд┐рдПрдбрд┐рдХ' рд╣реЛрдиреЗ рдХреЗ рдЕрд▓рд╛рд╡рд╛, рдЬреЛ рдЕрдиреНрдп рдкреНрд░рдХрд╛рд░ рд╣реИрдВ рдЕрднреА рдирд╣реАрдВ рд╣реЛ рд╕рдХрддрд╛)ред рдХреБрдЫ рдЕрд░реНрдереЛрдВ рдореЗрдВ, рд╡реЗ рдПрдХ рдирд╛рдо рд╣реИ, рд▓реЗрдХрд┐рди рдЕрдХреНрд╖рд░рд╛рдВрдХреАрдп рд╣реЛрдиреЗ рдХреЗ рдмрдЬрд╛рдп, рдЙрдирдХреЗ 'рдирд╛рдо' рдЙрдиреНрд╣реЗрдВ (рдХреЛрд╖реНрдардХреЛрдВ рдФрд░ рдЕрд▓реНрдкрд╡рд┐рд░рд╛рдо рдХрд╛) рд▓рд┐рдЦрдиреЗ рдХреЗ рд▓рд┐рдП рдЗрд╕реНрддреЗрдорд╛рд▓ рдХрд┐рдпрд╛ рд╡рд╛рдХреНрдп рд░рдЪрдирд╛ рд╣реИред

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

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

(рд╡рд╛рд╕реНрддрд╡ рдореЗрдВ, рдпрд╣ рд╕реБрд╡рд┐рдзрд╛ рдХрд╛рд▓реНрдкрдирд┐рдХ "рдСрдмреНрдЬреЗрдХреНрдЯ рд▓рд┐рдЯрд░рд▓" рд╕реЗ рд╕рдВрдмрдВрдзрд┐рдд рдорд╣рд╕реВрд╕ рдХрд░рддреА рд╣реИ - рдЬреЛ рдЕрдиреНрдп рд▓рдХреНрд╖рдгреЛрдВ рдХреЗ рд▓рд┐рдП рд╣реЛрдЧреА рдЬреЛ рдореМрдЬреВрджрд╛ рдХреНрд▓реЛрдЬрд░ рд╕рд┐рдВрдЯреИрдХреНрд╕ Fn ред рдпрд╛рдиреА, рдПрдХ рд▓реИрдореНрдмреНрдбрд╛ рдЕрднрд┐рд╡реНрдпрдХреНрддрд┐ рдХреЗ рдмрдЬрд╛рдп, рдЖрдк рджрд╛рдпрд░реЗ рдореЗрдВ рдЪрд░ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдХреЗ рджрд┐рдП рдЧрдП рд╡рд┐рд╢реЗрд╖рддрд╛ рдХреЗ рдкреНрд░рддреНрдпреЗрдХ рддрд░реАрдХреЗ ( self рдирд┐рд╣рд┐рдд рд╣реЛрдиреЗ рдХреЗ рд╕рд╛рде) рдХреЛ рд▓рд╛рдЧреВ рдХрд░реЗрдЧрд╛, рдФрд░ рд╕рдВрдХрд▓рдХ рдЕрдкрд╡рд░реНрд╕ рдХреЛ рдкрдХрдбрд╝рдиреЗ рдХреЗ рд▓рд┐рдП рдПрдХ рдЕрдЬреНрдЮрд╛рдд рдкреНрд░рдХрд╛рд░ рдЙрддреНрдкрдиреНрди рдХрд░реЗрдЧрд╛, рдФрд░ рдЗрд╕рдХреЗ рд▓рд┐рдП рджрд┐рдП рдЧрдП рд╡рд┐рд╢реЗрд╖рддрд╛ рдХреЛ рд▓рд╛рдЧреВ рдХрд░реЗрдЧрд╛, рдпрд╣ рд╣реЛрдЧрд╛ рдЙрд╕реА рддрд░рд╣ рдПрдХ рд╡реИрдХрд▓реНрдкрд┐рдХ move рдореЛрдб рд╣реИ, рдФрд░ рдЗрд╕реА рддрд░рд╣ред рд╡реИрд╕реЗ рднреА, рдореБрдЭреЗ рд╕рдВрджреЗрд╣ рд╣реИ рдХрд┐ if foo() { (some future) } else { (other future) } рдХреЛ рд╡реНрдпрдХреНрдд рдХрд░рдиреЗ рдХрд╛ рдПрдХ рдЕрд▓рдЧ рддрд░реАрдХрд╛ object Future { fn poll() { if foo() { (some future).poll() } else { (other future).poll() } } } (рдареАрдХ рд╣реИ, рдЖрдкрдХреЛ рдЗрд╕рдХреА рднреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реЛрдЧреА рдХрд╛ рдкрд░рд┐рдгрд╛рдо рд▓рд┐рдлреНрдЯ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП foo() рдмрд╛рд╣рд░ рдореЗрдВ рдПрдХ let рддреЛ рдпрд╣ рдХреЗрд╡рд▓ рджреВрд╕рд░реЗ рдХреЗ рд▓рд┐рдП

@glaebhoerl рдпрд╣ рдПрдХ рдмрд╣реБрдд рд╣реА рд░реЛрдЪрдХ рд╡рд┐рдЪрд╛рд░ рд╣реИ! рдпрд╣рд╛рдВ рдЬрд╛рд╡рд╛ рд╕реЗ рдХреБрдЫ рдкреВрд░реНрд╡ рдХрд▓рд╛ рднреА рд╣реИред

рдореЗрд░реЗ рд╕рд┐рд░ рдХреЗ рдКрдкрд░ рд╕реЗ рдХреБрдЫ рд╡рд┐рдЪрд╛рд░ (рдЗрд╕рд▓рд┐рдП рдмрд╣реБрдд рдкрдХреЗ рд╣реБрдП рдирд╣реАрдВ):

  1. [рдмрд╛рдЗрдХрд╢реЗрдб] рдЙрдкрд╕рд░реНрдЧ object рдкрддрд╛ рдЪрд▓рддрд╛ рд╣реИ рдХрд┐ рдпрд╣ рдХреЗрд╡рд▓ рдЕрд╕реНрддрд┐рддреНрд╡рдЧрдд рд╣реЛрдиреЗ рдХреЗ рдмрдЬрд╛рдп рдПрдХ рд╡рд┐рд╢реЗрд╖рддрд╛ рд╡рд╕реНрддреБ рд╣реИ - рд▓реЗрдХрд┐рди рдРрд╕рд╛ рдирд╣реАрдВ рд╣реИред

рдПрдХ рд╕рдВрднрд╛рд╡рд┐рдд рд╡реИрдХрд▓реНрдкрд┐рдХ рд╡рд╛рдХреНрдпрд╡рд┐рдиреНрдпрд╛рд╕:

impl Future { fn poll() { if foo() { a.poll() } else { b.poll() } } }
// ^ --
// this conflicts with inherent impls for types, so you have to delay
// things until you know whether `Future` is a type or a trait.
// This might be __very__ problematic.

// and perhaps (but probably not...):
dyn Future { fn poll() { if foo() { a.poll() } else { b.poll() } } }
  1. [рдореИрдХреНрд░реЛрдЬрд╝/рдЪреАрдиреА] рдЖрдк рдХреБрдЫ рдорд╛рдореВрд▓реА рд╡рд╛рдХреНрдп рд░рдЪрдирд╛рддреНрдордХ рдЪреАрдиреА рдкреНрд░рджрд╛рди рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ рддрд╛рдХрд┐ рдЖрдкрдХреЛ рдорд┐рд▓ рдЬрд╛рдП:
future!(if foo() { a.poll() } else { b.poll() })

рд╣рд╛рдБ рд╡рд╛рдХреНрдп рд░рдЪрдирд╛ рдкреНрд░рд╢реНрди рдПрдХ рдЧрдбрд╝рдмрдбрд╝ рд╣реИ рдХреНрдпреЛрдВрдХрд┐ рдпрд╣ рд╕реНрдкрд╖реНрдЯ рдирд╣реАрдВ рд╣реИ рдХрд┐ рдХреНрдпрд╛ рдЖрдк struct рд╢рд╛рдмреНрджрд┐рдХ, рдмрдВрдж, рдпрд╛ impl рдмреНрд▓реЙрдХ рд╕реЗ рдкреНрд░реЗрд░рдгрд╛ рд▓реЗрдирд╛ рдЪрд╛рд╣рддреЗ рд╣реИрдВ :) рдореИрдВрдиреЗ рдЙрджрд╛рд╣рд░рдг рдХреЗ рд▓рд┐рдП рдЕрдкрдиреЗ рд╕рд┐рд░ рдХреЗ рдКрдкрд░ рд╕реЗ рд╕рд┐рд░реНрдл рдПрдХ рдХреЛ рдЪреБрдирд╛ рд╣реИ рдЦрд╛рддрд┐рд░ред (рд╡реИрд╕реЗ рднреА, рдореЗрд░рд╛ рдореБрдЦреНрдп рдмрд┐рдВрджреБ рдпрд╣ рдирд╣реАрдВ рдерд╛ рдХрд┐ рд╣рдореЗрдВ рдЬрд╛рдирд╛ рдЪрд╛рд╣рд┐рдП рдФрд░ рд╡рд╕реНрддреБ рдЕрдХреНрд╖рд░ рдЬреЛрдбрд╝рдирд╛ рдЪрд╛рд╣рд┐рдП [рд╣рд╛рд▓рд╛рдВрдХрд┐ рд╣рдореЗрдВ рдЪрд╛рд╣рд┐рдП] рд▓реЗрдХрд┐рди рдореБрдЭреЗ рд▓рдЧрддрд╛ рд╣реИ рдХрд┐ рдЕрдЬреНрдЮрд╛рдд enum s рдпрд╣рд╛рдВ рдПрдХ рд▓рд╛рд▓ рд╣реЗрд░рд┐рдВрдЧ рд╣реИрдВ [рд╣рд╛рд▓рд╛рдВрдХрд┐ рд╣рдореЗрдВ рдЙрдиреНрд╣реЗрдВ рднреА рдЬреЛрдбрд╝рдирд╛ рдЪрд╛рд╣рд┐рдП]ред)

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

рд╣рдореНрдоред рдЗрд╕рд▓рд┐рдП рдореИрдВрдиреЗ рдорд╛рди рд▓рд┐рдпрд╛ рдерд╛ рдХрд┐ рдПрдирдо рдкреНрд░рдХрд╛рд░реЛрдВ рдХреЗ рд▓рд┐рдП "рддрд╛рдЬрд╛ рдирд╛рдо" рдЙрддреНрдкрдиреНрди рдХрд░рдиреЗ рдХреЗ рдмрдЬрд╛рдп, рд╣рдо рдЗрд╕рдХреЗ рдмрдЬрд╛рдп | рдкреНрд░рдХрд╛рд░реЛрдВ рдХрд╛ рд▓рд╛рдн рдЙрдард╛рдПрдВрдЧреЗ, рдЬреЛ рдЗрд╕ рддрд░рд╣ рд╕реЗ рд▓рд╛рдЧреВ рд╣реЛрддреЗ рд╣реИрдВ:

impl<A: IntoIterator, B: IntoIterator> IntoIterator for (A|B)  { /* dispatch appropriately */ }

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

-> impl IntoIterator<Item = Y>

рд▓реЗрдХрд┐рди рдХрд╣реАрдВ рдФрд░ рд╣рдо рдХрд░рддреЗ рд╣реИрдВ

-> impl IntoIterator<IntoIter = X, Item = Y>

рдпреЗ рджреЛ рдЕрддрд┐рд╡реНрдпрд╛рдкреА рдЕрд░реНрде рд╣реЛрдВрдЧреЗ рдЬреЛ рдореБрдЭреЗ рд▓рдЧрддрд╛ рд╣реИ рдХрд┐ "рдПрдХрддреНрд░рд┐рдд" рдирд╣реАрдВ рдХрд┐рдпрд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИ; рдареАрдХ рд╣реИ, рд╢рд╛рдпрдж рд╡рд┐рд╢реЗрд╖рдЬреНрдЮрддрд╛ рдХреЗ рд╕рд╛рдеред

рд╡реИрд╕реЗ рднреА, "рдЧреБрдкреНрдд рдПрдирдо" рдХреА рдзрд╛рд░рдгрд╛ рдореБрдЭреЗ рд▓рдЧрддрд╛ рд╣реИ рдХрд┐ рдЪрд╛рд░реЛрдВ рдУрд░ рдХреНрд▓реАрдирд░ рд▓рдЧрддреА рд╣реИред

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

@nikomatsakis : рдХреНрдпрд╛ рдпрд╣ рдХрд╣рдирд╛ рдЙрдЪрд┐рдд рд╣реИ рдХрд┐ рдЗрд╕ рдорд╛рдорд▓реЗ рдореЗрдВ рдЬреЛ рд▓реМрдЯрд╛рдпрд╛ рдЬрд╛ рд░рд╣рд╛ рд╣реИ рд╡рд╣ dyn Trait рддреБрд▓рдирд╛ рдореЗрдВ impl Trait , рдХреНрдпреЛрдВрдХрд┐ рд╕рд┐рдВрдереЗрдЯрд┐рдХ/рдЕрдирд╛рдо рд╡рд╛рдкрд╕реА рдореВрд▓реНрдп рдЧрддрд┐рд╢реАрд▓ рдкреНрд░реЗрд╖рдг рдХреЗ рд╕рдорд╛рди рдХреБрдЫ рд▓рд╛рдЧреВ рдХрд░рддрд╛ рд╣реИ?

cc https://github.com/rust-lang/rust/issues/49288 , рдПрдХ рдРрд╕рд╛ рдореБрджреНрджрд╛ рдЬрд┐рд╕реЗ рдореИрдВ рд╣рд╛рд▓ рд╣реА рдореЗрдВ Future s рдФрд░ Future -рд░рд┐рдЯрд░реНрдирд┐рдВрдЧ рд╡рд┐рд╢реЗрд╖рддрд╛ рд╡рд┐рдзрд┐рдпреЛрдВ рдХреЗ рд╕рд╛рде рдХрд╛рдо рдХрд░ рд░рд╣рд╛ рд╣реВрдВред

рдЪреВрдВрдХрд┐ рдпрд╣ рдЖрдЦрд┐рд░реА рдореМрдХрд╛ рд╣реИ рдЗрд╕рд╕реЗ рдкрд╣рд▓реЗ FCP рдмрдВрдж рд╣реЛ рдЬрд╛рддрд╛ рд╣реИ, рдореИрдВ рд╕реНрд╡рдЪрд╛рд▓рд┐рдд рдСрдЯреЛ рд▓рдХреНрд╖рдгреЛрдВ рдХреЗ рдЦрд┐рд▓рд╛рдл рдПрдХ рдЖрдЦрд┐рд░реА рддрд░реНрдХ рджреЗрдирд╛ рдЪрд╛рд╣рддрд╛ рд╣реВрдВред рдореБрдЭреЗ рдПрд╣рд╕рд╛рд╕ рд╣реИ рдХрд┐ рдпрд╣ рдереЛрдбрд╝рд╛ рдЖрдЦрд┐рд░реА рдорд┐рдирдЯ рд╣реИ, рдЗрд╕рд▓рд┐рдП рд╡рд░реНрддрдорд╛рди рдХрд╛рд░реНрдпрд╛рдиреНрд╡рдпрди рдХреЗ рд▓рд┐рдП рдкреНрд░рддрд┐рдмрджреНрдз рд╣реЛрдиреЗ рд╕реЗ рдкрд╣рд▓реЗ рдореИрдВ рдЗрд╕ рдореБрджреНрджреЗ рдХреЛ рдФрдкрдЪрд╛рд░рд┐рдХ рд░реВрдк рд╕реЗ рд╕рдВрдмреЛрдзрд┐рдд рдХрд░рдирд╛ рдЪрд╛рд╣рддрд╛ рд╣реВрдВред

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

 fn does_some_operation() -> impl Future<Item=(), Error=()> {
-    let data_stored = Arc::new("hello");
+    let data_stored = Rc::new("hello");

     return some_long_operation.and_then(|other_stuff| {
         do_other_calculation_with(data_stored)
     });
}

(рд╕рд░рд▓ рдЙрджрд╛рд╣рд░рдг: рдХрд╛рдо рдХрд░рдирд╛ , рдЖрдВрддрд░рд┐рдХ рдкрд░рд┐рд╡рд░реНрддрди рд╡рд┐рдлрд▓рддрд╛ рдХрд╛ рдХрд╛рд░рдг рдмрдирддреЗ рд╣реИрдВ )

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

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

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

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

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


рдореИрдВ рдХрд╣рддрд╛ рд╣реВрдВ рдХрд┐ рдпрд╣рд╛рдВ рдЗрд╕рдХреЗ рдЦрд░рд╛рдм рд╣реЛрдиреЗ рдХреА рдХреЗрд╡рд▓ "рдмрдбрд╝реА рд╕рдВрднрд╛рд╡рдирд╛" рд╣реИ рдХреНрдпреЛрдВрдХрд┐ рдлрд┐рд░ рд╕реЗ, рдпрд╣ рдореБрджреНрджрд╛ рд╕реНрдкрд╖реНрдЯ рдирд╣реАрдВ рд╣реИред рдкрд╣рд▓реА рдЬрдЧрд╣ рдореЗрдВ 'рдСрдЯреЛ рд▓рдХреНрд╖рдг' рдХрд╛ рдкреВрд░рд╛ рд╡рд┐рдЪрд╛рд░ рдЧреИрд░-рд╕реНрдкрд╖реНрдЯ рд╣реИред рднреЗрдЬреЗрдВ рдФрд░ рд╕рд┐рдВрдХ рдХреЛ рдХрд┐рд╕реА рд╕рдВрд░рдЪрдирд╛ рдХреА рд╕рд╛рдордЧреНрд░реА рдХреЗ рдЖрдзрд╛рд░ рдкрд░ рд▓рд╛рдЧреВ рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИ, рди рдХрд┐ рд╕рд╛рд░реНрд╡рдЬрдирд┐рдХ рдШреЛрд╖рдгрд╛ рдХреЗ рдЖрдзрд╛рд░ рдкрд░ред рдЪреВрдВрдХрд┐ рдпрд╣ рдирд┐рд░реНрдгрдп рдЬрдВрдЧ рдХреЗ рд▓рд┐рдП рдХрд╛рд░рдЧрд░ рд░рд╣рд╛, impl Trait рдЗрд╕реА рддрд░рд╣ рдХрд╛рд░реНрдп рдХрд░рдирд╛ рднреА рдЕрдЪреНрдЫрд╛ рдХрд╛рдо рдХрд░ рд╕рдХрддрд╛ рд╣реИред

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

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

рдХрд┐рд╕реА рдлрд╝рдВрдХреНрд╢рди рдХреЗ рдЖрдВрддрд░рд┐рдХ рдХреЛ рд╕рдВрд╢реЛрдзрд┐рдд рдХрд░рддреЗ рд╕рдордп, рдпрд╣ рдирд┐рд╢реНрдЪрд┐рдд рд░реВрдк рд╕реЗ рд╕реНрдкрд╖реНрдЯ рд╣реИ рдХрд┐ рдХреЛрдИ рдкреНрд░рджрд░реНрд╢рди рдФрд░ рд╢реБрджреНрдзрддрд╛ рджреЛрдиреЛрдВ рдХреЛ рдкреНрд░рднрд╛рд╡рд┐рдд рдХрд░ рд╕рдХрддрд╛ рд╣реИред рд╣рд╛рд▓рд╛рдБрдХрд┐, рд░рд╕реНрдЯ рдореЗрдВ, рд╣рдореЗрдВ рдпрд╣ рдЬрд╛рдБрдЪрдиреЗ рдХреА рдЬрд╝рд░реВрд░рдд рдирд╣реАрдВ рд╣реИ рдХрд┐ рд╣рдо рд╕рд╣реА рдкреНрд░рдХрд╛рд░ рд▓реМрдЯрд╛ рд░рд╣реЗ рд╣реИрдВред рдлрд╝рдВрдХреНрд╢рди рдШреЛрд╖рдгрд╛рдПрдВ рдПрдХ рдХрдард┐рди рдЕрдиреБрдмрдВрдз рд╣реИ рдЬрд┐рд╕реЗ рд╣рдореЗрдВ рдмрдирд╛рдП рд░рдЦрдирд╛ рдЪрд╛рд╣рд┐рдП, рдФрд░ rustc рд╣рдорд╛рд░реА рдкреАрда рджреЗрдЦрддрд╛ рд╣реИред рдпрд╣ рд╕реНрдЯреНрд░рдХреНрдЪрд░реНрд╕ рдФрд░ рдлрд╝рдВрдХреНрд╢рди рд░рд┐рдЯрд░реНрди рдореЗрдВ рдСрдЯреЛ рд▓рдХреНрд╖рдгреЛрдВ рдХреЗ рдмреАрдЪ рдПрдХ рдкрддрд▓реА рд░реЗрдЦрд╛ рд╣реИ, рд▓реЗрдХрд┐рди рдХрд┐рд╕реА рдлрд╝рдВрдХреНрд╢рди рдХреЗ рдЖрдВрддрд░рд┐рдХ рдХреЛ рдмрджрд▓рдирд╛ рдЕрдзрд┐рдХ рдирд┐рдпрдорд┐рдд рд╣реИред рдПрдХ рдмрд╛рд░ рд╣рдорд╛рд░реЗ рдкрд╛рд╕ рдкреВрд░реНрдг рдЬрдирд░реЗрдЯрд░-рд╕рдВрдЪрд╛рд▓рд┐рдд Future s рд╣реЛ рдЬрд╛рдиреЗ рдХреЗ рдмрд╛рдж, -> impl Future рд▓реМрдЯрдиреЗ рд╡рд╛рд▓реЗ рдХрд╛рд░реНрдпреЛрдВ рдХреЛ рд╕рдВрд╢реЛрдзрд┐рдд рдХрд░рдирд╛ рдФрд░ рднреА рдЕрдзрд┐рдХ рдирд┐рдпрдорд┐рдд рд╣реЛрдЧрд╛ред рдпреЗ рд╕рднреА рдкрд░рд┐рд╡рд░реНрддрди рд╣реЛрдВрдЧреЗ рдЬреЛ рд▓реЗрдЦрдХреЛрдВ рдХреЛ рд╕рдВрд╢реЛрдзрд┐рдд рднреЗрдЬреЗрдВ/рд╕рд┐рдВрдХ рдХрд╛рд░реНрдпрд╛рдиреНрд╡рдпрди рдХреЗ рд▓рд┐рдП рд╕реНрдХреНрд░реАрди рдХрд░рдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реЛрдЧреА рдпрджрд┐ рд╕рдВрдХрд▓рдХ рдЗрд╕реЗ рдкрдХрдбрд╝ рдирд╣реАрдВ рдкрд╛рддрд╛ рд╣реИред

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

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


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

рд╣рдореЗрдВ рдЧреИрд░-рднреЗрдЬреЗрдВ/рдЧреИрд░-рд╕рд┐рдВрдХ рдЖрдЗрдЯрдо рд▓реМрдЯрдиреЗ рд╡рд╛рд▓реЗ рдХрд╛рд░реНрдпреЛрдВ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реЛ рд╕рдХрддреА рд╣реИ рдпрд╛ рддреЛ + !Send + !Sync рдпрд╛ рдПрдХ рд╡рд┐рд╢реЗрд╖рддрд╛ (рдЙрдкрдирд╛рдо рд╕рдВрднрд╡рддрдГ?) рдпрд╣ рдПрдХ рдЕрдЪреНрдЫрд╛ рдирд┐рд░реНрдгрдп рдирд╣реАрдВ рд╣реЛрдЧрд╛, рд▓реЗрдХрд┐рди рдпрд╣ рдЙрд╕ рдирд┐рд░реНрдгрдп рд╕реЗ рдмреЗрд╣рддрд░ рд╣реЛ рд╕рдХрддрд╛ рд╣реИ рдЬрд┐рд╕реЗ рд╣рдо рд╡рд░реНрддрдорд╛рди рдореЗрдВ рдЪреБрди рд░рд╣реЗ рд╣реИрдВред

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


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

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

@daboross рдХреА рд╕рдореАрдХреНрд╖рд╛ wrt рдкрд░ рд╡рд┐рд╕реНрддрд╛рд░ред рд╡рд┐рд╢реЗрд╖рддрд╛ рдЙрдкрдирд╛рдо, рдХреЛрдИ рдЧреИрд░-рд▓реАрдХрд┐рдВрдЧ рдСрдЯреЛ рд▓рдХреНрд╖рдгреЛрдВ рдХреЗ рдПрд░реНрдЧреЛрдиреЙрдорд┐рдХреНрд╕ рдореЗрдВ рд╕реБрдзрд╛рд░ рдХрд░ рд╕рдХрддрд╛ рд╣реИ рдЬреИрд╕реЗ:

trait FutureNSS<T, E> = Future<Item = T, Error= E> + !Send + !Sync;

fn does_some_operation() -> impl FutureNSS<(), ()> {
     let data_stored = Rc::new("hello");
     some_long_operation.and_then(|other_stuff| {
         do_other_calculation_with(data_stored)
     });
}

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

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

Send рдЖрд╡рд╢реНрдпрдХрддрд╛ рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рдХреНрдпрд╛ рдЬрдм рддрдХ рдЗрд╕реЗ !Send рдХреЗ рд░реВрдк рдореЗрдВ рдЪрд┐рд╣реНрдирд┐рдд рдирд╣реАрдВ рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИ, рд▓реЗрдХрд┐рди рд╕рд┐рдВрдХ рдХреЗ рд░реВрдк рдореЗрдВ рдЪрд┐рд╣реНрдирд┐рдд рдХрд┐рдП рдЬрд╛рдиреЗ рддрдХ Sync рдирд╣реАрдВ рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИ? рдХреНрдпрд╛ рд╕рд┐рдВрдХ рдХреА рддреБрд▓рдирд╛ рдореЗрдВ рд╕реЗрдВрдб рдХреЛ рдЕрдзрд┐рдХ рд╕рд╛рдорд╛рдиреНрдп рдирд╣реАрдВ рдорд╛рдирд╛ рдЬрд╛рддрд╛ рд╣реИ?

рдРрд╢реЗ рд╣реА:

fn provides_send_only1() -> impl Trait {  compatible_with_Send_and_Sync }
fn provides_send_only2() -> impl Trait {  compatible_with_Send_only }
fn fails_to_complile1() -> impl Trait {  not_compatible_with_Send }
fn provides_nothing1() -> !Send + impl Trait { compatible_with_Send}
fn provides_nothing2() -> !Send + impl Trait { not_compatible_with_Send }
fn provides_send_and_sync() -> Sync + impl Trait {  compatible_with_Send_and_Sync }
fn fails_to_compile2() -> Sync + impl Trait { compatible_with_Send_only }

рдХреНрдпрд╛ рддрд░реНрдХ рд╕реНрдерд┐рддрд┐ рдФрд░ рд╡рд╛рдкрд╕реА рд╕реНрдерд┐рддрд┐ wrt рдореЗрдВ impl Trait рдмреАрдЪ рдХреЛрдИ рдЕрд╕рдВрдЧрддрд┐ рд╣реИред рдСрдЯреЛ рд▓рдХреНрд╖рдг?

fn foo(x: impl ImportantTrait) {
    // Can't use Send cause we have not required it...
}

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

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

рдареАрдХ рд╣реИ, рдпрд╣ рд╕рдЪ рд╣реИ рдХреЗ рд▓рд┐рдП рдЖрдЧрд╛рдореА рдСрдЯреЛ рд▓рдХреНрд╖рдг Unpin рдХрд┐ рдЧреВрдВрдЧрд╛ рдХрд┐рд╕реНрдордд рд╣реЛ рд░рд╣рд╛ рд╣реИ (рдХреЗрд╡рд▓ рдЖрддреНрдо рд╕рдВрджрд░реНрдн рдЬрдирд░реЗрдЯрд░ рдХреЗ рд▓рд┐рдП рдирд╣реАрдВ-implmented), рд▓реЗрдХрд┐рди ...? рдХреНрдпрд╛ рдпрд╣ рдПрдХ рд╕реАрдорд╛ рд╣реИ рдЬрд┐рд╕рдХреЗ рд╕рд╛рде рд╣рдо рд╡рд╛рд╕реНрддрд╡ рдореЗрдВ рд░рд╣ рд╕рдХрддреЗ рд╣реИрдВ? рдореБрдЭреЗ рд╡рд┐рд╢реНрд╡рд╛рд╕ рдирд╣реАрдВ рд╣реЛ рд░рд╣рд╛ рд╣реИ рдХрд┐ рднрд╡рд┐рд╖реНрдп рдореЗрдВ рдРрд╕рд╛ рдХреБрдЫ рдирд╣реАрдВ рд╣реЛрдЧрд╛ рдЬрд┐рд╕реЗ рдЕрдХреНрд╖рдо рдХрд░рдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реЛрдЧреА рдЬреИрд╕реЗ &mut рдпрд╛ Rc ...

рдореЗрд░рд╛ рдорд╛рдирдирд╛ тАЛтАЛтАЛтАЛрд╣реИ рдХрд┐ рдЗрд╕ рдкрд░ рдЪрд░реНрдЪрд╛ рдХреА рдЧрдИ рд╣реИ, рдФрд░ рдпрд╣ рдирд┐рд╢реНрдЪрд┐рдд рд░реВрдк рд╕реЗ рдмрд╣реБрдд рджреЗрд░ рд╣реЛ рдЪреБрдХреА рд╣реИ, рд▓реЗрдХрд┐рди рдореИрдВ рдЕрднреА рднреА рддрд░реНрдХ рд╕реНрдерд┐рддрд┐ рдореЗрдВ impl Trait рд╕реЗ рдЕрд╕рдВрддреБрд╖реНрдЯ рд╣реВрдВред

рджреЛрдиреЛрдВ рдХреА рдХреНрд╖рдорддрд╛рдПрдВ рдП) рдореВрд▓реНрдп рджреНрд╡рд╛рд░рд╛ рдХреНрд▓реЛрдЬрд░/рдлреНрдпреВрдЪрд░ рдХреЗ рд╕рд╛рде рдХрд╛рдо рдХрд░рддреА рд╣реИрдВ, рдФрд░ рдмреА) рдХреБрдЫ рдкреНрд░рдХрд╛рд░реЛрдВ рдХреЛ "рдЖрдЙрдЯрдкреБрдЯ" рдХреЗ рд░реВрдк рдореЗрдВ рдорд╛рдирддреА рд╣реИрдВ рдФрд░ рдЗрд╕ рдкреНрд░рдХрд╛рд░ рдХрд╛рд░реНрдпрд╛рдиреНрд╡рдпрди рд╡рд┐рд╡рд░рдг, рдореБрд╣рд╛рд╡рд░реЗрджрд╛рд░ рд╣реИрдВ рдФрд░ 1.0 рд╕реЗ рдкрд╣рд▓реЗ рд╣реИрдВ, рдХреНрдпреЛрдВрдХрд┐ рд╡реЗ рд╕реАрдзреЗ рдкреНрд░рджрд░реНрд╢рди, рд╕реНрдерд┐рд░рддрд╛ рдХреЗ рд░рд╕реНрдЯ рдХреЗ рдореВрд▓ рдореВрд▓реНрдпреЛрдВ рдХрд╛ рд╕рдорд░реНрдерди рдХрд░рддреЗ рд╣реИрдВ, рдФрд░ рд╕реБрд░рдХреНрд╖рд╛ред

-> impl Trait рдЗрд╕ рдкреНрд░рдХрд╛рд░ рдХреЗрд╡рд▓ 1.0 рджреНрд╡рд╛рд░рд╛ рдХрд┐рдП рдЧрдП рд╡рд╛рджреЗ рдХреЛ рдкреВрд░рд╛ рдХрд░ рд░рд╣рд╛ рд╣реИ, рдпрд╛ рдХрд┐рдирд╛рд░реЗ рдХреЗ рдорд╛рдорд▓реЗ рдХреЛ рд╣рдЯрд╛ рд░рд╣рд╛ рд╣реИ, рдпрд╛ рдореМрдЬреВрджрд╛ рд╕реБрд╡рд┐рдзрд╛рдУрдВ рдХреЛ рд╕рд╛рдорд╛рдиреНрдп рдХрд░ рд░рд╣рд╛ рд╣реИ: рдпрд╣ рдХрд╛рд░реНрдпреЛрдВ рдХреЗ рд▓рд┐рдП рдЖрдЙрдЯрдкреБрдЯ рдкреНрд░рдХрд╛рд░ рдЬреЛрдбрд╝рддрд╛ рд╣реИ, рдЙрд╕реА рддрдВрддреНрд░ рдХреЛ рд▓реЗрддрд╛ рд╣реИ рдЬрд┐рд╕реЗ рд╣рдореЗрд╢рд╛ рдЕрдЬреНрдЮрд╛рдд рдкреНрд░рдХрд╛рд░реЛрдВ рдХреЛ рд╕рдВрднрд╛рд▓рдиреЗ рдФрд░ рдЗрд╕реЗ рд▓рд╛рдЧреВ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдЙрдкрдпреЛрдЧ рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИ рдЕрдзрд┐рдХ рдорд╛рдорд▓реЛрдВ рдореЗрдВред рдпрд╣ abstract type рд╕реЗ рд╢реБрд░реВ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдЕрдзрд┐рдХ рд╕реИрджреНрдзрд╛рдВрддрд┐рдХ рд╣реЛ рд╕рдХрддрд╛ рд╣реИ, рдЕрд░реНрдерд╛рдд рдореЙрдбреНрдпреВрд▓ рдХреЗ рд▓рд┐рдП рдЖрдЙрдЯрдкреБрдЯ рдкреНрд░рдХрд╛рд░, рд▓реЗрдХрд┐рди рдпрд╣ рджреЗрдЦрддреЗ рд╣реБрдП рдХрд┐ рд░рд╕реНрдЯ рдореЗрдВ рдПрдордПрд▓ рдореЙрдбреНрдпреВрд▓ рд╕рд┐рд╕реНрдЯрдо рдирд╣реАрдВ рд╣реИ, рдСрд░реНрдбрд░ рдХреЛрдИ рдмрдбрд╝реА рдмрд╛рдд рдирд╣реАрдВ рд╣реИред

fn f(t: impl Trait) рдЗрд╕рдХреЗ рдмрдЬрд╛рдп рдРрд╕рд╛ рд▓рдЧрддрд╛ рд╣реИ рдХрд┐ рдЗрд╕реЗ "рд╕рд┐рд░реНрдл рдЗрд╕рд▓рд┐рдП рдХрд┐ рд╣рдо рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ" рдЬреЛрдбрд╝рд╛ рдЧрдпрд╛ рдерд╛, рдмрджрд▓реЗ рдореЗрдВ рдкрд░реНрдпрд╛рдкреНрдд рд╡рд╛рдкрд╕ рджрд┐рдП рдмрд┐рдирд╛ рднрд╛рд╖рд╛ рдХреЛ рдмрдбрд╝рд╛ рдФрд░ рдЕрдЬрдирдмреА рдмрдирд╛ рджрд┐рдпрд╛ред рдореИрдВрдиреЗ рд╕рдВрдШрд░реНрд╖ рдХрд┐рдпрд╛ рд╣реИ рдФрд░ рдЗрд╕реЗ рдлрд┐рдЯ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдХреБрдЫ рдореМрдЬреВрджрд╛ рдврд╛рдВрдЪреЗ рдХреЛ рдЦреЛрдЬрдиреЗ рдореЗрдВ рдЕрд╕рдлрд▓ рд░рд╣рд╛ рд╣реВрдВред рдореИрдВ fn f(f: impl Fn(...) -> ...) рдХреА рд╕рдВрдХреНрд╖рд┐рдкреНрддрддрд╛ рдХреЗ рдЖрд╕рдкрд╛рд╕ рдХреЗ рддрд░реНрдХ рдХреЛ рд╕рдордЭрддрд╛ рд╣реВрдВ, рдФрд░ рд╡рд╣ рдФрдЪрд┐рддреНрдп рдЬреЛ рдкрд╣рд▓реЗ рд╕реЗ рд╣реА <T: Trait> рдФрд░ where рдЦрдВрдбреЛрдВ рдореЗрдВ рд╣реЛ рд╕рдХрддрд╛ рд╣реИ, рд▓реЗрдХрд┐рди рд╡реЗ рдЦреЛрдЦрд▓реЗ рдорд╣рд╕реВрд╕ рдХрд░рддреЗ рд╣реИрдВред рд╡реЗ рдбрд╛рдЙрдирд╕рд╛рдЗрдбреНрд╕ рдХреЛ рдирдХрд╛рд░рддреЗ рдирд╣реАрдВ рд╣реИрдВ:

  • рдЕрдм рдЖрдкрдХреЛ рдмрд╛рдЙрдВрдбреНрд╕ рдХреЗ рд▓рд┐рдП рджреЛ рд╕рд┐рдВрдЯреИрдХреНрд╕ рд╕реАрдЦрдиреЗ рд╣реЛрдВрдЧреЗ- рдХрдо рд╕реЗ рдХрдо <> / where рдПрдХ рд╕рд┐рдВрдЯреИрдХреНрд╕ рд╕рд╛рдЭрд╛ рдХрд░реЗрдВред

    • рдпрд╣ рдПрдХ рд╕реАрдЦрдиреЗ рдХреА рдЪрдЯреНрдЯрд╛рди рднреА рдмрдирд╛рддрд╛ рд╣реИ рдФрд░ рдПрдХ рд╣реА рд╕рд╛рдорд╛рдиреНрдп рдкреНрд░рдХрд╛рд░ рдХреЛ рдХрдИ рд╕реНрдерд╛рдиреЛрдВ рдкрд░ рдЙрдкрдпреЛрдЧ рдХрд░рдиреЗ рдХреЗ рд╡рд┐рдЪрд╛рд░ рдХреЛ рдЕрд╕реНрдкрд╖реНрдЯ рдХрд░рддрд╛ рд╣реИред

    • рдирдпрд╛ рд╕рд┐рдВрдЯреИрдХреНрд╕ рдпрд╣ рдмрддрд╛рдирд╛ рдХрдард┐рди рдмрдирд╛рддрд╛ рд╣реИ рдХрд┐ рдХреЛрдИ рдлрд╝рдВрдХреНрд╢рди рд╕рд╛рдорд╛рдиреНрдп рд╕реЗ рдЕрдзрд┐рдХ рд╣реИ- рдЖрдкрдХреЛ рд╕рдВрдкреВрд░реНрдг рддрд░реНрдХ рд╕реВрдЪреА рдХреЛ рд╕реНрдХреИрди рдХрд░рдирд╛ рд╣реЛрдЧрд╛ред

  • рдЕрдм рдПрдХ рдлрд╝рдВрдХреНрд╢рди рдХрд╛ рдХрд╛рд░реНрдпрд╛рдиреНрд╡рдпрди рд╡рд┐рд╡рд░рдг рдХреНрдпрд╛ рд╣реЛрдирд╛ рдЪрд╛рд╣рд┐рдП (рдпрд╣ рдЕрдкрдиреЗ рдкреНрд░рдХрд╛рд░ рдХреЗ рдкреИрд░рд╛рдореАрдЯрд░ рдХреИрд╕реЗ рдШреЛрд╖рд┐рдд рдХрд░рддрд╛ рд╣реИ) рдЗрд╕рдХреЗ рдЗрдВрдЯрд░рдлрд╝реЗрд╕ рдХрд╛ рд╣рд┐рд╕реНрд╕рд╛ рдмрди рдЬрд╛рддрд╛ рд╣реИ, рдХреНрдпреЛрдВрдХрд┐ рдЖрдк рдЗрд╕рдХрд╛ рдкреНрд░рдХрд╛рд░ рдирд╣реАрдВ рд▓рд┐рдЦ рд╕рдХрддреЗ рд╣реИрдВ!

    • рдпрд╣ рд╡рд░реНрддрдорд╛рди рдореЗрдВ рдЪрд░реНрдЪрд╛ рдХреЗ рддрд╣рдд рдСрдЯреЛ рд╡рд┐рд╢реЗрд╖рддрд╛ рдЬрдЯрд┐рд▓рддрд╛рдУрдВ рдореЗрдВ рднреА рд╢рд╛рдорд┐рд▓ рд╣реИ- рдПрдХ рдлрд╝рдВрдХреНрд╢рди рдХрд╛ рд╕рд╛рд░реНрд╡рдЬрдирд┐рдХ рдЗрдВрдЯрд░рдлрд╝реЗрд╕ рдХреНрдпрд╛ рд╣реИ рдФрд░ рдХреНрдпрд╛ рдирд╣реАрдВ рд╣реИ, рдЗрд╕рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рдФрд░ рдЕрдзрд┐рдХ рдЙрд▓рдЭрдиред

  • dyn Trait рд╕рд╛рде рд╕рд╛рджреГрд╢реНрдп, рдИрдорд╛рдирджрд╛рд░реА рд╕реЗ, рдПрдХ рдЭреВрдард╛ рд╣реИ:

    • dyn Trait рдЕрд░реНрде рд╣рдореЗрд╢рд╛ рдПрдХ рд╣реА рд╣реЛрддрд╛ рд╣реИ, рдФрд░ рдореМрдЬреВрджрд╛ рдСрдЯреЛ рд╡рд┐рд╢реЗрд╖рддрд╛ рддрдВрддреНрд░ рдХреЗ рдЕрд▓рд╛рд╡рд╛ рдЗрд╕рдХреЗ рдЖрд╕рдкрд╛рд╕ рдХреА рдШреЛрд╖рдгрд╛рдУрдВ рдХреЛ "рд╕рдВрдХреНрд░рдорд┐рдд" рдирд╣реАрдВ рдХрд░рддрд╛ рд╣реИред

    • dyn Trait рдбреЗрдЯрд╛ рд╕рдВрд░рдЪрдирд╛рдУрдВ рдореЗрдВ рдкреНрд░рдпреЛрдЧ рдХрд░рдиреЗ рдпреЛрдЧреНрдп рд╣реИ, рдФрд░ рдпрд╣ рд╡рд╛рд╕реНрддрд╡ рдореЗрдВ рдЗрд╕рдХреЗ рдкреНрд░рд╛рдердорд┐рдХ рдЙрдкрдпреЛрдЧ рдорд╛рдорд▓реЛрдВ рдореЗрдВ рд╕реЗ рдПрдХ рд╣реИред рдбреЗрдЯрд╛ рд╕рдВрд░рдЪрдирд╛рдУрдВ рдореЗрдВ impl Trait рдбреЗрдЯрд╛ рд╕рдВрд░рдЪрдирд╛ рдХреЗ рд╕рднреА рдЙрдкрдпреЛрдЧреЛрдВ рдХреЛ рджреЗрдЦреЗ рдмрд┐рдирд╛ рдХреЛрдИ рдорддрд▓рдм рдирд╣реАрдВ рд╣реИред

    • dyn Trait рдЕрд░реНрде рдЯрд╛рдЗрдк рдЗрд░реЗрдЬрд╝рд░ рд╣реИ, рд▓реЗрдХрд┐рди impl Trait рдЗрд╕рдХреЗ рдХрд╛рд░реНрдпрд╛рдиреНрд╡рдпрди рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рдХреБрдЫ рднреА рдирд╣реАрдВ рджрд░реНрд╢рд╛рддрд╛ рд╣реИред

    • рдпрджрд┐ рд╣рдо рдЧреИрд░-рдореЛрдиреЛрдореЛрд░реНрдлрд╛рдЗрдЬреНрдб рдЬреЗрдирд░рд┐рдХ рдкреЗрд╢ рдХрд░рддреЗ рд╣реИрдВ рддреЛ рдкрд┐рдЫрд▓рд╛ рдмрд┐рдВрджреБ рдФрд░ рднреА рднреНрд░рдорд┐рдд рдХрд░рдиреЗ рд╡рд╛рд▓рд╛ рд╣реЛрдЧрд╛ред рд╡рд╛рд╕реНрддрд╡ рдореЗрдВ, рдРрд╕реА рд╕реНрдерд┐рддрд┐ рдореЗрдВ, fn f(t: impl Trait) рдХреА рд╕рдВрднрд╛рд╡рдирд╛ a) рдирдИ рд╕реБрд╡рд┐рдзрд╛ рдХреЗ рд╕рд╛рде рдХрд╛рдо рдирд╣реАрдВ рдХрд░реЗрдЧреА, рдФрд░/рдпрд╛ b) рдСрдЯреЛ рд▓рдХреНрд╖рдгреЛрдВ рдХреЗ рд╕рд╛рде рд╕рдорд╕реНрдпрд╛ рдХреА рддрд░рд╣ рдФрд░ рднреА рдЕрдзрд┐рдХ рдПрдЬ рдХреЗрд╕ рд▓реЙрдпрд░рд┐рдВрдЧ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реЛрдЧреАред рдХрд▓реНрдкрдирд╛ рдХреАрдЬрд┐рдП fn f<dyn T: Trait>(t: T, u: dyn impl Urait) ! :рдЪреАрдЦ:

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

рдЬрдм рддрдХ рдЗрд╕реЗ !рднреЗрдЬреЗрдВ рдХреЗ рд░реВрдк рдореЗрдВ рдЪрд┐рд╣реНрдирд┐рдд рдирд╣реАрдВ рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИ, рд▓реЗрдХрд┐рди рд╕рд┐рдВрдХ рдХреЗ рд░реВрдк рдореЗрдВ рдЪрд┐рд╣реНрдирд┐рдд рдирд╣реАрдВ рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИ, рддрдм рддрдХ рднреЗрдЬрдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рдХреНрдпрд╛ рд╣реИ? рдХреНрдпрд╛ рд╕рд┐рдВрдХ рдХреА рддреБрд▓рдирд╛ рдореЗрдВ рд╕реЗрдВрдб рдХреЛ рдЕрдзрд┐рдХ рд╕рд╛рдорд╛рдиреНрдп рдирд╣реАрдВ рдорд╛рдирд╛ рдЬрд╛рддрд╛ рд╣реИ?

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

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

// keeping the same basic structure, just replacing the keyword:
fn f() -> type Trait

// trying to lean further into the concept:
fn f() -> type R: Trait
fn f() -> type R where R: Trait
fn f() -> (i32, type R) where R: Trait
// or perhaps:
fn f() -> type R: Trait in R
// or maybe just:
fn f() -> type: Trait

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

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

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

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

рдпрд╣ рдХрд┐рддрдирд╛ рд╕рдЪ рд╣реЛрдЧрд╛, рдпрд╣ рдЬрд╛рдирдирд╛ рд╡рд╛рдХрдИ рдореБрд╢реНрдХрд┐рд▓ рд╣реИред рдРрд╕рд╛ рд▓рдЧрддрд╛ рд╣реИ рдХрд┐ рд╕рд╛рдорд╛рдиреНрдп рдирд┐рдпрдо рдпрд╣ рд╣реЛрдЧрд╛ рдХрд┐ Rc рдХреЛ рдкреЗрд╢ рдХрд░рдирд╛ рд╕рд╛рд╡рдзрд╛рдиреА рдХреЗ рд╕рд╛рде рдХрд┐рдпрд╛ рдЬрд╛рдирд╛ рд╣реИ - рдпрд╣ рдЗрддрдирд╛ рдЕрдзрд┐рдХ рдирд╣реАрдВ рд╣реИ рдХрд┐ рдЖрдк рдЗрд╕реЗ Rc рдирд╣реАрдВ рд╣реИ рдмрд▓реНрдХрд┐ dyn Trait , рдХреНрдпреЛрдВрдХрд┐ рдпрд╣ рдХрдо рд╕реНрдкрд╖реНрдЯ рд╣реЛ рд╕рдХрддрд╛ рд╣реИред)

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

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

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

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

@rpjohnst

рдореБрдЭреЗ рд╡рд┐рд╢реНрд╡рд╛рд╕ рд╣реИ рдХрд┐ рдЗрд╕ рдкрд░ рдЪрд░реНрдЪрд╛ рдХреА рдЧрдИ рд╣реИ

рд╡рд╛рд╕реНрддрд╡ рдореЗрдВ, рдпрд╣ рдХрдИ рд╡рд░реНрд╖реЛрдВ рдкрд╣рд▓реЗ рдкрд╣рд▓реЗ impl Trait RFC lo рдХреЗ рдмрд╛рдж рд╕реЗ :) рд╣реИред (рд╡рд╛рд╣, 2014ред рдореИрдВ рдмреВрдврд╝рд╛ рдорд╣рд╕реВрд╕ рдХрд░рддрд╛ рд╣реВрдВред)

рдореИрдВрдиреЗ рд╕рдВрдШрд░реНрд╖ рдХрд┐рдпрд╛ рд╣реИ рдФрд░ рдЗрд╕реЗ рдлрд┐рдЯ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдХреБрдЫ рдореМрдЬреВрджрд╛ рдврд╛рдВрдЪреЗ рдХреЛ рдЦреЛрдЬрдиреЗ рдореЗрдВ рдЕрд╕рдлрд▓ рд░рд╣рд╛ рд╣реВрдВред

рдореИрдВ рдЗрд╕рдХреЗ рдареАрдХ рд╡рд┐рдкрд░реАрдд рдорд╣рд╕реВрд╕ рдХрд░рддрд╛ рд╣реВрдВред рдореЗрд░реЗ рд▓рд┐рдП, рддрд░реНрдХ рд╕реНрдерд┐рддрд┐ рдореЗрдВ impl Trait рдмрд┐рдирд╛, impl Trait рд╡рд╛рдкрд╕реА рдХреА рд╕реНрдерд┐рддрд┐ рдореЗрдВ рдФрд░ рднреА рдЕрдзрд┐рдХ рдЦрдбрд╝рд╛ рд╣реИред рдореИрдВ рдЬреЛ рдПрдХреАрдХреГрдд рдзрд╛рдЧрд╛ рджреЗрдЦрддрд╛ рд╣реВрдВ рд╡рд╣ рд╣реИ:

  • impl Trait - рдЬрд╣рд╛рдВ рдпрд╣ рджрд┐рдЦрд╛рдИ рджреЗрддрд╛ рд╣реИ, рдпрд╣ рдЗрдВрдЧрд┐рдд рдХрд░рддрд╛ рд╣реИ рдХрд┐ "рдХреБрдЫ рдореЛрдиреЛрдореЛрд░реНрдлрд╛рдЗрдЬреНрдб рдкреНрд░рдХрд╛рд░ рд╣реЛрдЧрд╛ рдЬреЛ Trait "ред (рдпрд╣ рд╕рд╡рд╛рд▓ рдХрд┐ рдЙрд╕ рдкреНрд░рдХрд╛рд░ рдХреЛ рдХреМрди рдирд┐рд░реНрджрд┐рд╖реНрдЯ рдХрд░рддрд╛ рд╣реИ - рдХреЙрд▓рд░ рдпрд╛ рдХреИрд▓реА - рдЗрд╕ рдкрд░ рдирд┐рд░реНрднрд░ рдХрд░рддрд╛ рд╣реИ рдХрд┐ impl Trait рдХрд╣рд╛рдВ рджрд┐рдЦрд╛рдИ рджреЗрддрд╛ рд╣реИред)
  • dyn Trait - рдЬрд╣рд╛рдВ рдпрд╣ рджрд┐рдЦрд╛рдИ рджреЗрддрд╛ рд╣реИ, рдпрд╣ рдЗрдВрдЧрд┐рдд рдХрд░рддрд╛ рд╣реИ рдХрд┐ рдХреБрдЫ рдкреНрд░рдХрд╛рд░ рд╣реЛрдЧрд╛ рдЬреЛ Trait , рд▓реЗрдХрд┐рди рдпрд╣ рдХрд┐ рдкреНрд░рдХрд╛рд░ рдХрд╛ рдЪреБрдирд╛рд╡ рдЧрддрд┐рд╢реАрд▓ рд░реВрдк рд╕реЗ рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИред

рдЙрди рд╕реНрдерд╛рдиреЛрдВ рдХреЗ рд╕реЗрдЯ рдХрд╛ рд╡рд┐рд╕реНрддрд╛рд░ рдХрд░рдиреЗ рдХреА рднреА рдпреЛрдЬрдирд╛ рд╣реИ рдЬрд╣рд╛рдВ impl Trait рдкреНрд░рдХрдЯ рд╣реЛ рд╕рдХрддрд╛ рд╣реИ, рдЙрд╕ рдЕрдВрддрд░реНрдЬреНрдЮрд╛рди рдкрд░ рдирд┐рд░реНрдорд╛рдгред рдЙрджрд╛рд╣рд░рдг рдХреЗ рд▓рд┐рдП, https://github.com/rust-lang/rfcs/pull/2071 рдкрд░рдорд┐рдЯ

let x: impl Trait = ...;

рд╡рд╣реА рд╕рд┐рджреНрдзрд╛рдВрдд рд▓рд╛рдЧреВ рд╣реЛрддрд╛ рд╣реИ: рдкреНрд░рдХрд╛рд░ рдХреА рдкрд╕рдВрдж рдХреЛ рд╕рд╛рдВрдЦреНрдпрд┐рдХреАрдп рд░реВрдк рд╕реЗ рдЬрд╛рдирд╛ рдЬрд╛рддрд╛ рд╣реИред рдЗрд╕реА рддрд░рд╣, рд╡рд╣реА RFC abstract type (рдЬрд┐рд╕рдХреЗ рд▓рд┐рдП impl Trait рдХреЛ рдПрдХ рдкреНрд░рдХрд╛рд░ рдХреА рд╡рд╛рдХреНрдпрд╛рддреНрдордХ рдЪреАрдиреА рдХреЗ рд░реВрдк рдореЗрдВ рд╕рдордЭрд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИ) рдХрд╛ рдкрд░рд┐рдЪрдп рджреЗрддрд╛ рд╣реИ, рдЬреЛ рдХрд┐ рд╡рд┐рд╢реЗрд╖рддрд╛ рдХреЗ рд░реВрдк рдореЗрдВ рдФрд░ рдпрд╣рд╛рдВ рддрдХ тАЛтАЛрдХрд┐ рдореЙрдбреНрдпреВрд▓ рдореЗрдВ рд╕рджрд╕реНрдпреЛрдВ рдХреЗ рд░реВрдк рдореЗрдВ рдкреНрд░рдХрдЯ рд╣реЛ рд╕рдХрддрд╛ рд╣реИред

рдмрд╛рдЗрдХ рд╢реЗрдб-y рд╡рд┐рдЪрд╛рд░ рдпрд╣рд╛рдБ рдЗрддрдиреА рдХреЗ рд░реВрдк рдореЗрдВ рдирд╣реАрдВ рд╡рд┐рдЪрд▓рд┐рдд рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдКрдкрд░ рдореЗрд░реА рдЕрдВрдХ рд╕реЗ: рдХреЗ рдмрдЬрд╛рдп impl , рдХрд╛ рдЙрдкрдпреЛрдЧ type ?

рдирд┐рдЬреА рддреМрд░ рдкрд░, рдореИрдВ рдпрд╣рд╛рдВ рдПрдХ рдмрд╛рдЗрдХрд╢реЗрдб рдХреЛ рдмрд╣рд╛рд▓ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдЗрдЪреНрдЫреБрдХ рдирд╣реАрдВ рд╣реВрдВред рд╣рдордиреЗ https://github.com/rust-lang/rfcs/pull/2071 рдФрд░ рдЕрдиреНрдп рдЬрдЧрд╣реЛрдВ рдкрд░ рд╕рд┐рдВрдЯреИрдХреНрд╕ рдкрд░ рдЪрд░реНрдЪрд╛ рдХрд░рдиреЗ рдореЗрдВ рдХрд╛рдлреА рд╕рдордп рдмрд┐рддрд╛рдпрд╛ред рдПрдХ "рд╕рд╣реА рдХреАрд╡рд░реНрдб" рдкреНрд░рддреАрдд рдирд╣реАрдВ рд╣реЛрддрд╛ рд╣реИ, рд▓реЗрдХрд┐рди impl рдХреЛ "рдХреБрдЫ рдкреНрд░рдХрд╛рд░ рдЬреЛ рд▓рд╛рдЧреВ рдХрд░рддрд╛ рд╣реИ" рдХреЗ рд░реВрдк рдореЗрдВ рдкрдврд╝рдирд╛ рдмрд╣реБрдд рдЕрдЪреНрдЫреА рддрд░рд╣ рд╕реЗ рдХрд╛рдо рдХрд░рддрд╛ рд╣реИред

рдореБрдЭреЗ рдСрдЯреЛ рд╡рд┐рд╢реЗрд╖рддрд╛ рд░рд┐рд╕рд╛рд╡ рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рдХреБрдЫ рдФрд░ рдЬреЛрдбрд╝рдиреЗ рджреЗрдВ:

рд╕рдмрд╕реЗ рдкрд╣рд▓реЗ, рдЕрдВрддрддрдГ рдореБрдЭреЗ рд▓рдЧрддрд╛ рд╣реИ рдХрд┐ рдСрдЯреЛ рд╡рд┐рд╢реЗрд╖рддрд╛ рд░рд┐рд╕рд╛рд╡ рд╡рд╛рд╕реНрддрд╡ рдореЗрдВ рдпрд╣рд╛рдВ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рд╕рд╣реА рдХрд╛рдо рд╣реИ, рдареАрдХ рд╣реИ рдХреНрдпреЛрдВрдХрд┐ рдпрд╣ рдмрд╛рдХреА рднрд╛рд╖рд╛ рдХреЗ рдЕрдиреБрд░реВрдк рд╣реИред рдСрдЯреЛ рд▓рдХреНрд╖рдг рдереЗ - рдЬреИрд╕рд╛ рдХрд┐ рдореИрдВрдиреЗ рдкрд╣рд▓реЗ рдХрд╣рд╛ рдерд╛ - рд╣рдореЗрд╢рд╛ рдПрдХ рдЬреБрдЖ, рд▓реЗрдХрд┐рди рдРрд╕рд╛ рд▓рдЧрддрд╛ рд╣реИ рдХрд┐ рд╡реЗ рдореВрд▓ рд░реВрдк рд╕реЗ рднреБрдЧрддрд╛рди рдХрд░ рдЪреБрдХреЗ рд╣реИрдВред рдореИрдВ рдмрд╕ impl Trait рдХреЛ рдЗрддрдирд╛ рдЕрд▓рдЧ рдирд╣реАрдВ рджреЗрдЦрддрд╛ред

рд▓реЗрдХрд┐рди рд╕рд╛рде рд╣реА, рдореИрдВ рдпрд╣рд╛рдВ рджреЗрд░реА рдХрд░рдиреЗ рдХреЛ рд▓реЗрдХрд░ рдХрд╛рдлреА рдирд░реНрд╡рд╕ рд╣реВрдВред рдореИрдВ рд╕рд╣рдордд рд╣реВрдВ рдХрд┐ рдбрд┐рдЬрд╛рдЗрди рдХреНрд╖реЗрддреНрд░ рдореЗрдВ рдЕрдиреНрдп рджрд┐рд▓рдЪрд╕реНрдк рдмрд┐рдВрджреБ рд╣реИрдВ рдФрд░ рдореБрдЭреЗ 100% рд╡рд┐рд╢реНрд╡рд╛рд╕ рдирд╣реАрдВ рд╣реИ рдХрд┐ рд╣рдо рд╕рд╣реА рдЬрдЧрд╣ рдкрд░ рдкрд╣реБрдВрдЪ рдЧрдП рд╣реИрдВ, рд▓реЗрдХрд┐рди рдореБрдЭреЗ рдирд╣реАрдВ рдкрддрд╛ рдХрд┐ рд╣рдо рдХрднреА рднреА рдЗрд╕рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рд╕реБрдирд┐рд╢реНрдЪрд┐рдд рд╣реЛрдВрдЧреЗред рдореБрдЭреЗ рдмрд╣реБрдд рдЪрд┐рдВрддрд╛ рд╣реИ рдХрд┐ рдЕрдЧрд░ рд╣рдо рдЕрднреА рджреЗрд░реА рдХрд░рддреЗ рд╣реИрдВ рддреЛ рд╣рдореЗрдВ рд╡рд░реНрд╖ рдХреЗ рд▓рд┐рдП рдЕрдкрдиреЗ рд░реЛрдбрдореИрдк рдХреЛ рд╡рд┐рддрд░рд┐рдд рдХрд░рдиреЗ рдореЗрдВ рдХрдард┐рдирд╛рдИ рд╣реЛрдЧреАред

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

рддреЛ - рдХрдо рд╕реЗ рдХрдо рдЗрд╕ рдХреНрд╖рдг рдХреЗ рд░реВрдк рдореЗрдВ - рдореИрдВ рдЕрднреА рднреА рд╡рд░реНрддрдорд╛рди рдкрде рдХреЛ рдЬрд╛рд░реА рд░рдЦрдиреЗ рдХреЗ рдЗрдЪреНрдЫреБрдХ рд╣реВрдВред

рдирд┐рдЬреА рддреМрд░ рдкрд░, рдореИрдВ рдпрд╣рд╛рдВ рдПрдХ рдмрд╛рдЗрдХрд╢реЗрдб рдХреЛ рдмрд╣рд╛рд▓ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдЗрдЪреНрдЫреБрдХ рдирд╣реАрдВ рд╣реВрдВред

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

рдореЗрд░реЗ рд▓рд┐рдП, рддрд░реНрдХ рд╕реНрдерд┐рддрд┐ рдореЗрдВ impl Trait рдмрд┐рдирд╛, impl Trait рд╡рд╛рдкрд╕реА рдХреА рд╕реНрдерд┐рддрд┐ рдореЗрдВ рдФрд░ рднреА рдЕрдзрд┐рдХ рдЦрдбрд╝рд╛ рд╣реИред

рд╕рдВрдмрджреНрдз рдкреНрд░рдХрд╛рд░реЛрдВ рдХреА рд╕рд╛рджреГрд╢реНрдпрддрд╛ рдХреЛ рджреЗрдЦрддреЗ рд╣реБрдП, рдпрд╣ "рдмрд┐рдирд╛ type T рдХреЗ рддрд░реНрдХ рдХреА рд╕реНрдерд┐рддрд┐ рдореЗрдВ, рд╕рдВрдмрдВрдзрд┐рдд рдкреНрд░рдХрд╛рд░ рдФрд░ рднреА рдЕрдзрд┐рдХ рдмрд╛рд╣рд░ рдЦрдбрд╝реЗ рд╣реЛрддреЗ рд╣реИрдВред" рдореБрдЭреЗ рд╕рдВрджреЗрд╣ рд╣реИ рдХрд┐ рд╡рд┐рд╢реЗрд╖ рдЖрдкрддреНрддрд┐ рд╕рд╛рдордиреЗ рдирд╣реАрдВ рдЖрдИ рд╣реИ рдХреНрдпреЛрдВрдХрд┐ рд╣рдордиреЗ рдЬреЛ рд╡рд╛рдХреНрдп-рд╡рд┐рдиреНрдпрд╛рд╕ рдЪреБрдирд╛ рд╣реИ, рд╡рд╣ рдЗрд╕реЗ рдирд┐рд░рд░реНрдердХ рдмрдирд╛рддрд╛ рд╣реИ- рдореМрдЬреВрджрд╛ рд╡рд╛рдХреНрдпрд╡рд┐рдиреНрдпрд╛рд╕ рдЗрддрдирд╛ рдЕрдЪреНрдЫрд╛ рд╣реИ рдХрд┐ рдХрд┐рд╕реА рдХреЛ рднреА рд╡рд╛рдХреНрдпрд╛рддреНрдордХ рдЪреАрдиреА рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рдорд╣рд╕реВрд╕ рдирд╣реАрдВ рд╣реЛрддреА рд╣реИ рдЬреИрд╕реЗ trait Trait<type SomeAssociatedType> ред

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

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

рдЬреИрд╕рд╛ рдХрд┐ рдореИрдВрдиреЗ рдЕрдкрдиреА рдкрд┐рдЫрд▓реА рдЯрд┐рдкреНрдкрдгреА рдореЗрдВ рдЙрд▓реНрд▓реЗрдЦ рдХрд┐рдпрд╛ рдерд╛, рдореИрдВ рднреА abstract type рдХрд╛ рдкреНрд░рд╢рдВрд╕рдХ рд╣реВрдВред рдпрд╣, рдлрд┐рд░ рд╕реЗ, рдореЙрдбреНрдпреВрд▓ рдХреЗ рд▓рд┐рдП "рдЖрдЙрдЯрдкреБрдЯ рдкреНрд░рдХрд╛рд░" рдЕрд╡рдзрд╛рд░рдгрд╛ рдХрд╛ рд╡рд┐рд╕реНрддрд╛рд░ рд╣реИред рдФрд░ -> impl Trait , let x: impl Trait , рдФрд░ abstract type рд╕рдВрдмрдВрдзрд┐рдд рдкреНрд░рдХрд╛рд░реЛрдВ рдХреЛ рд▓рд╛рдЧреВ рдХрд░рдирд╛ рднреА рдмрд╣реБрдд рдЕрдЪреНрдЫрд╛ рд╣реИред

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

@nikomatsakis

рдпрд╣ рдХрд┐рддрдирд╛ рд╕рдЪ рд╣реЛрдЧрд╛, рдпрд╣ рдЬрд╛рдирдирд╛ рд╡рд╛рдХрдИ рдореБрд╢реНрдХрд┐рд▓ рд╣реИред

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

рд▓реЗрдХрд┐рди рд╕рд╛рде рд╣реА, рдореИрдВ рдпрд╣рд╛рдВ рджреЗрд░реА рдХрд░рдиреЗ рдХреЛ рд▓реЗрдХрд░ рдХрд╛рдлреА рдирд░реНрд╡рд╕ рд╣реВрдВред [..] рдореИрдВ рдмрд╣реБрдд рдЪрд┐рдВрддрд┐рдд рд╣реВрдВ рдХрд┐ рдЕрдЧрд░ рд╣рдо рдЕрднреА рджреЗрд░реА рдХрд░рддреЗ рд╣реИрдВ рддреЛ рд╣рдореЗрдВ рд╡рд░реНрд╖ рдХреЗ рд▓рд┐рдП рдЕрдкрдиреЗ рд░реЛрдбрдореИрдк рдкрд░ рдкрд╣реБрдВрдЪрдиреЗ рдореЗрдВ рдореБрд╢реНрдХрд┐рд▓ рд╣реЛрдЧреАред

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

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

рдпрд╣ рд╕реБрдирдирд╛ рдЕрдЪреНрдЫрд╛ рд╣реИ! рдФрд░ рдореБрдЭреЗ рд▓рдЧрддрд╛ рд╣реИ рдХрд┐ рдпрд╣ рдЬреНрдпрд╛рджрд╛рддрд░ рдореЗрд░реА рдЪрд┐рдВрддрд╛рдУрдВ рдХреЛ рд╢рд╛рдВрдд рдХрд░рддрд╛ рд╣реИред

рд╕рдЪ рд╣реИ, рд╣рд╛рд▓рд╛рдВрдХрд┐ рдореИрдВ рдирд┐рд╢реНрдЪрд┐рдд рд░реВрдк рд╕реЗ Send рдЬреИрд╕реЗ рд╡рд┐рд╢рд┐рд╖реНрдЯ рдСрдЯреЛ рд▓рдХреНрд╖рдгреЛрдВ рдХреЛ "рд╕рд┐рдВрдЧрд▓рд┐рдВрдЧ рдЖрдЙрдЯ" рдХрд░рдиреЗ рдХреЗ рд╡рд┐рдЪрд╛рд░ рд╕реЗ рдШрдмрд░рд╛рддрд╛ рд╣реВрдВред

рдореИрдВ рдЗрд╕ рднрд╛рд╡рдирд╛ рд╕реЗ рдмрд╣реБрдд рд╕рд╣рдордд рд╣реВрдБ .

рдХрд┐рд╕реА рднреА рдорд╛рдорд▓реЗ рдореЗрдВ, рдЖрдк рд╡рд╛рд╕реНрддрд╡ рдореЗрдВ рдХреНрдпрд╛ рдЪрд╛рд╣рддреЗ рд╣реИрдВ, рдФрд░ рдЬрд┐рд╕реЗ рд╣рдо рд╕реНрдердЧрд┐рдд рдХрд░рдиреЗ рдХрд╛ рдкреНрд░рдпрд╛рд╕ рдХрд░ рд░рд╣реЗ рд╣реИрдВ =), рдПрдХ рдкреНрд░рдХрд╛рд░ рдХрд╛ "рд╕рд╢рд░реНрдд" рдмрд╛рдзреНрдп рд╣реИ (рднреЗрдЬреЗрдВ рдпрджрд┐ T рднреЗрдЬреЗрдВ рд╣реИ)ред рдпрд╣ рдареАрдХ рд╡рд╣реА рд╣реИ рдЬреЛ рдСрдЯреЛ рд▓рдХреНрд╖рдг рдЖрдкрдХреЛ рджреЗрддреЗ рд╣реИрдВред

рдореБрдЭреЗ рд▓рдЧрддрд╛ рд╣реИ рдХрд┐ рдЕрдЧрд░ рдХреЛрдб рдиреЗ рд╕реНрдкрд╖реНрдЯ рд░реВрдк рд╕реЗ рдпрд╣ рдХрд╣рд╛ рд╣реИ рддреЛ T: Send => Foo<T>: Send рдмреЗрд╣рддрд░ рдврдВрдЧ рд╕реЗ рд╕рдордЭрд╛ рдЬрд╛рдПрдЧрд╛ред

fn foo<T: Extra, trait Extra = Send>(x: T) -> impl Bar + Extra {..}

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

@rpjohnst

dyn Trait рд╕рд╛рде рд╕рд╛рджреГрд╢реНрдп, рдИрдорд╛рдирджрд╛рд░реА рд╕реЗ, рдПрдХ рдЭреВрдард╛ рд╣реИ:

рддрд░реНрдХ рдХреА рд╕реНрдерд┐рддрд┐ рдореЗрдВ impl Trait рдореЗрдВ рдпрд╣ рдЧрд▓рдд рд╣реИ, рд▓реЗрдХрд┐рди -> impl Trait рд╕рд╛рде рдРрд╕рд╛ рдирд╣реАрдВ рд╣реИ рдХреНрдпреЛрдВрдХрд┐ рджреЛрдиреЛрдВ рдЕрд╕реНрддрд┐рддреНрд╡рдЧрдд рдкреНрд░рдХрд╛рд░ рд╣реИрдВред

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

рдореИрдВ рдпрд╣ рдиреЛрдЯ рдХрд░рдирд╛ рдЪрд╛рд╣рддрд╛ рд╣реВрдВ рдХрд┐ рдЯрд░реНрдмреЛрдлрд┐рд╢ рдХреЗ рдХрд╛рд░рдг рдЯрд╛рдЗрдк рдкреИрд░рд╛рдореАрдЯрд░ рдХрд╛ рдХреНрд░рдо рдХрднреА рднреА рдХрд╛рд░реНрдпрд╛рдиреНрд╡рдпрди рд╡рд┐рд╡рд░рдг рдирд╣реАрдВ рд░рд╣рд╛ рд╣реИ, рдФрд░ рдЗрд╕ рд╕рдВрдмрдВрдз рдореЗрдВ, рдореБрдЭреЗ рд▓рдЧрддрд╛ рд╣реИ рдХрд┐ impl Trait рдорджрдж рдХрд░ рд╕рдХрддрд╛ рд╣реИ рдХреНрдпреЛрдВрдХрд┐ рдпрд╣ рдЖрдкрдХреЛ рдЯрд░реНрдмреЛрдлрд┐рд╢ рдореЗрдВ рдирд┐рд░реНрджрд┐рд╖реНрдЯ рдХреБрдЫ рдкреНрд░рдХрд╛рд░ рдХреЗ рддрд░реНрдХреЛрдВ рдХреЛ рдЫреЛрдбрд╝рдиреЗ рдХреА рдЕрдиреБрдорддрд┐ рджреЗрддрд╛ рд╣реИ .

[..] рд╡рд╣рд╛рдВ рдореМрдЬреВрдж рд╕рд┐рдВрдЯреИрдХреНрд╕ рдЗрддрдирд╛ рдЕрдЪреНрдЫрд╛ рд╣реИ рдХрд┐ рдХрд┐рд╕реА рдХреЛ рднреА рд╕рд┐рдВрдЯреИрдХреНрдЯрд┐рдХ рд╢реБрдЧрд░ рдЬреИрд╕реЗ рд▓рдХреНрд╖рдг рд╡рд┐рд╢реЗрд╖рддрд╛ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рдорд╣рд╕реВрд╕ рдирд╣реАрдВ рд╣реЛрддреА рд╣реИ.

рдиреЗрд╡рд░ рд╕реЗ рдиреЗрд╡рд░? https://github.com/rust-lang/rfcs/issues/2274

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


@daboross , рдореИрдВ рдСрдкреНрдЯ-рдЖрдЙрдЯ рд╡рд┐рдЪрд╛рд░ рдореЗрдВ рдереЛрдбрд╝рд╛ рдФрд░ рдбреНрд░рд┐рд▓ рдХрд░рдирд╛ рдЪрд╛рд╣рддрд╛ рдерд╛ред рдкрд╣рд▓реА рдмрд╛рд░ рдореЗрдВ рдпрд╣ рдЖрд╢рд╛рдЬрдирдХ рд▓рдЧрддрд╛ рд╣реИ, рдХреНрдпреЛрдВрдХрд┐ рдпрд╣ рд╣рдореЗрдВ рд╣рд╕реНрддрд╛рдХреНрд╖рд░ рдХреЛ рдкреВрд░реА рддрд░рд╣ рд╕реЗ рдмрддрд╛рдиреЗ рдХреА рдЕрдиреБрдорддрд┐ рджреЗрдЧрд╛, рд▓реЗрдХрд┐рди рдЪреВрдХ рдХреЗ рд╕рд╛рде рдЬреЛ рд╕рд╛рдорд╛рдиреНрдп рдорд╛рдорд▓реЗ рдХреЛ рд╕рдВрдХреНрд╖рд┐рдкреНрдд рдмрдирд╛ рджреЗрддрд╛ рд╣реИред

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

  • рдпрджрд┐ рдСрдЯреЛ рд▓рдХреНрд╖рдгреЛрдВ рдХреЛ impl Trait рд▓рд┐рдП рдСрдкреНрдЯ-рдЖрдЙрдЯ рдХреЗ рд░реВрдк рдореЗрдВ рдорд╛рдирд╛ рдЬрд╛рддрд╛ рдерд╛, рддреЛ рдЙрдиреНрд╣реЗрдВ dyn Trait рд▓рд┐рдП рднреА рд╣реЛрдирд╛ рдЪрд╛рд╣рд┐рдПред
  • рдпрд╣ рдирд┐рд╢реНрдЪрд┐рдд рд░реВрдк рд╕реЗ рддрдм рднреА рд▓рд╛рдЧреВ рд╣реЛрддрд╛ рд╣реИ рдЬрдм рдЗрди рдирд┐рд░реНрдорд╛рдгреЛрдВ рдХрд╛ рдЙрдкрдпреЛрдЧ рддрд░реНрдХ рд╕реНрдерд┐рддрд┐ рдореЗрдВ рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИред
  • рд▓реЗрдХрд┐рди рдлрд┐рд░, рдЬреЗрдирд░рд┐рдХ рдХреЗ рд▓рд┐рдП рдЕрд▓рдЧ рддрд░рд╣ рд╕реЗ рд╡реНрдпрд╡рд╣рд╛рд░ рдХрд░рдирд╛ рдЕрдЬреАрдм рд╣реЛрдЧрд╛ред рджреВрд╕рд░реЗ рд╢рдмреНрджреЛрдВ рдореЗрдВ, fn foo<T>(t: T) , рдЖрдк рдбрд┐рдлрд╝реЙрд▓реНрдЯ рд░реВрдк рд╕реЗ T: Send рдЕрдкреЗрдХреНрд╖рд╛ рдХрд░ рд╕рдХрддреЗ рд╣реИрдВред
  • рдмреЗрд╢рдХ рд╣рдорд╛рд░реЗ рдкрд╛рд╕ рдЗрд╕рдХреЗ рд▓рд┐рдП рдПрдХ рддрдВрддреНрд░ рд╣реИ, рдЬреЛ рд╡рд░реНрддрдорд╛рди рдореЗрдВ рдХреЗрд╡рд▓ Sized ; рдпрд╣ рдПрдХ рд╡рд┐рд╢реЗрд╖рддрд╛ рд╣реИ рдЬрд┐рд╕реЗ рд╣рд░ рдЬрдЧрд╣ рдбрд┐рдлрд╝реЙрд▓реНрдЯ рд░реВрдк рд╕реЗ рдорд╛рдирд╛ рдЬрд╛рддрд╛ рд╣реИ, рдФрд░ рдЬрд┐рд╕рдХреЗ рд▓рд┐рдП рдЖрдк ?Sized рд▓рд┐рдЦрдХрд░ рдСрдкреНрдЯ рдЖрдЙрдЯ рдХрд░рддреЗ рд╣реИрдВ

?Sized рддрдВрддреНрд░ рд░рд╕реНрдЯ рдХреЗ рд╕рдмрд╕реЗ рдЕрд╕реНрдкрд╖реНрдЯ рдФрд░ рд╕рд┐рдЦрд╛рдиреЗ рдХреЗ рд▓рд┐рдП рдХрдард┐рди рдкрд╣рд▓реБрдУрдВ рдореЗрдВ рд╕реЗ рдПрдХ рд╣реИ, рдФрд░ рд╣рдо рд╕рд╛рдорд╛рдиреНрдп рд░реВрдк рд╕реЗ рдЗрд╕реЗ рдЕрдиреНрдп рдЕрд╡рдзрд╛рд░рдгрд╛рдУрдВ рддрдХ рд╡рд┐рд╕реНрддрд╛рд░рд┐рдд рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдмреЗрд╣рдж рдШреГрдгрд╛рд╕реНрдкрдж рд░рд╣реЗ рд╣реИрдВред рдПрдХ рдЕрд╡рдзрд╛рд░рдгрд╛ рдХреЗ рд▓рд┐рдП рдЗрд╕реЗ Send рд░реВрдк рдореЗрдВ рдХреЗрдВрджреНрд░реАрдп рдХреЗ рд░реВрдк рдореЗрдВ рдЙрдкрдпреЛрдЧ рдХрд░рдирд╛ рдЬреЛрдЦрд┐рдо рднрд░рд╛ рд▓рдЧрддрд╛ рд╣реИ - рдпрд╣ рдЙрд▓реНрд▓реЗрдЦ рдирд╣реАрдВ рд╣реИ рдХрд┐ рдпрд╣ рдПрдХ рдмрдбрд╝рд╛ рдмреНрд░реЗрдХрд┐рдВрдЧ рдкрд░рд┐рд╡рд░реНрддрди рд╣реЛрдЧрд╛ред

рдФрд░ рдХреНрдпрд╛ рд╣реИ, рд╣рд╛рд▓рд╛рдВрдХрд┐: рд╣рдо рд╡рд╛рд╕реНрддрд╡ рдореЗрдВ рдЬреЗрдирд░рд┐рдХ рдХреЗ рд▓рд┐рдП рдПрдХ рдСрдЯреЛ рд╡рд┐рд╢реЗрд╖рддрд╛ рдзрд╛рд░рдгрд╛ рдореЗрдВ рд╕реЗрдВрдХрдирд╛ рдирд╣реАрдВ рдЪрд╛рд╣рддреЗ рд╣реИрдВ, рдХреНрдпреЛрдВрдХрд┐ рдЖрдЬ рдЬреЗрдирд░рд┐рдХ рдХреА рд╕реБрдВрджрд░рддрд╛ рдХрд╛ рд╣рд┐рд╕реНрд╕рд╛ рдпрд╣ рд╣реИ рдХрд┐ рдЖрдк рдкреНрд░рднрд╛рд╡реА рд░реВрдк рд╕реЗ рд╕рд╛рдорд╛рдиреНрдп рд╣реЛ рд╕рдХрддреЗ рд╣реИрдВ рдХрд┐ рдПрдХ рдкреНрд░рдХрд╛рд░ рдПрдХ рдСрдЯреЛ рд╡рд┐рд╢реЗрд╖рддрд╛ рд▓рд╛рдЧреВ рдХрд░рддрд╛ рд╣реИ рдпрд╛ рдирд╣реАрдВ, рдФрд░ рд╡рд╣ рдЬрд╛рдирдХрд╛рд░реА рдмрд╕ рд╣реИ "рдХреЗ рдорд╛рдзреНрдпрдо рд╕реЗ рдкреНрд░рд╡рд╛рд╣"ред рдЙрджрд╛рд╣рд░рдг рдХреЗ рд▓рд┐рдП, fn f<T>(t: T) -> Option<T> ред рд╣рдо T рдореЗрдВ рдкрд╛рд╕ рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ рдЪрд╛рд╣реЗ рд╡рд╣ Send , рдФрд░ рдЖрдЙрдЯрдкреБрдЯ Send iff T рдерд╛ред рдпрд╣ рд░рд╕реНрдЯ рдореЗрдВ рдЬреЗрдирд░рд┐рдХ рдХрд╣рд╛рдиреА рдХрд╛ рдПрдХ рдЕрддреНрдпрдВрдд рдорд╣рддреНрд╡рдкреВрд░реНрдг рд╣рд┐рд╕реНрд╕рд╛ рд╣реИред

dyn Trait рд╕рд╛рде рднреА рд╕рдорд╕реНрдпрд╛рдПрдВ рд╣реИрдВред рд╡рд┐рд╢реЗрд╖ рд░реВрдк рд╕реЗ, рдЕрд▓рдЧ рд╕рдВрдХрд▓рди рдХреЗ рдХрд╛рд░рдг, рд╣рдореЗрдВ рдЗрд╕ "рдСрдкреНрдЯ рдЖрдЙрдЯ" рдкреНрд░рдХреГрддрд┐ рдХреЛ рдХреЗрд╡рд▓ "рдкреНрд░рд╕рд┐рджреНрдз" рдСрдЯреЛ рд▓рдХреНрд╖рдгреЛрдВ рдЬреИрд╕реЗ Send рдФрд░ Sync рддрдХ рд╕реАрдорд┐рдд рд░рдЦрдирд╛ рд╣реЛрдЧрд╛; рдЗрд╕рдХрд╛ рдорддрд▓рдм рд╢рд╛рдпрдж рдмрд╛рд╣рд░реА рдЙрдкрдпреЛрдЧ рдХреЗ рд▓рд┐рдП auto trait рдХреЛ рд╕реНрдерд┐рд░ рдирд╣реАрдВ рдХрд░рдирд╛ рд╣реЛрдЧрд╛ред

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


@rpjohnst

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

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

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

рдореИрдВ рдпрд╣ рднреА рдиреЛрдЯ рдХрд░рдирд╛ рдЪрд╛рд╣рддрд╛ рд╣реВрдВ рдХрд┐ рд╡рд╛рдХреНрдпрд╛рдВрд╢ рдЬреИрд╕реЗ:

fn f(t: impl Trait) рдЗрд╕рдХреЗ рдмрдЬрд╛рдп рдРрд╕рд╛ рд▓рдЧрддрд╛ рд╣реИ рдХрд┐ рдЗрд╕реЗ "рд╕рд┐рд░реНрдл рдЗрд╕рд▓рд┐рдП рдХрд┐ рд╣рдо рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ" рдЬреЛрдбрд╝рд╛ рдЧрдпрд╛ рдерд╛

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

рдЯреНрд░реЗрдбрдСрдлрд╝ рдореМрдЬреВрдж рд╣реИрдВ, рд╡рд╛рд╕реНрддрд╡ рдореЗрдВ рдбрд╛рдЙрдирд╕рд╛рдЗрдбреНрд╕ рд╣реИрдВ, рд▓реЗрдХрд┐рди рдпрд╣ рд╣рдореЗрдВ рдмрд╣рд╕ рдХреЗ "рджреВрд╕рд░реЗ рдкрдХреНрд╖" рдХреЗ рд╡реНрдпрдВрдЧреНрдпрд╛рддреНрдордХ рдирд┐рд╖реНрдХрд░реНрд╖ рддрдХ рдкрд╣реБрдВрдЪрдиреЗ рдореЗрдВ рдорджрдж рдирд╣реАрдВ рдХрд░рддрд╛ рд╣реИред

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

auto Trait рд░рд┐рд╕рд╛рд╡

auto Trait рд░рд┐рд╕рд╛рд╡ рдХреЗ рд╡рд┐рдЪрд╛рд░ рдиреЗ рдореБрдЭреЗ рд▓рдВрдмреЗ рд╕рдордп рддрдХ рдкрд░реЗрд╢рд╛рди рдХрд┐рдпрд╛-- рдХреБрдЫ рдорд╛рдпрдиреЛрдВ рдореЗрдВ, рдпрд╣ рд░рд╕реНрдЯ рдХреЗ рдХрдИ рдбрд┐рдЬрд╝рд╛рдЗрди рд▓рдХреНрд╖реНрдпреЛрдВ рдХреЗ рд╡рд┐рдкрд░реАрдд рд▓рдЧ рд╕рдХрддрд╛ рд╣реИред рдЕрдкрдиреЗ рдкреВрд░реНрд╡рдЬреЛрдВ рдХреА рддреБрд▓рдирд╛ рдореЗрдВ, рдЬреИрд╕реЗ рдХрд┐ C++ рдпрд╛ ML рдкрд░рд┐рд╡рд╛рд░, рд░рд╕реНрдЯ рдЗрд╕ рдорд╛рдпрдиреЗ рдореЗрдВ рдЕрд╕рд╛рдорд╛рдиреНрдп рд╣реИ рдХрд┐ рдЗрд╕реЗ рдлрд╝рдВрдХреНрд╢рди рдШреЛрд╖рдгрд╛рдУрдВ рдореЗрдВ рд╕реНрдкрд╖реНрдЯ рд░реВрдк рд╕реЗ рдмрддрд╛рдП рдЬрд╛рдиреЗ рдХреЗ рд▓рд┐рдП рд╕рд╛рдорд╛рдиреНрдп рд╕реАрдорд╛ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реЛрддреА рд╣реИред рдореЗрд░реА рд░рд╛рдп рдореЗрдВ, рдпрд╣ рд░рд╕реНрдЯ рдХреЗ рд╕рд╛рдорд╛рдиреНрдп рдХрд╛рд░реНрдпреЛрдВ рдХреЛ рдкрдврд╝рдиреЗ рдФрд░ рд╕рдордЭрдиреЗ рдореЗрдВ рдЖрд╕рд╛рди рдмрдирд╛рддрд╛ рд╣реИ, рдФрд░ рдпрд╣ рдЕрдкреЗрдХреНрд╖рд╛рдХреГрдд рд╕реНрдкрд╖реНрдЯ рдХрд░рддрд╛ рд╣реИ рдЬрдм рдПрдХ рдкрд╢реНрдЪ-рдЕрд╕рдВрдЧрдд рдкрд░рд┐рд╡рд░реНрддрди рдХрд┐рдпрд╛ рдЬрд╛ рд░рд╣рд╛ рд╣реЛред рд╣рдордиреЗ рдЗрд╕ рдкреИрдЯрд░реНрди рдХреЛ const fn рдЕрдкрдиреЗ рджреГрд╖реНрдЯрд┐рдХреЛрдг рдореЗрдВ рдЬрд╛рд░реА рд░рдЦрд╛ рд╣реИ, рдлрд╝рдВрдХреНрд╢рди рдирд┐рдХрд╛рдпреЛрдВ рд╕реЗ const рдиреЗрд╕ рдХрд╛ рдЙрд▓реНрд▓реЗрдЦ рдХрд░рдиреЗ рдХреЗ рдмрдЬрд╛рдп рдХрд╛рд░реНрдпреЛрдВ рдХреЛ рд╕реНрдкрд╖реНрдЯ рд░реВрдк рд╕реЗ const рд░реВрдк рдореЗрдВ рдирд┐рд░реНрджрд┐рд╖реНрдЯ рдХрд░рдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реИред рд╕реНрдкрд╖реНрдЯ рд╡рд┐рд╢реЗрд╖рддрд╛ рд╕реАрдорд╛рдУрдВ рдХреА рддрд░рд╣, рдЗрд╕рд╕реЗ рдпрд╣ рдмрддрд╛рдирд╛ рдЖрд╕рд╛рди рд╣реЛ рдЬрд╛рддрд╛ рд╣реИ рдХрд┐ рдХреМрди рд╕реЗ рдлрд╝рдВрдХреНрд╢рди рдХрд┐рд╕ рддрд░рд╣ рд╕реЗ рдЙрдкрдпреЛрдЧ рдХрд░рдиреЗ рдпреЛрдЧреНрдп рд╣реИрдВ, рдФрд░ рдкреБрд╕реНрддрдХрд╛рд▓рдп рд▓реЗрдЦрдХреЛрдВ рдХреЛ рдпрд╣ рд╡рд┐рд╢реНрд╡рд╛рд╕ рджрд┐рд▓рд╛рддрд╛ рд╣реИ рдХрд┐ рдЫреЛрдЯреЗ рдХрд╛рд░реНрдпрд╛рдиреНрд╡рдпрди рдкрд░рд┐рд╡рд░реНрддрди рдЙрдкрдпреЛрдЧрдХрд░реНрддрд╛рдУрдВ рдХреЛ рдирд╣реАрдВ рддреЛрдбрд╝реЗрдВрдЧреЗред

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

Send рдФрд░ Sync рдРрд╕реЗ "рд╕рдВрджрд░реНрдн" рд╣реИрдВ рдЬрд┐рдирдореЗрдВ рдЙрдкрдпреЛрдЧрдХрд░реНрддрд╛ рдкреНрд░реЛрдЧреНрд░рд╛рдо рдХрд░рддреЗ рд╣реИрдВ: рдпрд╣ рдЕрддреНрдпрдВрдд рджреБрд░реНрд▓рдн рд╣реИ рдХрд┐ рдореИрдВ рдПрдХ рдПрдкреНрд▓рд┐рдХреЗрд╢рди рдпрд╛ рд▓рд╛рдЗрдмреНрд░реЗрд░реА рд▓рд┐рдЦрддрд╛ рд╣реВрдВ рдЬреЛ Send рдФрд░ !Send рдкреНрд░рдХрд╛рд░ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рддрд╛ рд╣реИ (рд╡рд┐рд╢реЗрд╖ рд░реВрдк рд╕реЗ рдХреЗрдВрджреНрд░реАрдп рдирд┐рд╖реНрдкрд╛рджрдХ рдкрд░ рдЪрд▓рд╛рдиреЗ рдХреЗ рд▓рд┐рдП рдПрд╕рд┐рдВрдХ рдХреЛрдб рд▓рд┐рдЦрддреЗ рд╕рдордп, рдЬреЛ рдпрд╛ рддреЛ рдмрд╣реБрдкреНрд░рдЪрд╛рд░рд┐рдд рд╣реИ рдпрд╛ рдирд╣реАрдВ)ред рдереНрд░реЗрдб-рд╕реБрд░рдХреНрд╖рд┐рдд рд╣реЛрдиреЗ рдпрд╛ рди рд╣реЛрдиреЗ рдХрд╛ рд╡рд┐рдХрд▓реНрдк рдкрд╣рд▓реЗ рд╡рд┐рдХрд▓реНрдкреЛрдВ рдореЗрдВ рд╕реЗ рдПрдХ рд╣реИ рдЬрд┐рд╕реЗ рдПрдХ рдЖрд╡реЗрджрди рд▓рд┐рдЦрддреЗ рд╕рдордп рдХрд┐рдпрд╛ рдЬрд╛рдирд╛ рд╣реИ, рдФрд░ рд╡рд╣рд╛рдВ рд╕реЗ, рдереНрд░реЗрдб-рд╕реБрд░рдХреНрд╖рд┐рдд рд╣реЛрдиреЗ рдХрд╛ рдорддрд▓рдм рд╣реИ рдХрд┐ рдореЗрд░реЗ рд╕рднреА рдкреНрд░рдХрд╛рд░ Send ред рдкреБрд╕реНрддрдХрд╛рд▓рдпреЛрдВ рдХреЗ рд▓рд┐рдП, рдпрд╣ рд▓рдЧрднрдЧ рд╣рдореЗрд╢рд╛ рдРрд╕рд╛ рд╣реЛрддрд╛ рд╣реИ рдХрд┐ рдореИрдВ Send рдкреНрд░рдХрд╛рд░ рдкрд╕рдВрдж рдХрд░рддрд╛ рд╣реВрдВ, рдХреНрдпреЛрдВрдХрд┐ рдЙрдирдХрд╛ рдЙрдкрдпреЛрдЧ рдирд╣реАрдВ рдХрд░рдиреЗ рдХрд╛ рдЖрдорддреМрд░ рдкрд░ рдорддрд▓рдм рд╣реИ рдХрд┐ рдереНрд░реЗрдбреЗрдб рд╕рдВрджрд░реНрдн рдореЗрдВ рдЙрдкрдпреЛрдЧ рдХрд┐рдП рдЬрд╛рдиреЗ рдкрд░ рдореЗрд░реА рд▓рд╛рдЗрдмреНрд░реЗрд░реА рдЕрдиреБрдкрдпреЛрдЧреА рд╣реИ (рдпрд╛ рдПрдХ рд╕рдорд░реНрдкрд┐рдд рдереНрд░реЗрдб рдмрдирд╛рдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реИ)ред рдПрдХ рдирд┐рд░реНрд╡рд┐рд░реЛрдз parking_lot::Mutex рдХрд╛ рдкреНрд░рджрд░реНрд╢рди рд▓рдЧрднрдЧ RefCell рд╕рдорд╛рди рд╣реЛрдЧрд╛ рдЬрдм рдЖрдзреБрдирд┐рдХ CPU рдкрд░ рдЙрдкрдпреЛрдЧ рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИ, рдЗрд╕рд▓рд┐рдП рдореБрдЭреЗ !Send рдЙрдкрдпреЛрдЧ рдХреЗ рд▓рд┐рдП рдЙрдкрдпреЛрдЧрдХрд░реНрддрд╛рдУрдВ рдХреЛ рд╡рд┐рд╢реЗрд╖ рдкреБрд╕реНрддрдХрд╛рд▓рдп рдХрд╛рд░реНрдпрдХреНрд╖рдорддрд╛ рдХреА рдУрд░ рдзрдХреЗрд▓рдиреЗ рдХреЗ рд▓рд┐рдП рдХреЛрдИ рдкреНрд░реЗрд░рдгрд╛ рдирд╣реАрдВ рджрд┐рдЦрддреА рд╣реИ- рдорд╛рдорд▓реЗ рдЗрди рдХрд╛рд░рдгреЛрдВ рд╕реЗ, рдореБрдЭреЗ рдирд╣реАрдВ рд▓рдЧрддрд╛ рдХрд┐ рдлрд╝рдВрдХреНрд╢рди-рд╣рд╕реНрддрд╛рдХреНрд╖рд░ рд╕реНрддрд░ рдкрд░ Send рдФрд░ !Send рдкреНрд░рдХрд╛рд░реЛрдВ рдХреЗ рдмреАрдЪ рдЕрдВрддрд░ рдХрд░рдиреЗ рдореЗрдВ рд╕рдХреНрд╖рдо рд╣реЛрдирд╛ рдорд╣рддреНрд╡рдкреВрд░реНрдг рд╣реИ, рдФрд░ рдореБрдЭреЗ рдирд╣реАрдВ рд▓рдЧрддрд╛ рдХрд┐ рдпрд╣ рд╕рд╛рдорд╛рдиреНрдп рд╣реЛрдЧрд╛ рдкреБрд╕реНрддрдХрд╛рд▓рдп рд▓реЗрдЦрдХреЛрдВ рдиреЗ рдЧрд▓рддреА рд╕реЗ !Send рдкреНрд░рдХрд╛рд░реЛрдВ рдХреЛ impl Trait рдкреНрд░рдХрд╛рд░реЛрдВ рдореЗрдВ рдкреЗрд╢ рдХрд░ рджрд┐рдпрд╛ рдЬреЛ рдкрд╣рд▓реЗ Send ред рдпрд╣ рд╕рдЪ рд╣реИ рдХрд┐ рдпрд╣ рд╡рд┐рдХрд▓реНрдк рдкрдардиреАрдпрддрд╛ рдФрд░ рд╕реНрдкрд╖реНрдЯрддрд╛ рд▓рд╛рдЧрдд рдХреЗ рд╕рд╛рде рдЖрддрд╛ рд╣реИ, рд▓реЗрдХрд┐рди рдореЗрд░рд╛ рдорд╛рдирдирд╛ тАЛтАЛтАЛтАЛрд╣реИ рдХрд┐ рдПрд░реНрдЧреЛрдиреЛрдорд┐рдХ рдФрд░ рдкреНрд░рдпреЛрдЬреНрдп рд▓рд╛рднреЛрдВ рдХреЗ рд▓рд┐рдП рдЯреНрд░реЗрдб-рдСрдл рдЗрд╕рдХреЗ рд▓рд╛рдпрдХ рд╣реИред

рддрд░реНрдХ-рд╕реНрдерд┐рддрд┐ impl Trait

рдореЗрд░реЗ рдкрд╛рд╕ рдпрд╣рд╛рдБ рдХрд╣рдиреЗ рдХреЗ рд▓рд┐рдП рдмрд╣реБрдд рдХреБрдЫ рдирд╣реАрдВ рд╣реИ, рд╕рд┐рд╡рд╛рдп рдЗрд╕рдХреЗ рдХрд┐ рд╣рд░ рдмрд╛рд░ рдЬрдм рдореИрдВ рддрд░реНрдХ-рд╕реНрдерд┐рддрд┐ impl Trait рд▓рд┐рдП рдкрд╣реБрдБрдЪрддрд╛ рд╣реВрдБ, рддреЛ рдореИрдВрдиреЗ рдкрд╛рдпрд╛ рд╣реИ рдХрд┐ рдЗрд╕рдиреЗ рдореЗрд░реЗ рдлрд╝рдВрдХреНрд╢рди рд╣рд╕реНрддрд╛рдХреНрд╖рд░реЛрдВ рдХреА рдкрдардиреАрдпрддрд╛ рдФрд░ рд╕рдордЧреНрд░ рд╕реБрдЦрджрддрд╛ рдХреЛ рдмрд╣реБрдд рдмрдврд╝рд╛ рджрд┐рдпрд╛ рд╣реИред рдпрд╣ рд╕рдЪ рд╣реИ рдХрд┐ рдпрд╣ рдПрдХ рдирдИ рдХреНрд╖рдорддрд╛ рдирд╣реАрдВ рдЬреЛрдбрд╝рддрд╛ рд╣реИ рдЬреЛ рдЖрдЬ рдХреЗ рдЬрдВрдЧ рдореЗрдВ рд╕рдВрднрд╡ рдирд╣реАрдВ рд╣реИ, рд▓реЗрдХрд┐рди рдпрд╣ рдЬрдЯрд┐рд▓ рдлрд╝рдВрдХреНрд╢рди рд╣рд╕реНрддрд╛рдХреНрд╖рд░реЛрдВ рдХреЗ рд▓рд┐рдП рдПрдХ рдорд╣рд╛рди рдЧреБрдгрд╡рддреНрддрд╛-рдЬреАрд╡рди рд╕реБрдзрд╛рд░ рд╣реИ, рдпрд╣ рдЕрдЪреНрдЫреА рддрд░рд╣ рд╕реЗ рдЕрд╡рдзрд╛рд░рдгрд╛рддреНрдордХ рд░реВрдк рд╕реЗ рд╡рд╛рдкрд╕реА-рд╕реНрдерд┐рддрд┐ impl Trait , рдФрд░ рдпрд╣ OOP рдкреНрд░реЛрдЧреНрд░рд╛рдорд░реНрд╕ рдХреЗ рдЯреНрд░рд╛рдВрдЬрд┐рд╢рди рдХреЛ рд╣реИрдкреНрдкреА рд░реБрд╕реНрддреЗрд╕рд┐рдпрди рдореЗрдВ рдЖрд╕рд╛рди рдмрдирд╛рддрд╛ рд╣реИред рд╡рд░реНрддрдорд╛рди рдореЗрдВ, рдХреЗрд╡рд▓ рдПрдХ рдмрд╛рдЙрдВрдб рдкреНрд░рджрд╛рди рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдПрдХ рдирд╛рдорд┐рдд рдЬреЗрдиреЗрд░рд┐рдХ рдкреНрд░рдХрд╛рд░ рдХреЛ рдкреЗрд╢ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдмрд╣реБрдд рдЕрдзрд┐рдХ рдЕрддрд┐рд░реЗрдХ рд╣реИ (рдЙрджрд╛рд╣рд░рдг рдХреЗ рд▓рд┐рдП F рдореЗрдВ fn foo<F>(x: F) where F: FnOnce() рдмрдирд╛рдо fn foo(x: impl FnOnce()) )ред рдпрд╣ рдкрд░рд┐рд╡рд░реНрддрди рдЙрд╕ рд╕рдорд╕реНрдпрд╛ рдХреЛ рд╣рд▓ рдХрд░рддрд╛ рд╣реИ рдФрд░ рдлрд╝рдВрдХреНрд╢рди рд╣рд╕реНрддрд╛рдХреНрд╖рд░ рдореЗрдВ рдкрд░рд┐рдгрд╛рдо рджреЗрддрд╛ рд╣реИ рдЬреЛ рдкрдврд╝рдиреЗ рдФрд░ рд▓рд┐рдЦрдиреЗ рдореЗрдВ рдЖрд╕рд╛рди рд╣реЛрддреЗ рд╣реИрдВ, рдФрд░ рдЖрдИрдПрдордУ -> impl Trait рд╕рд╛рде рдПрдХ рдкреНрд░рд╛рдХреГрддрд┐рдХ рдлрд┐рдЯ рдХреА рддрд░рд╣ рдорд╣рд╕реВрд╕ рдХрд░рддрд╛ рд╣реИред

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

@рд╕реЗрдВрдЯреНрд░рд┐рд▓

рддрд░реНрдХ рдХреА рд╕реНрдерд┐рддрд┐ рдореЗрдВ рд╡рд┐рд╢реЗрд╖рддрд╛ рдХреЛ рдирд┐рд╣рд┐рдд рдХрд░рдиреЗ рдХреЗ рд╕рдВрдмрдВрдз рдореЗрдВ рдпрд╣ рдЧрд▓рдд рд╣реИ, рд▓реЗрдХрд┐рди рдРрд╕рд╛ рдирд╣реАрдВ рд╣реИ -> рдирд┐рд╣рд┐рдд рд╡рд┐рд╢реЗрд╖рддрд╛ рдХреНрдпреЛрдВрдХрд┐ рджреЛрдиреЛрдВ рдЕрд╕реНрддрд┐рддреНрд╡рдЧрдд рдкреНрд░рдХрд╛рд░ рд╣реИрдВред

рд╣рд╛рдБ, рдореЗрд░рд╛ рдпрд╣реА рдорддрд▓рдм рдерд╛ред

@aturon

рдЬреИрд╕реЗ рд╡рд╛рдХреНрдпрд╛рдВрд╢ ... рдЕрдЪреНрдЫреЗ рд╡рд┐рд╢реНрд╡рд╛рд╕ рдХреА рдЪрд░реНрдЪрд╛ рдХреЛ рдХрдордЬреЛрд░ рдХрд░рддреЗ рд╣реИрдВ

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

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

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

рддрд░реНрдХ рд╕реНрдерд┐рддрд┐ рдореЗрдВ impl Trait рд╕рдорд░реНрдерди рдХреЗ рд╕рд╛рде, рдЖрдк рдЗрд╕ рдлрд╝рдВрдХреНрд╢рди рдХреЛ рджреЛ рддрд░реАрдХреЛрдВ рд╕реЗ рд▓рд┐рдЦ рд╕рдХрддреЗ рд╣реИрдВ:

fn f(t: impl Trait)
fn f<T: Trait>(t: T)

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

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

рдореБрдЭреЗ рдпрдХреАрди рдирд╣реАрдВ рд╣реИ рдХрд┐ рд╣рдорд╛рд░реЗ рдХрд┐рд╕реА рднреА рдЕрдиреНрдп "рд╕рд░рд▓, рд▓реЗрдХрд┐рди рд╕реАрдорд┐рдд -> рдЬрдЯрд┐рд▓, рд▓реЗрдХрд┐рди рд╕рд╛рдорд╛рдиреНрдп" рдкрд░рд┐рд╡рд░реНрддрди, рд╕реАрдЦрдиреЗ рдХреА рдпреЛрдЧреНрдпрддрд╛/рдПрд░реНрдЧреЛрдиреЙрдорд┐рдХреНрд╕ рд╕реЗ рдкреНрд░реЗрд░рд┐рдд рд╣реИрдВ, рдЗрд╕ рддрд░рд╣ рд╕реЗ рдЗрдВрдЯрд░рдлрд╝реЗрд╕-рдмреНрд░реЗрдХрд┐рдВрдЧ рдкрд░рд┐рд╡рд░реНрддрди рд╢рд╛рдорд┐рд▓ рд╣реИрдВред рдпрд╛ рддреЛ рд╕рд░рд▓ рддрд░реАрдХреЗ рдХрд╛ рдЬрдЯрд┐рд▓ рд╕рдордХрдХреНрд╖ рд╕рдорд╛рди рд░реВрдк рд╕реЗ рд╡реНрдпрд╡рд╣рд╛рд░ рдХрд░рддрд╛ рд╣реИ рдФрд░ рдЖрдкрдХреЛ рдХреЗрд╡рд▓ рддрднреА рд╕реНрд╡рд┐рдЪ рдХрд░рдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реЛрддреА рд╣реИ рдЬрдм рдЖрдк рдкрд╣рд▓реЗ рд╕реЗ рд╣реА рдЗрдВрдЯрд░рдлрд╝реЗрд╕ рдпрд╛ рд╡реНрдпрд╡рд╣рд╛рд░ рдмрджрд▓ рд░рд╣реЗ рд╣реЛрдВ (рдЙрджрд╛рд╣рд░рдг рдХреЗ рд▓рд┐рдП рд▓рд╛рдЗрдлрдЯрд╛рдЗрдо рдПрд▓рд┐рд╢рди, рдореИрдЪ рдПрд░реНрдЧреЛрдиреЙрдорд┐рдХреНрд╕, -> impl Trait ), рдпрд╛ рдкрд░рд┐рд╡рд░реНрддрди рдЙрддрдирд╛ рд╣реА рд╕рд╛рдорд╛рдиреНрдп рдФрд░ рдЗрд░рд╛рджрд╛ рд╣реИ рд╕рд╛рд░реНрд╡рднреМрдорд┐рдХ рд░реВрдк рд╕реЗ рд▓рд╛рдЧреВ рдХрд┐рдпрд╛ рдЬрд╛рдирд╛ рдЪрд╛рд╣рд┐рдП (рдЙрджрд╛рд╣рд░рдг рдХреЗ рд▓рд┐рдП рдореЙрдбреНрдпреВрд▓/рдкрде, рдЗрди-рдмреИрдВрдб рдЬреАрд╡рдирдХрд╛рд▓, dyn Trait )ред

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

@cramertj рдЬрд╣рд╛рдВ рддрдХ тАЛтАЛрдлрдВрдХреНрд╢рди рд╕рд┐рдЧреНрдиреЗрдЪрд░ рд░рд┐рдбрдВрдбреЗрдВрд╕реА рдХреА рдмрд╛рдд рд╣реИ ... рдХреНрдпрд╛ рд╣рдо рдЗрд╕рд╕реЗ рдХрд┐рд╕реА рдФрд░ рддрд░реАрдХреЗ рд╕реЗ рдЫреБрдЯрдХрд╛рд░рд╛ рдкрд╛ рд╕рдХрддреЗ рд╣реИрдВ? рдЗрди-рдмреИрдВрдб рд▓рд╛рдЗрдлрдЯрд╛рдЗрдо рдмрд┐рдирд╛ рдмреИрдХрд░реЗрдлрд░реЗрдВрд╕ рдХреЗ рджреВрд░ рдЬрд╛рдиреЗ рдореЗрдВ рд╕рдХреНрд╖рдо рдереЗ; рд╢рд╛рдпрдж рд╣рдо рдХрд┐рд╕реА рднреА рддрд░рд╣ "рдЗрди-рдмреИрдВрдб рдкреНрд░рдХрд╛рд░ рдкреИрд░рд╛рдореАрдЯрд░" рдХреЗ рдиреИрддрд┐рдХ рд╕рдордХрдХреНрд╖ рдХрд░ рд╕рдХрддреЗ рд╣реИрдВред рдпрд╛ рджреВрд╕рд░реЗ рд╢рдмреНрджреЛрдВ рдореЗрдВ, "рдкрд░рд┐рд╡рд░реНрддрди рдЙрддрдирд╛ рд╣реА рд╕рд╛рдорд╛рдиреНрдп рд╣реИ рдФрд░ рдЗрд╕реЗ рд╕рд╛рд░реНрд╡рднреМрдорд┐рдХ рд░реВрдк рд╕реЗ рд▓рд╛рдЧреВ рдХрд░рдиреЗ рдХрд╛ рдЗрд░рд╛рджрд╛ рд╣реИред"

@rpjohnst

рдЗрд╕рдХреЗ рдЕрд▓рд╛рд╡рд╛, <T> рд╕рд┐рдВрдЯреИрдХреНрд╕ рдореЗрдВ рдЬрд╛рдирд╛ рдПрдХ рдорд╣рддреНрд╡рдкреВрд░реНрдг рдмрджрд▓рд╛рд╡ рд╣реИ!

рдЬрд░реВрд░реА рдирд╣реАрдВ, https://github.com/rust-lang/rfcs/pull/2176 рдХреЗ рд╕рд╛рде рдЖрдк рдЕрдВрдд рдореЗрдВ рдПрдХ рдЕрддрд┐рд░рд┐рдХреНрдд рдкреНрд░рдХрд╛рд░ рдХрд╛ рдкреИрд░рд╛рдореАрдЯрд░ рдЬреЛрдбрд╝ рд╕рдХрддреЗ рд╣реИрдВ T: Trait рдФрд░ рдЯрд░реНрдмреЛрдлрд┐рд╢ рдЕрднреА рднреА рдХрд╛рдо рдХрд░реЗрдЧрд╛ (рдЬрдм рддрдХ рдХрд┐ рдЖрдк рдЯреВрдЯрдиреЗ рдХреА рдмрд╛рдд рдирд╣реАрдВ рдХрд░ рд░рд╣реЗ рд╣реИрдВ рдЯрд░реНрдмреЛрдлрд┐рд╢-рдмреНрд░реЗрдХреЗрдЬ рдХреЗ рдЕрд▓рд╛рд╡рд╛ рдХреБрдЫ рдЕрдиреНрдп рд╕рд╛рдзрди)ред

рдЕрдВрддрд░реНрдирд┐рд╣рд┐рдд рд╡рд┐рд╢реЗрд╖рддрд╛ рд╕рдВрд╕реНрдХрд░рдг рдЖрдкрдХреЛ рдРрд╕рд╛ рдХрд░рдиреЗ рдирд╣реАрдВ рджреЗрддрд╛ рд╣реИ, рдФрд░ <T> рд╕рд┐рдВрдЯреИрдХреНрд╕ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рд╣рд╕реНрддрд╛рдХреНрд╖рд░ рдХреЛ рдлрд┐рд░ рд╕реЗ рд▓рд┐рдЦреЗ рдмрд┐рдирд╛ рдЗрд╕реЗ рд╣рдореЗрд╢рд╛ рдХрд╛рдо рдирд╣реАрдВ рдХрд┐рдпрд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИред рдЗрд╕рдХреЗ рдЕрд▓рд╛рд╡рд╛, <T> рд╕рд┐рдВрдЯреИрдХреНрд╕ рдореЗрдВ рдЬрд╛рдирд╛ рдПрдХ рдорд╣рддреНрд╡рдкреВрд░реНрдг рдмрджрд▓рд╛рд╡ рд╣реИ!

рд╕рд╛рде рд╣реА, рдореБрдЭреЗ рд▓рдЧрддрд╛ рд╣реИ рдХрд┐ рдЖрдкрдХрд╛ рдорддрд▓рдм рд╣реИ рдХрд┐ <T> рд╕рд┐рдВрдЯреИрдХреНрд╕ рд╕реЗ рдЖрдЧреЗ рдмрдврд╝рдирд╛ рдПрдХ рдмреНрд░реЗрдХрд┐рдВрдЧ рдкрд░рд┐рд╡рд░реНрддрди рд╣реИ (рдХреНрдпреЛрдВрдХрд┐ рдХреЙрд▓рд░ рдЕрдм рд╕реНрдкрд╖реНрдЯ рд░реВрдк рд╕реЗ рдЯрд░реНрдмреЛрдлрд┐рд╢ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдХреЗ T рдХрд╛ рдорд╛рди рдирд┐рд░реНрджрд┐рд╖реНрдЯ рдирд╣реАрдВ рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ)ред

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

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

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

рдпрд╣ рддрдХрдиреАрдХреА рд░реВрдк рд╕реЗ рдмреНрд░реЗрдХрд┐рдВрдЧ рдорд╛рдорд▓реЛрдВ рдХреА рд╕рдВрдЦреНрдпрд╛ рдХреЛ рдХрдо рдХрд░рддрд╛ рд╣реИ, рд▓реЗрдХрд┐рди рджреВрд╕рд░реА рдУрд░ рдпрд╣ рдЙрди рдорд╛рдорд▓реЛрдВ рдХреА рд╕рдВрдЦреНрдпрд╛ рдХреЛ рдмрдврд╝рд╛рддрд╛ рд╣реИ рдЬрд╣рд╛рдВ рдЖрдк рдХрд┐рд╕реА рд╡рд┐рд╢рд┐рд╖реНрдЯ рдЗрдВрд╕реНрдЯреЗрдВрдЯреЗрд╢рди рдХреЛ рдирд╛рдо рдирд╣реАрдВ рджреЗ рд╕рдХрддреЗред :(

@nikomatsakis

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

рдореБрдЭреЗ рдЕрднреА рднреА рдпрд╣ рдХрд╣рдиреЗ рдореЗрдВ рд╕рдВрдХреЛрдЪ рд╣реЛ рд░рд╣рд╛ рд╣реИ рдХрд┐ рдСрдЯреЛ рд╡рд┐рд╢реЗрд╖рддрд╛ рд▓реАрдХрд┐рдВрдЧ _the right_ рд╕рдорд╛рдзрд╛рди рд╣реИ, рд▓реЗрдХрд┐рди рдореИрдВ рдорд╛рдирддрд╛ рд╣реВрдВ рдХрд┐ рд╣рдо рд╡рд╛рд╕реНрддрд╡ рдореЗрдВ рдпрд╣ рдирд╣реАрдВ рдЬрд╛рди рд╕рдХрддреЗ рдХрд┐ рддрдереНрдп рдХреЗ рдмрд╛рдж рддрдХ рд╕рдмрд╕реЗ рдЕрдЪреНрдЫрд╛ рдХреНрдпрд╛ рд╣реИред

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

рдореИрдВ Sync рдФрд░ Send рдФрд░ _only_ рдХреЛ рдЕрд▓рдЧ рдирд╣реАрдВ рдХрд░рдирд╛ рдЪрд╛рд╣рддрд╛ рдерд╛, рдХреНрдпреЛрдВрдХрд┐ рдпрд╣ рдереЛрдбрд╝рд╛ рдордирдорд╛рдирд╛ рд╣реИ рдФрд░ рдХреЗрд╡рд▓ _one_ рдЙрдкрдпреЛрдЧ рдХреЗ рдорд╛рдорд▓реЗ рдХреЗ рд▓рд┐рдП рд╕рдмрд╕реЗ рдЕрдЪреНрдЫрд╛ рд╣реИред рд╣рд╛рд▓рд╛рдБрдХрд┐, рд╕рднреА рдСрдЯреЛ рд▓рдХреНрд╖рдгреЛрдВ рдХреЛ рдорд╛рдирдиреЗ рдХрд╛ рд╡рд┐рдХрд▓реНрдк рднреА рдЕрдЪреНрдЫрд╛ рдирд╣реАрдВ рд╣реЛрдЧрд╛ред + !Unpin + !... рд╣рд░ рдкреНрд░рдХрд╛рд░ рдкрд░ рдПрдХ рд╡реНрдпрд╡рд╣рд╛рд░реНрдп рд╕рдорд╛рдзрд╛рди рдХреА рддрд░рд╣ рдирд╣реАрдВ рд▓рдЧрддрд╛ рд╣реИред

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

@lрдлреЗрдпрд░реА

рдпрджрд┐ рдкреБрд░рд╛рдиреЗ рд╣рд╕реНрддрд╛рдХреНрд╖рд░ рдореЗрдВ рд╕реНрдкрд╖реНрдЯ рдкреНрд░рдХрд╛рд░ рдХреЗ рдорд╛рдкрджрдВрдбреЛрдВ рдФрд░ рдирд┐рд╣рд┐рдд рд▓реЛрдЧреЛрдВ рдХрд╛ рдорд┐рд╢реНрд░рдг рдерд╛, рддреЛ рд╕реНрдкрд╖реНрдЯ рд╕рд┐рдВрдЯреИрдХреНрд╕ рдореЗрдВ рдЬрд╛рдирд╛ рдПрдХ рдмреНрд░реЗрдХрд┐рдВрдЧ рдкрд░рд┐рд╡рд░реНрддрди рд╣реЛ рд╕рдХрддрд╛ рд╣реИ - n рдкреНрд░рдХрд╛рд░ рдХреЗ рдкреИрд░рд╛рдореАрдЯрд░ рдкреНрд░рджрд╛рди рдХрд░рдиреЗ рд╡рд╛рд▓реЗ рдХреЛ рдЕрдм рдЗрд╕рдХреЗ рдмрдЬрд╛рдп n + 1 рдкреНрд░рджрд╛рди рдХрд░рдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реЛрдЧреАред

рдлрд┐рд▓рд╣рд╛рд▓ рдЗрд╕рдХреА рдЗрдЬрд╛рдЬрдд рдирд╣реАрдВ рд╣реИред рдпрджрд┐ рдЖрдк impl Trait , рддреЛ рдЖрдкрдХреЛ рдХрд┐рд╕реА рднреА рдкреИрд░рд╛рдореАрдЯрд░ рдХреЗ рд▓рд┐рдП рдЯрд░реНрдмреЛрдлрд┐рд╢ рдирд╣реАрдВ рдорд┐рд▓рддрд╛ рд╣реИ (рдЬреИрд╕рд╛ рдХрд┐ рдореИрдВрдиреЗ рдиреЛрдЯ рдХрд┐рдпрд╛ рд╣реИ)ред рдпрд╣ рдПрдХ рджреАрд░реНрдШрдХрд╛рд▓рд┐рдХ рд╕рдорд╛рдзрд╛рди рдХреЗ рд░реВрдк рдореЗрдВ рдЕрднрд┐рдкреНрд░реЗрдд рдирд╣реАрдВ рд╣реИ, рд╣рд╛рд▓рд╛рдВрдХрд┐, рдЬрдм рддрдХ рд╣рдорд╛рд░реЗ рдкрд╛рд╕ рдПрдХ рдЧреЛрд▓ рдбрд┐рдЬрд╛рдЗрди рдХреЗ рд╕рд╛рде рдЖрдиреЗ рдХрд╛ рд╕рдордп рдирд╣реАрдВ рд╣реИ, рддрдм рддрдХ рдХреИрд╕реЗ рдЖрдЧреЗ рдмрдврд╝рдирд╛ рд╣реИ, рдЗрд╕ рдкрд░ рдЕрд╕рд╣рдорддрд┐ рдХреЛ рдЪрдХрдорд╛ рджреЗрдиреЗ рдХреЗ рд▓рд┐рдП рдПрдХ рд░реВрдврд╝рд┐рд╡рд╛рджреА рдХрджрдо рд╣реИред (рдФрд░, рдЬреИрд╕рд╛ рдХрд┐ @rpjohnst рдиреЗ рдЙрд▓реНрд▓реЗрдЦ рдХрд┐рдпрд╛ рд╣реИ, рдЗрд╕рдХреА рдЕрдкрдиреА рдХрдорд┐рдпрд╛рдВ рд╣реИрдВ ред)

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

@lрдлреЗрдпрд░реА

рдпрд╣ рдЙрди рдорд╛рдорд▓реЛрдВ рдореЗрдВ рд╕реЗ рдПрдХ рдерд╛ рдЬрд┐рд╕реЗ @Centril рдХреЗ RFC рдиреЗ рд╣рд▓ рдХрд░рдиреЗ рдХрд╛ рд▓рдХреНрд╖реНрдп рд░рдЦрд╛ рдерд╛ред

_[рд╕рд╛рдорд╛рдиреНрдп рдЬреНрдЮрд╛рди]_ рд╕рдВрдпреЛрдЧ рд╕реЗ, рдпрд╣ рд╡рд╛рд╕реНрддрд╡ рдореЗрдВ @nikomatsakis рдерд╛ рдЬрд┐рд╕рдиреЗ рдореЗрд░реЗ рдзреНрдпрд╛рди рдореЗрдВ рд▓рд╛рдпрд╛ рдХрд┐ рдЖрдВрд╢рд┐рдХ рдЯрд░реНрдмреЛрдлрд┐рд╢ <T: Trait> рдФрд░ impl Trait рдмреАрдЪ рдХреЗ рдмреНрд░реЗрдХ рдХреЛ рдХрдо рдХрд░ рд╕рдХрддрд╛ рд╣реИ;) рдпрд╣ RFC рдХрд╛ рд▓рдХреНрд╖реНрдп рдирд╣реАрдВ рдерд╛ рд╢реБрд░реБрдЖрдд рд╕реЗ рд╣реА, рд▓реЗрдХрд┐рди рдпрд╣ рдПрдХ рдЕрдЪреНрдЫрд╛ рдЖрд╢реНрдЪрд░реНрдп рдерд╛ред рдореИрдВ

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

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

рдЕрдЧрд░ рдЗрд╕реЗ 1.26 рдореЗрдВ рднреЗрдЬрд╛ рдЬрд╛ рд░рд╣рд╛ рд╣реИ рддреЛ https://github.com/rust-lang/rust/issues/49373 рдореБрдЭреЗ рдмрд╣реБрдд рдорд╣рддреНрд╡рдкреВрд░реНрдг рд▓рдЧрддрд╛ рд╣реИ, Future рдФрд░ Iterator рджреЛ рдкреНрд░рдореБрдЦ рдЙрдкрдпреЛрдЧ рд╣реИрдВ -рдХреЗрд╕ рдФрд░ рд╡реЗ рджреЛрдиреЛрдВ рд╕рдВрдмрдВрдзрд┐рдд рдкреНрд░рдХрд╛рд░реЛрдВ рдХреЛ рдЬрд╛рдирдиреЗ рдкрд░ рдмрд╣реБрдд рдирд┐рд░реНрднрд░ рд╣реИрдВред

рд╕рдорд╕реНрдпрд╛ рдЯреНрд░реИрдХрд░ рдореЗрдВ рддреНрд╡рд░рд┐рдд рдЦреЛрдЬ рдХреА, рдФрд░ #47715 рдПрдХ ICE рд╣реИ рдЬрд┐рд╕реЗ рдЕрднреА рднреА рдареАрдХ рдХрд░рдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реИред рдХреНрдпрд╛ рд╣рдо рдЗрд╕реЗ рд╕реНрдерд┐рд░ рд╣реЛрдиреЗ рд╕реЗ рдкрд╣рд▓реЗ рдкреНрд░рд╛рдкреНрдд рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ?

рдХреБрдЫ рдРрд╕рд╛ рдЬреЛ рдореИрдВрдиреЗ рдЖрдЬ рдЗрдореНрдкреНрд▓рд╛рдВрдЯ рдЯреНрд░реИрдЯ рдХреЗ рд╕рд╛рде рдХрд┐рдпрд╛:
https://play.rust-lang.org/?gist=69bd9ca4d41105f655db5f01ff444496&version=stable

рдРрд╕рд╛ рд▓рдЧрддрд╛ рд╣реИ рдХрд┐ impl Trait , unimplemented!() рд╕рд╛рде рдЕрд╕рдВрдЧрдд рд╣реИ - рдХреНрдпрд╛ рдпрд╣ рдПрдХ рдЬреНрдЮрд╛рдд рд╕рдорд╕реНрдпрд╛ рд╣реИ?

рд╣рд╛рдБ, рджреЗрдЦреЗрдВ #36375 рдФрд░ #44923

рдореИрдВрдиреЗ рдЕрднреА-рдЕрднреА рдорд╣рд╕реВрд╕ рдХрд┐рдпрд╛ рд╣реИ рдХрд┐ RFC 1951 рдХреА рдзрд╛рд░рдгрд╛ 2 рдореЗрд░реЗ impl Trait рдХреБрдЫ рдирд┐рдпреЛрдЬрд┐рдд рдЙрдкрдпреЛрдЧреЛрдВ рдХреЗ рдЦрд┐рд▓рд╛рдл async рдмреНрд▓реЙрдХреЛрдВ рдХреЗ рд╕рд╛рде рдЪрд▓рддреА рд╣реИред рд╡рд┐рд╢реЗрд╖ рд░реВрдк рд╕реЗ рдпрджрд┐ рдЖрдк рдЕрдзрд┐рдХ рдПрд░реНрдЧреЛрдиреЛрдорд┐рдХ рдПрдкреАрдЖрдИ рд░рдЦрдиреЗ рдХреЗ рд▓рд┐рдП рд╕рд╛рдорд╛рдиреНрдп AsRef рдпрд╛ Into рдкреИрд░рд╛рдореАрдЯрд░ рд▓реЗрддреЗ рд╣реИрдВ, рддреЛ async рдмреНрд▓реЙрдХ рд╡рд╛рдкрд╕ рдХрд░рдиреЗ рд╕реЗ рдкрд╣рд▓реЗ рдЗрд╕реЗ рдХреБрдЫ рд╕реНрд╡рд╛рдорд┐рддреНрд╡ рд╡рд╛рд▓реЗ рдкреНрд░рдХрд╛рд░ рдореЗрдВ рдмрджрд▓ рджреЗрдВ, рдлрд┐рд░ рднреА рдЖрдкрдХреЛ рд░рд┐рдЯрд░реНрди рдорд┐рд▓рддрд╛ рд╣реИ impl Trait рдкреНрд░рдХрд╛рд░ рдЙрд╕ рдкреИрд░рд╛рдореАрдЯрд░ рдореЗрдВ рдХрд┐рд╕реА рднреА рдЬреАрд╡рдирдХрд╛рд▓ рджреНрд╡рд╛рд░рд╛ рдмрд╛рдзреНрдп рдХрд┐рдпрд╛ рдЬрд╛ рд░рд╣рд╛ рд╣реИ, рдЙрджрд╛рд╣рд░рдг рдХреЗ рд▓рд┐рдП

impl HttpClient {
    fn get(&mut self, url: impl Into<Url>) -> impl Future<Output = Response> + '_ {
        let url = url.into();
        async {
            // perform the get
        }
    }
}

fn foo(client: &mut HttpClient) -> impl Future<Output = Response> + '_ {
    let url = Url::parse("http://foo.example.com").unwrap();
    client.get(&url)
}

рдЗрд╕рдХреЗ рд╕рд╛рде рдЖрдкрдХреЛ рдПрдХ error[E0597]: `url` does not live long enough рдорд┐рд▓реЗрдЧрд╛ рдХреНрдпреЛрдВрдХрд┐ get рдореЗрдВ рд▓реМрдЯрд╛рдП рдЧрдП impl Future рдореЗрдВ рдЕрд╕реНрдерд╛рдпреА рд╕рдВрджрд░реНрдн рдХрд╛ рдЬреАрд╡рдирдХрд╛рд▓ рд╢рд╛рдорд┐рд▓ рд╣реИред рдЗрд╕ рдЙрджрд╛рд╣рд░рдг рдореЗрдВ рдереЛрдбрд╝рд╛ рд╕рд╛ рдпреЛрдЧрджрд╛рди рджрд┐рдпрд╛ рдЧрдпрд╛ рд╣реИ рдХрд┐ рдЖрдк get рдореЗрдВ рдореВрд▓реНрдп рд╕реЗ рдпреВрдЖрд░рдПрд▓ рдкрд╛рд╕ рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ, рд▓реЗрдХрд┐рди рд╡рд╛рд╕реНрддрд╡рд┐рдХ рдХреЛрдб рдореЗрдВ рд▓рдЧрднрдЧ рдирд┐рд╢реНрдЪрд┐рдд рд░реВрдк рд╕реЗ рдЗрд╕реА рддрд░рд╣ рдХреЗ рдорд╛рдорд▓реЗ рд╕рд╛рдордиреЗ рдЖрдПрдВрдЧреЗред

рдЬрд╣рд╛рдБ рддрдХ рдореИрдВ рдмрддрд╛ рд╕рдХрддрд╛ рд╣реВрдБ рдХрд┐ рдЗрд╕рдХреЗ рд▓рд┐рдП рдЕрдкреЗрдХреНрд╖рд┐рдд рд╕реБрдзрд╛рд░ рд╕рд╛рд░ рдкреНрд░рдХрд╛рд░ рд╣реИ, рд╡рд┐рд╢реЗрд╖ рд░реВрдк рд╕реЗ

impl HttpClient {
    abstract type Get<'a>: impl Future<Output = Response> + 'a;
    fn get(&mut self, url: impl Into<Url>) -> Self::Get<'_> {
        let url = url.into();
        async {
            // perform the get
        }
    }
}

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

рдореИрдВ рд╕реЛрдЪ рд░рд╣рд╛ рд╣реВрдВ рдХрд┐ рдХреНрдпрд╛ рдЗрд╕реЗ рд▓рд┐рдЦрдиреЗ рдХрд╛ рд╕рдВрднрд╛рд╡рд┐рдд рд░реВрдк рд╕реЗ рдПрдХ рдФрд░ рд╕рдВрдХреНрд╖рд┐рдкреНрдд рддрд░реАрдХрд╛ рд╣реИ, рдпрд╛ рдХреНрдпрд╛ рдпрд╣ рд▓рдЧрднрдЧ рд╣рд░ рдлрд╝рдВрдХреНрд╢рди рдХреЗ рд▓рд┐рдП рдЙрдкрдпреЛрдЧ рдХрд┐рдП рдЬрд╛ рд░рд╣реЗ рдЕрдореВрд░реНрдд рдкреНрд░рдХрд╛рд░реЛрдВ рдХреЗ рд╕рд╛рде рд╕рдорд╛рдкреНрдд рд╣реЛ рдЬрд╛рдПрдЧрд╛ рдФрд░ рдХрднреА рднреА impl Trait рд░рд┐рдЯрд░реНрди рдкреНрд░рдХрд╛рд░ рдирд╣реАрдВ рд╣реЛрдЧрд╛?

@ Nemo157 рд╣рд╛рдБ, рджреЗрдЦреЗрдВ https://github.com/rust-lang/rust/issues/42940

рдЗрд╕рд▓рд┐рдП, рдЕрдЧрд░ рдореИрдВ рдЙрд╕ рдореБрджреНрджреЗ рдкрд░ @cramertj рдХреА рдЯрд┐рдкреНрдкрдгреА рдХреЛ рд╕рдордЭрддрд╛ рд╣реВрдВ рддреЛ рдЖрдкрдХреЛ HttpClient::get рдХреА рдкрд░рд┐рднрд╛рд╖рд╛ рдкрд░ рдПрдХ рддреНрд░реБрдЯрд┐ рдорд┐рд▓реЗрдЧреА рдЬреИрд╕реЗ `get` returns an `impl Future` type which is bounded to live for `'_`, but this type could potentially contain data with a shorter lifetime inside the type of `url` ред (рдЪреВрдВрдХрд┐ рдЖрд░рдПрдлрд╕реА рд╕реНрдкрд╖реНрдЯ рд░реВрдк рд╕реЗ рдирд┐рд░реНрджрд┐рд╖реНрдЯ рдХрд░рддрд╛ рд╣реИ рдХрд┐ impl Trait _all_ рд╕рд╛рдорд╛рдиреНрдп рдкреНрд░рдХрд╛рд░ рдХреЗ рдкреИрд░рд╛рдореАрдЯрд░ рдХреЛ рдХреИрдкреНрдЪрд░ рдХрд░рддрд╛ рд╣реИ, рдФрд░ рдпрд╣ рдПрдХ рдмрдЧ рд╣реИ рдЬрд┐рд╕реЗ рдЖрдкрдХреЛ рдПрдХ рдкреНрд░рдХрд╛рд░ рдХреЛ рдХреИрдкреНрдЪрд░ рдХрд░рдиреЗ рдХреА рдЕрдиреБрдорддрд┐ рд╣реИ рдЬрд┐рд╕рдореЗрдВ рдЖрдкрдХреЗ рд╕реНрдкрд╖реНрдЯ рд░реВрдк рд╕реЗ рдШреЛрд╖рд┐рдд рдЬреАрд╡рдирдХрд╛рд▓ рд╕реЗ рдХрдо рдЬреАрд╡рдирдХрд╛рд▓ рд╣реЛ рд╕рдХрддрд╛ рд╣реИ)ред

рдЗрд╕рд╕реЗ рдПрдХрдорд╛рддреНрд░ рдлрд┐рдХреНрд╕ рдЕрднреА рднреА рдирд╛рдордорд╛рддреНрд░ рд╕рд╛рд░ рдкреНрд░рдХрд╛рд░ рдШреЛрд╖рд┐рдд рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдкреНрд░рддреАрдд рд╣реЛрддрд╛ рд╣реИ рддрд╛рдХрд┐ рд╕реНрдкрд╖реНрдЯ рд░реВрдк рд╕реЗ рдШреЛрд╖рд┐рдд рдХрд┐рдпрд╛ рдЬрд╛ рд╕рдХреЗ рдХрд┐ рдХрд┐рд╕ рдкреНрд░рдХрд╛рд░ рдХреЗ рдкреИрд░рд╛рдореАрдЯрд░ рдХреИрдкреНрдЪрд░ рдХрд┐рдП рдЧрдП рд╣реИрдВред

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

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

@ Nemo157 рд╣рд╛рдВ, #42940 рдХреЛ рдареАрдХ рдХрд░рдиреЗ рд╕реЗ рдЖрдкрдХреА рдЬреАрд╡рди рднрд░ рдХреА рд╕рдорд╕реНрдпрд╛ рдареАрдХ рд╣реЛ рдЬрд╛рдПрдЧреА рдХреНрдпреЛрдВрдХрд┐ рдЖрдк рдпрд╣ рдирд┐рд░реНрджрд┐рд╖реНрдЯ рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ рдХрд┐ рд░рд┐рдЯрд░реНрди рдкреНрд░рдХрд╛рд░ рдХреЛ рд╕реНрд╡рдпрдВ рдХреЗ рдЙрдзрд╛рд░ рдХреЗ рд░реВрдк рдореЗрдВ рд▓рдВрдмреЗ рд╕рдордп рддрдХ рд░рд╣рдирд╛ рдЪрд╛рд╣рд┐рдП, рдЪрд╛рд╣реЗ Url рдХрд╛ рдЬреАрд╡рдирдХрд╛рд▓ рдХреБрдЫ рднреА рд╣реЛред рдпрд╣ рдирд┐рд╢реНрдЪрд┐рдд рд░реВрдк рд╕реЗ рдПрдХ рдмрджрд▓рд╛рд╡ рд╣реИ рдЬрд┐рд╕реЗ рд╣рдо рдХрд░рдирд╛ рдЪрд╛рд╣рддреЗ рд╣реИрдВ, рд▓реЗрдХрд┐рди рдореЗрд░рд╛ рдорд╛рдирдирд╛ тАЛтАЛтАЛтАЛрд╣реИ рдХрд┐ рдРрд╕рд╛ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдпрд╣ рдкрд┐рдЫрдбрд╝рд╛-рд╕рдВрдЧрдд рд╣реИ-- рдпрд╣ рд░рд┐рдЯрд░реНрди рдкреНрд░рдХрд╛рд░ рдХреЛ рдХрдо рдЬреАрд╡рдирдХрд╛рд▓ рдХреА рдЕрдиреБрдорддрд┐ рдирд╣реАрдВ рджреЗ рд░рд╣рд╛ рд╣реИ, рдпрд╣ рдЙрди рддрд░реАрдХреЛрдВ рдХреЛ рдЕрдзрд┐рдХ рдкреНрд░рддрд┐рдмрдВрдзрд┐рдд рдХрд░ рд░рд╣рд╛ рд╣реИ рдЬрд┐рдирдореЗрдВ рд░рд┐рдЯрд░реНрди рдкреНрд░рдХрд╛рд░ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд┐рдпрд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИред

рдЙрджрд╛рд╣рд░рдг рдХреЗ рд▓рд┐рдП, "рдкреИрд░рд╛рдореАрдЯрд░ Iter рд╕рд╛рде рдирд┐рдореНрди рддреНрд░реБрдЯрд┐рдпрд╛рдБ рдкрд░реНрдпрд╛рдкреНрдд рд╕рдордп рддрдХ рдирд╣реАрдВ рд░рд╣ рд╕рдХрддреА рд╣реИрдВ":

fn foo<'a, Iter>(_: &'a mut u32, iter: Iter) -> impl Iterator<Item = u32> + 'a
    where Iter: Iterator<Item = u32>
{
    iter
}

рдлрд╝рдВрдХреНрд╢рди рдХреЗ рд▓рд┐рдП рдЬреЗрдирд░рд┐рдХ рдореЗрдВ рдХреЗрд╡рд▓ Iter рд╣реЛрдирд╛ рдЗрд╕реЗ рд░рд┐рдЯрд░реНрди рдкреНрд░рдХрд╛рд░ рдореЗрдВ рдЙрдкрд╕реНрдерд┐рдд рд╣реЛрдиреЗ рдХреА рдЕрдиреБрдорддрд┐ рджреЗрдиреЗ рдХреЗ рд▓рд┐рдП рдкрд░реНрдпрд╛рдкреНрдд рдирд╣реАрдВ рд╣реИ, рд▓реЗрдХрд┐рди рд╡рд░реНрддрдорд╛рди рдореЗрдВ рдлрд╝рдВрдХреНрд╢рди рдХреЗ рдХреЙрд▓рд░ рдЧрд▓рдд рддрд░реАрдХреЗ рд╕реЗ рдорд╛рди рд▓реЗрддреЗ рд╣реИрдВ рдХрд┐ рдпрд╣ рд╣реИред рдпрд╣ рдирд┐рд╢реНрдЪрд┐рдд рд░реВрдк рд╕реЗ рдПрдХ рдмрдЧ рд╣реИ рдФрд░ рдЗрд╕реЗ рдареАрдХ рдХрд┐рдпрд╛ рдЬрд╛рдирд╛ рдЪрд╛рд╣рд┐рдП, рд▓реЗрдХрд┐рди рдореЗрд░рд╛ рдорд╛рдирдирд╛ тАЛтАЛтАЛтАЛрд╣реИ рдХрд┐ рдЗрд╕реЗ рдкреАрдЫреЗ рдХреА рдУрд░-рд╕рдВрдЧрдд рд░реВрдк рд╕реЗ рддрдп рдХрд┐рдпрд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИ рдФрд░ рд╕реНрдерд┐рд░реАрдХрд░рдг рдХреЛ рдЕрд╡рд░реБрджреНрдз рдирд╣реАрдВ рдХрд░рдирд╛ рдЪрд╛рд╣рд┐рдПред

рдРрд╕рд╛ рдкреНрд░рддреАрдд рд╣реЛрддрд╛ рд╣реИ #46541 рд╣реЛ рдЧрдпрд╛ рд╣реИред рдХреНрдпрд╛ рдХреЛрдИ рдУрдкреА рдЕрдкрдбреЗрдЯ рдХрд░ рд╕рдХрддрд╛ рд╣реИ?

рдХреНрдпрд╛ рдХреЛрдИ рдХрд╛рд░рдг рд╣реИ рдХрд┐ рд╕рд┐рдВрдЯреИрдХреНрд╕ abstract type Foo = ...; рдХреЛ type Foo = impl ...; рд╕реЗ рдЕрдзрд┐рдХ рдЪреБрдирд╛ рдЧрдпрд╛ рдерд╛? рдореИрдВрдиреЗ рд╡рд╛рдХреНрдп рд░рдЪрдирд╛ рдХреА рдирд┐рд░рдВрддрд░рддрд╛ рдХреЗ рд▓рд┐рдП рдмрд╛рдж рд╡рд╛рд▓реЗ рдХреЛ рдмрд╣реБрдд рдкрд╕рдВрдж рдХрд┐рдпрд╛, рдФрд░ рдореБрдЭреЗ рдХреБрдЫ рд╕рдордп рдкрд╣рд▓реЗ рдЗрд╕ рдкрд░ рдХреБрдЫ рдЪрд░реНрдЪрд╛ рдпрд╛рдж рд╣реИ, рд▓реЗрдХрд┐рди рдпрд╣ рдкреНрд░рддреАрдд рдирд╣реАрдВ рд╣реЛрддрд╛ рд╣реИред

рдореИрдВ type Foo = impl ...; рдпрд╛ type Foo: ...; рдЖрдВрд╢рд┐рдХ рд╣реВрдВ, abstract рдПрдХ рдЕрдирд╛рд╡рд╢реНрдпрдХ рдСрдбрдмреЙрд▓ рд▓рдЧрддрд╛ рд╣реИред

рдЕрдЧрд░ рдореБрдЭреЗ рдареАрдХ рд╕реЗ рдпрд╛рдж рд╣реИ, рддреЛ рдореБрдЦреНрдп рдЪрд┐рдВрддрд╛рдУрдВ рдореЗрдВ рд╕реЗ рдПрдХ рдпрд╣ рдереА рдХрд┐ рд▓реЛрдЧреЛрдВ рдиреЗ type X = Y рдХреЛ рдПрдХ рдкрд╛рдареНрдп рдкреНрд░рддрд┐рд╕реНрдерд╛рдкрди рдХреЗ рд░реВрдк рдореЗрдВ рд╡реНрдпрд╛рдЦреНрдпрд╛ рдХрд░рдирд╛ рд╕реАрдЦ рд▓рд┐рдпрд╛ рд╣реИ ("рдЬрд╣рд╛рдВ рд▓рд╛рдЧреВ рд╣реЛ X рдХреЛ Y рдмрджрд▓реЗрдВ")ред рдпрд╣ type X = impl Y рд▓рд┐рдП рдХрд╛рдо рдирд╣реАрдВ рдХрд░рддрд╛ рд╣реИред

рдореИрдВ рд╕реНрд╡рдпрдВ type X = impl Y рд╣реВрдВ рдХреНрдпреЛрдВрдХрд┐ рдореЗрд░рд╛ рдЕрдВрддрд░реНрдЬреНрдЮрд╛рди рдпрд╣ рд╣реИ рдХрд┐ type let рддрд░рд╣ рдХрд╛рдо рдХрд░рддрд╛ рд╣реИ, рд▓реЗрдХрд┐рди...

@alexreg рдЗрд╕ рд╡рд┐рд╖рдп рдкрд░ RFC 2071 рдкрд░ рдмрд╣реБрдд рд╕рд╛рд░реА рдЪрд░реНрдЪрд╛рдПрдБ рд╣реИрдВред TL; DR: type Foo = impl Trait; impl Trait рдХреЛ рдХреБрдЫ "рдЕрдзрд┐рдХ рд╕реНрдкрд╖реНрдЯ" рд░реВрдк рдореЗрдВ desugar рдХрд░рдиреЗ рдХреА рдХреНрд╖рдорддрд╛ рдХреЛ рддреЛрдбрд╝рддрд╛ рд╣реИ, рдФрд░ рдпрд╣ рд▓реЛрдЧреЛрдВ рдХреЗ рдЕрдВрддрд░реНрдЬреНрдЮрд╛рди рдХреЛ рддреЛрдбрд╝рддрд╛ рд╣реИ рдЬреЛ рдХрд┐ рдереЛрдбрд╝реЗ рд╕реЗ рд╕реНрдорд╛рд░реНрдЯ рд╡рд╛рдХреНрдпрд╛рддреНрдордХ рдкреНрд░рддрд┐рд╕реНрдерд╛рдкрди рдХреЗ рд░реВрдк рдореЗрдВ рдХрд╛рдо рдХрд░ рд░рд╣реЗ рдЙрдкрдирд╛рдореЛрдВ рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рд╣реИред

рдореИрдВ рдЯрд╛рдЗрдк рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдЖрдВрд╢рд┐рдХ рд╣реВрдБ Foo = impl ...; рдпрд╛ рдЯрд╛рдЗрдк рдХрд░реЗрдВ рдлреВ: ...;, рдПрдмреНрд╕рдЯреНрд░реИрдХреНрдЯ рдПрдХ рдЕрдирд╛рд╡рд╢реНрдпрдХ рдСрдбрдмреЙрд▓ рд▓рдЧрддрд╛ рд╣реИ

рдЖрдкрдХреЛ рдореЗрд░реЗ exists type Foo: Trait; рд╢рд┐рд╡рд┐рд░ рдореЗрдВ рд╢рд╛рдорд┐рд▓ рд╣реЛрдирд╛ рдЪрд╛рд╣рд┐рдП: рдкрд▓рдХ:

@рдХреНрд░реИрдорд░реНрдЯрдЬ рд╣рдореНрдоред рдореИрдВрдиреЗ рдЙрдирдореЗрдВ рд╕реЗ рдХреБрдЫ рдкрд░ рдЕрднреА-рдЕрднреА рдЦреБрдж рдХреЛ рддрд░реЛрддрд╛рдЬрд╛ рдХрд┐рдпрд╛ рд╣реИ, рдФрд░ рдЕрдЧрд░ рдореИрдВ рдИрдорд╛рдирджрд╛рд░ рд╣реВрдВ рддреЛ рдореИрдВ рдпрд╣ рдирд╣реАрдВ рдХрд╣ рд╕рдХрддрд╛ рдХрд┐ рдореИрдВ @withboats рдХреЗ рддрд░реНрдХ рдХреЛ рд╕рдордЭрддрд╛ https://github.com/rust-lang/rfcs/pull/2071#issuecomment -319012123 рдЬреИрд╕реА рдЪреАрдЬреЛрдВ рдХреЛ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдпрд╣ рд╕рд┐рдВрдЯреИрдХреНрд╕ рд╕рдмрд╕реЗ рдЕрдЪреНрдЫрд╛ рд╣реИ - рдХреНрдпрд╛ рдпрд╣ рд╡рд░реНрддрдорд╛рди рд╕рд┐рдВрдЯреИрдХреНрд╕ рдореЗрдВ рднреА рдХрд┐рдпрд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИ?

exists type Foo: Trait; рдереЛрдбрд╝рд╛ рд╕реБрдзрд╛рд░ рд╣реИ, рд╣рд╛рд▓рд╛рдВрдХрд┐ рдореИрдВ рдЕрднреА рднреА exists рдХреАрд╡рд░реНрдб рдХреЛ рдЫреЛрдбрд╝ рджреВрдВрдЧрд╛ред type Foo: Trait; рдореБрдЭреЗ рд╢рд┐рдХрд╛рдпрдд рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдкрд░реНрдпрд╛рдкреНрдд рдкрд░реЗрд╢рд╛рди рдирд╣реАрдВ рдХрд░реЗрдЧрд╛ред ЁЯШЙ abstract рд╕рд┐рд░реНрдл рдЬрд╝рд░реВрд░рдд рд╕реЗ рдЬрд╝реНрдпрд╛рджрд╛/ рд╡рд┐рд╖рдо рдЧреЗрдВрдж рд╣реИ , рдЬреИрд╕рд╛ рдХрд┐

@alexreg

рдХреНрдпрд╛ рдпрд╣ рд╡рд░реНрддрдорд╛рди рд╡рд╛рдХреНрдпрд╡рд┐рдиреНрдпрд╛рд╕ рдореЗрдВ рднреА рдХрд┐рдпрд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИ?

рд╣рд╛рдБ, рд▓реЗрдХрд┐рди рдпрд╣ рдмрд╣реБрдд рдЕрдзрд┐рдХ рдЕрдЬреАрдм рд╣реИред = impl Trait рд╕рд┐рдВрдЯреИрдХреНрд╕ ( abstract рдХреАрд╡рд░реНрдб рдореЙрдбреНрдпреВрд▓) рдХреЛ рдкреНрд░рд╛рдердорд┐рдХрддрд╛ рджреЗрдиреЗ рдХрд╛ рдпрд╣ рдореЗрд░рд╛ рдкреНрд░рд╛рдердорд┐рдХ рдХрд╛рд░рдг рдерд╛ред

type Foo = (impl Bar, impl Baz);
type IterDisplay = impl Iterator<Item=impl Display>;

// can be written like this:

exists type Foo1: Bar;
exists type Foo2: Baz;
exists type Foo: (Foo1, Foo2);

exists type IterDisplayItem: Display;
exists type IterDisplay: Iterator<Item=IterDisplayItem>;

рд╕рдВрдкрд╛рджрд┐рдд рдХрд░реЗрдВ: exists type Foo: (Foo1, Foo2); рдКрдкрд░ type Foo = (Foo1, Foo2); рд╣реЛрдирд╛ рдЪрд╛рд╣рд┐рдП рдерд╛ред рдЧрд▓рддрдлрд╣рдореА рдХреЗ рд▓рд┐рдП рдЦреЗрдж рд╣реИред

@cramertj рд╡рд╛рдХреНрдпрд╡рд┐рдиреНрдпрд╛рд╕ рдЕрдЪреНрдЫрд╛ рд▓рдЧрддрд╛ рд╣реИред рдХреНрдпрд╛ exists рдПрдХ рдЙрдЪрд┐рдд рдХреАрд╡рд░реНрдб рд╣реЛрдирд╛ рдЪрд╛рд╣рд┐рдП?

@cramertj рдареАрдХ рд╣реИ, рдореИрдВ рд╕реЛрдЪ рд░рд╣рд╛ рдерд╛ рдХрд┐ рдЖрдкрдХреЛ рдРрд╕рд╛ рдХреБрдЫ рдХрд░рдирд╛ рд╣реЛрдЧрд╛ ... = impl Trait рдкрд╕рдВрдж рдХрд░рдиреЗ рдХрд╛ рдПрдХ рдЕрдЪреНрдЫрд╛ рдХрд╛рд░рдг, рдореБрдЭреЗ рд▓рдЧрддрд╛ рд╣реИ! рдИрдорд╛рдирджрд╛рд░реА рд╕реЗ, рдЕрдЧрд░ рд▓реЛрдЧреЛрдВ рдХреЛ рд▓рдЧрддрд╛ рд╣реИ рдХрд┐ рдкреНрд░рддрд┐рд╕реНрдерд╛рдкрди рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рдЕрдВрддрд░реНрдЬреНрдЮрд╛рди рдпрд╣рд╛рдВ рдЕрд╕реНрддрд┐рддреНрд╡ рдХреЗ рдкреНрд░рдХрд╛рд░реЛрдВ рдХреЗ рд▓рд┐рдП рдкрд░реНрдпрд╛рдкреНрдд рд░реВрдк рд╕реЗ рдЯреВрдЯ рдЬрд╛рддрд╛ рд╣реИ (рд╕рд░рд▓ рдкреНрд░рдХрд╛рд░ рдХреЗ рдЙрдкрдирд╛рдореЛрдВ рдХреА рддреБрд▓рдирд╛ рдореЗрдВ), рддреЛ рдирд┐рдореНрдирд▓рд┐рдЦрд┐рдд рд╕рдордЭреМрддрд╛ рдХреНрдпреЛрдВ рдирд╣реАрдВ?

exists type Foo = (impl Bar, impl Baz);

(рдИрдорд╛рдирджрд╛рд░реА рд╕реЗ рд╣рд╛рд▓рд╛рдВрдХрд┐, рдореБрдЭреЗ рд╣рд░ рдЪреАрдЬ рдХреЗ рд▓рд┐рдП рд╕рд┐рдВрдЧрд▓ type рдХреАрд╡рд░реНрдб рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдиреЗ рдХреА рдирд┐рд░рдВрддрд░рддрд╛ рдЪрд╛рд╣рд┐рдПред)

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

exists type Foo: (Foo1, Foo2);

рдЧрд╣рд░рд╛ рдЕрдЬреАрдмред Foo: (Foo1, Foo2) рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдирд╛ рдЬрд╣рд╛рдВ RHS рдмрд╛рдзреНрдп рдирд╣реАрдВ рд╣реИ, рднрд╛рд╖рд╛ рдореЗрдВ рдХрд╣реАрдВ рдФрд░ Ty: Bound рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдиреЗ рдХреЗ рддрд░реАрдХреЗ рдХреЗ рдЕрдиреБрд░реВрдк рдирд╣реАрдВ рд╣реИред

рдирд┐рдореНрдирд▓рд┐рдЦрд┐рдд рд░реВрдк рдореБрдЭреЗ рдареАрдХ рд▓рдЧрддреЗ рд╣реИрдВ:

exists type Foo: Bar + Baz;  // <=> "There exists a type Foo which satisfies Bar and Baz."
                             // Reads super well!

type Foo = impl Bar + Baz;

type Bar = (impl Foo, impl Bar);

рдореИрдВ рдпрд╣рд╛рдВ рдПрдХ рд╢рдмреНрдж рдХреЗ рд░реВрдк рдореЗрдВ abstract рдЙрдкрдпреЛрдЧ рдирд╣реАрдВ рдХрд░рдирд╛ рднреА рдкрд╕рдВрдж рдХрд░рддрд╛ рд╣реВрдВред

рдореБрдЭреЗ exists type Foo: (Foo1, Foo2); рдмрд╣реБрдд рдЕрдЬреАрдм рд▓рдЧрддрд╛ рд╣реИ

рдпрд╣ рдирд┐рд╢реНрдЪрд┐рдд рд░реВрдк рд╕реЗ рдореЗрд░реЗ рд▓рд┐рдП рдПрдХ рдЧрд▓рддреА рдХреА рддрд░рд╣ рджрд┐рдЦрддрд╛ рд╣реИ, рдФрд░ рдореБрдЭреЗ рд▓рдЧрддрд╛ рд╣реИ рдХрд┐ рдЗрд╕реЗ type Foo = (Foo1, Foo2); рдХрд╣рдирд╛ рдЪрд╛рд╣рд┐рдПред

рдЕрдЧрд░ рд╣рдо рдпрд╣рд╛рдВ abstract type рдмрдирд╛рдо exists type рдмрд╛рдЗрдХ рд╢реЗрдбрд┐рдВрдЧ рдХрд░ рд░рд╣реЗ рд╣реИрдВ, рддреЛ рдореИрдВ рдирд┐рд╢реНрдЪрд┐рдд рд░реВрдк рд╕реЗ рдкреВрд░реНрд╡ рдХрд╛ рд╕рдорд░реНрдерди рдХрд░реВрдВрдЧрд╛ред рдЕрдзрд┐рдХрддрд░ рдХреНрдпреЛрдВрдХрд┐ "рд╕рд╛рд░" рд╡рд┐рд╢реЗрд╖рдг рдХреЗ рд░реВрдк рдореЗрдВ рдХрд╛рдо рдХрд░рддрд╛ рд╣реИред рдореИрдВ рдмрд╛рддрдЪреАрдд рдореЗрдВ рдЖрд╕рд╛рдиреА рд╕реЗ рдХреБрдЫ "рдЕрдореВрд░реНрдд рдкреНрд░рдХрд╛рд░" рдХрд╣ рд╕рдХрддрд╛ рд╣реВрдВ, рдЬрдмрдХрд┐ рдпрд╣ рдХрд╣рдирд╛ рдЕрдЬреАрдм рд▓рдЧрддрд╛ рд╣реИ рдХрд┐ рд╣рдо "рдЕрд╕реНрддрд┐рддреНрд╡ рдкреНрд░рдХрд╛рд░" рдмрдирд╛ рд░рд╣реЗ рд╣реИрдВред

рдореИрдВ рдЕрдм рднреА : Foo + Bar рд╕реЗ : (Foo, Bar) , = Foo + Bar , = impl Foo + Bar рдпрд╛ = (impl Foo, impl Bar рдкрд╕рдВрдж рдХрд░реВрдВрдЧрд╛ред + рдХрд╛ рдЙрдкрдпреЛрдЧ рдЕрдиреНрдп рд╕рднреА рд╕реНрдерд╛рдиреЛрдВ рдХреЗ рд╕рд╛рде рдЕрдЪреНрдЫреА рддрд░рд╣ рд╕реЗ рдХрд╛рдо рдХрд░рддрд╛ рд╣реИ, рдФрд░ = рдХреА рдХрдореА рд╡рд╛рд╕реНрддрд╡ рдореЗрдВ рджрд░реНрд╢рд╛рддреА рд╣реИ рдХрд┐ рд╣рдо рдкреВрд░реНрдг рдкреНрд░рдХрд╛рд░ рдирд╣реАрдВ рд▓рд┐рдЦ рд╕рдХрддреЗ рд╣реИрдВред рд╣рдо рдпрд╣рд╛рдВ рдПрдХ рдкреНрд░рдХрд╛рд░ рдХрд╛ рдЙрдкрдирд╛рдо рдирд╣реАрдВ рдмрдирд╛ рд░рд╣реЗ рд╣реИрдВ, рд╣рдо рдЙрд╕ рдЪреАрдЬрд╝ рдХреЗ рд▓рд┐рдП рдПрдХ рдирд╛рдо рдмрдирд╛ рд░рд╣реЗ рд╣реИрдВ рдЬрд┐рд╕рдХреА рд╣рдо рдирд┐рд╢реНрдЪрд┐рдд рд╕реАрдорд╛ рдХреА рдЧрд╛рд░рдВрдЯреА рджреЗрддреЗ рд╣реИрдВ, рд▓реЗрдХрд┐рди рд╣рдо рд╕реНрдкрд╖реНрдЯ рд░реВрдк рд╕реЗ рдирд╛рдо рдирд╣реАрдВ рджреЗ рд╕рдХрддреЗред


рдореБрдЭреЗ рдЕрднреА рднреА https://github.com/rust-lang/rfcs/pull/2071#issuecomment -318852774 рдХрд╛ рд╕рд┐рдВрдЯреИрдХреНрд╕ рд╕реБрдЭрд╛рд╡ рдкрд╕рдВрдж рд╣реИ:

type ExistentialFoo: Bar;
type Bar: Baz + Bax;

рд╣рд╛рд▓рд╛рдВрдХрд┐ рдпрд╣ рд╣реИ, рдЬреИрд╕рд╛ рдХрд┐ рдЙрд╕ рд╕реВрддреНрд░ рдореЗрдВ рдмрддрд╛рдпрд╛ рдЧрдпрд╛ рд╣реИ, рдереЛрдбрд╝рд╛ рдмрд╣реБрдд рдЕрдВрддрд░ рд╣реИ рдФрд░ рдмрд╣реБрдд рд╕реНрдкрд╖реНрдЯ рдирд╣реАрдВ рд╣реИред

рдореБрдЭреЗ рдЖрдк рдореЗрдВ рд╕реЗ рдХреБрдЫ рд▓реЛрдЧреЛрдВ рд╕реЗ рдмрд╣реБрдд рдЕрд▓рдЧ рддрд░реАрдХреЗ рд╕реЗ (impl Foo, impl Bar) рд╡реНрдпрд╛рдЦреНрдпрд╛ рдХрд░рдиреА рдЪрд╛рд╣рд┐рдП ... рдореЗрд░реЗ рд▓рд┐рдП, рдЗрд╕рдХрд╛ рдорддрд▓рдм рд╣реИ рдХрд┐ рдкреНрд░рдХрд╛рд░ рдХреБрдЫ рдЕрд╕реНрддрд┐рддреНрд╡рдЧрдд рдкреНрд░рдХрд╛рд░реЛрдВ рдХрд╛ 2-рдЯреБрдкрд▓ рд╣реИ, рдФрд░ impl Foo + Bar рд╕реЗ рдмрд┐рд▓реНрдХреБрд▓ рдЕрд▓рдЧ рд╣реИред

@alexreg рдЕрдЧрд░ рд╡рд╣ @cramertj рдХрд╛ рдЗрд░рд╛рджрд╛ рдерд╛, рддреЛ рдореБрдЭреЗ рдЕрднреА рднреА : рд╕рд┐рдВрдЯреИрдХреНрд╕ рдХреЗ рд╕рд╛рде рдпрд╣ рдмрд╣реБрдд рдЕрдЬреАрдм рд▓рдЧреЗрдЧрд╛:

exists type Foo: (Foo1, Foo2);

рдпрд╣ рдЕрднреА рднреА рдмрд╣реБрдд рдЕрд╕реНрдкрд╖реНрдЯ рд▓рдЧрддрд╛ рд╣реИ рдХрд┐ рдпрд╣ рдХреНрдпрд╛ рдХрд░ рд░рд╣рд╛ рд╣реИ - рд╕реАрдорд╛рдПрдВ рдЖрдорддреМрд░ рдкрд░ рдХрд┐рд╕реА рднреА рдорд╛рдорд▓реЗ рдореЗрдВ рд╕рдВрднрд╛рд╡рд┐рдд рдкреНрд░рдХрд╛рд░реЛрдВ рдХрд╛ рдПрдХ рдЯрдкрд▓ рдирд┐рд░реНрджрд┐рд╖реНрдЯ рдирд╣реАрдВ рдХрд░рддреА рд╣реИрдВ, рдФрд░ рдЗрд╕реЗ рдЖрд╕рд╛рдиреА рд╕реЗ Foo: Foo1 + Foo2 рд╕рд┐рдВрдЯреИрдХреНрд╕ рдХреЗ рдЕрд░реНрде рдХреЗ рд▓рд┐рдП рднреНрд░рдорд┐рдд рдХрд┐рдпрд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИред

= (impl Foo, impl Bar) рдПрдХ рджрд┐рд▓рдЪрд╕реНрдк рд╡рд┐рдЪрд╛рд░ рд╣реИ - рдРрд╕реЗ рдкреНрд░рдХрд╛рд░реЛрдВ рдХреЗ рд╕рд╛рде рдЕрд╕реНрддрд┐рддреНрд╡рдкрд░рдХ рдЯреБрдкрд▓реНрд╕ рдмрдирд╛рдиреЗ рдХреА рдЕрдиреБрдорддрд┐ рджреЗрдирд╛ рдЬреЛ рд╕реНрд╡рдпрдВ рдЬреНрдЮрд╛рдд рдирд╣реАрдВ рд╣реИрдВ, рджрд┐рд▓рдЪрд╕реНрдк рд╣реЛрдЧрд╛ред рдореБрдЭреЗ рдирд╣реАрдВ рд▓рдЧрддрд╛ рдХрд┐ рд╣рдо _need_ рдЙрди рд▓реЛрдЧреЛрдВ рдХрд╛ рд╕рдорд░реНрдерди рдХрд░рддреЗ рд╣реИрдВ, рдХреНрдпреЛрдВрдХрд┐ рд╣рдо рдХреЗрд╡рд▓ рджреЛ рдЕрд╕реНрддрд┐рддреНрд╡рдЧрдд рдкреНрд░рдХрд╛рд░реЛрдВ рдХреЛ impl Foo рдФрд░ impl Bar рд▓рд┐рдП рдкреЗрд╢ рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ, рдлрд┐рд░ рдЯрдкрд▓ рдХреЗ рд▓рд┐рдП рддреАрд╕рд░реЗ рдкреНрд░рдХрд╛рд░ рдХреЗ рдЙрдкрдирд╛рдоред

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

рдореБрдЭреЗ рдирд╣реАрдВ рд▓рдЧрддрд╛ рдХрд┐ рд╣рдореЗрдВ рдЙрдирдХрд╛ рд╕рдорд░реНрдерди рдХрд░рдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реИ, рдХреНрдпреЛрдВрдХрд┐ рд╣рдо рдХреЗрд╡рд▓ impl Foo рдФрд░ impl Bar рд▓рд┐рдП рджреЛ рдЕрд╕реНрддрд┐рддреНрд╡рдЧрдд рдкреНрд░рдХрд╛рд░реЛрдВ рдХреЛ рдкреЗрд╢ рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ, рдлрд┐рд░ рдЯрдкрд▓ рдХреЗ рд▓рд┐рдП рддреАрд╕рд░реЗ рдкреНрд░рдХрд╛рд░ рдХреЗ рдЙрдкрдирд╛рдоред

рдРрд╕рд╛ рд▓рдЧрддрд╛ рд╣реИ рдХрд┐ рдЕрдиреМрдкрдЪрд╛рд░рд┐рдХ ... рдЕрд╕реНрдерд╛рдпреА рдЗрддрдиреЗ рдЕрдЪреНрдЫреЗ рдЖрдИрдПрдордУ рдирд╣реАрдВ рд╣реИрдВред

@alexreg рдиреЛрдЯ: рдореЗрд░реЗ рдХрд╣рдиреЗ рдХрд╛ рдорддрд▓рдм рдпрд╣ рдирд╣реАрдВ рдерд╛ рдХрд┐ impl Bar + Baz; (impl Foo, impl Bar) рдЬреИрд╕рд╛ рд╣реА рд╣реИ, рдмрд╛рдж рд╡рд╛рд▓рд╛ рд╕реНрдкрд╖реНрдЯ рд░реВрдк рд╕реЗ 2-рдЯреБрдкрд▓ рд╣реИред

@daboross

рдЕрдЧрд░ рд╡рд╣ @cramertj рдХрд╛ рдЗрд░рд╛рджрд╛ рдерд╛, рддреЛ рдореБрдЭреЗ рдЕрднреА рднреА : рд╡рд╛рдХреНрдпрд╡рд┐рдиреНрдпрд╛рд╕ рдХреЗ рд╕рд╛рде рдпрд╣ рдмрд╣реБрдд рдЕрдЬреАрдм рд▓рдЧреЗрдЧрд╛:

exists type Foo: (Foo1, Foo2);

рдпрд╣ рдЕрднреА рднреА рдмрд╣реБрдд рдЕрд╕реНрдкрд╖реНрдЯ рд▓рдЧрддрд╛ рд╣реИ рдХрд┐ рдпрд╣ рдХреНрдпрд╛ рдХрд░ рд░рд╣рд╛ рд╣реИ - рд╕реАрдорд╛рдПрдВ рдЖрдорддреМрд░ рдкрд░ рдХрд┐рд╕реА рднреА рдорд╛рдорд▓реЗ рдореЗрдВ рд╕рдВрднрд╛рд╡рд┐рдд рдкреНрд░рдХрд╛рд░реЛрдВ рдХрд╛ рдПрдХ рдЯрдкрд▓ рдирд┐рд░реНрджрд┐рд╖реНрдЯ рдирд╣реАрдВ рдХрд░рддреА рд╣реИрдВ, рдФрд░ рдЗрд╕реЗ рдЖрд╕рд╛рдиреА рд╕реЗ рдлреВ рдХреЗ рдЕрд░реНрде рдХреЗ рд▓рд┐рдП рднреНрд░рдорд┐рдд рдХрд┐рдпрд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИ: рдлреВ 1 + рдлреВ 2 рд╡рд╛рдХреНрдпрд╡рд┐рдиреНрдпрд╛рд╕ред

рдпрд╣ рд╢рд╛рдпрдж рдереЛрдбрд╝рд╛ рдЕрд╕реНрдкрд╖реНрдЯ рд╣реИ ( (impl Foo, impl Bar) рдЬрд┐рддрдирд╛ рд╕реНрдкрд╖реНрдЯ рдирд╣реАрдВ рд╣реИ, рдЬрд┐рд╕реЗ рдореИрдВ рд╕рд╣рдЬ рд░реВрдк рд╕реЗ рддреБрд░рдВрдд рд╕рдордЭреВрдВрдЧрд╛) - рд▓реЗрдХрд┐рди рдореБрдЭреЗ рдирд╣реАрдВ рд▓рдЧрддрд╛ рдХрд┐ рдореИрдВ рдЗрд╕реЗ рд╡реНрдпрдХреНрддрд┐рдЧрдд рд░реВрдк рд╕реЗ Foo1 + Foo2 рд▓рд┐рдП рдХрднреА рднреНрд░рдорд┐рдд рдХрд░реВрдВрдЧрд╛ред

= (рдЗрдореНрдкреНрд▓ рдлреВ, рдЗрдореНрдкреНрд▓рд╛ рдмрд╛рд░) рдПрдХ рджрд┐рд▓рдЪрд╕реНрдк рд╡рд┐рдЪрд╛рд░ рд╣реИ - рдРрд╕реЗ рдкреНрд░рдХрд╛рд░реЛрдВ рдХреЗ рд╕рд╛рде рдЕрд╕реНрддрд┐рддреНрд╡рдкрд░рдХ рдЯреБрдкрд▓реНрд╕ рдмрдирд╛рдиреЗ рдХреА рдЕрдиреБрдорддрд┐ рджреЗрдирд╛ рдЬреЛ рд╕реНрд╡рдпрдВ рдЬреНрдЮрд╛рдд рдирд╣реАрдВ рд╣реИрдВ, рджрд┐рд▓рдЪрд╕реНрдк рд╣реЛрдЧрд╛ред рдореБрдЭреЗ рдирд╣реАрдВ рд▓рдЧрддрд╛ рдХрд┐ рд╣рдореЗрдВ рдЙрди рд▓реЛрдЧреЛрдВ рдХрд╛ рд╕рдорд░реНрдерди рдХрд░рдиреЗ рдХреА рдЬрд╝рд░реВрд░рдд рд╣реИ, рдХреНрдпреЛрдВрдХрд┐ рд╣рдо рдХреЗрд╡рд▓ рджреЛ рдЕрд╕реНрддрд┐рддреНрд╡ рдХреЗ рдкреНрд░рдХрд╛рд░реЛрдВ рдХреЛ рдЗрдВрдкреНрд▓рд╛рдВрдЯ рдлреВ рдФрд░ рдЗрдореНрдкреНрд▓рд╛ рдмрд╛рд░ рдХреЗ рд▓рд┐рдП рдкреЗрд╢ рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ, рдлрд┐рд░ рдЯреБрдкрд▓ рдХреЗ рд▓рд┐рдП рддреАрд╕рд░реЗ рдкреНрд░рдХрд╛рд░ рдХреЗ рдЙрдкрдирд╛рдоред

рд╣рд╛рдБ, рдпрд╣ рдПрдХ рдкреНрд░рд╛рд░рдВрднрд┐рдХ рдкреНрд░рд╕реНрддрд╛рд╡ рдерд╛, рдФрд░ рдореБрдЭреЗ рдЕрдм рднреА рдпрд╣ рдмрд╣реБрдд рдкрд╕рдВрдж рд╣реИред рдпрд╣ рдзреНрдпрд╛рди рджрд┐рдпрд╛ рдЧрдпрд╛ рд╣реИ рдХрд┐ рдпрд╣ рд╡рд░реНрддрдорд╛рди рд╕рд┐рдВрдЯреИрдХреНрд╕ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдХреЗ рд╡реИрд╕реЗ рднреА рдХрд┐рдпрд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИ, рд▓реЗрдХрд┐рди рдЗрд╕рдХреЗ рд▓рд┐рдП рдХреЛрдб рдХреА 3 рдкрдВрдХреНрддрд┐рдпреЛрдВ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реЛрддреА рд╣реИ, рдЬреЛ рдХрд┐ рдмрд╣реБрдд рд╣реА рдПрд░реНрдЧреЛрдиреЛрдорд┐рдХ рдирд╣реАрдВ рд╣реИред рдореИрдВ рдпрд╣ рднреА рдорд╛рдирддрд╛ рд╣реВрдВ рдХрд┐ рдХреБрдЫ рд╕рд┐рдВрдЯреИрдХреНрд╕ рдЬреИрд╕реЗ ... = (impl Foo, impl Bar) рдЙрдкрдпреЛрдЧрдХрд░реНрддрд╛ рдХреЗ рд▓рд┐рдП рд╕рдмрд╕реЗ рд╕реНрдкрд╖реНрдЯ рд╣реИ, рд▓реЗрдХрд┐рди рдореБрдЭреЗ рдкрддрд╛ рд╣реИ рдХрд┐ рдпрд╣рд╛рдВ рд╡рд┐рд╡рд╛рдж рд╣реИред

@Centril рдореИрдВрдиреЗ рдкрд╣рд▓реЗ рдРрд╕рд╛ рдирд╣реАрдВ рд╕реЛрдЪрд╛ рдерд╛, рд▓реЗрдХрд┐рди рдпрд╣ рдереЛрдбрд╝рд╛ рдЕрд╕реНрдкрд╖реНрдЯ рдерд╛, рдФрд░ рдлрд┐рд░ @daboross рдЗрд╕реЗ рдЗрд╕ рддрд░рд╣ рд╕реЗ рд╡реНрдпрд╛рдЦреНрдпрд╛ рдХрд░рдирд╛ рдкреНрд░рддреАрдд рд╣рд╛ ред рд╡реИрд╕реЗ рднреА, рдЦреБрд╢реА рд╣реИ рдХрд┐ рд╣рдордиреЗ рдЗрд╕реЗ рд╕рд╛рдлрд╝ рдХрд░ рджрд┐рдпрд╛ рд╣реИред

рдУрд╣, рдореЗрд░рд╛ рд╕рдВрдкрд╛рджрди https://github.com/rust-lang/rust/issues/34511#issuecomment -386763340 рдкрд░ exists type Foo: (Foo1, Foo2); рд╣реЛрдирд╛ рдЪрд╛рд╣рд┐рдП рдерд╛ type Foo = (Foo1, Foo2); ред

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

type A = impl Foo;
type B = (impl Foo, impl Bar, String);

@alexreg рд╣рд╛рдБ, рдореБрдЭреЗ рд▓рдЧрддрд╛ рд╣реИ рдХрд┐ рд╕рдмрд╕реЗ ergonomic рд╡рд╛рдХреНрдп рд░рдЪрдирд╛ рд╣реИ рд▓рдЧрддрд╛ рд╣реИред

RFC https://github.com/rust-lang/rfcs/pull/2289 рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдХреЗ, рдореИрдВ рдЗрд╕ рдкреНрд░рдХрд╛рд░ @cramertj рдХреЗ рд╕реНрдирд┐рдкреЗрдЯ рдХреЛ рдлрд┐рд░ рд╕реЗ

type Foo = (impl Bar, impl Baz);
type IterDisplay = impl Iterator<Item: Display>;

// alternatively:

exists type IterDisplay: Iterator<Item: Display>;

type IterDisplay: Iterator<Item: Display>;

рд╣рд╛рд▓рд╛рдВрдХрд┐, рдореБрдЭреЗ рд▓рдЧрддрд╛ рд╣реИ рдХрд┐ рдЯрд╛рдЗрдк рдЙрдкрдирд╛рдореЛрдВ рдХреЗ рд▓рд┐рдП, exists рдкреЗрд╢ рдирд╣реАрдВ рдХрд░рдиреЗ рд╕реЗ рднрд╛рд╖рд╛ рдХреЗ рд╕рд┐рдВрдЯреИрдХреНрд╕ рдХреЛ рдФрд░ рдЕрдзрд┐рдХ рдЬрдЯрд┐рд▓ рдмрдирд╛рддреЗ рд╣реБрдП рдЕрднрд┐рд╡реНрдпрдВрдЬрдХ рд╢рдХреНрддрд┐ рдмрдирд╛рдП рд░рдЦрдиреЗ рдореЗрдВ рдорджрдж рдорд┐рд▓реЗрдЧреА; рдЗрд╕рд▓рд┐рдП рдЬрдЯрд┐рд▓ рдмрдЬрдЯ рдкреАрдУрд╡реА рд╕реЗ, impl Iterator exists рд╕реЗ рдмреЗрд╣рддрд░ рд▓рдЧрддрд╛ рд╣реИред рдЕрдВрддрд┐рдо рд╡рд┐рдХрд▓реНрдк рд╡рд╛рд╕реНрддрд╡ рдореЗрдВ рдирдП рд╕рд┐рдВрдЯреИрдХреНрд╕ рдХрд╛ рдкрд░рд┐рдЪрдп рдирд╣реАрдВ рджреЗрддрд╛ рд╣реИ рдФрд░ рд╕реНрдкрд╖реНрдЯ рд╣реЛрдиреЗ рдХреЗ рд╕рд╛рде-рд╕рд╛рде рд╕рдмрд╕реЗ рдЫреЛрдЯрд╛ рднреА рд╣реИред

рд╕рдВрдХреНрд╖реЗрдк рдореЗрдВ, рдореБрдЭреЗ рд▓рдЧрддрд╛ рд╣реИ рдХрд┐ рдирд┐рдореНрдирд▓рд┐рдЦрд┐рдд рджреЛрдиреЛрдВ рд░реВрдкреЛрдВ рдХреА рдЕрдиреБрдорддрд┐ рджреА рдЬрд╛рдиреА рдЪрд╛рд╣рд┐рдП (рдХреНрдпреЛрдВрдХрд┐ рдпрд╣ impl Trait рдФрд░ рд╣рдорд╛рд░реЗ рдкрд╛рд╕ рдкрд╣рд▓реЗ рд╕реЗ рдореМрдЬреВрдж рд╕рдВрдмрдВрдзрд┐рдд рдкреНрд░рдХрд╛рд░ рдХреЗ рд╕рд┐рдВрдЯреИрдХреНрд╕ рдкрд░ рд╕реАрдорд╛ рджреЛрдиреЛрдВ рдХреЗ рддрд╣рдд рдХрд╛рдо рдХрд░рддрд╛ рд╣реИ):

type Foo = (impl Bar, impl Baz);
type IterDisplay: Iterator<Item: Display>;

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

рдореБрдЭреЗ type Foo: Trait рд╡реИрд░рд┐рдПрдВрдЯ рдХреА рддреБрд▓рдирд╛ рдореЗрдВ type Foo = impl Trait рд╡реИрд░рд┐рдПрдВрдЯ рдЕрдзрд┐рдХ рдкрд╕рдВрдж рд╣реИред рдпрд╣ рд╕рдВрдмрдВрдзрд┐рдд рдкреНрд░рдХрд╛рд░ рдХреЗ рд╕рд┐рдВрдЯреИрдХреНрд╕ рд╕реЗ рдореЗрд▓ рдЦрд╛рддрд╛ рд╣реИ, рдЬреЛ рдЕрдЪреНрдЫрд╛ рд╣реИ рдХреНрдпреЛрдВрдХрд┐ рдпрд╣ рдЙрд╕ рдореЙрдбреНрдпреВрд▓ рдХрд╛ "рдЖрдЙрдЯрдкреБрдЯ рдкреНрд░рдХрд╛рд░" рднреА рд╣реИ рдЬрд┐рд╕рдореЗрдВ рдпрд╣ рд╢рд╛рдорд┐рд▓ рд╣реИред

impl Trait рд╕рд┐рдВрдЯреИрдХреНрд╕ рдХрд╛ рдЙрдкрдпреЛрдЧ рдкрд╣рд▓реЗ рд╕реЗ рд╣реА рдЗрдирдкреБрдЯ рдФрд░ рдЖрдЙрдЯрдкреБрдЯ рджреЛрдиреЛрдВ рдкреНрд░рдХрд╛рд░реЛрдВ рдХреЗ рд▓рд┐рдП рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИ, рдЬрд┐рд╕рдХрд╛ рдЕрд░реНрде рд╣реИ рдХрд┐ рдпрд╣ рдкреЙрд▓реАрдореЙрд░реНрдлрд┐рдХ рдореЙрдбреНрдпреВрд▓ рдХреА рдЫрд╛рдк рджреЗрдиреЗ рдХрд╛ рдЬреЛрдЦрд┐рдо рдЙрдард╛рддрд╛ рд╣реИред :(

рдпрджрд┐ impl Trait рдХрд╛ рдЙрдкрдпреЛрдЧ рдХреЗрд╡рд▓ рдЖрдЙрдЯрдкреБрдЯ рдкреНрд░рдХрд╛рд░реЛрдВ рдХреЗ рд▓рд┐рдП рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИ, рддреЛ рдореИрдВ type Foo = impl Trait рд╕рдВрд╕реНрдХрд░рдг рдХреЛ рдЗрд╕ рдЖрдзрд╛рд░ рдкрд░ рдкрд╕рдВрдж рдХрд░ рд╕рдХрддрд╛ рд╣реВрдВ рдХрд┐ рд╕рдВрдмрдВрдзрд┐рдд рдкреНрд░рдХрд╛рд░ рд╕рд┐рдВрдЯреИрдХреНрд╕ рд▓рдХреНрд╖рдгреЛрдВ рдХреЗ рд▓рд┐рдП рдЕрдзрд┐рдХ рд╣реИ (рдЬреЛ рдХрд┐ рдПрдордПрд▓ рд╣рд╕реНрддрд╛рдХреНрд╖рд░реЛрдВ рдХреЗ рдЕрдиреБрд░реВрдк рд╣реИ) рдЬрдмрдХрд┐ type Foo = .. рдХрдВрдХреНрд░реАрдЯ рдореЙрдбреНрдпреВрд▓ рдХреЗ рд▓рд┐рдП

@rpjohnst

рдореБрдЭреЗ type Foo: Trait рд╡реИрд░рд┐рдПрдВрдЯ рдХреА рддреБрд▓рдирд╛ рдореЗрдВ type Foo = impl Trait рд╡реИрд░рд┐рдПрдВрдЯ рдЕрдзрд┐рдХ рдкрд╕рдВрдж рд╣реИред

рдореИрдВ рд╕рд╣рдордд рд╣реВрдВ, рдЬрдм рднреА рд╕рдВрднрд╡ рд╣реЛ рдЗрд╕рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд┐рдпрд╛ рдЬрд╛рдирд╛ рдЪрд╛рд╣рд┐рдП; рд▓реЗрдХрд┐рди (impl T, impl U) рдХреЗ рдорд╛рдорд▓реЗ рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рдХреНрдпрд╛ рд╣реИ рдЬрд╣рд╛рдВ рдмрд╛рдзреНрдп рд╡рд╛рдХреНрдпрд╡рд┐рдиреНрдпрд╛рд╕ рд╕реАрдзреЗ рдЙрдкрдпреЛрдЧ рдирд╣реАрдВ рдХрд┐рдпрд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИ? рдореБрдЭреЗ рдРрд╕рд╛ рд▓рдЧрддрд╛ рд╣реИ рдХрд┐ рдЕрд╕реНрдерд╛рдпреА рдкреНрд░рдХрд╛рд░ рдХреЗ рдЙрдкрдирд╛рдореЛрдВ рдХреЛ рдкреЗрд╢ рдХрд░рдиреЗ рд╕реЗ рдкрдардиреАрдпрддрд╛ рдкреНрд░рднрд╛рд╡рд┐рдд рд╣реЛрддреА рд╣реИред

рдХреЗрд╡рд▓ type Name: Bound рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдирд╛ рдРрд╕рд╛ рд▓рдЧрддрд╛ рд╣реИ рдЬреИрд╕реЗ impl рдмреНрд▓реЙрдХ рдХреЗ рдЕрдВрджрд░ рдЙрдкрдпреЛрдЧ рдХрд┐рдП рдЬрд╛рдиреЗ рдкрд░ рдпрд╣ рднреНрд░рдорд┐рдд рд╣реЛ рдЬрд╛рдПрдЧрд╛:

impl Iterator for Foo {
    type Item: Display;

    fn next(&mut self) -> Option<Self::Item> { Some(5) }
}

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

pub abstract type First: Display;
pub abstract type Second: Debug;

impl Iterator for Foo {
    type Item = (First, Second);

    fn next(&mut self) -> Option<Self::Item> { Some((5, 6)) }
}

рдмрдирд╛рдо

impl Iterator for Foo {
    type Item = (impl Display, impl Debug);

    fn next(&mut self) -> Option<Self::Item> { Some((5, 6)) }
}

@ Nemo157 рджреЛрдиреЛрдВ рдХреЛ рдЕрдиреБрдорддрд┐ рдХреНрдпреЛрдВ рди рджреЗрдВ:

pub type First: Display;
pub type Second: Debug;

impl Iterator for Foo {
    type Item = (First, Second);
    fn next(&mut self) -> Option<Self::Item> { Some((5, 6)) }
}

рддрдерд╛:

impl Iterator for Foo {
    type Item = (impl Display, impl Debug);
    fn next(&mut self) -> Option<Self::Item> { Some((5, 6)) }
}

?

рдореИрдВ рдирд╣реАрдВ рджреЗрдЦрддрд╛ рдХрд┐ рдПрдХ рд╣реА рд╕реБрд╡рд┐рдзрд╛ рдХреЗ рд▓рд┐рдП рджреЛ рд╕рд┐рдВрдЯреИрдХреНрд╕ рд╣реЛрдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рдХреНрдпреЛрдВ рд╣реИ, рдХреЗрд╡рд▓ type Name = impl Bound; рд╕рд┐рдВрдЯреИрдХреНрд╕ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдХреЗ рд╕реНрдкрд╖реНрдЯ рд░реВрдк рд╕реЗ рджреЛ рднрд╛рдЧреЛрдВ рдХреЗ рд▓рд┐рдП рдирд╛рдо рдкреНрд░рджрд╛рди рдХрд░рдирд╛ рдЕрднреА рднреА рд╕рдВрднрд╡ рд╣реЛрдЧрд╛:

pub type First = impl Display;
pub type Second = impl Debug;

impl Iterator for Foo {
    type Item = (First, Second);
    fn next(&mut self) -> Option<Self::Item> { Some((5, 6)) }
}

@ рдирд┐рдореЛ157 рдореИрдВ рдорд╛рдирддрд╛ рд╣реВрдВ рдХрд┐ рджреЛ рдЕрд▓рдЧ-рдЕрд▓рдЧ рд╡рд╛рдХреНрдпрд╡рд┐рдиреНрдпрд╛рд╕ рд╣реЛрдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рдирд╣реАрдВ рд╣реИ (рдФрд░ рдирд╣реАрдВ)ред рд╣рд╛рд▓рд╛рдВрдХрд┐, рдореБрдЭреЗ рдХрд╣рдирд╛ рд╣реЛрдЧрд╛ рдХрд┐ рдореБрдЭреЗ type (рдмрд┐рдирд╛ рдХрд┐рд╕реА рдЙрдкрд╕рд░реНрдЧ рдХреАрд╡рд░реНрдб рдХреЗ) рднреНрд░рдорд┐рдд рдХрд░рдиреЗ рд╡рд╛рд▓рд╛ рдирд╣реАрдВ рд▓рдЧрддрд╛ред

@rpjohnst рдПрдХ рдмрд╣реБрд░реВрдкреА рдореЙрдбреНрдпреВрд▓ рдмрд┐рд▓реНрд▓реА рдХреНрдпрд╛ рд╣реИ? :-) рд╡реИрд╕реЗ рднреА, рдореБрдЭреЗ рдирд╣реАрдВ рд▓рдЧрддрд╛ рдХрд┐ рд╣рдореЗрдВ рд╕рдВрдмрдВрдзрд┐рдд рдкреНрд░рдХрд╛рд░ рдХреА рдкрд░рд┐рднрд╛рд╖рд╛рдУрдВ рдХреЗ рдмрд╛рдж рд╕рд┐рдВрдЯреИрдХреНрд╕ рдХрд╛ рдореЙрдбрд▓рд┐рдВрдЧ рдХреНрдпреЛрдВ рдХрд░рдирд╛ рдЪрд╛рд╣рд┐рдП, рдЬреЛ рдПрдХ рдкреНрд░рдХрд╛рд░ рдкрд░ рд╡рд┐рд╢реЗрд╖рддрд╛ рд╕реАрдорд╛рдПрдВ рд░рдЦ рд░рд╣реЗ рд╣реИрдВред рдЗрд╕рдХрд╛ рд╕реАрдорд╛ рд╕реЗ рдХреЛрдИ рд▓реЗрдирд╛-рджреЗрдирд╛ рдирд╣реАрдВ рд╣реИред

@alexreg рдПрдХ fn foo(x: impl Trait) рдХрд░рддрд╛ рд╣реИред рдпрд╣ рдРрд╕рд╛ рдХреБрдЫ рдирд╣реАрдВ рд╣реИ рдЬреЛ рдореМрдЬреВрдж рд╣реИ, рдФрд░ рдЗрд╕рд▓рд┐рдП рдореИрдВ рдирд╣реАрдВ рдЪрд╛рд╣рддрд╛ рдХрд┐ рд▓реЛрдЧ рдпрд╣ рд╕реЛрдЪреЗрдВ рдХрд┐ рдпрд╣ рдХрд░рддрд╛ рд╣реИред

abstract type ( рд╕рдВрдкрд╛рджрд┐рдд рдХрд░реЗрдВ: рдлреАрдЪрд░ рдХреЛ рдирд╛рдо рджреЗрдиреЗ рдХреЗ рд▓рд┐рдП, рдХреАрд╡рд░реНрдб рдХреЗ рдЙрдкрдпреЛрдЧ рдХрд╛ рд╕реБрдЭрд╛рд╡ рджреЗрдиреЗ рдХреЗ рд▓рд┐рдП рдирд╣реАрдВ) рд╕рдм рдХреБрдЫ рд╕реАрдорд╛ рд╕реЗ рд╕рдВрдмрдВрдзрд┐рдд рд╣реИ! рдмрд╛рдЙрдВрдб рдХреЗрд╡рд▓ рдПрдХ рдЪреАрдЬ рд╣реИ рдЬрд┐рд╕реЗ рдЖрдк рдкреНрд░рдХрд╛рд░ рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рдЬрд╛рдирддреЗ рд╣реИрдВред рдЙрдирдХреЗ рдФрд░ рд╕рдВрдмрджреНрдз рдкреНрд░рдХрд╛рд░реЛрдВ рдХреЗ рдмреАрдЪ рдПрдХрдорд╛рддреНрд░ рдЕрдВрддрд░ рдпрд╣ рд╣реИ рдХрд┐ рдЙрдирдХрд╛ рдЕрдиреБрдорд╛рди рд▓рдЧрд╛рдпрд╛ рдЬрд╛рддрд╛ рд╣реИ, рдХреНрдпреЛрдВрдХрд┐ рд╡реЗ рдЖрдорддреМрд░ рдкрд░ рдЕрдирд╛рдо рд╣реЛрддреЗ рд╣реИрдВред

@ Nemo157 Foo: Bar рд╕рд┐рдВрдЯреИрдХреНрд╕ рдЕрдиреНрдп рд╕рдВрджрд░реНрднреЛрдВ рдореЗрдВ рдкрд╣рд▓реЗ рд╕реЗ рд╣реА рдЕрдзрд┐рдХ рдкрд░рд┐рдЪрд┐рдд рд╣реИ (рд╕рдВрдмрдВрдзрд┐рдд рдкреНрд░рдХрд╛рд░реЛрдВ рдкрд░ рд╕реАрдорд╛рдПрдВ, рдФрд░ рдкреНрд░рдХрд╛рд░ рдкреИрд░рд╛рдореАрдЯрд░ рдкрд░) рдФрд░ рдЕрдзрд┐рдХ рдПрд░реНрдЧреЛрдиреЛрдорд┐рдХ рдФрд░ (рдЖрдИрдПрдордУ) рд╕реНрдкрд╖реНрдЯ рд╣реИ рдЬрдм рдЗрд╕реЗ рдЕрд╕реНрдерд╛рдпреА рдкреЗрд╢ рдХрд┐рдП рдмрд┐рдирд╛ рдЙрдкрдпреЛрдЧ рдХрд┐рдпрд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИред

рд▓рд┐рдЦрдирд╛:

type IterDisplay: Iterator<Item: Display>;

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

type IterDisplay = impl Iterator<Item = impl Display>;

рдореБрдЭреЗ рд▓рдЧрддрд╛ рд╣реИ рдХрд┐ рдпрд╣ рд╣рдорд╛рд░реЗ рдкрд╛рд╕ рдкрд╣рд▓реЗ рд╕реЗ рдореМрдЬреВрдж рд╕рд┐рдВрдЯреИрдХреНрд╕ рдХреЛ рд▓рдЧрд╛рддрд╛рд░ рд▓рд╛рдЧреВ рдХрд░ рд░рд╣рд╛ рд╣реИ; рддреЛ рдпрд╣ рд╡рд╛рд╕реНрддрд╡ рдореЗрдВ рдирдпрд╛ рдирд╣реАрдВ рд╣реИред

EDIT2: рдкрд╣рд▓рд╛ рд╕рд┐рдВрдЯреИрдХреНрд╕ рдпрд╣ рднреА рд╣реИ рдХрд┐ рдореИрдВ рдЗрд╕реЗ рд░рд╕реНрдЯрдбреЙрдХ рдореЗрдВ рдХреИрд╕реЗ рдкреНрд░рд╕реНрддреБрдд рдХрд░рдирд╛ рдЪрд╛рд╣рддрд╛ рд╣реВрдВред

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

trait Foo {
    type Bar: Baz;
    // stuff...
}

struct Quux;

impl Foo for Quux {
    type Bar: Baz; // Oh look! Same as in the trait; I had to do nothing!
    // stuff...
}

impl Bar рд╕рд┐рдВрдЯреИрдХреНрд╕ рдмреЗрд╣рддрд░ рд▓рдЧрддрд╛ рд╣реИ рдЬрдм рдЖрдкрдХреЛ рдЕрдиреНрдпрдерд╛ рдЕрд╕реНрдерд╛рдпреА рдкрд░рд┐рдЪрдп рджреЗрдирд╛ рд╣реЛрдЧрд╛, рд▓реЗрдХрд┐рди рдпрд╣ рд╕рд┐рдВрдЯреИрдХреНрд╕ рдХреЛ рд▓рдЧрд╛рддрд╛рд░ рд▓рд╛рдЧреВ рдХрд░ рд░рд╣рд╛ рд╣реИред

рджреЛрдиреЛрдВ рд╕рд┐рдВрдЯреИрдХреНрд╕ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдиреЗ рдореЗрдВ рд╕рдХреНрд╖рдо рд╣реЛрдирд╛ рд╡рд╛рд╕реНрддрд╡ рдореЗрдВ рддрд░реНрдХ рд╕реНрдерд┐рддрд┐ рдореЗрдВ impl Trait рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдиреЗ рдореЗрдВ рд╕рдХреНрд╖рдо рд╣реЛрдиреЗ рдХреЗ рд╕рд╛рде-рд╕рд╛рде рдПрдХ рд╕реНрдкрд╖реНрдЯ рдкреНрд░рдХрд╛рд░ рдкреИрд░рд╛рдореАрдЯрд░ T: Trait рд╣реЛрдиреЗ рд╕реЗ рдмрд╣реБрдд рдЕрд▓рдЧ рдирд╣реАрдВ рд╣реЛрдЧрд╛ рдЬрд┐рд╕рдХрд╛ рдЙрдкрдпреЛрдЧ рддрд░реНрдХ рджреНрд╡рд╛рд░рд╛ рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИред

EDIT1: рд╡рд╛рд╕реНрддрд╡ рдореЗрдВ, рдХреЗрд╡рд▓ рдПрдХ рд╕рд┐рдВрдЯреИрдХреНрд╕ рдХрд╛ рд╣реЛрдирд╛ рд╡рд┐рд╢реЗрд╖ рдЖрд╡рд░рдг рд╣реЛрдЧрд╛, рди рдХрд┐ рджреВрд╕рд░реА рддрд░рдлред

@rpjohnst рдореИрдВ рдЕрд▓рдЧ рд╣реЛрдиреЗ рдХреА рднреАрдЦ рдорд╛рдБрдЧрддрд╛ рд╣реВрдБ, рд╣рд╛рд▓рд╛рдБрдХрд┐ рдореБрдЭреЗ рдпрд╣ рдХрд╣рдирд╛ рдЪрд╛рд╣рд┐рдП рдерд╛ рдХрд┐ рдЗрд╕рдХрд╛ рд╕реНрдкрд╖реНрдЯ рд░реВрдк рд╕реЗ рд╕реАрдорд╛ рд╕реЗ рдХреЛрдИ рд▓реЗрдирд╛-рджреЗрдирд╛ рдирд╣реАрдВ рд╣реИред

рд╡реИрд╕реЗ рднреА, рдореИрдВ type Foo: Bar; рд╡рд╛рдХреНрдпрд╡рд┐рдиреНрдпрд╛рд╕ рдХреЗ рдЦрд┐рд▓рд╛рдл рдирд╣реАрдВ рд╣реВрдВ, рд▓реЗрдХрд┐рди рднрд▓рд╛рдИ рдХреЗ рд▓рд┐рдП, рдЖрдЗрдП abstract рдХреАрд╡рд░реНрдб рд╕реЗ рдЫреБрдЯрдХрд╛рд░рд╛ рдкрд╛рдПрдВред рдХрд┐рд╕реА рднреА рдкрд░рд┐рд╕реНрдерд┐рддрд┐ рдореЗрдВ type рдЕрдкрдиреЗ рдЖрдк рдореЗрдВ рдмрд┐рд▓реНрдХреБрд▓ рд╕реНрдкрд╖реНрдЯ рд╣реИред

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

рд╕рд╛рде рд╣реА, рдпрд╣ рдорд╛рдирддреЗ рд╣реБрдП рдХрд┐ рдореБрдЭреЗ type Iter: Iterator<Item = Foo> рдореБрдЭреЗ Foo рдвреВрдВрдврдирд╛ рд╣реЛрдЧрд╛ рдФрд░ рдпрд╣ рдкрддрд╛ рд▓рдЧрд╛рдирд╛ рд╣реЛрдЧрд╛ рдХрд┐ рдХреНрдпрд╛ рд╣реЛ рд░рд╣рд╛ рд╣реИ рдЗрд╕рд╕реЗ рдкрд╣рд▓реЗ рдХрд┐ рдпрд╣ рдПрдХ рдкреНрд░рдХрд╛рд░ рдпрд╛ рд╡рд┐рд╢реЗрд╖рддрд╛ рд╣реИред

рдФрд░ рдЕрдВрдд рдореЗрдВ, рдореБрдЭреЗ рд▓рдЧрддрд╛ рд╣реИ рдХрд┐ рдЕрдиреБрдорд╛рди рдмрд┐рдВрджреБрдУрдВ рдХрд╛ рджреГрд╢реНрдп рд╕реБрд░рд╛рдЧ рдЕрдиреБрдорд╛рди рддреНрд░реБрдЯрд┐рдпреЛрдВ рдХреЛ рдбреАрдмрдЧ рдХрд░рдиреЗ рдФрд░ рдЕрдиреБрдорд╛рди рддреНрд░реБрдЯрд┐ рд╕рдВрджреЗрд╢реЛрдВ рдХреА рд╡реНрдпрд╛рдЦреНрдпрд╛ рдХрд░рдиреЗ рдореЗрдВ рднреА рдорджрдж рдХрд░реЗрдЧрд╛ред

рддреЛ рдореБрдЭреЗ рд▓рдЧрддрд╛ рд╣реИ рдХрд┐ = / impl рд╕рдВрд╕реНрдХрд░рдг рдереЛрдбрд╝рд╛ рдФрд░ рдкреЗрдкрд░рдХрдЯ рд╣рд▓ рдХрд░рддрд╛ рд╣реИред

@рдлрд╛рдпрд▓реЙрди

рд╕рд╛рде рд╣реА, рдорд╛рди рд▓реАрдЬрд┐рдП рдХрд┐ рдореБрдЭреЗ рдЯрд╛рдЗрдк Iter: Iterator<Item = Foo> рдореБрдЭреЗ Foo рдвреВрдВрдврдирд╛ рд╣реЛрдЧрд╛ рдФрд░ рдпрд╣ рдкрддрд╛ рд▓рдЧрд╛рдирд╛ рд╣реЛрдЧрд╛ рдХрд┐ рдпрд╣ рдХреНрдпрд╛ рд╣реЛ рд░рд╣рд╛ рд╣реИ, рдЗрд╕рд╕реЗ рдкрд╣рд▓реЗ рдХрд┐ рдпрд╣ рдПрдХ рдкреНрд░рдХрд╛рд░ рдпрд╛ рд╡рд┐рд╢реЗрд╖рддрд╛ рд╣реИред

рдпрд╣ рдореБрдЭреЗ рдирд╣реАрдВ рдорд┐рд▓рддрд╛ рд╣реИ; Item = Foo рд╣рдореЗрд╢рд╛ рдПрдХ рдкреНрд░рдХрд╛рд░ рд╣реЛрдирд╛ рдЪрд╛рд╣рд┐рдП, рдпрд╣ рджреЗрдЦрддреЗ рд╣реБрдП рдХрд┐ dyn Foo рд╕реНрдерд┐рд░ рд╣реИ (рдФрд░ рдирдВрдЧреЗ рд▓рдХреНрд╖рдг рдЪрд░рдгрдмрджреНрдз рд╣реЛ рд░рд╣реЗ рд╣реИрдВ ...)?

@рд╕реЗрдВрдЯреНрд░рд┐рд▓

рдпрд╣ рдореБрдЭреЗ рдирд╣реАрдВ рдорд┐рд▓рддрд╛ рд╣реИ; рдЖрдЗрдЯрдо = рдлреВ рд╣рдореЗрд╢рд╛ рдПрдХ рдкреНрд░рдХрд╛рд░ рдХрд╛ рд╣реЛрдирд╛ рдЪрд╛рд╣рд┐рдП, рдпрд╣ рджреЗрдЦрддреЗ рд╣реБрдП рдХрд┐ dyn рдлреВ рд╕реНрдерд┐рд░ рд╣реИ (рдФрд░ рдирдВрдЧреЗ рд▓рдХреНрд╖рдг рдЪрд░рдгрдмрджреНрдз рд╣реЛ рд░рд╣реЗ рд╣реИрдВ ...)?

рд╣рд╛рдБ, рд▓реЗрдХрд┐рди рдкреНрд░рд╕реНрддрд╛рд╡рд┐рдд impl рдХрдо рд╕рдВрд╕реНрдХрд░рдг рдореЗрдВ, рдпрд╣ рдПрдХ рдмрд╛рдзреНрдп, рдпрд╛ рдПрдХ рдареЛрд╕ рдкреНрд░рдХрд╛рд░ рдХреЗ рд╕рд╛рде рдПрдХ рдЕрдиреБрдорд╛рдирд┐рдд рдкреНрд░рдХрд╛рд░ рд╣реЛ рд╕рдХрддрд╛ рд╣реИред рдЬреИрд╕реЗ Iterator<Item = String> рдмрдирд╛рдо Iterator<Item = Display> ред рдореБрдЭреЗ рдпрд╣ рдЬрд╛рдирдиреЗ рдХреЗ рд▓рд┐рдП рд▓рдХреНрд╖рдгреЛрдВ рдХреЛ рдЬрд╛рдирдирд╛ рд╣реЛрдЧрд╛ рдХрд┐ рдХреНрдпрд╛ рдЕрдиреБрдорд╛рди рд╣реЛ рд░рд╣рд╛ рд╣реИред

рд╕рдВрдкрд╛рджрд┐рдд рдХрд░реЗрдВ: рдЖрд╣, рдХрд┐рд╕реА рдиреЗ : рдЙрдкрдпреЛрдЧ рдирд╣реАрдВ рдХрд┐рдпрд╛ред рдХрд┐рдВрдбрд╛ рдореЗрд░рд╛ рдорддрд▓рдм рд╣реИ рдпрд╛рдж рдХрд░рдиреЗ рдореЗрдВ рдЖрд╕рд╛рди :) рд▓реЗрдХрд┐рди рдЖрдк рд╕рд╣реА рд╣реИрдВ рдХрд┐ рд╡реЗ рдЕрд▓рдЧ рд╣реИрдВред

2 рд╕рдВрдкрд╛рджрд┐рдд рдХрд░реЗрдВ: рдореБрдЭреЗ рд▓рдЧрддрд╛ рд╣реИ рдХрд┐ рдпрд╣ рд╕рдорд╕реНрдпрд╛ рд╕рдВрдмрджреНрдз рдкреНрд░рдХрд╛рд░реЛрдВ рдХреЗ рдмрд╛рд╣рд░ рд╣реЛрдЧреАред type Foo: (Bar, Baz) рдХреЛ рджреЗрдЦрддреЗ рд╣реБрдП рдЖрдкрдХреЛ рдпрд╣ рдЬрд╛рдирдиреЗ рдХреЗ рд▓рд┐рдП рдмрд╛рд░ рдФрд░ рдмрд╛рдЬ рдХреЛ рдЬрд╛рдирдирд╛ рд╣реЛрдЧрд╛ рдХрд┐ рдЕрдиреБрдорд╛рди рдХрд╣рд╛рдБ рд╣реЛрддрд╛ рд╣реИред

@рд╕реЗрдВрдЯреНрд░рд┐рд▓

EDIT1: рд╡рд╛рд╕реНрддрд╡ рдореЗрдВ, рдХреЗрд╡рд▓ рдПрдХ рд╕рд┐рдВрдЯреИрдХреНрд╕ рдХрд╛ рд╣реЛрдирд╛ рд╡рд┐рд╢реЗрд╖ рдЖрд╡рд░рдг рд╣реЛрдЧрд╛, рди рдХрд┐ рджреВрд╕рд░реА рддрд░рдлред

рд╡рд░реНрддрдорд╛рди рдореЗрдВ _existential_ рдкреНрд░рдХрд╛рд░, -> impl Trait рдШреЛрд╖рд┐рдд рдХрд░рдиреЗ рдХрд╛ рдХреЗрд╡рд▓ рдПрдХ рд╣реА рддрд░реАрдХрд╛ рд╣реИред рддрд░реНрдХ рд╕реВрдЪреА рдореЗрдВ _universal_ рдкреНрд░рдХрд╛рд░ ( T: Trait рдФрд░ : impl Trait ) рдШреЛрд╖рд┐рдд рдХрд░рдиреЗ рдХреЗ рджреЛ рддрд░реАрдХреЗ рд╣реИрдВред

рдпрджрд┐ рд╣рдорд╛рд░реЗ рдкрд╛рд╕ рдмрд╣реБрд░реВрдкреА рдореЙрдбреНрдпреВрд▓ рдереЗ рдЬреЛ рд╕рд╛рд░реНрд╡рднреМрдорд┐рдХ рдкреНрд░рдХрд╛рд░реЛрдВ рдореЗрдВ рд▓реЗрддреЗ рдереЗ, рддреЛ рдореИрдВ рдЙрд╕рдХреЗ рдЖрд╕-рдкрд╛рд╕ рдХреБрдЫ рддрд░реНрдХ рджреЗрдЦ рд╕рдХрддрд╛ рдерд╛, рд▓реЗрдХрд┐рди рдореЗрд░рд╛ рдорд╛рдирдирд╛ тАЛтАЛтАЛтАЛрд╣реИ рдХрд┐ рджреЛрдиреЛрдВ рдореЙрдбреНрдпреВрд▓ рдФрд░ рд╡рд┐рд╢реЗрд╖рддрд╛ рдкрд░рд┐рднрд╛рд╖рд╛рдУрдВ рдореЗрдВ type Name = Type; рдХрд╛ рд╡рд░реНрддрдорд╛рди рдЙрдкрдпреЛрдЧ рдЖрдЙрдЯрдкреБрдЯ рдкреНрд░рдХрд╛рд░ рдкреИрд░рд╛рдореАрдЯрд░ рдХреЗ рд░реВрдк рдореЗрдВ рд╣реИ, рдЬреЛ рдПрдХ рдЕрд╕реНрддрд┐рддреНрд╡рдЧрдд рд╣реЛрдирд╛ рдЪрд╛рд╣рд┐рдП рдкреНрд░рдХрд╛рд░ред


@рдлрд╛рдпрд▓реЙрди

рд╣рд╛рдБ, рд▓реЗрдХрд┐рди рдкреНрд░рд╕реНрддрд╛рд╡рд┐рдд impl рдХрдо рд╕рдВрд╕реНрдХрд░рдг рдореЗрдВ, рдпрд╣ рдПрдХ рдмрд╛рдзреНрдп, рдпрд╛ рдПрдХ рдареЛрд╕ рдкреНрд░рдХрд╛рд░ рдХреЗ рд╕рд╛рде рдПрдХ рдЕрдиреБрдорд╛рдирд┐рдд рдкреНрд░рдХрд╛рд░ рд╣реЛ рд╕рдХрддрд╛ рд╣реИред рдЬреИрд╕реЗ Iterator<Item = String> рдмрдирд╛рдо Iterator<Item = Display> ред рдореБрдЭреЗ рдпрд╣ рдЬрд╛рдирдиреЗ рдХреЗ рд▓рд┐рдП рд▓рдХреНрд╖рдгреЛрдВ рдХреЛ рдЬрд╛рдирдирд╛ рд╣реЛрдЧрд╛ рдХрд┐ рдХреНрдпрд╛ рдЕрдиреБрдорд╛рди рд╣реЛ рд░рд╣рд╛ рд╣реИред

рдореЗрд░рд╛ рдорд╛рдирдирд╛ тАЛтАЛрд╣реИ рдХрд┐ impl рдХрдо рд╕рдВрд╕реНрдХрд░рдг рдЕрд╕реНрддрд┐рддреНрд╡рдЧрдд рдкреНрд░рдХрд╛рд░реЛрдВ рдХреЗ рд▓рд┐рдП рд╕рднреА рдорд╛рдорд▓реЛрдВ рдореЗрдВ : Bound рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░ рд░рд╣рд╛ рд╣реИ, рдЗрд╕рд▓рд┐рдП рдЖрдкрдХреЗ рдкрд╛рд╕ рд╡рд┐рд╢реЗрд╖рддрд╛ рд╕реАрдорд╛ рдХреЗ рд░реВрдк рдореЗрдВ Iterator<Item = String> рдпрд╛ Iterator<Item: Display> , рд▓реЗрдХрд┐рди Iterator<Item = Display> рдПрдХ рдЕрдорд╛рдиреНрдп рдШреЛрд╖рдгрд╛ рд╣реЛрдЧреАред

@ рдирд┐рдореЛ157
рдЖрдк рд╕рдВрдмрдВрдзрд┐рдд рдкреНрд░рдХрд╛рд░ рдХреЗ рдорд╛рдорд▓реЗ рдХреЗ рд╕рдВрдмрдВрдз рдореЗрдВ рд╕рд╣реА рд╣реИрдВ, рдореЗрд░рд╛ рд╡рд╣рд╛рдВ рдмреБрд░рд╛ рд╣реИред рд▓реЗрдХрд┐рди (рдЬреИрд╕рд╛ рдХрд┐ рдореЗрд░реЗ рд╕рдВрдкрд╛рджрди рдореЗрдВ рдЙрд▓реНрд▓реЗрдЦ рдХрд┐рдпрд╛ рдЧрдпрд╛ рд╣реИ) рдореБрдЭреЗ рд▓рдЧрддрд╛ рд╣реИ рдХрд┐ рдЕрднреА рднреА type Foo: (A, B) рд╕рд╛рде рдХреЛрдИ рд╕рдорд╕реНрдпрд╛ рд╣реИред рдЬреИрд╕рд╛ рдХрд┐ A рдпрд╛ B рдПрдХ рдкреНрд░рдХрд╛рд░ рдпрд╛ рд╡рд┐рд╢реЗрд╖рддрд╛ рд╣реЛ рд╕рдХрддрд╛ рд╣реИред

рдореЗрд░рд╛ рдорд╛рдирдирд╛ тАЛтАЛрд╣реИ рдХрд┐ = рд╕рд╛рде рдЬрд╛рдиреЗ рдХрд╛ рдпрд╣ рднреА рдПрдХ рдЕрдЪреНрдЫрд╛ рдХрд╛рд░рдг рд╣реИред : рдХреЗрд╡рд▓ рдЖрдкрдХреЛ рдмрддрд╛рддрд╛ рд╣реИ рдХрд┐ рдХреБрдЫ рдЪреАрдЬреЗрдВ рдЕрдиреБрдорд╛рдирд┐рдд рд╣реИрдВ, рд▓реЗрдХрд┐рди рдЖрдкрдХреЛ рдпрд╣ рдирд╣реАрдВ рдмрддрд╛рддреА рд╣реИрдВ рдХрд┐ рдХреМрди рд╕реА рд╣реИред type Foo = (A, impl B) рдореБрдЭреЗ рд╕реНрдкрд╖реНрдЯ рд▓рдЧрддрд╛ рд╣реИред

рдореИрдВ рдпрд╣ рднреА рдорд╛рдирддрд╛ рд╣реВрдВ рдХрд┐ impl рд╕рд╛рде рдХреЛрдб рд╕реНрдирд┐рдкреЗрдЯ рдкрдврд╝рдирд╛ рдФрд░ рдкреНрд░рджрд╛рди рдХрд░рдирд╛ рдЖрд╕рд╛рди рд╣реИ, рдХреНрдпреЛрдВрдХрд┐ рдПрдХ рд╡рд┐рд╢реЗрд╖рддрд╛ рдХреНрдпрд╛ рд╣реИ рдФрд░ рдХреНрдпрд╛ рдирд╣реАрдВ рд╣реИ рдЗрд╕рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рдЕрддрд┐рд░рд┐рдХреНрдд рд╕рдВрджрд░реНрдн рдкреНрд░рджрд╛рди рдХрд░рдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рдирд╣реАрдВ рд╣реИред

рд╕рдВрдкрд╛рджрд┐рдд рдХрд░реЗрдВ: рдХреБрдЫ рдХреНрд░реЗрдбрд┐рдЯ: рдореЗрд░рд╛ рддрд░реНрдХ рдореВрд▓ рд░реВрдк рд╕реЗ @alexreg рдХреЗ рдпрд╣рд╛рдБ рдЬреИрд╕рд╛ рд╣реА impl рдмреЗрд╣рддрд░ рд╣реИред

рд╡рд░реНрддрдорд╛рди рдореЗрдВ рдЕрд╕реНрддрд┐рддреНрд╡рдЧрдд рдкреНрд░рдХрд╛рд░ рдШреЛрд╖рд┐рдд рдХрд░рдиреЗ рдХрд╛ рдХреЗрд╡рд▓ рдПрдХ рд╣реА рддрд░реАрдХрд╛ рд╣реИ, -> impl Trait ред рд╕рд╛рд░реНрд╡рднреМрдорд┐рдХ рдкреНрд░рдХрд╛рд░ рдШреЛрд╖рд┐рдд рдХрд░рдиреЗ рдХреЗ рджреЛ рддрд░реАрдХреЗ рд╣реИрдВ ( T: Trait рдФрд░ : impl Trait рдПрдХ рддрд░реНрдХ рд╕реВрдЪреА рдореЗрдВ)ред

рдореИрдВ рдпрд╣реА рдХрд╣ рд░рд╣рд╛ рд╣реВрдВ: рдкреАрдЖрдИ рд╕рд╛рд░реНрд╡рднреМрдорд┐рдХ рдкрд░рд┐рдорд╛рдгреАрдХрд░рдг рдХреЗ рджреЛ рддрд░реАрдХреЗ рдХреНрдпреЛрдВ рд╣реЛрдиреЗ рдЪрд╛рд╣рд┐рдП, рд▓реЗрдХрд┐рди рдЕрдиреНрдп рд╕реНрдерд╛рдиреЛрдВ рдкрд░ рдХреЗрд╡рд▓ рдПрдХ рд╣реА рдЕрд╕реНрддрд┐рддреНрд╡ рдореЗрдВ рд╣реИ ( dyn Trait рдЕрдирджреЗрдЦреА)?

рдпрд╣ рдореЗрд░реЗ рд▓рд┐рдП рд╕рдорд╛рди рд░реВрдк рд╕реЗ рд╕рдВрднрд╛рд╡рд┐рдд рд▓рдЧрддрд╛ рд╣реИ рдХрд┐ рдХреЛрдИ рдЙрдкрдпреЛрдЧрдХрд░реНрддрд╛ type Foo: Bound; рдФрд░ type Foo = impl Bound; рднрд╛рд╖рд╛ рдХреЗ рд╡рд┐рднрд┐рдиреНрди рднрд╛рдЧреЛрдВ рдХреЛ рд╕реАрдЦрдиреЗ рдХреЗ рдмрд╛рдж рд▓рд┐рдЦреЗрдЧрд╛, рдФрд░ рдореИрдВ рдпрд╣ рдирд╣реАрдВ рдХрд╣ рд╕рдХрддрд╛ рдХрд┐ рд╕рднреА рдорд╛рдорд▓реЛрдВ рдореЗрдВ рдПрдХ рд╡рд╛рдХреНрдпрд╡рд┐рдиреНрдпрд╛рд╕ рд╕реНрдкрд╖реНрдЯ рд░реВрдк рд╕реЗ рдмреЗрд╣рддрд░ рд╣реИ; рдореЗрд░реЗ рд▓рд┐рдП рдпрд╣ рд╕реНрдкрд╖реНрдЯ рд╣реИ рдХрд┐ рдПрдХ рд╡рд╛рдХреНрдп рд░рдЪрдирд╛ рдХреБрдЫ рдЪреАрдЬреЛрдВ рдХреЗ рд▓рд┐рдП рдмреЗрд╣рддрд░ рд╣реИ рдФрд░ рджреВрд╕рд░реА рд╡рд┐рднрд┐рдиреНрди рдЪреАрдЬреЛрдВ рдХреЗ рд▓рд┐рдПред

@рдлрд╛рдпрд▓реЙрди

рдореЗрд░рд╛ рдорд╛рдирдирд╛ тАЛтАЛрд╣реИ рдХрд┐ = рдХреЗ рд╕рд╛рде рдЬрд╛рдиреЗ рдХрд╛ рдпрд╣ рднреА рдПрдХ рдЕрдЪреНрдЫрд╛ рдХрд╛рд░рдг рд╣реИред : рдХреЗрд╡рд▓ рдЖрдкрдХреЛ рдмрддрд╛рддрд╛ рд╣реИ рдХрд┐ рдХреБрдЫ рдЪреАрдЬреЗрдВ рдЕрдиреБрдорд╛рдирд┐рдд рд╣реИрдВ, рд▓реЗрдХрд┐рди рдЖрдкрдХреЛ рдпрд╣ рдирд╣реАрдВ рдмрддрд╛рддреА рд╣реИрдВ рдХрд┐ рдХреМрди рд╕реА рд╣реИред рдЯрд╛рдЗрдк рдлреВ = (рдП, рдЗрдВрдк рдмреА) рдореБрдЭреЗ рд╕реНрдкрд╖реНрдЯ рд▓рдЧрддрд╛ рд╣реИред

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

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

type A: Foo;
type B: Bar;
type C: Baz;
type D: Iterator<Item = C>; 
type E = (A, Vec<B>, D);

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

type E = (impl Foo, Vec<impl Bar>, impl Iterator<Item = impl Baz>);

рдЙрдкрд░реЛрдХреНрдд рд╕реЗ рдЕрд╕рдВрдмрдВрдзрд┐рдд: рд╣рдо рд░рд╛рдд рдореЗрдВ let x: impl Trait рдХреЛ рд▓рд╛рдЧреВ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдХрдм рдЦреЗрд▓рддреЗ рд╣реИрдВ? рдореИрдВ рдХреБрдЫ рд╕рдордп рд╕реЗ рдЗрд╕ рд╕реБрд╡рд┐рдзрд╛ рдХреЛ рдпрд╛рдж рдХрд░ рд░рд╣рд╛ рд╣реВрдВред

@alexreg

рдПрдХ рдФрд░ рдмрд╛рдд рдпрд╣ рд╣реИ: рдХреНрдпрд╛ рдХреЛрдИ рдЙрд╕ рд╕рд┐рдВрдЯреИрдХреНрд╕ рдХреЗ рддрд╣рдд : рдХреЛ рдПрдХ рд╕рдВрдмрджреНрдз рдкреНрд░рдХрд╛рд░ рдХреЗ рдмрдВрдзрди рдХреЗ рднреАрддрд░ рднреА рдЕрдиреБрдорддрд┐ рджреЗрдЧрд╛?

рд╣рд╛рдБ рдХреНрдпреЛрдВ рдирд╣реАрдВ; рдпрд╣ rust-lang/rfcs#2289 + type Foo: Bound рд╕реНрд╡рд╛рднрд╛рд╡рд┐рдХ рдкреНрд░рднрд╛рд╡ рд╣реЛрдЧрд╛ред

рдЖрдк рдпрд╣ рднреА рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ:

type E = (impl Foo, Vec<impl Bar>, impl Iterator<Item: Baz>);

@Centril рдореБрдЭреЗ рд▓рдЧрддрд╛ рд╣реИ рдХрд┐ рджреЛ рд╡реИрдХрд▓реНрдкрд┐рдХ рд╡рд╛рдХреНрдпрд╡рд┐рдиреНрдпрд╛рд╕реЛрдВ рдХреЛ рдЕрдиреБрдорддрд┐ рджреЗрдирд╛ рдПрдХ рдмреБрд░рд╛ рд╡рд┐рдЪрд╛рд░ рд╣реИред "рд╣рдо рддрдп рдирд╣реАрдВ рдХрд░ рд╕рдХреЗ, рдЗрд╕рд▓рд┐рдП рд╣рдо рджреЛрдиреЛрдВ рдХрд╛ рд╕рдорд░реНрдерди рдХрд░реЗрдВрдЧреЗ" рд╕рд┐рдВрдбреНрд░реЛрдо рдЬреИрд╕реА рдЧрдВрдз рдЖрддреА рд╣реИред рдХреЛрдб рдХреЛ рджреЗрдЦрдирд╛ рдЬреЛ рдЙрдиреНрд╣реЗрдВ рдорд┐рд▓рд╛рддрд╛ рд╣реИ рдФрд░ рдореЗрд▓ рдЦрд╛рддрд╛ рд╣реИ, рдПрдХ рд╡рд╛рд╕реНрддрд╡рд┐рдХ рдЖрдВрдЦреЛрдВ рдХреА рд░реЛрд╢рдиреА рд╣реЛрдЧреА!

@Centril рдореИрдВ рдЖрдкрдХреЗ BTW рдХреЗ рдЙрд╕ RFC рдкрд░ @nikomatsakis рдХреЗ рд╕рд╛рде рд╣реВрдБ, рдХреНрд╖рдорд╛ рдХрд░реЗрдВред рдмрд▓реНрдХрд┐ рд▓рд┐рдЦреЗрдВрдЧреЗ impl Iterator<Item = impl Baz> ред рдЕрдЪреНрдЫрд╛ рдФрд░ рд╕реНрдкрд╖реНрдЯред

@alexreg рдпрд╣ рдЙрдЪрд┐рдд рд╣реИ;

рд▓реЗрдХрд┐рди (рд╕рдВрдпреБрдХреНрдд рд░рд╛рд╖реНрдЯреНрд░) рд╕реМрднрд╛рдЧреНрдп рд╕реЗ (рдЖрдкрдХреЗ рдкреАрдУрд╡реА рдХреЗ рдЖрдзрд╛рд░ рдкрд░), рд╣рдордиреЗ рдкрд╣рд▓реЗ рд╕реЗ рд╣реА рддрд░реНрдХ рд╕реНрдерд┐рддрд┐ рдореЗрдВ impl Trait рд╕рд╛рде "рджреЛ рд╡реИрдХрд▓реНрдкрд┐рдХ рд╕рд┐рдВрдЯреИрдХреНрд╕ рдХреА рдЕрдиреБрдорддрд┐ рджреЗрдВ" рд╢реБрд░реВ рдХрд░ рджреА рд╣реИ, рдЬреИрд╕реЗ рдХрд┐ рд╣рдорд╛рд░реЗ рдкрд╛рд╕ Foo: Bar рдФрд░ impl Bar рдПрдХ рд╣реА рдмрд╛рдд рдХрд╛ рдорддрд▓рдм рдХрд╛рдо рдХрд░рдирд╛;

рдпрд╣ рд╕рд╛рд░реНрд╡рднреМрдорд┐рдХ рдкрд░рд┐рдорд╛рдгреАрдХрд░рдг рдХреЗ рд▓рд┐рдП рд╣реИ, рд▓реЗрдХрд┐рди impl Trait рдЕрдВрдХрди рд╡рд╛рд╕реНрддрд╡ рдореЗрдВ рдЗрд╕ рдмрд╛рдд рдХреА рдкрд░рд╡рд╛рд╣ рдирд╣реАрдВ рдХрд░рддрд╛ рд╣реИ рдХрд┐ рдпрд╣ рджреНрд╡реИрдд рдХреЗ рдХрд┐рд╕ рдкрдХреНрд╖ рдкрд░ рд╣реИ; рдЖрдЦрд┐рд░рдХрд╛рд░, рд╣рдо any Trait рдФрд░ some Trait ред

рдпрд╣ рджреЗрдЦрддреЗ рд╣реБрдП рдХрд┐ рд╣рдордиреЗ рдкрд╣рд▓реЗ рд╕реЗ рд╣реА "рд╣рдо рддрдп рдирд╣реАрдВ рдХрд░ рд╕рдХреЗ" рдФрд░ "рджреНрд╡реИрдд рдХрд╛ рдкрдХреНрд╖ рд╡рд╛рдХреНрдп-рд╡рд┐рдиреНрдпрд╛рд╕ рд╕реЗ рдХреЛрдИ рдлрд░реНрдХ рдирд╣реАрдВ рдкрдбрд╝рддрд╛ " рдХрд╛ рдЪреБрдирд╛рд╡ рдХрд░ рд▓рд┐рдпрд╛ рд╣реИ, рдпрд╣ рдореБрдЭреЗ рд╣рд░ рдЬрдЧрд╣ "рд╣рдо рддрдп рдирд╣реАрдВ рдХрд░ рд╕рдХрддреЗ" рд▓рд╛рдЧреВ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рд╕реБрд╕рдВрдЧрдд рд▓рдЧрддрд╛ рд╣реИ рддрд╛рдХрд┐ рдЙрдкрдпреЛрдЧрдХрд░реНрддрд╛ рдХреЛ рди рдорд┐рд▓реЗ рдореЗрдВ "рд▓реЗрдХрд┐рди рдореИрдВ рдЗрд╕реЗ рд╡рд╣рд╛рдБ рдЗрд╕ рддрд░рд╣ рд▓рд┐рдЦ рд╕рдХрддрд╛ рдерд╛, рдпрд╣рд╛рдБ рдХреНрдпреЛрдВ рдирд╣реАрдВ?" ;)


рдкреБрдирд╢реНрдЪ:

рдкреБрдирдГред impl Iterator<Item = impl Baz> рдпрд╣ рдЬрд╣рд╛рдВ рдХреНрд▓реЙрдЬ рдореЗрдВ рдмрд╛рдЙрдВрдб рдХреЗ рд░реВрдк рдореЗрдВ рдХрд╛рдо рдирд╣реАрдВ рдХрд░рддрд╛ рд╣реИ; рддреЛ рдЖрдкрдХреЛ рдЗрд╕реЗ Iter: Iterator<Item = impl Baz> рддрд░рд╣ рдорд┐рд▓рд╛рдирд╛ рд╣реЛрдЧрд╛ред рдЖрдкрдХреЛ рдЗрд╕рдХреА рдЕрдиреБрдорддрд┐ рджреЗрдиреА рд╣реЛрдЧреА: Iter = impl Iterator<Item = impl Baz> рдЗрд╕рдХреЗ рд▓рд┐рдП рд╕рдорд╛рди рд░реВрдк рд╕реЗ рдХрд╛рдо рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП (рд╢рд╛рдпрдж рд╣рдореЗрдВ рдЪрд╛рд╣рд┐рдП?)ред

рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рддреЗ рд╣реБрдП : Bound рднреА рдХреЗ рдмрдЬрд╛рдп рд╣реИ = impl Bound , рдпрд╣ рднреА рд╕реНрдкрд╖реНрдЯ рд╣реИ рд╕рд┐рд░реНрдл рдЫреЛрдЯреЗ ^, -
рдореБрдЭреЗ рд▓рдЧрддрд╛ рд╣реИ рдХрд┐ X = Ty рдФрд░ X: Ty рдмреАрдЪ рдЕрдВрддрд░ рдореЗрдВ рдЕрдВрддрд░ рд╡рд╛рдХреНрдп рд░рдЪрдирд╛ рдХреЛ рд╕реБрдкрд╛рдареНрдп рдмрдирд╛рддрд╛ рд╣реИред

рдореЗрд░реА рдЕрдкрдиреА рд╕рд▓рд╛рд╣ рдХреЛ рдирдЬрд╝рд░рдЕрдВрджрд╛рдЬрд╝ рдХрд░рдиреЗ рдХреЗ рдмрд╛рдж, рдЖрдЗрдП RFC рдореЗрдВ рдЗрд╕ рдмрд╛рддрдЪреАрдд рдХреЛ рдЬрд╛рд░реА рд░рдЦреЗрдВ;)

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

рд╣рдордиреЗ рдХрд┐рдпрд╛, рд▓реЗрдХрд┐рди рдореЗрд░рд╛ рдорд╛рдирдирд╛ тАЛтАЛрд╣реИ рдХрд┐ рдЪреБрдирд╛рд╡ рд╕рдорд░реВрдкрддрд╛/рд╕рдВрдЧрддрд┐ рдХреЗ рджреГрд╖реНрдЯрд┐рдХреЛрдг рд╕реЗ рдЕрдзрд┐рдХ рдХрд┐рдпрд╛ рдЧрдпрд╛ рдерд╛ред рд╕рд╛рдорд╛рдиреНрдп рд░реВрдк рд╕реЗ рдЯрд╛рдЗрдк рдХрд┐рдП рдЧрдП рддрд░реНрдХ рд╕рд╛рд░реНрд╡рднреМрдорд┐рдХ рд░реВрдк рд╕реЗ рдЯрд╛рдЗрдк рдХрд┐рдП рдЧрдП ( impl Trait ) рд╡рд╛рд▓реЗ рддрд░реНрдХреЛрдВ рдХреА рддреБрд▓рдирд╛ рдореЗрдВ рд╕рдЦреНрддреА рд╕реЗ рдЕрдзрд┐рдХ рд╢рдХреНрддрд┐рд╢рд╛рд▓реА рд╣реЛрддреЗ рд╣реИрдВред рд▓реЗрдХрд┐рди рд╣рдо рд╡рд╛рдкрд╕реА рдХреА рд╕реНрдерд┐рддрд┐ рдореЗрдВ impl Trait рдкреЗрд╢ рдХрд░ рд░рд╣реЗ рдереЗ, рдЗрд╕реЗ рддрд░реНрдХ рд╕реНрдерд┐рддрд┐ рдкреЗрд╢ рдХрд░рдирд╛ рд╕рдордЭ рдореЗрдВ рдЖрдпрд╛ред

рдпрд╣ рджреЗрдЦрддреЗ рд╣реБрдП рдХрд┐ рд╣рдордиреЗ рдкрд╣рд▓реЗ рд╕реЗ рд╣реА "рд╣рдо рддрдп рдирд╣реАрдВ рдХрд░ рд╕рдХреЗ" рдФрд░ "рджреНрд╡реИрдд рдХрд╛ рдкрдХреНрд╖ рд╡рд╛рдХреНрдп-рд╡рд┐рдиреНрдпрд╛рд╕ рд╕реЗ рдХреЛрдИ рдлрд░реНрдХ рдирд╣реАрдВ рдкрдбрд╝рддрд╛" рдХрд╛ рдЪреБрдирд╛рд╡ рдХрд░ рд▓рд┐рдпрд╛ рд╣реИ, рдпрд╣ рдореБрдЭреЗ рд╣рд░ рдЬрдЧрд╣ "рд╣рдо рддрдп рдирд╣реАрдВ рдХрд░ рд╕рдХрддреЗ" рд▓рд╛рдЧреВ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рд╕реБрд╕рдВрдЧрдд рд▓рдЧрддрд╛ рд╣реИ рддрд╛рдХрд┐ рдЙрдкрдпреЛрдЧрдХрд░реНрддрд╛ рдХреЛ рди рдорд┐рд▓реЗ рдореЗрдВ "рд▓реЗрдХрд┐рди рдореИрдВ рдЗрд╕реЗ рд╡рд╣рд╛рдБ рдЗрд╕ рддрд░рд╣ рд▓рд┐рдЦ рд╕рдХрддрд╛ рдерд╛, рдпрд╣рд╛рдБ рдХреНрдпреЛрдВ рдирд╣реАрдВ?" ;)

рдореБрдЭреЗ рдпрдХреАрди рдирд╣реАрдВ рд╣реИ рдХрд┐ рдпрд╣ рдЙрд╕ рдмрд┐рдВрджреБ рдкрд░ рд╣реИ рдЬрд╣рд╛рдВ рд╣рдореЗрдВ рдЕрдкрдиреА рдмрд╛рд╣реЛрдВ рдХреЛ рдКрдкрд░ рдЙрдард╛рдирд╛ рдЪрд╛рд╣рд┐рдП рдФрд░ рдХрд╣рдирд╛ рдЪрд╛рд╣рд┐рдП "рдЪрд▓реЛ рд╕рдм рдХреБрдЫ рд▓рд╛рдЧреВ рдХрд░реЗрдВ"ред рдпрд╣рд╛рдБ рд▓рд╛рдн рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рдЙрддрдирд╛ рд╕реНрдкрд╖реНрдЯ рддрд░реНрдХ рдирд╣реАрдВ рд╣реИред

рдкреБрдирд╢реНрдЪ:

рдкреБрдирдГред impl Iterator<Item = impl Baz> рдпрд╣ рдЬрд╣рд╛рдВ рдХреНрд▓реЙрдЬ рдореЗрдВ рдмрд╛рдЙрдВрдб рдХреЗ рд░реВрдк рдореЗрдВ рдХрд╛рдо рдирд╣реАрдВ рдХрд░рддрд╛ рд╣реИ; рддреЛ рдЖрдкрдХреЛ рдЗрд╕реЗ Iter: Iterator<Item = impl Baz> рддрд░рд╣ рдорд┐рд▓рд╛рдирд╛ рд╣реЛрдЧрд╛ред рдЖрдкрдХреЛ рдЗрд╕рдХреА рдЕрдиреБрдорддрд┐ рджреЗрдиреА рд╣реЛрдЧреА: Iter = impl Iterator<Item = impl Baz> рдЗрд╕рдХреЗ рд▓рд┐рдП рд╕рдорд╛рди рд░реВрдк рд╕реЗ рдХрд╛рдо рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП (рд╢рд╛рдпрдж рд╣рдореЗрдВ рдЪрд╛рд╣рд┐рдП?)ред

рдореИрдВ рдХрд╣реВрдВрдЧрд╛ рдХрд┐ рд╣рдо рдпрд╛ рддреЛ рдХреЗрд╡рд▓ where Iter: Iterator<Item = T>, T: Baz рд╕рдорд░реНрдерди рдХрд░рддреЗ рд╣реИрдВ (рдЬреИрд╕реЗ рд╣рдорд╛рд░реЗ рдкрд╛рд╕ рдЕрднреА рд╣реИ) рдпрд╛ Iter = impl Iterator<Item = impl Baz> (рдЬреИрд╕рд╛ рдЖрдкрдиреЗ рд╕реБрдЭрд╛рд╡ рджрд┐рдпрд╛) рдХреЗ рд╕рд╛рде рдкреВрд░реА рддрд░рд╣ рд╕реЗ рдЬрд╛рдирд╛ред рдХреЗрд╡рд▓ рдЖрдзреЗ-рдЕрдзреВрд░реЗ рдШрд░ рдХреЛ рдЕрдиреБрдорддрд┐ рджреЗрдирд╛ рдкреБрд▓рд┐рд╕-рдЖрдЙрдЯ рдЬреИрд╕рд╛ рд▓рдЧрддрд╛ рд╣реИред

рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рддреЗ рд╣реБрдП : Bound рднреА рдХреЗ рдмрдЬрд╛рдп рд╣реИ = impl рдмрд╛рдЙрдВрдб, рдпрд╣ рднреА рд╕реНрдкрд╖реНрдЯ рд╣реИ рд╕рд┐рд░реНрдл рдЫреЛрдЯреЗ ^, -
рдореБрдЭреЗ рд▓рдЧрддрд╛ рд╣реИ рдХрд┐ X = Ty рдФрд░ X: Ty рдмреАрдЪ рдЕрдВрддрд░ рдореЗрдВ рдЕрдВрддрд░ рд╡рд╛рдХреНрдп рд░рдЪрдирд╛ рдХреЛ рд╕реБрдкрд╛рдареНрдп рдмрдирд╛рддрд╛ рд╣реИред

рдпрд╣ рд╕реБрдкрд╛рдареНрдп рд╣реИ, рд▓реЗрдХрд┐рди рдореБрдЭреЗ рдирд╣реАрдВ рд▓рдЧрддрд╛ рдХрд┐ рдпрд╣ рд▓рдЧрднрдЧ рд╕реНрдкрд╖реНрдЯ/рд╕реНрдкрд╖реНрдЯ рд╣реИ рдХрд┐ рдЕрд╕реНрддрд┐рддреНрд╡ рдХреЗ рдкреНрд░рдХрд╛рд░ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд┐рдпрд╛ рдЬрд╛ рд░рд╣рд╛ рд╣реИред рдпрд╣ рддрдм рдФрд░ рдмрдврд╝ рдЬрд╛рддрд╛ рд╣реИ рдЬрдм рдЗрд╕ рд╕рд┐рдВрдЯреИрдХреНрд╕ рдХреА рд╕реАрдорд╛ рдХреЗ рдХрд╛рд░рдг рдкрд░рд┐рднрд╛рд╖рд╛ рдХреЛ рдХрдИ рдкрдВрдХреНрддрд┐рдпреЛрдВ рдореЗрдВ рд╡рд┐рднрд╛рдЬрд┐рдд рдХрд░рдирд╛ рдкрдбрд╝рддрд╛ рд╣реИред

рдореЗрд░реА рдЕрдкрдиреА рд╕рд▓рд╛рд╣ рдХреЛ рдирдЬрд╝рд░рдЕрдВрджрд╛рдЬрд╝ рдХрд░рдиреЗ рдХреЗ рдмрд╛рдж, рдЖрдЗрдП RFC рдореЗрдВ рдЗрд╕ рдмрд╛рддрдЪреАрдд рдХреЛ рдЬрд╛рд░реА рд░рдЦреЗрдВ;)

рд░реБрдХреЛ, рддреБрдореНрд╣рд╛рд░рд╛ рдорддрд▓рдм рд╣реИ рдЖрдкрдХрд╛ RFC? рдореБрдЭреЗ рд▓рдЧрддрд╛ рд╣реИ рдХрд┐ рдпрд╣ рдЙрд╕ рдФрд░ рдЗрд╕ рджреЛрдиреЛрдВ рдХреЗ рд▓рд┐рдП рдкреНрд░рд╛рд╕рдВрдЧрд┐рдХ рд╣реИ, рдЬреЛ рдореИрдВ рдмрддрд╛ рд╕рдХрддрд╛ рд╣реВрдВред :-)

рд░реБрдХреЛ, рддреБрдореНрд╣рд╛рд░рд╛ рдорддрд▓рдм рд╣реИ рдЖрдкрдХрд╛ RFC? рдореБрдЭреЗ рд▓рдЧрддрд╛ рд╣реИ рдХрд┐ рдпрд╣ рдЙрд╕ рдФрд░ рдЗрд╕ рджреЛрдиреЛрдВ рдХреЗ рд▓рд┐рдП рдкреНрд░рд╛рд╕рдВрдЧрд┐рдХ рд╣реИ, рдЬреЛ рдореИрдВ рдмрддрд╛ рд╕рдХрддрд╛ рд╣реВрдВред :-)

рдареАрдХ рд╣реИ; рдЪрд▓реЛ рдлрд┐рд░ рдпрд╣реАрдВ рдЪрд▓рддреЗ рд╣реИрдВ;

рд╣рдордиреЗ рдХрд┐рдпрд╛, рд▓реЗрдХрд┐рди рдореЗрд░рд╛ рдорд╛рдирдирд╛ тАЛтАЛрд╣реИ рдХрд┐ рдЪреБрдирд╛рд╡ рд╕рдорд░реВрдкрддрд╛/рд╕рдВрдЧрддрд┐ рдХреЗ рджреГрд╖реНрдЯрд┐рдХреЛрдг рд╕реЗ рдЕрдзрд┐рдХ рдХрд┐рдпрд╛ рдЧрдпрд╛ рдерд╛ред рд╕рд╛рдорд╛рдиреНрдп рд░реВрдк рд╕реЗ рдЯрд╛рдЗрдк рдХрд┐рдП рдЧрдП рддрд░реНрдХ рд╕рд╛рд░реНрд╡рднреМрдорд┐рдХ рд░реВрдк рд╕реЗ рдЯрд╛рдЗрдк рдХрд┐рдП рдЧрдП ( impl Trait ) рд╡рд╛рд▓реЗ рддрд░реНрдХреЛрдВ рдХреА рддреБрд▓рдирд╛ рдореЗрдВ рд╕рдЦреНрддреА рд╕реЗ рдЕрдзрд┐рдХ рд╢рдХреНрддрд┐рд╢рд╛рд▓реА рд╣реЛрддреЗ рд╣реИрдВред рд▓реЗрдХрд┐рди рд╣рдо рд╡рд╛рдкрд╕реА рдХреА рд╕реНрдерд┐рддрд┐ рдореЗрдВ impl Trait рдкреЗрд╢ рдХрд░ рд░рд╣реЗ рдереЗ, рдЗрд╕реЗ рддрд░реНрдХ рд╕реНрдерд┐рддрд┐ рдкреЗрд╢ рдХрд░рдирд╛ рд╕рдордЭ рдореЗрдВ рдЖрдпрд╛ред

рдореЗрд░рд╛ рдкреВрд░рд╛ рдмрд┐рдВрджреБ рдирд┐рд░рдВрддрд░рддрд╛ рдФрд░ рд╕рдорд░реВрдкрддрд╛ рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рд╣реИред = рдкреА
рдпрджрд┐ рдЖрдкрдХреЛ рдЕрд╕реНрддрд┐рддреНрд╡рдЧрдд рдФрд░ рд╕рд╛рд░реНрд╡рднреМрдорд┐рдХ рдкрд░рд┐рдорд╛рдгреАрдХрд░рдг рджреЛрдиреЛрдВ рдХреЗ рд▓рд┐рдП impl Trait рд▓рд┐рдЦрдиреЗ рдХреА рдЕрдиреБрдорддрд┐ рд╣реИ, рддреЛ рдореЗрд░реЗ рд▓рд┐рдП рдпрд╣ рд╕рдордЭ рдореЗрдВ рдЖрддрд╛ рд╣реИ рдХрд┐ рдЖрдкрдХреЛ рд╕рд╛рд░реНрд╡рднреМрдорд┐рдХ рдФрд░ рдЕрд╕реНрддрд┐рддреНрд╡рдЧрдд рдкрд░рд┐рдорд╛рдгреАрдХрд░рдг рджреЛрдиреЛрдВ рдХреЗ рд▓рд┐рдП Type: Trait рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдиреЗ рдХреА рдЕрдиреБрдорддрд┐ рджреА рдЬрд╛рдиреА рдЪрд╛рд╣рд┐рдПред

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

fn foo(bar: impl Trait, baz: typeof bar) { // eww... but possible!
    ...
}

рдореБрдЭреЗ рдпрдХреАрди рдирд╣реАрдВ рд╣реИ рдХрд┐ рдпрд╣ рдЙрд╕ рдмрд┐рдВрджреБ рдкрд░ рд╣реИ рдЬрд╣рд╛рдВ рд╣рдореЗрдВ рдЕрдкрдиреА рдмрд╛рд╣реЛрдВ рдХреЛ рдКрдкрд░ рдЙрдард╛рдирд╛ рдЪрд╛рд╣рд┐рдП рдФрд░ рдХрд╣рдирд╛ рдЪрд╛рд╣рд┐рдП "рдЪрд▓реЛ рд╕рдм рдХреБрдЫ рд▓рд╛рдЧреВ рдХрд░реЗрдВ"ред рдпрд╣рд╛рдБ рд▓рд╛рдн рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рдЙрддрдирд╛ рд╕реНрдкрд╖реНрдЯ рддрд░реНрдХ рдирд╣реАрдВ рд╣реИред

рдореЗрд░рд╛ рддрд░реНрдХ рдпрд╣ рд╣реИ рдХрд┐ рдЖрд╢реНрдЪрд░реНрдпрдЬрдирдХ рдЙрдкрдпреЛрдЧрдХрд░реНрддрд╛ "рдпрд╣ рд╡рд╛рдХреНрдпрд╡рд┐рдиреНрдпрд╛рд╕ рдХрд╣реАрдВ рдФрд░ рдкреНрд░рдпреЛрдЧ рдпреЛрдЧреНрдп рд╣реИ рдФрд░ рдЗрд╕рдХрд╛ рдЕрд░реНрде рдпрд╣рд╛рдВ рд╕реНрдкрд╖реНрдЯ рд╣реИ, рд▓реЗрдХрд┐рди рдЖрдк рдЗрд╕реЗ рдЗрд╕ рдЬрдЧрд╣ рдкрд░ рдирд╣реАрдВ рд▓рд┐рдЦ рд╕рдХрддреЗ рд╣реИрдВ" рдЗрд╕реЗ рдХрд░рдиреЗ рдХреЗ рджреЛ рддрд░реАрдХреЛрдВ рд╕реЗ рдЕрдзрд┐рдХ рдЦрд░реНрдЪ рд╣реЛрддрд╛ рд╣реИ (рдЬрд┐рд╕реЗ рдЖрдк рджреЛрдиреЛрдВ рдХреЛ рдХрд┐рд╕реА рднреА рддрд░рд╣ рд╕реЗ рдЦреБрдж рдХреЛ рдкрд░рд┐рдЪрд┐рдд рдХрд░рдирд╛ рд╣реЛрдЧрд╛ ) рд╣рдордиреЗ https://github.com/rust-lang/rfcs/pull/2300 (рд╡рд┐рд▓рдп), https://github.com/rust-lang/rfcs/pull/2302 (PFCP), https рдХреЗ рд╕рд╛рде рднреА рдРрд╕рд╛ рд╣реА рдХрд┐рдпрд╛ рд╣реИред

рдпрд╣ рд╕реБрдкрд╛рдареНрдп рд╣реИ, рд▓реЗрдХрд┐рди рдореБрдЭреЗ рдирд╣реАрдВ рд▓рдЧрддрд╛ рдХрд┐ рдпрд╣ рд▓рдЧрднрдЧ рд╕реНрдкрд╖реНрдЯ/рд╕реНрдкрд╖реНрдЯ рд╣реИ рдХрд┐ рдЕрд╕реНрддрд┐рддреНрд╡ рдХреЗ рдкреНрд░рдХрд╛рд░ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд┐рдпрд╛ рдЬрд╛ рд░рд╣рд╛ рд╣реИред

рдореЗрд░реЗ рд╡рд┐рдЪрд╛рд░ рд╕реЗ рд╕реБрдкрд╛рдареНрдп рдкрд░реНрдпрд╛рдкреНрдд рд╣реИ; рдореБрдЭреЗ рдирд╣реАрдВ рд▓рдЧрддрд╛ рдХрд┐ рд░рд╕реНрдЯ "рд╕рдмрд╕реЗ рдКрдкрд░ рд╕реНрдкрд╖реНрдЯ" рдХреЗ рд▓рд┐рдП рдЬрд┐рдореНрдореЗрджрд╛рд░ рд╣реИ рдФрд░ рдЕрддреНрдпрдзрд┐рдХ рд╡рд░реНрдмреЛрдЬрд╝ рд╣реЛрдиреЗ рдХреЗ рдирд╛рддреЗ (рдЬреЛ рдореБрдЭреЗ рдмрд╣реБрдд рдЕрдзрд┐рдХ рдЙрдкрдпреЛрдЧ рдХрд┐рдП рдЬрд╛рдиреЗ рдкрд░ рд╕рд┐рдВрдЯреИрдХреНрд╕ рдорд┐рд▓рддрд╛ рд╣реИ) рднреА рдЙрдкрдпреЛрдЧ рдХреЛ рд╣рддреЛрддреНрд╕рд╛рд╣рд┐рдд рдХрд░рдХреЗ рдЦрд░реНрдЪ рд╣реЛрддрд╛ рд╣реИред
(рдпрджрд┐ рдЖрдк рдЪрд╛рд╣рддреЗ рд╣реИрдВ рдХрд┐ рдХреБрдЫ рдЕрдХреНрд╕рд░ рдЗрд╕реНрддреЗрдорд╛рд▓ рдХрд┐рдпрд╛ рдЬрд╛рдП, рддреЛ рдЗрд╕реЗ рдЯреЗрд░рд╕рд░ рд╕рд┐рдВрдЯреИрдХреНрд╕ рджреЗрдВ ... cf ? рд░рд┐рд╢реНрд╡рдд рдХреЗ рд░реВрдк рдореЗрдВ .unwrap() )ред

рдпрд╣ рддрдм рдФрд░ рдмрдврд╝ рдЬрд╛рддрд╛ рд╣реИ рдЬрдм рдЗрд╕ рд╕рд┐рдВрдЯреИрдХреНрд╕ рдХреА рд╕реАрдорд╛ рдХреЗ рдХрд╛рд░рдг рдкрд░рд┐рднрд╛рд╖рд╛ рдХреЛ рдХрдИ рдкрдВрдХреНрддрд┐рдпреЛрдВ рдореЗрдВ рд╡рд┐рднрд╛рдЬрд┐рдд рдХрд░рдирд╛ рдкрдбрд╝рддрд╛ рд╣реИред

рдпрд╣ рдореБрдЭреЗ рдирд╣реАрдВ рдорд┐рд▓рддрд╛ рд╣реИ; рдореБрдЭреЗ рдРрд╕рд╛ рд▓рдЧрддрд╛ рд╣реИ рдХрд┐ Assoc = impl Trait рд▓рд╛рдЗрди рд╡рд┐рднрд╛рдЬрди рдХрд╛ рдХрд╛рд░рдг Assoc: Trait рд╕реЗ рднреА рдЕрдзрд┐рдХ рд╣реЛрдирд╛ рдЪрд╛рд╣рд┐рдП рдХреНрдпреЛрдВрдХрд┐ рдкреВрд░реНрд╡ рд▓рдВрдмрд╛ рд╣реИред

рдореИрдВ рдХрд╣реВрдВрдЧрд╛ рдХрд┐ рд╣рдо рдпрд╛ рддреЛ рдХреЗрд╡рд▓ where Iter: Iterator<Item = T>, T: Baz рд╕рдорд░реНрдерди рдХрд░рддреЗ рд╣реИрдВ (рдЬреИрд╕реЗ рд╣рдорд╛рд░реЗ рдкрд╛рд╕ рдЕрднреА рд╣реИ) рдпрд╛ Iter = impl Iterator<Item = impl Baz> (рдЬреИрд╕рд╛ рдЖрдкрдиреЗ рд╕реБрдЭрд╛рд╡ рджрд┐рдпрд╛) рдХреЗ рд╕рд╛рде рдкреВрд░реА рддрд░рд╣ рд╕реЗ рдЬрд╛рдирд╛ред
рдХреЗрд╡рд▓ рдЖрдзреЗ-рдЕрдзреВрд░реЗ рдШрд░ рдХреЛ рдЕрдиреБрдорддрд┐ рджреЗрдирд╛ рдкреБрд▓рд┐рд╕-рдЖрдЙрдЯ рдЬреИрд╕рд╛ рд▓рдЧрддрд╛ рд╣реИред

рдмрд┐рд▓реНрдХреБрд▓ рд╕рд╣реА!, рдЪрд▓реЛ рдЖрдзреЗ рд░рд╛рд╕реНрддреЗ рдШрд░/рдкреБрд▓рд┐рд╕-рдЖрдЙрдЯ рдирд╣реАрдВ рдЬрд╛рддреЗ рд╣реИрдВ рдФрд░ where Iter: Iterator<Item: Baz> ;)

@Centril рдареАрдХ рд╣реИ, рдЖрдкрдиреЗ рдореБрдЭреЗ рдореБрдЦреНрдп рд░реВрдк рд╕реЗ рд╕рдорд░реВрдкрддрд╛/рд╕реНрдерд┐рд░рддрд╛ рддрд░реНрдХ рдкрд░ рдЬреАрдд рд▓рд┐рдпрд╛ рд╣реИред рджреЛрдиреЛрдВ рд░реВрдкреЛрдВ рдХреЗ рд╣реЛрдиреЗ рдХрд╛ рдПрд░реНрдЧреЛрдиреЙрдорд┐рдХреНрд╕ рд╣рд╛рд▓рд╛рдВрдХрд┐ рднреА рдорджрдж рдХрд░рддрд╛ рд╣реИред рд╣рд╛рд▓рд╛рдВрдХрд┐, рдЗрд╕ рд╕реБрд╡рд┐рдзрд╛ рдХреЗ рд▓рд┐рдП рд▓рдВрдмреЗ рд╕рдордп рд╕реЗ рдкрд╣рд▓реЗ рднрд╛рд░реА рд▓рд╛рдЗрдирд┐рдВрдЧ рдЬрд░реВрд░реА рд╣реИред

рдХрд▓ рдореЗрд░реЗ рдкреВрд░реЗ рдЙрддреНрддрд░ рдХреЗ рд╕рд╛рде рдЗрд╕реЗ рд╕рдВрдкрд╛рджрд┐рдд рдХрд░реЗрдВрдЧреЗред

рд╕рдВрдкрд╛рджрд┐рдд рдХрд░реЗрдВ

рдЬреИрд╕рд╛ рдХрд┐ @Centril рдмрддрд╛рддрд╛ рд╣реИ, рд╣рдо рдкрд╣рд▓реЗ рд╕реЗ рд╣реА : Trait (рдмрд╛рдзреНрдп) рд╕рд┐рдВрдЯреИрдХреНрд╕ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдХреЗ рд╕рд╛рд░реНрд╡рднреМрдорд┐рдХ рдкреНрд░рдХрд╛рд░реЛрдВ рдХрд╛ рд╕рдорд░реНрдерди рдХрд░рддреЗ рд╣реИрдВред рдЬреИрд╕реЗ

fn foo<T: Trait>(x: T) { ... }

"рдЙрдЪрд┐рдд" рдпрд╛ "рд╕рдВрд╢реЛрдзрд┐рдд" рд╕рд╛рд░реНрд╡рднреМрдорд┐рдХ рдкреНрд░рдХрд╛рд░реЛрдВ рдХреЗ рд╕рд╛рде, рдЙрджрд╛

fn foo(x: impl Trait) { ... }

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

рдЕрдм, рд╣рдорд╛рд░реЗ рдкрд╛рд╕ рдкрд╣рд▓реЗ рд╕реЗ рд╣реА impl Trait рдлрд╝рдВрдХреНрд╢рди рд░рд┐рдЯрд░реНрди рд╕реНрдерд┐рддрд┐ рдореЗрдВ рднреА рд╣реИ, рдЬреЛ рдПрдХ рдЕрд╕реНрддрд┐рддреНрд╡ рдкреНрд░рдХрд╛рд░ рдХрд╛ рдкреНрд░рддрд┐рдирд┐рдзрд┐рддреНрд╡ рдХрд░рддрд╛ рд╣реИред рд╕рдВрдмрдВрдзрд┐рдд рдкреНрд░рдХрд╛рд░ рдХреЗ рд▓рдХреНрд╖рдг рд░реВрдк рдореЗрдВ рдореМрдЬреВрдж рд╣реИрдВ, рдФрд░ рдкрд╣рд▓реЗ рд╕реЗ рд╣реА : Trait рд╕рд┐рдВрдЯреИрдХреНрд╕ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рддреЗ рд╣реИрдВред

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

type A: Iterator<Item: Foo + Bar>;
type B = (impl Baz, impl Debug, String);

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

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

struct Foo {
    pub foo: impl Display,
}

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

рдпреЗ рджреЛ рдореМрд▓рд┐рдХ рд░реВрдк рд╕реЗ рдЕрд▓рдЧ-рдЕрд▓рдЧ рдСрдкрд░реЗрд╢рди рд╣реИрдВ, рд╣рд╛рдВ рд╡реЗ рджреЛрдиреЛрдВ рд╡рд┐рд╢реЗрд╖рддрд╛ рд╕реАрдорд╛рдУрдВ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рддреЗ рд╣реИрдВ, рд▓реЗрдХрд┐рди рдореБрдЭреЗ рдХреЛрдИ рдХрд╛рд░рдг рдирд╣реАрдВ рджрд┐рдЦрддрд╛ рд╣реИ рдХрд┐ рдЕрд╕реНрддрд┐рддреНрд╡ рдХреЗ рдкреНрд░рдХрд╛рд░ рдХреЛ рдШреЛрд╖рд┐рдд рдХрд░рдиреЗ рдХреЗ рджреЛ рддрд░реАрдХреЗ рдирдП рд▓реЛрдЧреЛрдВ рдХреЗ рд▓рд┐рдП рднреНрд░рдо рдХреЛ рдХрдо рдХрд░реЗрдВрдЧреЗред рдпрджрд┐ type Name: Trait рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдиреЗ рдХрд╛ рдкреНрд░рдпрд╛рд╕ рд╡рд╛рд╕реНрддрд╡ рдореЗрдВ рдирд╡рд╛рдЧрдВрддреБрдХреЛрдВ рдХреЗ рд▓рд┐рдП рдПрдХ рд╕рдВрднрд╛рд╡рд┐рдд рдЪреАрдЬ рд╣реИ рддреЛ рдЗрд╕реЗ рдПрдХ рд▓рд┐рдВрдЯ рдХреЗ рдорд╛рдзреНрдпрдо рд╕реЗ рд╣рд▓ рдХрд┐рдпрд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИ:

    type Foo: Display;
    ^^^^^^^^^^^^^^^^^^
note: were you attempting to create an existential type?
note: suggested replacement `type Foo = impl Display`

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

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

рдореБрдЭреЗ рд▓рдЧрддрд╛ рд╣реИ рдХрд┐ рдореЗрд░реЗ рдкрд╛рд╕ RFC рдкрд░ рдЯрд┐рдкреНрдкрдгреА рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдЕрднреА рддрдХ рд░рд╕реНрдЯ рдХреЗ рд╕рд╛рде рдкрд░реНрдпрд╛рдкреНрдд рдЕрдиреБрднрд╡ рдирд╣реАрдВ рд╣реИред рд╣рд╛рд▓рд╛рдБрдХрд┐, рдореБрдЭреЗ рдЗрд╕ рд╕реБрд╡рд┐рдзрд╛ рдХреЛ рд░рд╛рдд рдФрд░ рд╕реНрдерд┐рд░ рд░рд╕реНрдЯ рдореЗрдВ рд╡рд┐рд▓рдп рд╣реЛрддреЗ рджреЗрдЦрдиреЗ рдореЗрдВ рджрд┐рд▓рдЪрд╕реНрдкреА рд╣реИ, рддрд╛рдХрд┐ рдбреНрд░реЙрдкреНрд╕ рдСрдлрд╝ рдбрд╛рдпрдордВрдб рд╢рд╛рд░реНрдбрд┐рдВрдЧ рдХрд╛рд░реНрдпрд╛рдиреНрд╡рдпрди рдХреЗ рд╣рд┐рд╕реНрд╕реЗ рдХреЗ рд░реВрдк рдореЗрдВ Ethereum рдХреЗ рд▓рд┐рдП рдПрдХ рд╢рд╛рд░реНрдбрд┐рдВрдЧ рдкреНрд░реЛрдЯреЛрдХреЙрд▓ рдмрдирд╛рдиреЗ рдХреЗ рд▓рд┐рдП рд╕рдХреЗ ред рдореИрдВрдиреЗ рдЗрд╕ рдореБрджреНрджреЗ рдХреА рд╕рджрд╕реНрдпрддрд╛ рд▓реА рд╣реИ, рд╣рд╛рд▓рд╛рдВрдХрд┐ рдореЗрд░реЗ рдкрд╛рд╕ рд╕рднреА рдЯрд┐рдкреНрдкрдгрд┐рдпреЛрдВ рдХреЛ рд░рдЦрдиреЗ рдХреЗ рд▓рд┐рдП рд╕рдордп рдирд╣реАрдВ рд╣реИ! рдореИрдВ рдЗрд╕ рдореБрджреНрджреЗ рдкрд░ рдЙрдЪреНрдЪ рд╕реНрддрд░ рдкрд░ рдЕрдк рдЯреВ рдбреЗрдЯ рдХреИрд╕реЗ рд░рд╣ рд╕рдХрддрд╛ рд╣реВрдВ, рдмрд┐рдирд╛ рдкрдарди рдЯрд┐рдкреНрдкрдгрд┐рдпреЛрдВ рдХреЛ рд╕реНрдХрд┐рдо рдХрд┐рдП? рдЗрд╕ рд╕рдордп рдРрд╕рд╛ рд▓рдЧрддрд╛ рд╣реИ рдХрд┐ рдореБрдЭреЗ рдмрд╕ рд╕рдордп-рд╕рдордп рдкрд░ рдЪреЗрдХ рдЗрди рдХрд░рдХреЗ, рдФрд░ рдореБрджреНрджреЗ рдХреА рд╕рджрд╕реНрдпрддрд╛ рди рд▓реЗрдХрд░ рдРрд╕рд╛ рдХрд░рдирд╛ рдкрдбрд╝ рд╕рдХрддрд╛ рд╣реИред рдпрд╣ рдЕрдЪреНрдЫрд╛ рд╣реЛрдЧрд╛ рдпрджрд┐ рдореИрдВ рдЗрд╕ рдкрд░ рдЙрдЪреНрдЪ рд╕реНрддрд░реАрдп рд╕рдорд╛рдЪрд╛рд░ рдкреНрд░рд╛рдкреНрдд рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдИрдореЗрд▓ рджреНрд╡рд╛рд░рд╛ рд╕рджрд╕реНрдпрддрд╛ рд▓реЗ рд╕рдХреВрдВред

рдореИрдВ рдЕрдм рднреА рдорд╛рдирддрд╛ рд╣реВрдВ рдХрд┐ рдПрдХ рдХреАрд╡рд░реНрдб рдХреЗ рддрд╣рдд рд╕рд╛рд░реНрд╡рднреМрдорд┐рдХ рдФрд░ рдЕрд╕реНрддрд┐рддреНрд╡рдЧрдд рдкрд░рд┐рдорд╛рдгреАрдХрд░рдг рдХреЛ рдорд┐рд▓рд╛рдирд╛ рдПрдХ рдЧрд▓рддреА рдереА, рдФрд░ рдЗрд╕рд▓рд┐рдП рдХрд┐ рд╕реНрдерд┐рд░рддрд╛ рддрд░реНрдХ рдореЗрд░реЗ рд▓рд┐рдП рдХрд╛рдо рдирд╣реАрдВ рдХрд░рддрд╛ рд╣реИред

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

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

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


рдЖрдк рдорд╛рдорд▓рд╛ рдмрдирд╛ рд╕рдХрддреЗ рд╣реИрдВ (рд▓реЗрдХрд┐рди рдореИрдВ рдРрд╕рд╛ рдирд╣реАрдВ рдХрд░реВрдВрдЧрд╛):

struct Foo {
    pub foo: impl Display,
}

рд╢рдмреНрджрд╛рд░реНрде рдХреЗ рдмрд░рд╛рдмрд░ рд╣реИ:

struct Foo<T: Display> {
    pub foo: T,
}

рдлрд╝рдВрдХреНрд╢рди-рддрд░реНрдХ рддрд░реНрдХ рдХреЗ рддрд╣рддред

рдореВрд▓ рд░реВрдк рд╕реЗ, impl Trait , рдЖрдкрдХреЛ рдпрд╣ рд╕реЛрдЪрдирд╛ рд╣реЛрдЧрд╛ рдХрд┐ "рдХреНрдпрд╛ рдпрд╣ рд╡рд╛рдкрд╕реА-рдкреНрд░рдХрд╛рд░ рдХреА рддрд░рд╣ рд╣реИ, рдпрд╛ рддрд░реНрдХ рдЬреИрд╕рд╛ рд╣реИ?" , рдЬреЛ рдореБрд╢реНрдХрд┐рд▓ рд╣реЛ рд╕рдХрддрд╛ рд╣реИред


рдпрджрд┐ type Name: Trait рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдиреЗ рдХрд╛ рдкреНрд░рдпрд╛рд╕ рд╡рд╛рд╕реНрддрд╡ рдореЗрдВ рдирд╡рд╛рдЧрдВрддреБрдХреЛрдВ рдХреЗ рд▓рд┐рдП рдПрдХ рд╕рдВрднрд╛рд╡рд┐рдд рдЪреАрдЬ рд╣реИ рддреЛ рдЗрд╕реЗ рдПрдХ рд▓рд┐рдВрдЯ рдХреЗ рдорд╛рдзреНрдпрдо рд╕реЗ рд╣рд▓ рдХрд┐рдпрд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИ:

рдореИрдВ рднреА рдПрдХ рдкреНрд░рдХрд╛рд░ рдХрд╛ рд╡реГрдХреНрд╖ рд╣реЛрдЧрд╛, рд▓реЗрдХрд┐рди рджреВрд╕рд░реА рджрд┐рд╢рд╛ рдореЗрдВ; рдореБрдЭреЗ рд▓рдЧрддрд╛ рд╣реИ рдХрд┐ рдирд┐рдореНрдирд▓рд┐рдЦрд┐рдд рддрд░реАрдХреЗ рдореБрд╣рд╛рд╡рд░реЗрджрд╛рд░ рд╣реЛрдиреЗ рдЪрд╛рд╣рд┐рдП:

// GOOD:
type Foo: Iterator<Item: Display>;

type Bar = (impl Display, impl Debug);

// BAD
type Foo = impl Iterator<Item = impl Display>;

type Bar0: Display;
type Bar1: Debug;
type Bar = (Bar0, Bar1);

рдареАрдХ рд╣реИ, рд╡реИрдХрд▓реНрдкрд┐рдХ рд╕реВрддреНрд░реАрдХрд░рдг рдЬреЛ рдореЗрд░рд╛ рдорд╛рдирдирд╛ тАЛтАЛтАЛтАЛрд╣реИ рдХрд┐ RFC 2071 рдЗрд╢рд╛рд░рд╛ рдХрд░ рд░рд╣рд╛ рд╣реИ рдФрд░ рдЗрд╕ рдореБрджреНрджреЗ рдкрд░ рдЪрд░реНрдЪрд╛ рдХреА рдЬрд╛ рд╕рдХрддреА рд╣реИ, рд▓реЗрдХрд┐рди рдХрднреА рднреА рд╕реНрдкрд╖реНрдЯ рд░реВрдк рд╕реЗ рдирд╣реАрдВ рдХрд╣рд╛ рдЧрдпрд╛ рдерд╛:

рдЕрд╕реНрддрд┐рддреНрд╡рдЧрдд рд░реВрдк рд╕реЗ рдкрд░рд┐рдорд╛рдгрд┐рдд рдкреНрд░рдХрд╛рд░реЛрдВ рдХреЛ рдШреЛрд╖рд┐рдд рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдХреЗрд╡рд▓ _one way_ рд╣реИ: existential type Name: Bound; ( existential рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдХреЗ рдХреНрдпреЛрдВрдХрд┐ рдпрд╣ RFC рдореЗрдВ рдирд┐рд░реНрджрд┐рд╖реНрдЯ рд╣реИ, рдореИрдВ рдкреВрд░реА рддрд░рд╣ рд╕реЗ рдЗрд╕ рдлреЙрд░реНрдореВрд▓реЗрд╢рди рдХреЗ рддрд╣рдд рдХреАрд╡рд░реНрдб рдХреЛ рдЫреЛрдбрд╝рдиреЗ рдХреЗ рдЦрд┐рд▓рд╛рдл рдирд╣реАрдВ рд╣реВрдВ)ред

рд╡рд░реНрддрдорд╛рди рджрд╛рдпрд░реЗ рдореЗрдВ рдПрдХ рдЕрдЬреНрдЮрд╛рдд рдЕрд╕реНрддрд┐рддреНрд╡рдЧрдд рд░реВрдк рд╕реЗ рдорд╛рддреНрд░рд╛рдмрджреНрдз рдкреНрд░рдХрд╛рд░ рдХреЛ рд╕реНрдкрд╖реНрдЯ рд░реВрдк рд╕реЗ рдШреЛрд╖рд┐рдд рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдЕрддрд┐рд░рд┐рдХреНрдд рдЪреАрдиреА рд╣реИ: impl Bound (рд╕рдордп рдХреЗ рд▓рд┐рдП рдлрд╝рдВрдХреНрд╢рди рддрд░реНрдХреЛрдВ рдореЗрдВ рд╕рд╛рд░реНрд╡рднреМрдорд┐рдХ рдорд╛рддреНрд░рд╛ рдХрд╛ рдард╣рд░рд╛рд╡ рдЪреАрдиреА рдХреЛ рдЕрдирджреЗрдЦрд╛ рдХрд░рдирд╛)ред

рддреЛ, рд╡рд░реНрддрдорд╛рди рд░рд┐рдЯрд░реНрди рдкреНрд░рдХрд╛рд░ рдХрд╛ рдЙрдкрдпреЛрдЧ рдПрдХ рд╕рд╛рдзрд╛рд░рдг desugaring рд╣реИ:

fn foo() -> impl Iterator<Item = impl Display> { ... }
existential type _0: Display;
existential type _1: Iterator<Item = _0>;
fn foo() -> _1 { ... }

const , static рдФрд░ let рдХрд░рдирд╛ рд╕рдорд╛рди рд░реВрдк рд╕реЗ рддреБрдЪреНрдЫ рд╣реИред

RFC рдореЗрдВ рдПрдХ рд╡рд┐рд╕реНрддрд╛рд░ рдХрд╛ рдЙрд▓реНрд▓реЗрдЦ рдирд╣реАрдВ рдХрд┐рдпрд╛ рдЧрдпрд╛ рд╣реИ: type Alias = Concrete; рд╕рд┐рдВрдЯреИрдХреНрд╕ рдореЗрдВ рдЗрд╕ рдЪреАрдиреА рдХрд╛ рд╕рдорд░реНрдерди рдХрд░рдирд╛, рдЗрд╕рд▓рд┐рдП рдЬрдм рдЖрдк рд▓рд┐рдЦрддреЗ рд╣реИрдВ

type Foo = impl Iterator<Item = impl Display>;

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

existential type _0: Display;
existential type _1: Iterator<Item = _0>;
type Foo = _1;

рдЬреЛ рддрдм рдореМрдЬреВрджрд╛ рдореЙрдбреНрдпреВрд▓ рдХреЛ Foo рдорд╛рдзреНрдпрдо рд╕реЗ рджреЗрдЦрдиреЗ рдХреА рдЕрдиреБрдорддрд┐ рджреЗрдиреЗ рдХреЗ рд▓рд┐рдП рдкреНрд░рдХрд╛рд░ рдХреЗ рдЙрдкрдирд╛рдореЛрдВ рдХреА рдкрд╛рд░рджрд░реНрд╢реА рдкреНрд░рдХреГрддрд┐ рдкрд░ рдирд┐рд░реНрднрд░ рдХрд░рддрд╛ рд╣реИ рдФрд░ рджреЗрдЦрддрд╛ рд╣реИ рдХрд┐ рдпрд╣ рдПрдХ рдЕрд╕реНрддрд┐рддреНрд╡ рдХреЗ рдкреНрд░рдХрд╛рд░ рдХреЛ рд╕рдВрджрд░реНрднрд┐рдд рдХрд░рддрд╛ рд╣реИред

рд╡рд╛рд╕реНрддрд╡ рдореЗрдВ, рдореЗрд░рд╛ рджреГрдврд╝ рд╡рд┐рд╢реНрд╡рд╛рд╕ рд╣реИ рдХрд┐ рдЬрд╣рд╛рдВ рд╕рдВрднрд╡ рд╣реЛ, рд╣рдорд╛рд░реЗ рдкрд╛рд╕ рдмрд╛рдж рдХреЗ рд░реВрдк рдХреЗ рдкрдХреНрд╖ рдореЗрдВ рдПрдХ рдХрдВрдкрд╛рдЗрд▓рд░ рд▓рд┐рдВрдЯ рд╣реЛрдирд╛ рдЪрд╛рд╣рд┐рдПред

рдореИрдВ рдЬреНрдпрд╛рджрд╛рддрд░ @alexreg рдХреА рдЯрд┐рдкреНрдкрдгреА рдХреЗ рд╕рд╛рде рдЬреБрдбрд╝рд╛ рд╣реБрдЖ arg: impl Trait рдУрд░ рдЭреБрдХрд╛рд╡ рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рдХреБрдЫ рдЪрд┐рдВрддрд╛рдПрдВ рд╣реИрдВ, рдореБрдЦреНрдп рд░реВрдк рд╕реЗ рдкреБрд╕реНрддрдХрд╛рд▓рдпреЛрдВ рдореЗрдВ рд╕реЗрд╡рд░ рдмреНрд░реЗрдХрд┐рдВрдЧ рдкрд░рд┐рд╡рд░реНрддрдиреЛрдВ рдХреЛ рдкреНрд░реЛрддреНрд╕рд╛рд╣рд┐рдд рдХрд░рдиреЗ рдХреЗ рдЬреЛрдЦрд┐рдо рдХреЗ рдХрд╛рд░рдг impl Trait рдХрд╛рдо рдирд╣реАрдВ рдХрд░рддрд╛ рд╣реИ рдЯрд░реНрдмреЛрдлрд┐рд╢ рдХреЗ рд╕рд╛рде (рдЕрднреА, рдФрд░ рдЗрд╕реЗ рдЕрдЪреНрдЫреА рддрд░рд╣ рд╕реЗ рдХрд╛рдо рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдЖрдкрдХреЛ рдЖрдВрд╢рд┐рдХ рдЯрд░реНрдмреЛрдлрд┐рд╢ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реЛрдЧреА)ред рдЗрд╕рд▓рд┐рдП, рдЯрд╛рдЗрдк рдПрд▓рд┐рдпрд╛рд╕ (рдЬрд╣рд╛рдВ рдХреЛрдИ рд╕рдорд╕реНрдпрд╛ рдкреИрджрд╛ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдХреЛрдИ рдЯрд░реНрдмреЛрдлрд┐рд╢ рдирд╣реАрдВ рд╣реИ) рдХреЗ рдорд╛рдорд▓реЗ рдореЗрдВ рдХреНрд▓рд┐рдкреА рдореЗрдВ рд▓рд╛рдЗрдирд┐рдВрдЧ рдХрдо рд╕реАрдзреА рд▓рдЧрддреА рд╣реИред

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

@Centril рдЕрднреА рдЗрд╕реЗ рдореЗрд░реЗ рд╕рд╛рде IRC рдкрд░ рд▓рд╛рдпрд╛ рд╣реИ, рдФрд░ рдореИрдВ рдорд╛рдирддрд╛ рд╣реВрдВ рдХрд┐ рдпрд╣ рдкреАрдЫреЗ рдХреА рдЕрдиреБрдХреВрд▓рддрд╛ (рддреЛрдбрд╝рдиреЗ рдореЗрдВ рдмрд╣реБрдд рдЖрд╕рд╛рди) рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рдПрдХ рдЙрдЪрд┐рдд рдмрд┐рдВрджреБ рд╣реИред рдЬрдм/рдЕрдЧрд░ рдЖрдВрд╢рд┐рдХ рдЯрд░реНрдмреЛрдлрд┐рд╢ рднреВрдорд┐, рдореБрдЭреЗ рд▓рдЧрддрд╛ рд╣реИ рдХрд┐ рдПрдХ рдХрдВрдкрд╛рдЗрд▓рд░ рд▓рд┐рдВрдЯ рдЬреЛрдбрд╝рд╛ рдЬрд╛рдирд╛ рдЪрд╛рд╣рд┐рдП, рд▓реЗрдХрд┐рди рддрдм рддрдХ рдирд╣реАрдВред

рддреЛ... рдЕрдм рд╣рдо рдирд╛рдорд┐рдд рдЕрд╕реНрддрд┐рддреНрд╡ рдХреЗ рдкреНрд░рдХрд╛рд░реЛрдВ рдХреЗ рд▓рд┐рдП рд╡рд╛рдХреНрдп рд░рдЪрдирд╛ рдкрд░ рдХрд╛рдлреА рдЪрд░реНрдЪрд╛ рдХрд░ рдЪреБрдХреЗ рд╣реИрдВред рдХреНрдпрд╛ рд╣рдо рдХрд┐рд╕реА рдирд┐рд╖реНрдХрд░реНрд╖ рдкрд░ рдкрд╣реБрдВрдЪрдиреЗ рдХреА рдХреЛрд╢рд┐рд╢ рдХрд░реЗрдВрдЧреЗ рдФрд░ рдЗрд╕реЗ рдЖрд░рдПрдлрд╕реА/рдкреАрдЖрд░ рдкреЛрд╕реНрдЯ рдореЗрдВ рд▓рд┐рдЦреЗрдВрдЧреЗ, рддрд╛рдХрд┐ рдХреЛрдИ рд╡рд╛рд╕реНрддрд╡рд┐рдХ рдХрд╛рд░реНрдпрд╛рдиреНрд╡рдпрди рдкрд░ рдХрд╛рдо рд╢реБрд░реВ рдХрд░ рд╕рдХреЗ? :-)

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

@rpjohnst рд╡реИрд╕реЗ рдЖрдк рдирд┐рд╢реНрдЪрд┐рдд рд░реВрдк рд╕реЗ рдирд╛рдорд┐рдд рдЕрд╕реНрддрд┐рддреНрд╡ рдХреЗ рд╕рдВрдмрдВрдз рдореЗрдВ рдореБрдЭрд╕реЗ рдФрд░ @Centril рд╕реЗ рд╕рд╣рдордд рд╣реИрдВ ... рдЬреИрд╕реЗ рдХрд┐ рдлрд╝рдВрдХреНрд╢рди рддрд░реНрдХреЛрдВ рдореЗрдВ рдЙрдирд╕реЗ рджреВрд░ рд░рд╣рдиреЗ рдХреЗ рд▓рд┐рдП, рдпрд╣ рдПрдХ рд╕рдВрднрд╛рд╡рдирд╛ рд╣реИ, рд▓реЗрдХрд┐рди рд╢рд╛рдпрдж рдХрд┐рд╕реА рдЕрдиреНрдп рд╕реНрдерд╛рди рдХреЗ рд▓рд┐рдП рдПрдХ рдЪрд░реНрдЪрд╛ рд╣реИред рдпрд╣ рдирд┐рд░реНрднрд░ рдХрд░рддрд╛ рд╣реИ рдХрд┐ рдХреЛрдИ рдЗрд╕ рд╕рдВрджрд░реНрдн рдореЗрдВ рд╕рд░рд▓рддрд╛ рдпрд╛ рд╡реНрдпрд╛рдкрдХрддрд╛ рдХрд╛ рдкрдХреНрд╖ рд▓реЗрдирд╛ рдЪрд╛рд╣рддрд╛ рд╣реИ рдпрд╛ рдирд╣реАрдВред

рдХреНрдпрд╛ RFC impl Trait рдкрд░ рддрд░реНрдХ рд╕реНрдерд┐рддрд┐ рдореЗрдВ рдЕрджреНрдпрддрд┐рдд рд╣реИ? рдпрджрд┐ рд╣рд╛рдВ, рддреЛ рдХреНрдпрд╛ рдпрд╣ рдмрддрд╛рдирд╛ рд╕реБрд░рдХреНрд╖рд┐рдд рд╣реИ рдХрд┐ рдЗрд╕рдХреЗ рд╢рдмреНрджрд╛рд░реНрде _universal_ рд╣реИрдВ? рдЕрдЧрд░ рдРрд╕рд╛ рд╣реИ: рдореИрдВ рд░реЛрдирд╛ рдЪрд╛рд╣рддрд╛ рд╣реВрдБред рдЧрд╣рд░рд╛рдИ рд╕реЗред

@рдлрд╝рд╛рдЬрд╝реЛрди : рдЬрдВрдЧ 1.26 impl Trait рд▓рд┐рдП рдЬрд╛рд░реА рдиреЛрдЯ :

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

рдмрд╕ рдЗрд╕рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рдЕрдкрдиреЗ рд╡рд┐рдЪрд╛рд░ рд╡реНрдпрдХреНрдд рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП:

  • рд╣рдорд╛рд░реЗ рдкрд╛рд╕ рдкрд╣рд▓реЗ рд╕реЗ рд╣реА рдкреНрд░рдХрд╛рд░ рдЪрд░ рдХреЗ рд▓рд┐рдП рдПрдХ рд╡рд╛рдХреНрдпрд╡рд┐рдиреНрдпрд╛рд╕ рдерд╛ рдФрд░ рд╡рд╛рд╕реНрддрд╡ рдореЗрдВ, рдХрд┐рд╕реА рднреА рдкреНрд░рдХрд╛рд░ рдХреЗ рдЪрд░ рдХреЗ рд▓рд┐рдП рд╡рд╛рд╕реНрддрд╡ рдореЗрдВ рдХреБрдЫ рдЙрдкрдпреЛрдЧ рд╣реЛрддреЗ рд╣реИрдВ (рдпрд╛рдиреА рдпрд╣ рдЕрдХреНрд╕рд░ рд╣реЛрддрд╛ рд╣реИ рдХрд┐ рдЖрдк рдЗрд╕реЗ рдПрдХ рд╣реА рд╕реНрдерд╛рди рдкрд░ рдЫреЛрдбрд╝рдиреЗ рдХреЗ рдмрдЬрд╛рдп рдХрдИ рд╕реНрдерд╛рдиреЛрдВ рдкрд░ рдкреНрд░рдХрд╛рд░ рдЪрд░ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдирд╛ рдЪрд╛рд╣рддреЗ рд╣реИрдВ)ред
  • Covariant existentials рд╣рдореЗрдВ рдХреБрдЫ рд╣реИ рдХрд┐ рдПрдХ рд╡рд┐рд╢реЗрд╖рддрд╛ рдХреЗ рдмрд┐рдирд╛ рдЕрднреА рдРрд╕рд╛ рдХрд░рдирд╛ рдореБрд╢реНрдХрд┐рд▓ рд╣реИ (рджреЗрдЦрдиреЗ рдХреЗ рд▓рд┐рдП рд░реИрдВрдХ-рдПрди рдХрд╛рд░реНрдпреЛрдВ рджрд░рд╡рд╛рдЬреЗ рдЦреЛрд▓, рд╣реЛрддрд╛ рдпрд╣ рд╣реИ) рдФрд░ рдПрдХ рд╡рд┐рд╢реЗрд╖рддрд╛ рдпрд╣ рд╣реИ рдХрд┐ рд╡рд╛рд╕реНрддрд╡ рдореЗрдВ рдЬрдВрдЧ рдХреЗ рд▓рд┐рдП рдпрд╛рдж рдЖ рд░рд╣реА рд╣реИ рд╣реИред
  • impl Trait рдХреЛ "рдХреИрд▓реА рджреНрд╡рд╛рд░рд╛ рдЪреБрдиреЗ рдЧрдП рдкреНрд░рдХрд╛рд░" рдХреЗ рд░реВрдк рдореЗрдВ рд╕рдВрджрд░реНрднрд┐рдд рдХрд░рдирд╛ рдЖрд╕рд╛рди рд╣реИ, рдХреНрдпреЛрдВрдХрд┐ ... рдХреНрдпреЛрдВрдХрд┐ рдЕрднреА рдХреЗ рд▓рд┐рдП рдпрд╣ рдПрдХрдорд╛рддреНрд░ рднрд╛рд╖рд╛ рдирд┐рд░реНрдорд╛рдг рд╣реИ рдЬреЛ рд╣рдореЗрдВ рдРрд╕рд╛ рдХрд░рдиреЗ рдореЗрдВ рд╕рдХреНрд╖рдо рдмрдирд╛рддрд╛ рд╣реИ! рдХреЙрд▓рд░ рджреНрд╡рд╛рд░рд╛ рдкреНрд░рдХрд╛рд░ рдЪреБрдирдирд╛ рдкрд╣рд▓реЗ рд╕реЗ рд╣реА рдХрдИ рдирд┐рд░реНрдорд╛рдгреЛрдВ рдХреЗ рдорд╛рдзреНрдпрдо рд╕реЗ рдЙрдкрд▓рдмреНрдз рд╣реИред

рдореБрдЭреЗ рд╕рдЪ рдореЗрдВ рд▓рдЧрддрд╛ рд╣реИ рдХрд┐ impl Trait рддрд░реНрдХ рдХреА рд╕реНрдерд┐рддрд┐ рдореЗрдВ рд╡рд░реНрддрдорд╛рди рдирд┐рд░реНрдгрдп рдПрдХ рджрдпрд╛ рд╣реИред :рд░реЛрдирд╛:

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

рдЬрдмрдХрд┐ рдореИрдВ рдЗрд╕ рдкрд░ рдереЛрдбрд╝рд╛ рдлрдЯрд╛ рд╣реБрдЖ рд╣реВрдВ, рдореБрдЭреЗ рдирд┐рд╢реНрдЪрд┐рдд рд░реВрдк рд╕реЗ рд▓рдЧрддрд╛ рд╣реИ рдХрд┐ рдЕрднреА let x: impl Trait рдХреЛ рд▓рд╛рдЧреВ рдХрд░рдиреЗ рдореЗрдВ рд╕рдордп рдмреЗрд╣рддрд░ рд╣реЛрдЧрд╛!

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

рд╣рдорд╛рд░реЗ рдкрд╛рд╕ рдЗрд╕рдХреЗ рд▓рд┐рдП рдкрд╣рд▓реЗ рд╕реЗ рд╣реА рдПрдХ рд╕рд┐рдВрдЯреИрдХреНрд╕ рд╣реИ ( fn foo(f: impl for<T: Trait> Fn(T)) ), (рдЙрд░реНрдл "рдЯрд╛рдЗрдк рдПрдЪрдЖрд░рдЯреАрдмреА"), рд▓реЗрдХрд┐рди рдЗрд╕реЗ рдЕрднреА рддрдХ рд▓рд╛рдЧреВ рдирд╣реАрдВ рдХрд┐рдпрд╛ рдЧрдпрд╛ рд╣реИред fn foo(f: impl Fn(impl Trait)) рдПрдХ рддреНрд░реБрдЯрд┐ рдЙрддреНрдкрдиреНрди рдХрд░рддрд╛ рд╣реИ рдХрд┐ "рдиреЗрд╕реНрдЯреЗрдб impl Trait рдХреА рдЕрдиреБрдорддрд┐ рдирд╣реАрдВ рд╣реИ", рдФрд░ рдореБрдЭреЗ рдЙрдореНрдореАрдж рд╣реИ рдХрд┐ рд╣рдо рдЪрд╛рд╣рддреЗ рд╣реИрдВ рдХрд┐ рдЗрд╕рдХрд╛ рдорддрд▓рдм рдЙрдЪреНрдЪ-рд░реИрдВрдХ рд╕рдВрд╕реНрдХрд░рдг рд╣реЛ, рдЬрдм рд╣рдореЗрдВ рдЯрд╛рдЗрдк HRTB рдорд┐рд▓рддрд╛ рд╣реИред

рдпрд╣ рдЙрд╕реА рддрд░рд╣ рд╣реИ рдЬреИрд╕реЗ Fn(&'_ T) рдЕрд░реНрде рд╣реИ for<'a> Fn(&'a T) , рдЗрд╕рд▓рд┐рдП рдореБрдЭреЗ рдЗрд╕рдХреЗ рд╡рд┐рд╡рд╛рджрд╛рд╕реНрдкрдж рд╣реЛрдиреЗ рдХреА рдЙрдореНрдореАрдж рдирд╣реАрдВ рд╣реИред

рд╡рд░реНрддрдорд╛рди рдорд╕реМрджреЗ рдХреЛ рджреЗрдЦрддреЗ рд╣реБрдП, рддрд░реНрдХ рд╕реНрдерд┐рддрд┐ рдореЗрдВ impl Trait рдПрдХ _universal_ рд╣реИ, рд▓реЗрдХрд┐рди рдЖрдк рдХрд╣ рд░рд╣реЗ рд╣реИрдВ рдХрд┐ impl for<_> Trait рдЗрд╕реЗ _existential_ рдореЗрдВ рдмрджрд▓ рджреЗрддрд╛ рд╣реИ?! рд╡рд╣ рдХрд┐рддрдирд╛ рдкрд╛рдЧрд▓ рд╣реИ?

рд╣рдордиреЗ рдХреНрдпреЛрдВ рд╕реЛрдЪрд╛ рдХрд┐ рд╣рдореЗрдВ _рд╕рд╛рд░реНрд╡рднреМрдорд┐рдХ_ рдмрдирд╛рдиреЗ рдХреЗ рд▓рд┐рдП _рдЕрднреА рддрдХ рдПрдХ рдФрд░ рддрд░реАрдХрд╛_ рдкреЗрд╢ рдХрд░рдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реИ? рдореЗрд░рд╛ рдорддрд▓рдм рд╣реИ:

fn foo(x: impl MyTrait)

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

fn foo(x: impl Trait) -> impl Trait

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

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

(рд╕реБрд╡рд┐рдзрд╛ рдХреЗ рд╕реНрдерд┐рд░ рд╣реЛрдиреЗ рдХреЗ рдмрд╛рдж рд╢рд╛рдпрдж рдЗрд╕ рдкрд░ рдмрд╣рд╕ рдХрд░рдиреЗ рдХрд╛ рдХреЛрдИ рдорддрд▓рдм рдирд╣реАрдВ рд╣реИ, рд▓реЗрдХрд┐рди рдПрдХ рдареЛрд╕ рддрд░реНрдХ рдХреЗ рд▓рд┐рдП рдпрд╣рд╛рдВ рджреЗрдЦреЗрдВ (рдЬрд┐рд╕рд╕реЗ рдореИрдВ рд╕рд╣рдордд рд╣реВрдВ) рдХреНрдпреЛрдВ impl Trait рддрд░реНрдХ рдХреА рд╕реНрдерд┐рддрд┐ рдореЗрдВ рд╢рдмреНрджрд╛рд░реНрде рд╣реЛрдиреЗ рдХреЗ рдХрд╛рд░рдг рдпрд╣ рд╕рдордЭрджрд╛рд░ рд╣реИ рдФрд░ рд╕реБрд╕рдВрдЧрддред рдЯреАрдПрд▓; рдбреЙ рдпрд╣ рдЙрд╕реА рдХрд╛рд░рдг рд╕реЗ рд╣реИ рдХрд┐ рдХреНрдпреЛрдВ fn foo(arg: Box<Trait>) рд▓рдЧрднрдЧ fn foo<T: Trait>(arg: Box<T>) рдХреЗ рд╕рдорд╛рди рд╣реА рдХрд╛рдо рдХрд░рддрд╛ рд╣реИ, рднрд▓реЗ рд╣реА dyn Trait рдПрдХ рдЕрд╕реНрддрд┐рддреНрд╡рдЧрдд рд╣реИ; рдЕрдм dyn рдкреНрд░рддрд┐рд╕реНрдерд╛рдкрд┐рдд рдХрд░реЗрдВ impl ред)

рд╡рд░реНрддрдорд╛рди рдорд╕реМрджреЗ рдХреЛ рджреЗрдЦрддреЗ рд╣реБрдП, рддрд░реНрдХ рд╕реНрдерд┐рддрд┐ рдореЗрдВ impl Trait рдПрдХ рд╕рд╛рд░реНрд╡рднреМрдорд┐рдХ рд╣реИ, рд▓реЗрдХрд┐рди рдЖрдк рдХрд╣ рд░рд╣реЗ рд╣реИрдВ рдХрд┐ impl for<_> Trait рдЗрд╕реЗ рдЕрд╕реНрддрд┐рддреНрд╡ рдореЗрдВ рдмрджрд▓ рджреЗрддрд╛ рд╣реИ ?!

рдирд╣реАрдВ, рд╡реЗ рджреЛрдиреЛрдВ рд╕рд╛рд░реНрд╡рднреМрдорд┐рдХ рд╣реИрдВред рдореИрдВ рдХрд╣ рд░рд╣рд╛ рд╣реВрдВ рдХрд┐ рдЙрдЪреНрдЪ-рд░реИрдВрдХ рд╡рд╛рд▓реЗ рдЙрдкрдпреЛрдЧ рдЗрд╕ рддрд░рд╣ рджрд┐рдЦрд╛рдИ рджреЗрдВрдЧреЗ:

fn foo<F: for<G: Fn(X) -> Y> Fn(G) -> Z>(f: F) {...}

рдЬреЛ рдПрдХ рд╣реА рд╕рдордп рдореЗрдВ рдЬреЛрдбрд╝рд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИ (рдпрд╛рдиреА impl Trait рдХреЛрдИ рдмрджрд▓рд╛рд╡ рдирд╣реАрдВ) рдХреЗ рд░реВрдк рдореЗрдВ рд▓рд┐рдЦрд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИ:

fn foo(f: impl for<G: Fn(X) -> Y> Fn(G) -> Z) {...}

рдпрд╣ рд╕рд╛рд░реНрд╡рднреМрдорд┐рдХ рд╣реИ impl Trait , рдмрд╕ рдпрд╣ рдХрд┐ Trait рдПрдХ HRTB рд╣реИ ( impl for<'a> Fn(&'a T) )ред
рдЕрдЧрд░ рд╣рдо рддрдп рдХрд░рддреЗ рд╣реИрдВ (рдЬрд┐рд╕рдХреА рдореБрдЭреЗ рдЙрдореНрдореАрдж рд╣реИ) рдХрд┐ impl Trait рдЕрдВрджрд░ Fn(...) рддрд░реНрдХ рднреА рд╕рд╛рд░реНрд╡рднреМрдорд┐рдХ рд╣реИрдВ, рддреЛ рдЖрдк рдЗрд╕реЗ рдЙрд╕реА рдкреНрд░рднрд╛рд╡ рдХреЛ рдкреНрд░рд╛рдкреНрдд рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рд▓рд┐рдЦ рд╕рдХрддреЗ рд╣реИрдВ:

fn foo(f: impl Fn(impl Fn(X) -> Y) -> Z) {...}

рдореИрдВрдиреЗ рд╕реЛрдЪрд╛ рдХрд┐ рдЖрдкрдХрд╛ рдорддрд▓рдм "рдЙрдЪреНрдЪ-рд░реИрдВрдХрд┐рдВрдЧ" рд╕реЗ рд╣реИ, рдЕрдЧрд░ рдЖрдкрдиреЗ рдирд╣реАрдВ рдХрд┐рдпрд╛, рддреЛ рдХреГрдкрдпрд╛ рдореБрдЭреЗ рдмрддрд╛рдПрдВред

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

fn foo() -> impl for<G: Fn(X) -> Y> Fn(G) -> Z {...}

рдЗрд╕ рддрд░рд╣ рд▓рд┐рдЦрд╛ рдЬрд╛рдирд╛ рд╣реИ:

fn foo() -> impl Fn(impl Fn(X) -> Y) -> Z {...}

рдпрд╣ рдПрдХ рдЕрд╕реНрддрд┐рддреНрд╡рдЧрдд impl Trait рдЬрд┐рд╕рдореЗрдВ рдПрдХ рд╕рд╛рд░реНрд╡рднреМрдорд┐рдХ impl Trait (рд╕рдВрд▓рдЧреНрди рдХрд╛рд░реНрдп рдХреЗ рдмрдЬрд╛рдп рдЕрд╕реНрддрд┐рддреНрд╡ рдХреЗ рд▓рд┐рдП рдмрд╛рдзреНрдп) рд╣реЛрдЧрд╛ред

@eddyb рдХреНрдпрд╛ рд╕рд╛рдорд╛рдиреНрдп рд░реВрдк рд╕реЗ рдЕрд╕реНрддрд┐рддреНрд╡рдЧрдд рдФрд░ рд╕рд╛рд░реНрд╡рднреМрдорд┐рдХ рд╢реМрдХ рдХреЛ рднреНрд░рдорд┐рдд рди рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП?
рдЕрд╕реНрддрд┐рддреНрд╡рдЧрдд рдкрд░рд┐рдорд╛рдгреАрдХрд░рдг рдХреЗ рд▓рд┐рдП рдЦреЛрдЬрд╢рдмреНрдж рднреА рдЕрд╕реНрддрд┐рддреНрд╡рдЧрдд рдкреНрд░рдХрд╛рд░реЛрдВ рдХреЗ рд▓рд┐рдП рдкреБрди: рдЙрдкрдпреЛрдЧ рдпреЛрдЧреНрдп рдирд╣реАрдВ рд╣реЛрдЧрд╛?
рд╣рдо рдЕрд╕реНрддрд┐рддреНрд╡рдЧрдд ( рдФрд░ рд╕рд╛рд░реНрд╡рднреМрдорд┐рдХ) рдкрд░рд┐рдорд╛рдгреАрдХрд░рдг рдХреЗ рд▓рд┐рдП impl рдХрд╛ рдЙрдкрдпреЛрдЧ рдХреНрдпреЛрдВ рдХрд░ рд░рд╣реЗ рд╣реИрдВ рд▓реЗрдХрд┐рди рдЕрд╕реНрддрд┐рддреНрд╡ рдХреЗ рдкреНрд░рдХрд╛рд░реЛрдВ рдХреЗ рд▓рд┐рдП existential рд░рд╣реЗ рд╣реИрдВ?

рдореИрдВ рддреАрди рдмрд┐рдВрджреБ рдмрдирд╛рдирд╛ рдЪрд╛рд╣реВрдВрдЧрд╛:

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

рдпрд╣ рд╡рд╛рд╕реНрддрд╡ рдореЗрдВ рджреБрдЦрдж рд╣реИ рдХрд┐ рдпрд╣ рдкреНрд░рддрд┐рдХреНрд░рд┐рдпрд╛ рд╕реНрдерд┐рд░реАрдХрд░рдг рдХреЗ рдмрд╛рдж рдЖрддреА рд╣реИ рдФрд░ рдЗрд╕ рдШрдЯрдирд╛ рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рдХреБрдЫ рдХрд┐рдпрд╛ рдЬрд╛рдирд╛ рдЪрд╛рд╣рд┐рдП

рдЬрдм рддрдХ рдпрд╣ рдПрдХ рд╡рд┐рдЪрд╛рд░ рд░рд╣рд╛ рд╣реИ, рддрдм рддрдХ рддрд░реНрдХ рдХреА рд╕реНрдерд┐рддрд┐ рдореЗрдВ impl Trait рдЖрдкрддреНрддрд┐рдпрд╛рдВ рд░рд╣реА рд╣реИрдВред рдЗрд╕ рддрд░рд╣ рдХреА рдкреНрд░рддрд┐рдХреНрд░рд┐рдпрд╛ _рдирдИ рдирд╣реАрдВ рд╣реИ_, рдкреНрд░рд╛рд╕рдВрдЧрд┐рдХ RFC рдереНрд░реЗрдб рдореЗрдВ рднреА рдЗрд╕ рдкрд░ рдЕрддреНрдпрдзрд┐рдХ рдмрд╣рд╕ рд╣реБрдИ рдереАред рдЯрд╛рдЗрдк-рдереНрдпреЛрд░реА рдХреЗ рдирдЬрд░рд┐рдП рд╕реЗ рди рдХреЗрд╡рд▓ рд╕рд╛рд░реНрд╡рднреМрдорд┐рдХ/рдЕрд╕реНрддрд┐рддреНрд╡рд╡рд╛рджреА рдкреНрд░рдХрд╛рд░реЛрдВ рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рдмрд╣реБрдд рдЪрд░реНрдЪрд╛ рд╣реБрдИ, рдмрд▓реНрдХрд┐ рдпрд╣ рднреА рдХрд┐ рдирдП рдЙрдкрдпреЛрдЧрдХрд░реНрддрд╛рдУрдВ рдХреЗ рд▓рд┐рдП рдпрд╣ рдХреИрд╕реЗ рднреНрд░рдорд┐рдд рд╣реЛрдЧрд╛ред

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

@Boscop any рдФрд░ some рдХреЛ рдЗрд╕ рдХрд╛рдо рдХреЛ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдХреАрд╡рд░реНрдб рдХреА рдПрдХ рдЬреЛрдбрд╝реА рдХреЗ рд░реВрдк рдореЗрдВ рдкреНрд░рд╕реНрддрд╛рд╡рд┐рдд рдХрд┐рдпрд╛ рдЧрдпрд╛ рдерд╛, рд▓реЗрдХрд┐рди рдЗрд╕рдХреЗ рдЦрд┐рд▓рд╛рдл рдлреИрд╕рд▓рд╛ рдХрд┐рдпрд╛ рдЧрдпрд╛ рдерд╛ (рд╣рд╛рд▓рд╛рдВрдХрд┐ рдореБрдЭреЗ рдирд╣реАрдВ рдкрддрд╛ рдХрд┐ рддрд░реНрдХ рдХрд╣реАрдВ рднреА рд▓рд┐рдЦрд╛ рдЧрдпрд╛ рдерд╛)ред

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

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

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

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

рд╣рд╛рдВ? рдореЗрд░рд╛ рдорддрд▓рдм рд╣реИ рдХрд┐ рдореИрдВ рдЗрд╕ рдмрд╛рдд рдкрд░ рдмрд╣рд╕ рдирд╣реАрдВ рдХрд░ рд░рд╣рд╛ рд╣реВрдВ рдХрд┐ рдЬреЛ рд╣реБрдЖ рд╡рд╣ рдПрдХ рдЕрдЪреНрдЫрд╛ рд╡рд┐рдЪрд╛рд░ рдерд╛ рдпрд╛ рдмреБрд░рд╛ред рдореЗрд░рд╛ рдорддрд▓рдм рд╕рд┐рд░реНрдл рдпрд╣ рдмрддрд╛рдирд╛ рд╣реИ рдХрд┐ RFC рдереНрд░реЗрдб рдХреЛ рдЗрд╕ рдкрд░ рдкреНрд░рддрд┐рдХреНрд░рд┐рдпрд╛ рдорд┐рд▓реА, рдФрд░ рдпрд╣ рд╡реИрд╕реЗ рднреА рддрдп рдХрд┐рдпрд╛ рдЧрдпрд╛ рдерд╛ред

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

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

рдЬрд╝реНрдпрд╛рджрд╛ рдмреБрд░рд╛? рдРрд╕рд╛ рдХреИрд╕реЗ? рдореИрдВ рдЕрд╕реНрдкрд╖реНрдЯрддрд╛/рднреНрд░рдо рд╕реЗ рдЕрдзрд┐рдХ рдпрд╛рдж рд░рдЦрдирд╛ рдкрд╕рдВрдж рдХрд░рддрд╛ рд╣реВрдВред

рд╣рд╛рдВ? рдореЗрд░рд╛ рдорддрд▓рдм рд╣реИ рдХрд┐ рдореИрдВ рдЗрд╕ рдмрд╛рдд рдкрд░ рдмрд╣рд╕ рдирд╣реАрдВ рдХрд░ рд░рд╣рд╛ рд╣реВрдВ рдХрд┐ рдЬреЛ рд╣реБрдЖ рд╡рд╣ рдПрдХ рдЕрдЪреНрдЫрд╛ рд╡рд┐рдЪрд╛рд░ рдерд╛ рдпрд╛ рдмреБрд░рд╛ред рдореЗрд░рд╛ рдорддрд▓рдм рд╕рд┐рд░реНрдл рдпрд╣ рдмрддрд╛рдирд╛ рд╣реИ рдХрд┐ RFC рдереНрд░реЗрдб рдХреЛ рдЗрд╕ рдкрд░ рдкреНрд░рддрд┐рдХреНрд░рд┐рдпрд╛ рдорд┐рд▓реА, рдФрд░ рдпрд╣ рд╡реИрд╕реЗ рднреА рддрдп рдХрд┐рдпрд╛ рдЧрдпрд╛ рдерд╛ред

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

рдЕрдм рдЗрд╕реЗ рдкреЗрд╢ рдХрд┐рдпрд╛ рдЧрдпрд╛ рдерд╛ рдФрд░ рд╣рдорд╛рд░реЗ рдкрд╛рд╕ рд╡рд╛рд╕реНрддрд╡рд┐рдХ рд╣рд╛рд░реНрдб рдбреЗрдЯрд╛ рдкреНрд░рд╛рдкреНрдд рдХрд░рдиреЗ рдХрд╛ рдПрдХ рддрд░реАрдХрд╛ рд╣реИ, рдпрд╛ рдХрд┐рд╕реА рднреА рд╣рд╛рд░реНрдб рдбреЗрдЯрд╛ рдХреЗ рд░реВрдк рдореЗрдВ рдкреНрд░рд╛рдкреНрдд рдХрд┐рдпрд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИ рдХрд┐ рд▓реЛрдЧ 0 рд╕реЗ 10 рдХреЗ рдкреИрдорд╛рдиреЗ рдкрд░ рдХрд┐рддрдиреЗ рднреНрд░рдорд┐рдд рд╣реЛ рдЬрд╛рддреЗ рд╣реИрдВред

рдЬреИрд╕рд╛ рдХрд┐ рдЖрдкрдиреЗ рдХрд╣рд╛ рдерд╛ рдХрд┐ рдлреАрдбрдмреИрдХ рдкрд░ рдореЗрдЯрд╛ рдЪрд░реНрдЪрд╛ рдХрд╣реАрдВ рдФрд░ рдХрд░рдирд╛ рдмреЗрд╣рддрд░ рд╣реИ

рдЙрджрд╛рд╣рд░рдг рдХреЗ рд▓рд┐рдП, рдореИрдВрдиреЗ рдкрд╣рд▓реЗ рд╣реА рдЗрд╕ рддрд░рд╣ рдХреА рдЪрд░реНрдЪрд╛ рд╢реБрд░реВ рдХрд░ рджреА рд╣реИ рдФрд░ рдХреБрдЫ рд╡рд╛рд╕реНрддрд╡рд┐рдХ рдХрджрдо рдЙрдард╛рдП рдЬрд╛ рд╕рдХрддреЗ рд╣реИрдВ, рднрд▓реЗ рд╣реА рдЫреЛрдЯреЗ рд╣реЛрдВ: https://internals.rust-lang.org/t/idea-mandate-n-inрдирд┐рд░реНрднрд░-рдЙрдкрдпреЛрдЧ -рдкрд╣рд▓реЗ-рд╕реНрдерд┐рд░реАрдХрд░рдг-рдП-рдлреАрдЪрд░/7522/14ред рдореЗрд░реЗ рдкрд╛рд╕ RFC рд▓рд┐рдЦрдиреЗ рдХрд╛ рд╕рдордп рдирд╣реАрдВ рдерд╛, рдЗрд╕рд▓рд┐рдП рдЕрдЧрд░ рдХреЛрдИ рдореБрдЭреЗ рдЗрд╕рдХреЗ рд▓рд┐рдП рдорд╛рд░рддрд╛ рд╣реИ рдпрд╛ рдорджрдж рдХрд░рдирд╛ рдЪрд╛рд╣рддрд╛ рд╣реИ, рддреЛ рдореБрдЭреЗ рдХреЛрдИ рдЖрдкрддреНрддрд┐ рдирд╣реАрдВ рд╣реЛрдЧреАред

рдЬрд╝реНрдпрд╛рджрд╛ рдмреБрд░рд╛? рдРрд╕рд╛ рдХреИрд╕реЗ?

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

impl Trait рдЬреИрд╕рд╛ рдХрд┐ рдХреИрд▓реА-рдкрд┐рдХрд┐рдВрдЧ рдореЗрдВ рдкрд░реНрдпрд╛рдкреНрдд рд╣реЛрдЧрд╛ред рдпрджрд┐ рдЖрдк рдЗрд╕реЗ рддрд░реНрдХ рдХреА рд╕реНрдерд┐рддрд┐ рдореЗрдВ рдЙрдкрдпреЛрдЧ рдХрд░рдиреЗ рдХрд╛ рдкреНрд░рдпрд╛рд╕ рдХрд░рддреЗ рд╣реИрдВ, рддреЛ рдЖрдк рднреНрд░рдо рдХрд╛ рдкрд░рд┐рдЪрдп рджреЗрддреЗ рд╣реИрдВред рдПрдЪрдЖрд░рдЯреАрдмреА рдЙрд╕ рднреНрд░рдо рдХреЛ рджреВрд░ рдХрд░реЗрдВрдЧреЗред

@vorner рдкрд╣рд▓реЗ рдореИрдВрдиреЗ рддрд░реНрдХ рджрд┐рдпрд╛ рдерд╛ рдХрд┐ рд╣рдореЗрдВ
рдПрдлрдбрдмреНрд▓реНрдпреВрдЖрдИрдбрдмреНрд▓реНрдпреВ, рдореБрдЭреЗ рдпрд╛рдж рд╣реИ, рдЬрдм рдореИрдВ рдЬрдВрдЧ рд╕реАрдЦ рд░рд╣рд╛ рдерд╛ (рд╕реА ++, рдбреА, рдЬрд╛рд╡рд╛ рдЖрджрд┐ рд╕реЗ рдЖ рд░рд╣рд╛ рдерд╛), рд╕рд╛рд░реНрд╡рднреМрдорд┐рдХ рд░реВрдк рд╕реЗ рдорд╛рддреНрд░рд╛рддреНрдордХ рдкреНрд░рдХрд╛рд░ рдЬреЗрдиреЗрд░рд┐рдХ (рдЙрдирдХреЗ рд╡рд╛рдХреНрдпрд╡рд┐рдиреНрдпрд╛рд╕ рд╕рд╣рд┐рдд) рдХреЛ рд╕рдордЭрдирд╛ рдЖрд╕рд╛рди рдерд╛ (рдЬреЗрдиреЗрд░рд┐рдХ рдореЗрдВ рдЬреАрд╡рдирдХрд╛рд▓ рдереЛрдбрд╝рд╛ рдХрдард┐рди рдерд╛)ред
рдореБрдЭреЗ рд▓рдЧрддрд╛ рд╣реИ рдХрд┐ рддрд░реНрдХ рдкреНрд░рдХрд╛рд░реЛрдВ рдХреЗ рд▓рд┐рдП impl Trait рдХреЗ рдкрд░рд┐рдгрд╛рдорд╕реНрд╡рд░реВрдк рд▓рд╛рдЗрди рдХреЗ рдиреАрдЪреЗ рдирдП рд▓реЛрдЧреЛрдВ рд╕реЗ рдмрд╣реБрдд рднреНрд░рдо рд╣реЛрдЧрд╛ рдФрд░ рдЗрд╕ рддрд░рд╣ рдХреЗ рдХрдИ рдкреНрд░рд╢реНрди рд╣реЛрдВрдЧреЗред
рдРрд╕реЗ рдХрд┐рд╕реА рднреА рд╕рдмреВрдд рдХреЗ рдЕрднрд╛рд╡ рдореЗрдВ рдЬрд┐рд╕рдХреЗ рд▓рд┐рдП рдкрд░рд┐рд╡рд░реНрддрди рд░рд╕реНрдЯ рдХреЛ рд╕реАрдЦрдирд╛ рдЖрд╕рд╛рди рдмрдирд╛ рджреЗрдЧрд╛, рд╣рдореЗрдВ рдРрд╕реЗ рдмрджрд▓рд╛рд╡ рдХрд░рдиреЗ рд╕реЗ рдмрдЪрдирд╛ рдЪрд╛рд╣рд┐рдП, рдФрд░ рдЗрд╕рдХреЗ рдмрдЬрд╛рдп рдРрд╕реЗ рдмрджрд▓рд╛рд╡ рдХрд░рдиреЗ рдЪрд╛рд╣рд┐рдП рдЬреЛ рд░рд╕реНрдЯ рдХреЛ рдЕрдзрд┐рдХ рд╕реБрд╕рдВрдЧрдд рдмрдирд╛рддреЗ рд╣реИрдВ/рд░рдЦрддреЗ рд╣реИрдВ рдХреНрдпреЛрдВрдХрд┐ рдирд┐рд░рдВрддрд░рддрд╛ рдЗрд╕реЗ рдпрд╛рдж рд░рдЦрдирд╛ рдХрдо рд╕реЗ рдХрдо рдЖрд╕рд╛рди рдмрдирд╛рддреА рд╣реИред рд░рд╕реНрдЯ рдиреНрдпреВрдмреАрдЬрд╝ рдХреЛ рд╡реИрд╕реЗ рднреА рдкреБрд╕реНрддрдХ рдХреЛ рджреЛ рдмрд╛рд░ рдкрдврд╝рдирд╛ рд╣реЛрдЧрд╛, рдЗрд╕рд▓рд┐рдП args рдХреЗ рд▓рд┐рдП impl Trait рд╢реБрд░реБрдЖрдд рдХрд░рдХреЗ рдкреБрд╕реНрддрдХ рдореЗрдВ рдЬреЗрдирд░рд┐рдХ рдХреЛ рдмрд╛рдж рдореЗрдВ рд╕реНрдердЧрд┐рдд рдХрд░рдиреЗ рдХреА рдЕрдиреБрдорддрд┐ рджреЗрдирд╛ рд╡рд╛рд╕реНрддрд╡ рдореЗрдВ рдХрд┐рд╕реА рднреА рдЬрдЯрд┐рд▓рддрд╛ рдХреЛ рджреВрд░ рдирд╣реАрдВ рдХрд░рддрд╛ рд╣реИред

Btw @eddyb, рдХреНрдпреЛрдВ рд╣рдо рдПрдХ рдФрд░ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реИ existential рдХреЗ рдЕрд▓рд╛рд╡рд╛ рдХреАрд╡рд░реНрдб рдкреНрд░рдХрд╛рд░ рдХреЗ рд▓рд┐рдП impl ? (рдХрд╛рд╢ рд╣рдо рджреЛрдиреЛрдВ рдХреЗ рд▓рд┐рдП some рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рддреЗ..)

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

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

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

@eddyb рдмреАрдЯреАрдбрдмреНрд▓реНрдпреВ , рд╣рдореЗрдВ

рдХреНрдпреЛрдВ рдирд╣реАрдВ forall тАж /me рдзреАрд░реЗ-рдзреАрд░реЗ рдЫрд┐рдк рдЬрд╛рддрд╛ рд╣реИ

@phaazon рд╣рдорд╛рд░реЗ рдкрд╛рд╕ forall (рдпрд╛рдиреА "рд╕рд╛рд░реНрд╡рднреМрдорд┐рдХ") рд╣реИ рдФрд░ рдпрд╣ for , рдЙрджрд╛рд╣рд░рдг рдХреЗ рд▓рд┐рдП HRTB ( for<'a> Trait<'a> )ред

@eddyb рд╣рд╛рдБ, рдлрд┐рд░ рдЗрд╕реЗ рдЕрд╕реНрддрд┐рддреНрд╡ рдХреЗ рд▓рд┐рдП рднреА рдЙрдкрдпреЛрдЧ рдХрд░реЗрдВ, рдЬреИрд╕реЗ рд╣рд╛рд╕реНрдХреЗрд▓ forall рд╕рд╛рде рдХрд░рддрд╛ рд╣реИ, рдЙрджрд╛рд╣рд░рдг рдХреЗ рд▓рд┐рдПред

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

рдореИрдВ рд╡рд╛рд╕реНрддрд╡ рдореЗрдВ рдЗрд╕реЗ рдирд╣реАрдВ рд╕рдордЭрддрд╛ред рдЙрдиреНрд╣реЗрдВ рддрд░реНрдХ рдХреА рд╕реНрдерд┐рддрд┐ рдореЗрдВ рд░рдЦрдиреЗ рдХрд╛ рдХреНрдпрд╛ рдорддрд▓рдм рд╣реИ? рдореИрдВ рдЗрддрдирд╛ рд░рд╕реНрдЯ рдирд╣реАрдВ рд▓рд┐рдЦрддрд╛, рд▓реЗрдХрд┐рди рдореБрдЭреЗ рд╡рд╛рд╕реНрддрд╡ рдореЗрдВ -> impl Trait рдХрд░рдиреЗ рдореЗрдВ рд╕рдХреНрд╖рдо рд╣реЛрдирд╛ рдкрд╕рдВрдж рдЖрдпрд╛ред рдореИрдВ рдЗрд╕реЗ рддрд░реНрдХ рд╕реНрдерд┐рддрд┐ рдореЗрдВ рдХрдм рдЙрдкрдпреЛрдЧ рдХрд░реВрдВрдЧрд╛?

рдореЗрд░реА рд╕рдордЭ рдпрд╣ рдереА рдХрд┐ рдпрд╣ рдЬреНрдпрд╛рджрд╛рддрд░ рдирд┐рд░рдВрддрд░рддрд╛ рдХреЗ рд▓рд┐рдП рдерд╛ред рдЕрдЧрд░ рдореИрдВ fn рд╣рд╕реНрддрд╛рдХреНрд╖рд░ рдореЗрдВ рддрд░реНрдХ рд╕реНрдерд┐рддрд┐ рдореЗрдВ impl Trait рдЯрд╛рдЗрдк рдХрд░ рд╕рдХрддрд╛ рд╣реВрдВ, рддреЛ рдореИрдВ рдЗрд╕реЗ рдХрд╣реАрдВ рдФрд░ рдХреНрдпреЛрдВ рдирд╣реАрдВ рд▓рд┐рдЦ рд╕рдХрддрд╛?

рдЙрд╕ рдиреЗ рдХрд╣рд╛, рдореИрдВ рд╡реНрдпрдХреНрддрд┐рдЧрдд рд░реВрдк рд╕реЗ рд▓реЛрдЧреЛрдВ рдХреЛ "рдмрд╕ рдПрдХ рдкреНрд░рдХрд╛рд░ рдХреЗ рдкреИрд░рд╛рдореАрдЯрд░ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдиреЗ" рдХреЗ рд▓рд┐рдП рдХрд╣рддрд╛ рд╣реВрдВ ...

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

рд╕рд╛рде рд╣реА, рд╕рдорд╕реНрдпрд╛ рдпрд╣ рднреА рдкреИрджрд╛ рд╣реЛрддреА рд╣реИ рдХрд┐ рдХрд┐рд╕рдХреЗ рдкрдХреНрд╖ рдореЗрдВ/рдЦрд┐рд▓рд╛рдл рдЦрдбрд╝реЗ рд╣реЛрдВ!

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

рдЗрд╕рд▓рд┐рдП рдЖрдк рдЗрд╕рдХрд╛ рдкрддрд╛ рдирд╣реАрдВ рд▓реЗ рд╕рдХрддреЗ

рдЖрдк рдЗрд╕реЗ рд╣рд╕реНрддрд╛рдХреНрд╖рд░ рд╕реЗ рдЕрдиреБрдорд╛рди рд▓рдЧрд╛рдХрд░ рдХрд░ рд╕рдХрддреЗ рд╣реИрдВред

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

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

fn foo(x: impl Debug)

рдХреНрдпрд╛ рдареАрдХ рд╡реИрд╕реА рд╣реА рдмрд╛рдд рд╣реИ

fn foo<A>(x: A) where A: Debug
fn foo<A: Debug>(x: A)

рдЗрд╕рдХреЗ рдЕрд▓рд╛рд╡рд╛, рдЗрд╕ рдкрд░ рд╡рд┐рдЪрд╛рд░ рдХрд░реЗрдВ:

fn foo<A>(x: A) -> A where A: Debug

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

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

рд╕рд╛рде рд╣реА, рдХреБрдЫ рдРрд╕рд╛ рдЬреЛ рдореИрдВ рдХрд╣рдирд╛ рднреВрд▓ рдЧрдпрд╛: рдпрд╣ рджреЗрдЦрдирд╛ рдХрдард┐рди рдмрдирд╛рддрд╛ рд╣реИ рдХрд┐ рдЖрдкрдХрд╛ рдХрд╛рд░реНрдп рдХреИрд╕реЗ рдкреИрд░рд╛рдореАрдЯрд░/рдореЛрдиреЛрдореЛрд░реНрдлрд┐рдЬреНрдб рд╣реИред

@ рд╡рд░реНрдирд░ рдЖрдВрд╢рд┐рдХ рдЦреЛрдЬрдХрд░реНрддрд╛ рдХреЗ рд▓рд┐рдП рдЗрд╕рдХреЗ рдЦрд┐рд▓рд╛рдл рд▓рд┐рдВрдЯ рдХрд░рдирд╛ рдмрд╣реБрдд рд╕рдордЭ рдореЗрдВ рдЖрддрд╛ рд╣реИред рдореИрдВ рд╡рд╛рд╕реНрддрд╡ рдореЗрдВ рд╣рд╛рд▓рд╛рдВрдХрд┐ рд╢реБрд░реВ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рддрд░реНрдХ рд╕реНрдерд┐рддрд┐ рдореЗрдВ рд╕реБрд╡рд┐рдзрд╛ рдХреЗ рд▓рд┐рдП рдирд╣реАрдВ рд╣реВрдВред

рдпрд╣ рдХреИрд╕реЗ рд╕рдВрдЧрдд рд╣реИ рдЬрдм -> impl Trait рдХреИрд▓реА рдкреНрд░рдХрд╛рд░ рдЪреБрдирддрд╛ рд╣реИ, рдЬрдмрдХрд┐ x: impl Trait рдореЗрдВ рдХреЙрд▓рд░ рдкреНрд░рдХрд╛рд░ рдЪреБрдирддрд╛ рд╣реИ?

рдореИрдВ рд╕рдордЭрддрд╛ рд╣реВрдВ рдХрд┐ рдЗрд╕рдХреЗ рдХрд╛рдо рдХрд░рдиреЗ рдХрд╛ рдХреЛрдИ рджреВрд╕рд░рд╛ рддрд░реАрдХрд╛ рдирд╣реАрдВ рд╣реИ, рд▓реЗрдХрд┐рди рдпрд╣ "рд╕реБрд╕рдВрдЧрдд" рдирд╣реАрдВ рд▓рдЧрддрд╛ рд╣реИ, рдпрд╣ рд╕рдВрдЧрдд рдХреЗ рд╡рд┐рдкрд░реАрдд рд▓рдЧрддрд╛ рд╣реИ

рдореИрдВ рд╡рд╛рд╕реНрддрд╡ рдореЗрдВ рд╕рд╣рдордд рд╣реВрдВ рдХрд┐ рдпрд╣ рд╕рдм рдХреБрдЫ рд╣реИ рд▓реЗрдХрд┐рди рд╕реБрд╕рдВрдЧрдд рд╣реИ рдФрд░ рд▓реЛрдЧ рднреНрд░рдорд┐рдд рд╣реЛрдВрдЧреЗ, рдирд╡рд╛рдЧрдВрддреБрдХ рдХреЗ рд╕рд╛рде-рд╕рд╛рде рдЙрдиреНрдирдд рдХреБрд╢рд▓ рдЬрдВрдЧрд▓реАред

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

  • рд░рд╕реНрдЯ-рд▓реИрдВрдЧ/рдЖрд░рдПрдлрд╕реАрдПрд╕#1522 ("рдиреНрдпреВрдирддрдо impl Trait ")
  • rust-lang/rfcs#1951 (" impl Trait рд▓рд┐рдП рд╕рд┐рдВрдЯреИрдХреНрд╕ рдФрд░ рдкреИрд░рд╛рдореАрдЯрд░ рд╕реНрдХреЛрдкрд┐рдВрдЧ рдХреЛ рдЕрдВрддрд┐рдо рд░реВрдк рджреЗрдВ, рдЗрд╕реЗ рддрд░реНрдХреЛрдВ рддрдХ рд╡рд┐рд╕реНрддрд╛рд░рд┐рдд рдХрд░рддреЗ рд╣реБрдП")

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

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

рдЗрд╕реЗ рдХреИрд╕реЗ рд╕реНрдерд┐рд░ рдХрд┐рдпрд╛ рдЧрдпрд╛ рд╣реИ рдЬрдм impl Trait рдХреЛ рд▓рдХреНрд╖рдгреЛрдВ рдореЗрдВ fns рдХреЗ рд▓рд┐рдП рддрд░реНрдХ рд╕реНрдерд┐рддрд┐ рдореЗрдВ рд╕рдорд░реНрдерди рднреА рдирд╣реАрдВ рдорд┐рд▓рд╛ рд╣реИ ??

@alexreg рдпрд╣ рд╕рдорд░реНрдерд┐рдд рд╣реИ ...? https://play.rust-lang.org/?gist=47b1c3a3bf61f33d4acb3634e5a68388&version=stable

@daboross рдлрд┐рд░ рдореВрд▓ рдкреЛрд╕реНрдЯ рдореЗрдВ рдЪреЗрдХрдмреЙрдХреНрд╕ рдкрд░ рдЯрд┐рдХ рдХрд░рдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реИ!

(рдмрд╕ рдкрддрд╛ рдЪрд▓рддрд╛ рд╣реИ рдХрд┐ https://play.rust-lang.org/?gist=47b1c3a3bf61f33d4acb3634e5a68388&version=stable рд╡рд░реНрддрдорд╛рди рдореЗрдВ рдХрд╛рдо рдХрд░рддрд╛ рд╣реИ)

рдореБрдЭреЗ рд▓рдЧрддрд╛ рд╣реИ рдХрд┐ рдпрд╣ рдЕрдЬреАрдм рд╣реИ рдХрд┐ https://play.rust-lang.org/?gist=c29e80715ac161c6dc95f96a7f91aa8c&version=stable&mode=debug рдХрд╛рдо рдирд╣реАрдВ рдХрд░рддрд╛ (рдЕрднреА рддрдХ), рдЗрд╕ рддреНрд░реБрдЯрд┐ рд╕рдВрджреЗрд╢ рдХреЗ рд╕рд╛рде рдФрд░ рдХреНрдпрд╛ рд╣реИред рдХреНрдпрд╛ рдРрд╕рд╛ рд╕реЛрдЪрдиреЗ рд╡рд╛рд▓рд╛ рдореИрдВ рдЕрдХреЗрд▓рд╛ рд╣реВрдБ? рд╣реЛ рд╕рдХрддрд╛ рд╣реИ рдХрд┐ рдЗрд╕реЗ рд▓рдХреНрд╖рдгреЛрдВ рдореЗрдВ рд╡рд╛рдкрд╕реА рдХреА рд╕реНрдерд┐рддрд┐ рдореЗрдВ impl Trait рд▓рд┐рдП рдПрдХ рдЪреЗрдХрдмреЙрдХреНрд╕ рдЬреЛрдбрд╝рдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реЛ, рдпрд╛ рдпрд╣ рдХреЗрд╡рд▓ impl Trait рдХреЛ рд╡рд┐рд╢реЗрд╖рддрд╛ рдХрд╛рд░реНрдпреЛрдВ рдХреЗ рд▓рд┐рдП рддрд░реНрдХ-рд╕реНрдерд┐рддрд┐ рдореЗрдВ рдЕрдиреБрдорддрд┐ рджреЗрдиреЗ рдХрд╛ рдПрдХ рд╕рдЪреЗрдд рдирд┐рд░реНрдгрдп рдерд╛, existential type рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдордЬрдмреВрд░ рдХрд░рдирд╛

@ рдПрдХреНрд▓реЛрдЧ

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

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

@cramertj рдХреНрдпрд╛ рд╣рдо рдЕрднреА рдЙрд╕ рдмрд┐рдВрджреБ рдкрд░ рд╣реИрдВ рдЬрд╣рд╛рдВ рд╣рдорд╛рд░реЗ рдкрд╛рд╕ рдЗрд╕реЗ рд▓рд╛рдЧреВ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдкрд░реНрдпрд╛рдкреНрдд рд╡реНрдпрд╛рд╡рд╣рд╛рд░рд┐рдХ рдЕрдиреБрднрд╡ рд╣реИ?

рдЗрд╕рд╕реЗ рдкрд╣рд▓реЗ рдХрд┐ рд╣рдо рдФрд░ рд╕реБрд╡рд┐рдзрд╛рдПрдБ рдЬреЛрдбрд╝реЗрдВ, рдореИрдВ рдХреБрдЫ рд╕реНрдерд┐рд░ рд░рд┐рд▓реАрдЬрд╝ рдореЗрдВ impl Trait рджреЗрдЦрдирд╛ рдЪрд╛рд╣рддрд╛ рд╣реВрдБред

@ рдорд╛рд░реНрдХ-рдЖрдИрдПрдо рдореИрдВ рдпрд╣ рджреЗрдЦрдиреЗ рдореЗрдВ рд╡рд┐рдлрд▓ рд╣реВрдВ рдХрд┐ рд╡реНрдпрдХреНрддрд┐рдЧрдд рд░реВрдк рд╕реЗ рд╡рд╛рдкрд╕реА-рд╕реНрдерд┐рддрд┐ impl Trait рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рдХреНрдпрд╛ рд╡рд┐рд╡рд╛рджрд╛рд╕реНрдкрдж рд╣реИ, рд╡реНрдпрдХреНрддрд┐рдЧрдд рд░реВрдк рд╕реЗ ... рд╢рд╛рдпрдж рдореБрдЭреЗ рдХреБрдЫ рдпрд╛рдж рдЖ рд░рд╣рд╛ рд╣реИред

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

рд╕рдордЭрд╛ред рдореБрдЭреЗ рд▓рдЧрддрд╛ рд╣реИ рдХрд┐ рдореИрдВ рдЗрд╕реЗ рдПрдХ рдирдИ рд╕реБрд╡рд┐рдзрд╛ рд╕реЗ рдЕрдзрд┐рдХ рдореМрдЬреВрджрд╛ рд╕реБрд╡рд┐рдзрд╛ рдХрд╛ рдПрдХ рд▓рд╛рдкрддрд╛ рд╣рд┐рд╕реНрд╕рд╛ рдорд╛рдирддрд╛ рд╣реВрдВред

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

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

рдореБрдЭреЗ рдЖрд╢реНрдЪрд░реНрдп рд╣реИ рдХрд┐ рдХреНрдпрд╛ рд╣рдо рд▓рдХреНрд╖рдгреЛрдВ рдореЗрдВ рд╕рд╛рд░реНрд╡рднреМрдорд┐рдХ рдирд┐рд╣рд┐рддрд╛рд░реНрде рд╡рд┐рд╢реЗрд╖рддрд╛ рдкрд░ рд╡рд╛рдкрд╕ рдкрдХрдбрд╝ рд╕рдХрддреЗ рд╣реИрдВ ...

рд▓реЗрдХрд┐рди рд╣рд╛рдБ, рдореБрдЭреЗ рд▓рдЧрддрд╛ рд╣реИ рдХрд┐ рдореИрдВ рддреБрдореНрд╣рд╛рд░рд╛ рдмрд┐рдВрджреБ рджреЗрдЦрддрд╛ рд╣реВрдБред

@ рдорд╛рд░реНрдХ-рдЖрдИрдПрдо рдирд╣реАрдВ, рд╣рдо рдирд╣реАрдВ рдХрд░ рд╕рдХрддреЗ, рд╡реЗ рдкрд╣рд▓реЗ рд╕реЗ рд╣реА рд╕реНрдерд┐рд░ рд╣реИрдВ ред

рд╡реЗ рдХрд╛рд░реНрдп рдХрд░ рд░рд╣реЗ рд╣реИрдВ, рд▓реЗрдХрд┐рди рд╡рд┐рд╢реЗрд╖рддрд╛ рдШреЛрд╖рдгрд╛рдУрдВ рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рдХреНрдпрд╛?

@ рдорд╛рд░реНрдХ-рдЖрдИрдПрдо рдЬреИрд╕рд╛ рдХрд┐ рд╕реНрдирд┐рдкреЗрдЯ рд╕реЗ рдкрддрд╛ рдЪрд▓рддрд╛ рд╣реИ, рд╡реЗ рдЗрдореНрдкреНрд▓рд╛рдВрдЯреНрд╕ рдФрд░ рдЯреНрд░реЗрдЯ рдбрд┐рдХреНрд▓реЗрд░реЗрд╢рди рджреЛрдиреЛрдВ рдореЗрдВ рд╕реНрдерд┐рд░ рд╣реИрдВред

рд╣рдо abstract type рд╕рд╛рде рдХрд╣рд╛рдВ рдмрд╕ рд░рд╣реЗ рд╣реИрдВ, рдЗрд╕реЗ рдкрдХрдбрд╝рдиреЗ рдХреЗ рд▓рд┐рдП рдмрд╕ рдХреВрджреЗрдВред рд╡реНрдпрдХреНрддрд┐рдЧрдд рд░реВрдк рд╕реЗ, рдореИрдВ @Centril рдХреЗ рд╣рд╛рд▓ рд╣реА рдореЗрдВ рдкреНрд░рд╕реНрддрд╛рд╡рд┐рдд рд╕рд┐рдВрдЯреИрдХреНрд╕ рдФрд░ рд╕рд░реНрд╡реЛрддреНрддрдо рдкреНрд░рдерд╛рдУрдВ рдХреЗ рд╕рд╛рде рдмрд╣реБрдд рдЕрдзрд┐рдХ рдСрди-рдмреЛрд░реНрдб

// GOOD:
type Foo: Iterator<Item: Display>;

type Bar = (impl Display, impl Debug);

// BAD
type Foo = impl Iterator<Item = impl Display>;

type Bar0: Display;
type Bar1: Debug;
type Bar = (Bar0, Bar1);

рдЬреЛ рдореЗрд░реЗ рдХреБрдЫ рдХреЛрдб рдкрд░ рд▓рд╛рдЧреВ рд╣реЛрддрд╛ рд╣реИ, рдореБрдЭреЗ рд▓рдЧрддрд╛ рд╣реИ рдХрд┐ рдРрд╕рд╛ рдХреБрдЫ рджрд┐рдЦрд╛рдИ рджреЗрдЧрд╛:

// Concrete type with a generic body
struct Data<TBody> {
    ts: Timestamp,
    body: TBody,
}


// A name for an inferred iterator
type IterData = Data<impl Read>;
type Iter: Iterator<Item = IterData>;


// A function that gives us an iterator. Also takes some arbitrary range
fn iter(&self, range: impl RangeBounds<Timestamp>) -> Result<Iter, Error> { ... }


// A struct that holds on to that iterator
struct HoldsIter {
    iter: Iter,
}

рдореЗрд░реЗ рд▓рд┐рдП рдЗрд╕рдХрд╛ рдХреЛрдИ рдорддрд▓рдм рдирд╣реАрдВ рд╣реИ рдХрд┐ type Bar = (impl Display,); рдЕрдЪреНрдЫрд╛ рд╣реЛрдЧрд╛, рд▓реЗрдХрд┐рди type Bar = impl Display; рдмреБрд░рд╛ рд╣реЛрдЧрд╛ред

рдпрджрд┐ рд╣рдо рдЕрд▓рдЧ-рдЕрд▓рдЧ рд╡реИрдХрд▓реНрдкрд┐рдХ рдЕрд╕реНрддрд┐рддреНрд╡рдЧрдд рдкреНрд░рдХрд╛рд░ рдХреЗ рд╕рд┐рдВрдЯреИрдХреНрд╕ рдкрд░ рдирд┐рд░реНрдгрдп рд▓реЗ рд░рд╣реЗ рд╣реИрдВ (рд╕рднреА рдЖрд░рдПрдлрд╕реА 2071 рд╕реЗ рдЕрд▓рдЧ рд╣реИрдВ?), рддреЛ рдХреНрдпрд╛ https://users.rust-lang.org/ рдкрд░ рдлреЛрд░рдо рдереНрд░реЗрдб рдРрд╕рд╛ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдПрдХ рдЕрдЪреНрдЫреА рдЬрдЧрд╣ рд╣реЛрдЧреА?

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

type Foo = impl Trait рдХреНрдпрд╛ рдЧрд▓рдд рд╣реИ?

@daboross рд╢рд╛рдпрдж рдЗрд╕рдХреЗ рдмрдЬрд╛рдп рдЖрдВрддрд░рд┐рдХ рдордВрдЪред рдореИрдВ рд╕рд┐рдВрдЯреИрдХреНрд╕ рдХреЛ рдЕрдВрддрд┐рдо рд░реВрдк рджреЗрдиреЗ рдХреЗ рд▓рд┐рдП рдЗрд╕рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рдПрдХ рдЖрд░рдПрдлрд╕реА рд▓рд┐рдЦрдиреЗ рдкрд░ рд╡рд┐рдЪрд╛рд░ рдХрд░ рд░рд╣рд╛ рд╣реВрдВред

@daboross рдкрд╣рд▓реЗ рд╕реЗ рд╣реА рдЗрд╕ рдзрд╛рдЧреЗ рдкрд░ рд╡рд╛рдХреНрдп рд░рдЪрдирд╛ рдкрд░ рдкрд░реНрдпрд╛рдкреНрдд рд╕реЗ рдЕрдзрд┐рдХ рдЪрд░реНрдЪрд╛ рд╣реЛ рдЪреБрдХреА рд╣реИред рдореБрдЭреЗ рд▓рдЧрддрд╛ рд╣реИ рдХрд┐ рдЕрдЧрд░ @Centril рдЗрд╕ рд╕рдордп рдЗрд╕рдХреЗ рд▓рд┐рдП рдПрдХ RFC рд▓рд┐рдЦ рд╕рдХрддрд╛ рд╣реИ, рддреЛ рдмрдврд╝рд┐рдпрд╛ред

рдХреНрдпрд╛ рд▓рдХреНрд╖рдгреЛрдВ рдореЗрдВ рдЕрд╕реНрддрд┐рддреНрд╡ рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рдЪрд░реНрдЪрд╛ рдХреЗ рд▓рд┐рдП рдореИрдВ рдХрд┐рд╕реА рднреА рдореБрджреНрджреЗ рдХреА рд╕рджрд╕реНрдпрддрд╛ рд▓реЗ рд╕рдХрддрд╛ рд╣реВрдВ?

рдХреНрдпрд╛ рдПрдХ рд╡рд╛рдХреНрдп рд░рдЪрдирд╛ рдпрд╛ рджреВрд╕рд░реЗ рдХреЗ рд▓рд┐рдП рдХреЛрдИ рдореИрдХреНрд░реЛ-рд╕рдВрдмрдВрдзрд┐рдд рддрд░реНрдХ рд╣реИ?

@tomaka рдкрд╣рд▓реЗ рдорд╛рдорд▓реЗ рдореЗрдВ type Foo = (impl Display,) рд╡рд╛рд╕реНрддрд╡ рдореЗрдВ рдЖрдкрдХреЗ рдкрд╛рд╕ рдПрдХрдорд╛рддреНрд░ рд╡рд╛рдХреНрдпрд╡рд┐рдиреНрдпрд╛рд╕ рд╣реИред type Foo: Trait рд╕реЗ рдЕрдзрд┐рдХ type Foo = impl Trait рд▓рд┐рдП рдореЗрд░реА рдкреНрд░рд╛рдердорд┐рдХрддрд╛ рд╕рд┐рд░реНрдл рдЗрд╕ рддрдереНрдп рд╕реЗ рдЖрддреА рд╣реИ рдХрд┐ рд╣рдо рдПрдХ рдкреНрд░рдХрд╛рд░ рдХреЛ рдмрд╛рдзреНрдп рдХрд░ рд░рд╣реЗ рд╣реИрдВ рдЬрд┐рд╕реЗ рд╣рдо рдирд╛рдо рджреЗ рд╕рдХрддреЗ рд╣реИрдВ, рдЬреИрд╕реЗ <TFoo: Trait> рдпрд╛ where TFoo: Trait , рдЬрдмрдХрд┐ impl Trait рд╣рдо рдкреНрд░рдХрд╛рд░ рдХрд╛ рдирд╛рдо рдирд╣реАрдВ рджреЗ рд╕рдХрддреЗред

рд╕реНрдкрд╖реНрдЯ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП, рдореИрдВ рдпрд╣ рдирд╣реАрдВ рдХрд╣ рд░рд╣рд╛ рд╣реВрдВ рдХрд┐ type Foo = impl Bar рдЦрд░рд╛рдм рд╣реИ, рдореИрдВ рдХрд╣ рд░рд╣рд╛ рд╣реВрдВ рдХрд┐ type Foo: Bar рд╕рд╛рдзрд╛рд░рдг рдорд╛рдорд▓реЛрдВ рдореЗрдВ рдмреЗрд╣рддрд░ рд╣реИ, рдЖрдВрд╢рд┐рдХ рд░реВрдк рд╕реЗ @CodrAus рдХреА рдкреНрд░реЗрд░рдгрд╛ рдХреЗ рдХрд╛рд░рдгред

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

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

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

@KodrAus

рдпрд╣рд╛рдВ рдмрддрд╛рдпрд╛ рдЧрдпрд╛ рд╣реИ рдХрд┐ рдореИрдВ рдЙрди рдкреНрд░рдХрд╛рд░ рдХреА рдкрд░рд┐рднрд╛рд╖рд╛рдУрдВ рдХреЛ рдХреИрд╕реЗ рдкрдврд╝рддрд╛ рд╣реВрдВ:

  • type Foo: Trait рдЕрд░реНрде рд╣реИ " Foo Trait рд▓рд╛рдЧреВ рдХрд░рдиреЗ рд╡рд╛рд▓рд╛ рдПрдХ рдкреНрд░рдХрд╛рд░ рд╣реИ "
  • type Foo = impl Trait рдЕрд░реНрде рд╣реИ " Foo рдХрд┐рд╕реА рдкреНрд░рдХрд╛рд░ рдХрд╛ рдЙрдкрдирд╛рдо рд╣реИ рдЬреЛ Trait "

рдореЗрд░реЗ рд▓рд┐рдП, Foo: Trait рдмрд╕ Foo рд▓рд╛рдЧреВ рдХрд░рдиреЗ рдкрд░ рдПрдХ рдмрд╛рдзрд╛ рдХреА рдШреЛрд╖рдгрд╛ рдХрд░рддрд╛ рд╣реИ Trait ред рдПрдХ рддрд░рд╣ рд╕реЗ type Foo: Trait рдЕрдзреВрд░рд╛ рд▓рдЧрддрд╛ рд╣реИред рдРрд╕рд╛ рд▓рдЧрддрд╛ рд╣реИ рдХрд┐ рд╣рдорд╛рд░реЗ рдкрд╛рд╕ рдПрдХ рдмрд╛рдзрд╛ рд╣реИ, рд▓реЗрдХрд┐рди Foo рдХреА рд╡рд╛рд╕реНрддрд╡рд┐рдХ рдкрд░рд┐рднрд╛рд╖рд╛ рдЧрд╛рдпрдм рд╣реИред

рджреВрд╕рд░реА рдУрд░, impl Trait рдЕрд░реНрде рд╣реИ "рдпрд╣ рдПрдХ рдПрдХрд▓ рдкреНрд░рдХрд╛рд░ рд╣реИ, рд▓реЗрдХрд┐рди рд╕рдВрдХрд▓рдХ рдЗрд╕рдХреЗ рдирд╛рдо рдХрд╛ рдкрддрд╛ рд▓рдЧрд╛рддрд╛ рд╣реИ"ред рдЗрд╕рд▓рд┐рдП, type Foo = impl Trait рдЕрд░реНрде рд╣реИ рдХрд┐ рд╣рдорд╛рд░реЗ рдкрд╛рд╕ рдкрд╣рд▓реЗ рд╕реЗ рд╣реА рдПрдХ рдареЛрд╕ рдкреНрд░рдХрд╛рд░ рд╣реИ (рдЬреЛ Trait ), рдЬрд┐рд╕рдореЗрдВ рд╕реЗ Foo рд╕рд┐рд░реНрдл рдПрдХ рдЙрдкрдирд╛рдо рд╣реИред

рдореЗрд░рд╛ рдорд╛рдирдирд╛ тАЛтАЛрд╣реИ рдХрд┐ type Foo = impl Trait рд╕рд╣реА рдЕрд░реНрде рдХреЛ рдЕрдзрд┐рдХ рд╕реНрдкрд╖реНрдЯ рд░реВрдк рд╕реЗ рдмрддрд╛рддрд╛ рд╣реИ: Foo Trait рд▓рд╛рдЧреВ рдХрд░рдиреЗ рд╡рд╛рд▓реЗ рдХрд┐рд╕реА рдкреНрд░рдХрд╛рд░ рдХрд╛ рдЙрдкрдирд╛рдо рд╣реИред

@stjepang

type Foo: Trait рдЕрд░реНрде рд╣реИ "рдлреВ рдПрдХ рдкреНрд░рдХрд╛рд░ рдХрд╛ рдХрд╛рд░реНрдпрд╛рдиреНрд╡рдпрди рд╡рд┐рд╢реЗрд╖рддрд╛ рд╣реИ"
[..]
рдПрдХ рддрд░рд╣ рд╕реЗ type Foo: Trait рдЕрдзреВрд░рд╛ рд▓рдЧрддрд╛ рд╣реИред

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

рджреВрд╕рд░реА рдУрд░, impl Trait "рдпрд╣ рдПрдХ рдПрдХрд▓ рдкреНрд░рдХрд╛рд░ рд╣реИ, рд▓реЗрдХрд┐рди рд╕рдВрдХрд▓рдХ рдЕрдВрддрд░ рдХреЛ рднрд░рддрд╛ рд╣реИ" рдХрд╛ рд╡рд┐рдЪрд╛рд░реЛрддреНрддреЗрдЬрдХ рд╣реИред рдЗрд╕рд▓рд┐рдП, type Foo = impl Trait рддрд╛рддреНрдкрд░реНрдп рд╣реИ рдХрд┐ рд╣рдорд╛рд░реЗ рдкрд╛рд╕ рдкрд╣рд▓реЗ рд╕реЗ рд╣реА рдПрдХ рдареЛрд╕ рдкреНрд░рдХрд╛рд░ рд╣реИ (рдЬреЛ Trait ), рдЬрд┐рд╕рдореЗрдВ рд╕реЗ Foo рдПрдХ рдЙрдкрдирд╛рдо рд╣реИ, рд▓реЗрдХрд┐рди рд╕рдВрдХрд▓рдХ рдпрд╣ рдкрддрд╛ рд▓рдЧрд╛рдПрдЧрд╛ рдХрд┐ рдпрд╣ рд╡рд╛рд╕реНрддрд╡ рдореЗрдВ рдХрд┐рд╕ рдкреНрд░рдХрд╛рд░ рдХрд╛ рд╣реИред

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

@рд╕реЗрдВрдЯреНрд░рд┐рд▓

рдкрд╛рдардХреЛрдВ рдФрд░ рд╡рд┐рд╢реЗрд╖ рд░реВрдк рд╕реЗ рд╢реБрд░реБрдЖрддреА рджреГрд╖реНрдЯрд┐рдХреЛрдг рд╕реЗ, рдореБрдЭреЗ рд▓рдЧрддрд╛ рд╣реИ рдХрд┐ рд╡рд┐рд╕реНрддрд╛рд░ рдЕрдзрд┐рдХ рдорд╣рддреНрд╡рдкреВрд░реНрдг рд╣реИред

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

рд╡рд┐рд╕реНрддрд╛рд░рд┐рдд рдмрдирд╛рдо рдЧрд╣рди рджреНрд╡рд┐рднрд╛рдЬрди рджрд┐рд▓рдЪрд╕реНрдк рд╣реИ - рдореИрдВрдиреЗ рдкрд╣рд▓реЗ рдХрднреА рдЗрд╕ рддрд░рд╣ рд╕реЗ impl Trait рдмрд╛рд░реЗ рдореЗрдВ рдирд╣реАрдВ рд╕реЛрдЪрд╛ рдерд╛ред

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

рдмрд╕ рдореЗрд░рд╛ 2c, рд╣рд╛рд▓рд╛рдБрдХрд┐ред рджреВрд╕рд░реЛрдВ рдХреЗ рдкрд╛рд╕ impl Trait рдЕрд▓рдЧ-рдЕрд▓рдЧ рдорд╛рдирд╕рд┐рдХ рдореЙрдбрд▓ рд╣реЛ рд╕рдХрддреЗ рд╣реИрдВред

рдореИрдВ рдЗрд╕ рдЯрд┐рдкреНрдкрдгреА рд╕реЗ рдкреВрд░реА рддрд░рд╣ рд╕рд╣рдордд рд╣реВрдВ: type Foo: Trait рдЕрдзреВрд░рд╛ рд▓рдЧрддрд╛ рд╣реИред рдФрд░ type Foo = impl Trait impl Trait рдХрд╣реАрдВ рдФрд░

@joshtriplett рдирд┐рд░рдВрддрд░рддрд╛ рдЪрд░реНрдЪрд╛ рдХреА рд╢реБрд░реБрдЖрдд рдХреЗ рд▓рд┐рдП https://github.com/rust-lang/rust/issues/34511#issuecomment -387238653 рджреЗрдЦреЗрдВ; рдореЗрд░рд╛ рдорд╛рдирдирд╛ тАЛтАЛтАЛтАЛрд╣реИ рдХрд┐ рдлреЙрд░реНрдо рдлреЙрд░реНрдо рдХреЛ рдЕрдиреБрдорддрд┐ рджреЗрдирд╛ рд╡рд╛рд╕реНрддрд╡ рдореЗрдВ рд▓рдЧрд╛рддрд╛рд░ рдХрд╛рдо рдХрд░рдирд╛ рд╣реИред рдФрд░ рдХреЗрд╡рд▓ рд░реВрдкреЛрдВ рдореЗрдВ рд╕реЗ рдПрдХ рдХреЛ рдЕрдиреБрдорддрд┐ рджреЗрдирд╛ (рдЬреЛ рднреА рд╣реЛ...) рдЕрд╕рдВрдЧрдд рд╣реИред type Foo: Trait рдЕрдиреБрдорддрд┐ рджреЗрдирд╛ https://github.com/rust-lang/rfcs/pull/2289 рдХреЗ рд╕рд╛рде рд╡рд┐рд╢реЗрд╖ рд░реВрдк рд╕реЗ рдЕрдЪреНрдЫреА рддрд░рд╣ рд╕реЗ рдлрд┐рдЯ рдмреИрдарддрд╛ рд╣реИ рдЬрд┐рд╕рдХреЗ рд╕рд╛рде рдЖрдк рдХрд╣ рд╕рдХрддреЗ рд╣реИрдВ: type Foo: Iterator<Item: Display>; рдЬреЛ рдЪреАрдЬреЛрдВ рдХреЛ рдмрдбрд╝реЗ рдХрд░реАрдиреЗ рд╕реЗ рдПрдХ рд╕рдорд╛рди рдмрдирд╛рддрд╛ рд╣реИред

@stjepang type Foo: Bar; рд╡рд┐рд╕реНрддрд╛рд░рд┐рдд рдкрд░рд┐рдкреНрд░реЗрдХреНрд╖реНрдп рдХреЗ рд▓рд┐рдП рдЖрдкрдХреЛ рдЯрд╛рдЗрдк рдереНрдпреЛрд░реА рдореЗрдВ рдЕрд╕реНрддрд┐рддреНрд╡рдЧрдд рдкрд░рд┐рдорд╛рдгреАрдХрд░рдг рдХреЛ рд╕рдордЭрдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рдирд╣реАрдВ рд╣реИред рдЖрдкрдХреЛ рд╡рд╛рд╕реНрддрд╡ рдореЗрдВ рдпрд╣ рд╕рдордЭрдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реИ рдХрд┐ Foo рдЖрдкрдХреЛ Bar рджреНрд╡рд╛рд░рд╛ рд╡рд╣рди рдХрд┐рдП рдЬрд╛рдиреЗ рд╡рд╛рд▓реЗ рд╕рднреА рдХрд╛рд░реНрдпреЛрдВ рдХреЛ рдХрд░рдиреЗ рдХреА рдЕрдиреБрдорддрд┐ рджреЗрддрд╛ рд╣реИ, рдмрд╕ред рдЙрдкрдпреЛрдЧрдХрд░реНрддрд╛ рдХреЗ рджреГрд╖реНрдЯрд┐рдХреЛрдг рд╕реЗ Foo рдХреЗ рджреГрд╖реНрдЯрд┐рдХреЛрдг рд╕реЗ, рдпрд╣ рднреА рджрд┐рд▓рдЪрд╕реНрдк рд╣реИред

@рд╕реЗрдВрдЯреНрд░рд┐рд▓

рдореЗрд░рд╛ рдорд╛рдирдирд╛ тАЛтАЛтАЛтАЛрд╣реИ рдХрд┐ рдЕрдм рдореИрдВ рд╕рдордЭ рдЧрдпрд╛ рд╣реВрдВ рдХрд┐ рдЖрдк рдХрд╣рд╛рдВ рд╕реЗ рдЖ рд░рд╣реЗ рд╣реИрдВ рдФрд░ Type: Trait рд╕рд┐рдВрдЯреИрдХреНрд╕ рдХреЛ рдЕрдзрд┐рдХ рд╕реЗ рдЕрдзрд┐рдХ рд╕реНрдерд╛рдиреЛрдВ рдкрд░ рдзрдХреЗрд▓рдиреЗ рдХреА рдЕрдкреАрд▓ред

рдЯрд╛рдЗрдк-рдЗрдореНрдкреНрд▓реАрдореЗрдВрдЯреНрд╕-рдЯреНрд░реЗрдЯ рдмрд╛рдЙрдВрдбреНрд╕ рдХреЗ рд▓рд┐рдП рдЙрдкрдпреЛрдЧ рдХрд┐рдП рдЬрд╛ рд░рд╣реЗ : рдЖрд╕рдкрд╛рд╕ рдПрдХ рдордЬрдмреВрдд рдЕрд░реНрде рд╣реИ рдФрд░ = рдХрд╛ рдЙрдкрдпреЛрдЧ рдЯрд╛рдЗрдк рдбреЗрдлрд┐рдирд┐рд╢рди рдФрд░ рдЯрд╛рдЗрдк-рдмрд░рд╛рдмрд░-рдЕрдиреНрдп-рдЯрд╛рдЗрдк рдмрд╛рдЙрдВрдбреНрд╕ рдХреЗ рд▓рд┐рдП рдХрд┐рдпрд╛ рдЬрд╛ рд░рд╣рд╛ рд╣реИред

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

  • Foo: Iterator<Item: Bar>
  • Foo: Iterator<Item = impl Bar>

рдЕрдВрдд рдореЗрдВ рдЗрди рджреЛ рд╕реАрдорд╛рдУрдВ рдХрд╛ рдПрдХ рд╣реА рдкреНрд░рднрд╛рд╡ рд╣реЛрддрд╛ рд╣реИ, рд▓реЗрдХрд┐рди (рдореБрдЭреЗ рд▓рдЧрддрд╛ рд╣реИ) рд╕реВрдХреНрд╖реНрдо рд░реВрдк рд╕реЗ рднрд┐рдиреНрди рд╣реИрдВред рдкреВрд░реНрд╡ рдХрд╣рддрд╛ рд╣реИ " Item рдХреЛ рд╡рд┐рд╢реЗрд╖рддрд╛ Bar " рдХреЛ рд▓рд╛рдЧреВ рдХрд░рдирд╛ рдЪрд╛рд╣рд┐рдП, рдЬрдмрдХрд┐ рдмрд╛рдж рд╡рд╛рд▓рд╛ рдХрд╣рддрд╛ рд╣реИ " Item Bar рд▓рд╛рдЧреВ рдХрд░рдиреЗ рд╡рд╛рд▓реЗ рдХрд┐рд╕реА рдкреНрд░рдХрд╛рд░ рдХреЗ рдмрд░рд╛рдмрд░ рд╣реЛрдирд╛ рдЪрд╛рд╣рд┐рдПред

рдореБрдЭреЗ рдПрдХ рдЕрдиреНрдп рдЙрджрд╛рд╣рд░рдг рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдХреЗ рдЗрд╕ рд╡рд┐рдЪрд╛рд░ рдХреЛ рд╕реНрдкрд╖реНрдЯ рдХрд░рдиреЗ рдХрд╛ рдкреНрд░рдпрд╛рд╕ рдХрд░реЗрдВ:

trait Person {
    type Name: Into<String>; // Just a type bound, not a definition!
    // ...
}

struct Alice;

impl Person for Alice {
    type Name = impl Into<String>; // A concrete type definition.
    // ...
}

рд╣рдореЗрдВ рдПрдХ рдЕрд╕реНрддрд┐рддреНрд╡рдЧрдд рдкреНрд░рдХрд╛рд░ рдХреЛ рдХреИрд╕реЗ рдкрд░рд┐рднрд╛рд╖рд┐рдд рдХрд░рдирд╛ рдЪрд╛рд╣рд┐рдП рдЬреЛ Person рдХреЛ рд▓рд╛рдЧреВ рдХрд░рддрд╛ рд╣реИ?

  • type Someone: Person , рдЬреЛ рдПрдХ рдкреНрд░рдХрд╛рд░ рдХреА рдмрд╛рдзреНрдпрддрд╛ рдЬреИрд╕рд╛ рджрд┐рдЦрддрд╛ рд╣реИред
  • type Someone = impl Person , рдЬреЛ рдПрдХ рдкреНрд░рдХрд╛рд░ рдХреА рдкрд░рд┐рднрд╛рд╖рд╛ рдХреА рддрд░рд╣ рджрд┐рдЦрддрд╛ рд╣реИред

@stjepang рдЯрд╛рдЗрдк рдмрд╛рдЙрдВрдб рдХреА рддрд░рд╣ Person for Alice рддрд░рд╣ рд▓рд╛рдЧреВ рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ:

struct Alice;
trait Person          { type Name: Into<String>; ... }
impl Person for Alice { type Name: Into<String>; ... }

рджреЗрдЦреЛ рдорд╛рдБ! рд╡рд┐рд╢реЗрд╖рддрд╛ рдФрд░ рдирд┐рд╣рд┐рддрд╛рд░реНрде рджреЛрдиреЛрдВ рдХреЗ рд▓рд┐рдП { .. } рдЕрдВрджрд░ рдХрд╛ рд╕рд╛рдорд╛рди рд╕рдорд╛рди рд╣реИ, рдЗрд╕рдХрд╛ рдорддрд▓рдм рд╣реИ рдХрд┐ рдЬрд╣рд╛рдВ рддрдХ Name рдХрд╛ рд╕рдВрдмрдВрдз рд╣реИ, рдЖрдк рдЕрдЫреВрддреЗ рд╡рд┐рд╢реЗрд╖рддрд╛ рд╕реЗ рдкрд╛рда рдХреЛ рдХреЙрдкреА рдХрд░ рд╕рдХрддреЗ рд╣реИрдВред

рдПрдХ рд╕рдВрдмрджреНрдз рдкреНрд░рдХрд╛рд░ рдХреЗ рд░реВрдк рдореЗрдВ рдПрдХ рдкреНрд░рдХрд╛рд░ рдХрд╛ рд╕реНрддрд░ рдлрд╝рдВрдХреНрд╢рди рд╣реИ (рдЬрд╣рд╛рдВ рдкрд╣рд▓рд╛ рддрд░реНрдХ Self ), рд╣рдо рдПрдХ рдкреНрд░рдХрд╛рд░ рдХреЗ рдЙрдкрдирд╛рдо рдХреЛ 0-arity рд╕рдВрдмрджреНрдз рдкреНрд░рдХрд╛рд░ рдХреЗ рд░реВрдк рдореЗрдВ рджреЗрдЦ рд╕рдХрддреЗ рд╣реИрдВ, рдЗрд╕рд▓рд┐рдП рдХреБрдЫ рднреА рдЕрдЬреАрдм рдирд╣реАрдВ рд╣реЛ рд░рд╣рд╛ рд╣реИред

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

рд╣рд╛рдВ; рдореБрдЭреЗ рдкрд╣рд▓рд╛ рд╡рд╛рдХреНрдпрд╛рдВрд╢ рдмрд┐рдВрджреБ рдкрд░ рдФрд░ рд╕реНрд╡рд╛рднрд╛рд╡рд┐рдХ рд▓рдЧрддрд╛ рд╣реИред :)

@ рд╕реЗрдВрдЯреНрд░рд▓ рд╣реЗрд╣ред рдХреНрдпрд╛ рдЗрд╕рдХрд╛ рдорддрд▓рдм рд╣реИ рдХрд┐ type Thing; рдЕрдХреЗрд▓реЗ рдПрдХ рдЕрдореВрд░реНрдд рдкреНрд░рдХрд╛рд░ рдХреЛ рдкреЗрд╢ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдкрд░реНрдпрд╛рдкреНрдд рд╣реИ?

trait Neg           { type Output; fn neg(self) -> Self::Output; }
impl Neg for MyType { type Output; fn neg(self) -> Self::Output { self } }

@kennytm рдореБрдЭреЗ рд▓рдЧрддрд╛ рд╣реИ рдХрд┐ рдпрд╣ рддрдХрдиреАрдХреА рд░реВрдк рд╕реЗ рд╕рдВрднрд╡ рд╣реИ; рд▓реЗрдХрд┐рди рдЖрдк рдкреВрдЫ рд╕рдХрддреЗ рд╣реИрдВ рдХрд┐ рдХреНрдпрд╛ рдпрд╣ рд╡рд╛рдВрдЫрдиреАрдп рд╣реИ рдпрд╛ рдирд╣реАрдВ, рдпрд╣ рдирд┐рд╣рд┐рдд/рд╕реНрдкрд╖реНрдЯ рдкрд░ рдЕрдкрдиреЗ рд╡рд┐рдЪрд╛рд░реЛрдВ рдкрд░ рдирд┐рд░реНрднрд░ рдХрд░рддрд╛ рд╣реИред рдЙрд╕ рд╡рд┐рд╢реЗрд╖ рдорд╛рдорд▓реЗ рдореЗрдВ рдореБрдЭреЗ рд▓рдЧрддрд╛ рд╣реИ рдХрд┐ рдпрд╣ рд▓рд┐рдЦрдиреЗ рдХреЗ рд▓рд┐рдП рддрдХрдиреАрдХреА рд░реВрдк рд╕реЗ рдкрд░реНрдпрд╛рдкреНрдд рд╣реЛрдЧрд╛:

trait Neg           { type Output; fn neg(self) -> Self::Output; }
impl Neg for MyType { fn neg(self) -> Self::Output { self } }

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

рдореБрдЭреЗ рд▓рдЧрддрд╛ рд╣реИ рдХрд┐ рдпрд╣ рд╕рдм рдкрдврд╝рдиреЗ рдХреЗ рдмрд╛рдж, рдореИрдВ @Centril рд╕реЗ рдЕрдзрд┐рдХ рд╕рд╣рдордд рд╣реВрдВред рдЬрдм рдореИрдВ type Foo = impl Bar рджреЗрдЦрддрд╛ рд╣реВрдВ рддреЛ рдореБрдЭреЗ рд▓рдЧрддрд╛ рд╣реИ рдХрд┐ Foo рдПрдХ рд╡рд┐рд╢реЗрд╖ рдкреНрд░рдХрд╛рд░ рд╣реИ, рдЬреИрд╕реЗ рдЕрдиреНрдп рдЙрдкрдирд╛рдореЛрдВ рдХреЗ рд╕рд╛рдеред рд▓реЗрдХрд┐рди рдпрд╣ рдирд╣реАрдВ рд╣реИред рдЗрд╕ рдЙрджрд╛рд╣рд░рдг рдкрд░ рд╡рд┐рдЪрд╛рд░ рдХрд░реЗрдВ:

type Displayable = impl Display;

fn foo() -> Displayable { "hi" }
fn bar() -> Displayable { 42 }

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

рдХреБрдЫ рд▓реЛрдЧреЛрдВ рдиреЗ рдЙрд▓реНрд▓реЗрдЦ рдХрд┐рдпрд╛ рдХрд┐ type Foo: Bar "рдЕрдкреВрд░реНрдг" рд▓рдЧрддрд╛ рд╣реИред рдореЗрд░реЗ рд▓рд┐рдП рдпрд╣ рдЕрдЪреНрдЫреА рдмрд╛рдд рд╣реИред рдХреБрдЫ рдЕрд░реНрдереЛрдВ рдореЗрдВ Foo рдЕрдзреВрд░рд╛ рд╣реИ; рд╣рдо рдирд╣реАрдВ рдЬрд╛рдирддреЗ рдХрд┐ рдпрд╣ рдХреНрдпрд╛ рд╣реИ, рд▓реЗрдХрд┐рди рд╣рдо рдЬрд╛рдирддреЗ рд╣реИрдВ рдХрд┐ рдпрд╣ Bar рд╕рдВрддреБрд╖реНрдЯ рдХрд░рддрд╛ рд╣реИред

@ рдорд╛рд░реНрдХ-рдЗрдо

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

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

рдХреНрдпрд╛ рдХреЛрдИ рдХрд╛рд░рдг рд╣реИ рдХрд┐ Displayable рдПрдХ рдареЛрд╕ рдкреНрд░рдХрд╛рд░ рдХреЗ рдмрдЬрд╛рдп impl Display рд▓рд┐рдП рдПрдХ рд╢реЙрд░реНрдЯрд╣реИрдВрдб рд╣реЛрдЧрд╛? рдХреНрдпрд╛ рдЗрд╕ рддрд░рд╣ рдХрд╛ рд╡реНрдпрд╡рд╣рд╛рд░ рднреА рдЙрдкрдпреЛрдЧреА рд╣реИ, рдпрд╣ рджреЗрдЦрддреЗ рд╣реБрдП рдХрд┐ рд╡рд┐рд╢реЗрд╖рддрд╛ рдЙрдкрдирд╛рдо (рдЯреНрд░реИрдХрд┐рдВрдЧ рд╕рдорд╕реНрдпрд╛: https://github.com/rust-lang/rust/issues/41517) рдХрд╛ рдЙрдкрдпреЛрдЧ рдЗрд╕реА рддрд░рд╣ рдХрд┐рдпрд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИ? рдЙрджрд╛рд╣рд░рдг:

trait Displayable = Display;

fn foo() -> impl Displayable { "hi" }
fn bar() -> impl Displayable { 42 }

@ рдорд╛рд░реНрдХ-рдЗрдо

type Displayable = impl Display;

fn foo() -> Displayable { "hi" }
fn bar() -> Displayable { 42 }

рдпрд╣ рдПрдХ рд╡реИрдз рдЙрджрд╛рд╣рд░рдг рдирд╣реАрдВ рд╣реИред RFC 2071 рдореЗрдВ рдЕрд╕реНрддрд┐рддреНрд╡ рдХреЗ рдкреНрд░рдХрд╛рд░реЛрдВ рдкрд░ рд╕рдВрджрд░реНрдн рдЕрдиреБрднрд╛рдЧ рд╕реЗ:

existential type Foo = impl Debug;

Foo рдХрд╛ рдЙрдкрдпреЛрдЧ рдкреВрд░реЗ рдореЙрдбреНрдпреВрд▓ рдореЗрдВ рдХрдИ рд╕реНрдерд╛рдиреЛрдВ рдкрд░ i32 рд░реВрдк рдореЗрдВ рдХрд┐рдпрд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИред рд╣рд╛рд▓рд╛рдВрдХрд┐, рдкреНрд░рддреНрдпреЗрдХ рд╕рдорд╛рд░реЛрд╣ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рддрд╛ рд╣реИ Foo рдХреЗ рд░реВрдк рдореЗрдВ i32 рдЪрд╛рд╣рд┐рдП рд╕реНрд╡рддрдВрддреНрд░ рд░реВрдк рд╕реЗ рдЬрдЧрд╣ рдкрд░ рдмрд╛рдзрд╛рдУрдВ Foo рдРрд╕реА рд╣реИ рдХрд┐ рдпрд╣ рд╣реЛрдирд╛ рдЪрд╛рд╣рд┐рдП i32

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

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

рдореБрдЭреЗ рд▓рдЧрддрд╛ рд╣реИ рдХрд┐ рдЖрдкрдХрд╛ рдЙрджрд╛рд╣рд░рдг expected type `&'static str` but found type `i32` рдХреА рд╡рд╛рдкрд╕реА рдкрд░ bar рдЬреИрд╕рд╛ рдХреБрдЫ рджреЗрдЧрд╛, рдХреНрдпреЛрдВрдХрд┐ foo рдкрд╣рд▓реЗ рд╕реЗ рд╣реА Displayable рд╕реЗ &'static str рдХреЗ рдареЛрд╕ рдкреНрд░рдХрд╛рд░ рдХреЛ рд╕реЗрдЯ рдХрд░ рдЪреБрдХрд╛ рд╣реЛрдЧрд╛

рд╕рдВрдкрд╛рджрд┐рдд рдХрд░реЗрдВ: рдЬрдм рддрдХ рдЖрдк рдЗрд╕ рдЕрдВрддрд░реНрдЬреНрдЮрд╛рди рд╕реЗ рдирд╣реАрдВ рдЖ рд░рд╣реЗ рд╣реИрдВ рдХрд┐

type Displayable = impl Display;

fn foo() -> Displayable { "hi" }
fn bar() -> Displayable { 42 }

рдХреЗ рдмрд░рд╛рдмрд░ рд╣реИ

fn foo() -> impl Display { "hi" }
fn bar() -> impl Display { 42 }

рдореЗрд░реА рдЕрдкреЗрдХреНрд╖рд╛ рдХреЗ рдмрдЬрд╛рдп

existential type _0 = impl Display;
type Displayable = _0;

fn foo() -> Displayable { "hi" }
fn bar() -> Displayable { 42 }

рдореБрдЭреЗ рд▓рдЧрддрд╛ рд╣реИ рдХрд┐ рдЙрди рджреЛ рд╡реНрдпрд╛рдЦреНрдпрд╛рдУрдВ рдореЗрдВ рд╕реЗ рдХреМрди рд╕реА рд╕рд╣реА рд╣реИ, рдпрд╣ RFC рдкрд░ рдирд┐рд░реНрднрд░ рд╣реЛ рд╕рдХрддрд╛ рд╣реИ рдХрд┐ @Centril рд▓рд┐рдЦ рд░рд╣рд╛ рд╣реЛрдЧрд╛ред

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

рдореБрдЭреЗ рд▓рдЧрддрд╛ рд╣реИ рдХрд┐ рдЙрди рджреЛ рд╡реНрдпрд╛рдЦреНрдпрд╛рдУрдВ рдореЗрдВ рд╕реЗ рдХреМрди рд╕реА рд╕рд╣реА рд╣реИ, рдпрд╣ RFC рдкрд░ рдирд┐рд░реНрднрд░ рд╣реЛ рд╕рдХрддрд╛ рд╣реИ рдХрд┐ @Centril рд▓рд┐рдЦ рд░рд╣рд╛ рд╣реЛрдЧрд╛ред

type Displayable = impl Display; рдореМрдЬреВрдж рд╣реЛрдиреЗ рдХрд╛ рдХрд╛рд░рдг рдпрд╣ рд╣реИ рдХрд┐ рдпрд╣ рдПрдХ рд╡рд┐рд╢реЗрд╖ рдкреНрд░рдХрд╛рд░ рдХреЗ рд▓рд┐рдП рдПрдХ рдЙрдкрдирд╛рдо рд╣реИред
https://github.com/rust-lang/rfcs/issues/1738 рджреЗрдЦреЗрдВ, рдпрд╣ рд╡рд╣ рд╕рдорд╕реНрдпрд╛ рд╣реИ рдЬрд┐рд╕реЗ рдпрд╣ рд╕реБрд╡рд┐рдзрд╛ рд╣рд▓ рдХрд░рддреА рд╣реИред

@ Nemo157 рдЖрдкрдХреА рдЕрдкреЗрдХреНрд╖рд╛ рд╕рд╣реА рд╣реИред :)

рдирд┐рдореНрдирд▓рд┐рдЦрд┐рдд:

type Foo = (impl Bar, impl Bar);
type Baz = impl Bar;

рдХреЗ рд▓рд┐рдП рд╡рд┐рд╕рд░реНрдЬрд┐рдд рдХрд┐рдпрд╛ рдЬрд╛рдПрдЧрд╛:

/* existential */ type _0: Bar;
/* existential */ type _1: Bar;
type Foo = (_0, _1);

/* existential */ type _2: Bar;
type Baz = _2;

рдЬрд╣рд╛рдВ _0 , _1 рдФрд░ _2 рд╕рднреА рдирд╛рдордорд╛рддреНрд░ рдХреЗ рдЕрд▓рдЧ-рдЕрд▓рдЧ рдкреНрд░рдХрд╛рд░ рд╣реИрдВ рдЗрд╕рд▓рд┐рдП Id<_0, _1> , Id<_0, _2> , Id<_1, _2> (рдФрд░ рд╕рдордорд┐рдд рдЙрджрд╛рд╣рд░рдг) рд╕рднреА рдирд┐рд░реНрдЬрди рд╣реИрдВ, рдЬрд╣рд╛рдВ Id рдХреЛ ref рдореЗрдВ рдкрд░рд┐рднрд╛рд╖рд┐рдд рдХрд┐рдпрд╛

рдЕрд╕реНрд╡реАрдХрд░рдг: рдореИрдВрдиреЗ (рд╕реНрд╡реЗрдЪреНрдЫрд╛ рд╕реЗ) рдЖрд░рдПрдлрд╕реА рдирд╣реАрдВ рдкрдврд╝рд╛ рд╣реИ (рд▓реЗрдХрд┐рди рдкрддрд╛ рд╣реИ рдХрд┐ рдпрд╣ рдХрд┐рд╕ рдмрд╛рд░реЗ рдореЗрдВ рд╣реИ), рддрд╛рдХрд┐ рдореИрдВ рд╕рд┐рдВрдЯреИрдХреНрд╕ рдХреЗ рд╕рд╛рде "рд╕рд╣рдЬ" рдорд╣рд╕реВрд╕ рдХрд░рдиреЗ рдкрд░ рдЯрд┐рдкреНрдкрдгреА рдХрд░ рд╕рдХреВрдВред

type Foo: Trait рд╕рд┐рдВрдЯреИрдХреНрд╕ рдХреЗ рд▓рд┐рдП, рдореИрдВ рдкреВрд░реА рддрд░рд╣ рд╕реЗ рдЗрд╕ рддрд░рд╣ рдХреБрдЫ рд╕рдВрднрд╡ рд╣реЛрдиреЗ рдХреА рдЙрдореНрдореАрдж рдХрд░рддрд╛ рд╣реВрдВ:

trait Trait {
    type Foo: Display;
    type Foo: Debug;
}

рдЙрд╕реА рддрд░рд╣ рд╕реЗ where Foo: Display, Foo: Debug рд╡рд░реНрддрдорд╛рди рдореЗрдВ рд╕рдВрднрд╡ рд╣реИред

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

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

@ рдПрдХреНрд▓реЛрдЧ

type Foo: Trait рд╕рд┐рдВрдЯреИрдХреНрд╕ рдХреЗ рд▓рд┐рдП, рдореИрдВ рдкреВрд░реА рддрд░рд╣ рд╕реЗ рдЗрд╕ рддрд░рд╣ рдХреБрдЫ рд╕рдВрднрд╡ рд╣реЛрдиреЗ рдХреА рдЙрдореНрдореАрдж рдХрд░рддрд╛ рд╣реВрдВ:

рд╣реЛ рд╕рдХрддрд╛ рд╣реИред рд╡реЗ "рдкреНрд░рдХрд╛рд░ рдХреЗ рдЙрдкрдирд╛рдо" рд╕рдВрдмрджреНрдз рдкреНрд░рдХрд╛рд░реЛрдВ рдХреА рдШреЛрд╖рдгрд╛ рдХрд░рддреЗ рд╣реИрдВ (рдкреНрд░рдХрд╛рд░ рдХреЗ рдЙрдкрдирд╛рдореЛрдВ рдХреА рд╡реНрдпрд╛рдЦреНрдпрд╛ 0-рдЖрд░реА рдкреНрд░рдХрд╛рд░ рдХреЗ рд╕реНрддрд░ рдХреЗ рдХрд╛рд░реНрдпреЛрдВ рдХреЗ рд░реВрдк рдореЗрдВ рдХреА рдЬрд╛ рд╕рдХрддреА рд╣реИ рдЬрдмрдХрд┐ рд╕рдВрдмрдВрдзрд┐рдд рдкреНрд░рдХрд╛рд░ 1+ -рд░реА рдкреНрд░рдХрд╛рд░ рдХреЗ рд╕реНрддрд░ рдХреЗ рдХрд╛рд░реНрдп рд╣реИрдВ)ред рдмреЗрд╢рдХ рдЖрдкрдХреЗ рдкрд╛рд╕ рдПрдХ рд╣реА рдирд╛рдо рдХреЗ рд╕рд╛рде рдПрдХ рд╕реЗ рдЕрдзрд┐рдХ рд╕рдВрдмрджреНрдз рдкреНрд░рдХрд╛рд░ рдирд╣реАрдВ рд╣реЛ рд╕рдХрддреЗ рд╣реИрдВ, рдЬреЛ рдПрдХ рдореЙрдбреНрдпреВрд▓ рдореЗрдВ рдПрдХ рд╣реА рдирд╛рдо рдХреЗ рд╕рд╛рде рджреЛ рдкреНрд░рдХрд╛рд░ рдХреЗ рдЙрдкрдирд╛рдореЛрдВ рдХреЛ рдкрд░рд┐рднрд╛рд╖рд┐рдд рдХрд░рдиреЗ рдХреА рдХреЛрд╢рд┐рд╢ рдХрд░рдиреЗ рдЬреИрд╕рд╛ рд╣реЛрдЧрд╛ред impl , type Foo: Bar рднреА рдЕрд╕реНрддрд┐рддреНрд╡рдЧрдд рдкрд░рд┐рдорд╛рдгреАрдХрд░рдг рд╕реЗ рдореЗрд▓ рдЦрд╛рддрд╛ рд╣реИред

рдУрд╣, рдФрд░ рдореБрдЭреЗ рд▓рдЧрддрд╛ рд╣реИ рдХрд┐ рд░рд╕реНрдЯ рдХреЗ рдкрд╛рд╕ рдЬрд┐рддрдирд╛ рдЕрдзрд┐рдХ рд╕рд┐рдВрдЯреИрдХреНрд╕ рд╣реЛрдЧрд╛, рдЗрд╕реЗ рд╕реАрдЦрдирд╛ рдЙрддрдирд╛ рд╣реА рдХрдард┐рди рд╣реЛрдЧрд╛ред

рджреЛрдиреЛрдВ рд╡рд╛рдХреНрдпрд╡рд┐рдиреНрдпрд╛рд╕ рдкрд╣рд▓реЗ рд╕реЗ рд╣реА рдЙрдкрдпреЛрдЧ рдХрд┐рдП рдЬрд╛ рд░рд╣реЗ рд╣реИрдВред type Foo: Bar; рдкрд╣рд▓реЗ рд╕реЗ рд╣реА рд▓рдХреНрд╖рдгреЛрдВ рдореЗрдВ рдХрд╛рдиреВрдиреА рд╣реИ, рдФрд░ рд╕рд╛рд░реНрд╡рднреМрдорд┐рдХ рдкрд░рд┐рдорд╛рдгреАрдХрд░рдг рдХреЗ рд▓рд┐рдП рднреА Foo: Bar рдЬрд╣рд╛рдВ Foo рдПрдХ рдкреНрд░рдХрд╛рд░ рдЪрд░ рд╣реИред impl Trait рдХрд╛ рдЙрдкрдпреЛрдЧ рд░рд┐рдЯрд░реНрди рд╕реНрдерд┐рддрд┐ рдореЗрдВ рдЕрд╕реНрддрд┐рддреНрд╡рдЧрдд рдкрд░рд┐рдорд╛рдгреАрдХрд░рдг рдФрд░ рддрд░реНрдХ рд╕реНрдерд┐рддрд┐ рдореЗрдВ рд╕рд╛рд░реНрд╡рднреМрдорд┐рдХ рдкрд░рд┐рдорд╛рдгреАрдХрд░рдг рдХреЗ рд▓рд┐рдП рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИред рджреЛрдиреЛрдВ рдкреНрд▓рдЧ рдХреЛ рднрд╛рд╖рд╛ рдореЗрдВ рд╕рдВрдЧрддрд┐ рдЕрдВрддрд░рд╛рд▓ рдХреА рдЕрдиреБрдорддрд┐ рджреЗрдирд╛ред рд╡реЗ рд╡рд┐рднрд┐рдиреНрди рдкрд░рд┐рджреГрд╢реНрдпреЛрдВ рдХреЗ рд▓рд┐рдП рднреА рдЗрд╖реНрдЯрддрдо рд╣реИрдВ, рдФрд░ рдЗрд╕рд▓рд┐рдП рджреЛрдиреЛрдВ рдЖрдкрдХреЛ рд╡реИрд╢реНрд╡рд┐рдХ рдЗрд╖реНрдЯрддрдо рдкреНрд░рджрд╛рди рдХрд░рддреЗ рд╣реИрдВред

рдЗрд╕рдХреЗ рдЕрд▓рд╛рд╡рд╛, рд╢реБрд░реБрдЖрдд рдХрд░рдиреЗ рд╡рд╛рд▓реЗ рдХреЛ type Foo = (impl Bar, impl Baz); рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реЛрдиреЗ рдХреА рд╕рдВрднрд╛рд╡рдирд╛ рдирд╣реАрдВ рд╣реИред рдЕрдзрд┐рдХрд╛рдВрд╢ рдЙрдкрдпреЛрдЧ рд╕рдВрднрд╡рддрдГ type Foo: Bar; ред

RFC 2071 рдХреЗ рд▓рд┐рдП рдореВрд▓ рдкреБрд▓ рдЕрдиреБрд░реЛрдз рдореЗрдВ рдПрдХ typeof рдХреАрд╡рд░реНрдб рдХрд╛ рдЙрд▓реНрд▓реЗрдЦ рд╣реИ рдЬреЛ рдЗрд╕ рдЪрд░реНрдЪрд╛ рдореЗрдВ рдкреВрд░реА рддрд░рд╣ рд╕реЗ рдЦрд╛рд░рд┐рдЬ рдХрд░ рджрд┐рдпрд╛ рдЧрдпрд╛ рд▓рдЧрддрд╛ рд╣реИред рдореБрдЭреЗ рд▓рдЧрддрд╛ рд╣реИ рдХрд┐ рд╡рд░реНрддрдорд╛рди рдореЗрдВ рдкреНрд░рд╕реНрддрд╛рд╡рд┐рдд рд╡рд╛рдХреНрдпрд╡рд┐рдиреНрдпрд╛рд╕ рдмрд▓реНрдХрд┐ рдирд┐рд╣рд┐рдд рд╣реИ, рдЬрд┐рд╕рдореЗрдВ рд╕рдВрдХрд▓рдХ рдФрд░ рдХреЛрдИ рднреА рдорд╛рдирд╡ рд╣реИ рдЬреЛ рдареЛрд╕ рдкреНрд░рдХрд╛рд░ рдХреЗ рд▓рд┐рдП рдХреЛрдб рдЦреЛрдЬ рдХреЛ рдкрдврд╝рддрд╛ рд╣реИред

рдореИрдВ рдкрд╕рдВрдж рдХрд░реВрдВрдЧрд╛ рдЕрдЧрд░ рдЗрд╕реЗ рд╕реНрдкрд╖реНрдЯ рдХрд┐рдпрд╛ рдЬрд╛рдПред рддреЛ рдЗрд╕рдХреЗ рдмрдЬрд╛рдп

type Foo = impl SomeTrait;
fn foo_func() -> Foo { ... }

рд╣рдо рд▓рд┐рдЦреЗрдВрдЧреЗ

fn foo_func() -> impl SomeTrait { ... }
type Foo = return_type_of(foo_func);

(рд░рд┐рдЯрд░реНрди_рдЯрд╛рдЗрдк_рдСрдл рдХреЗ рдирд╛рдо рд╕реЗ рдмрд╛рдЗрдХ рд╢реЗрдб рдХрд┐рдпрд╛ рдЬрд╛рдирд╛ рд╣реИ), рдпрд╛ рдпрд╣рд╛рдВ рддрдХ тАЛтАЛрдХрд┐

fn foo_func() -> impl SomeTrait as Foo { ... }

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

trait Bar
{
    type Assoc: SomeTrait;
    fn func() -> Assoc;
}

impl Bar for SomeType
{
    type Assoc = return_type_of(Self::func);
    fn func() -> Assoc { ... }
}

рдпрд╛ рдФрд░ рднреА

impl Bar for SomeType
{
    fn func() -> impl SomeTrait as Self::Assoc { ... }
}

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

@рд╕реЗрдВрдЯреНрд░рд┐рд▓

рд╣реЛ рд╕рдХрддрд╛ рд╣реИред рд╡реЗ "рдкреНрд░рдХрд╛рд░ рдХреЗ рдЙрдкрдирд╛рдо" рд╕рдВрдмрджреНрдз рдкреНрд░рдХрд╛рд░реЛрдВ рдХреА рдШреЛрд╖рдгрд╛ рдХрд░рддреЗ рд╣реИрдВ (рдкреНрд░рдХрд╛рд░ рдХреЗ рдЙрдкрдирд╛рдореЛрдВ рдХреА рд╡реНрдпрд╛рдЦреНрдпрд╛ 0-рдЖрд░реА рдкреНрд░рдХрд╛рд░ рдХреЗ рд╕реНрддрд░ рдХреЗ рдХрд╛рд░реНрдпреЛрдВ рдХреЗ рд░реВрдк рдореЗрдВ рдХреА рдЬрд╛ рд╕рдХрддреА рд╣реИ рдЬрдмрдХрд┐ рд╕рдВрдмрдВрдзрд┐рдд рдкреНрд░рдХрд╛рд░ 1+ -рд░реА рдкреНрд░рдХрд╛рд░ рдХреЗ рд╕реНрддрд░ рдХреЗ рдХрд╛рд░реНрдп рд╣реИрдВ)ред рдмреЗрд╢рдХ рдЖрдкрдХреЗ рдкрд╛рд╕ рдПрдХ рд╣реА рдирд╛рдо рдХреЗ рд╕рд╛рде рдПрдХ рд╕реЗ рдЕрдзрд┐рдХ рд╕рдВрдмрджреНрдз рдкреНрд░рдХрд╛рд░ рдирд╣реАрдВ рд╣реЛ рд╕рдХрддреЗ рд╣реИрдВ, рдЬреЛ рдПрдХ рдореЙрдбреНрдпреВрд▓ рдореЗрдВ рдПрдХ рд╣реА рдирд╛рдо рдХреЗ рд╕рд╛рде рджреЛ рдкреНрд░рдХрд╛рд░ рдХреЗ рдЙрдкрдирд╛рдореЛрдВ рдХреЛ рдкрд░рд┐рднрд╛рд╖рд┐рдд рдХрд░рдиреЗ рдХреА рдХреЛрд╢рд┐рд╢ рдХрд░рдиреЗ рдЬреИрд╕рд╛ рд╣реЛрдЧрд╛ред рдПрдХ рдЗрдореНрдкреНрд▓рд╛рдВрдЯ рдореЗрдВ, рдЯрд╛рдЗрдк рдХрд░реЗрдВ рдлреВ: рдмрд╛рд░ рднреА рдЕрд╕реНрддрд┐рддреНрд╡рдЧрдд рдкрд░рд┐рдорд╛рдгреАрдХрд░рдг рд╕реЗ рдореЗрд▓ рдЦрд╛рддрд╛ рд╣реИред

(рдХреНрд╖рдорд╛ рдХрд░реЗрдВ, рдореЗрд░рд╛ рдорддрд▓рдм рдЗрд╕реЗ impl Trait for Struct рдореЗрдВ рд░рдЦрдирд╛ рдерд╛, рди рдХрд┐ trait Trait )

рдореБрдЭреЗ рдЦреЗрдж рд╣реИ, рдореБрдЭреЗ рдпрдХреАрди рдирд╣реАрдВ рд╣реИ рдХрд┐ рдореИрдВ рд╕рдордЭрддрд╛ рд╣реВрдБред рдореИрдВ рдЬреЛ рдХрд╣рдиреЗ рдХреА рдХреЛрд╢рд┐рд╢ рдХрд░рддрд╛ рд╣реВрдВ, рд╡рд╣ рдореЗрд░реЗ рд▓рд┐рдП рдХреЛрдб рдЬреИрд╕рд╛ рд╣реИ

impl Trait for Struct {
    type Type: Debug;
    type Type: Display;

    fn foo() -> Self::Type { 42 }
}

(рдкреВрд░реНрдг рд╕рдВрд╕реНрдХрд░рдг рдХреЗ рд▓рд┐рдП рдЦреЗрд▓ рдХрд╛ рдореИрджрд╛рди рд▓рд┐рдВрдХ)
рдРрд╕рд╛ рд▓рдЧрддрд╛ рд╣реИ рдХрд┐ рдЗрд╕реЗ рдХрд╛рдо рдХрд░рдирд╛ рдЪрд╛рд╣рд┐рдПред

рдХреНрдпреЛрдВрдХрд┐ рдпрд╣ рд╕рд┐рд░реНрдл Type рдкрд░ рджреЛ рд╕реАрдорд╛рдПрдВ рд▓рдЧрд╛ рд░рд╣рд╛ рд╣реИ, рдареАрдХ рдЙрд╕реА рддрд░рд╣ рдЬреИрд╕реЗ where Type: Debug, Type: Display work ред

рдЗрд╕ рдЕрдиреБрдорддрд┐ рджреА рдЬрд╛ рдирд╣реАрдВ рд╣реИ (рдореИрдВ рдХреНрдпрд╛ рджреНрд╡рд╛рд░рд╛ "рдмреЗрд╢рдХ рдЖрдк рдПрдХ рд╡рд┐рд╢реЗрд╖рддрд╛ рдореЗрдВ рдПрдХ рд╣реА рдирд╛рдо рдХреЗ рд╕рд╛рде рдХрдИ рд╕рдВрдмрджреНрдз рдкреНрд░рдХрд╛рд░ рдирд╣реАрдВ рд╣реЛ рд╕рдХрддрд╛" рд╕рдордЭрдиреЗ рдХреЗ рд▓рд┐рдП рд▓рдЧ рд░рд╣реЗ рд╣реИрдВ? рд▓реЗрдХрд┐рди рд▓рд┐рдЦрд┐рдд рд░реВрдк рдореЗрдВ рдореЗрд░реА рддреНрд░реБрдЯрд┐ рджрд┐рдпрд╛ trait Trait рдХреЗ рдмрдЬрд╛рдп impl Trait for Struct рдореБрдЭреЗ рдпрдХреАрди рдирд╣реАрдВ рд╣реИ), рддреЛ рдореБрдЭреЗ рд▓рдЧрддрд╛ рд╣реИ рдХрд┐ рдпрд╣ type Type: Trait рд╕рд┐рдВрдЯреИрдХреНрд╕ рдХреЗ рд╕рд╛рде рдПрдХ рд╕рдорд╕реНрдпрд╛ рд╣реИред

рдлрд┐рд░, trait рдШреЛрд╖рдгрд╛ рдХреЗ рдЕрдВрджрд░, рд╕рд┐рдВрдЯреИрдХреНрд╕ рдкрд╣рд▓реЗ рд╕реЗ рд╣реА type Type: Trait , рдФрд░ рдХрдИ рдкрд░рд┐рднрд╛рд╖рд╛рдУрдВ рдХреА рдЕрдиреБрдорддрд┐ рдирд╣реАрдВ рджреЗрддрд╛ рд╣реИред рддреЛ рдореБрдЭреЗ рд▓рдЧрддрд╛ рд╣реИ рдХрд┐ рд╢рд╛рдпрдж рдпрд╣ рдирд╛рд╡ рдмрд╣реБрдд рдкрд╣рд▓реЗ рд╣реА рд░рд╡рд╛рдирд╛ рд╣реЛ рдЪреБрдХреА рд╣реИтАж

рд╣рд╛рд▓рд╛рдБрдХрд┐, рдЬреИрд╕рд╛ рдХрд┐ @stjepang рдФрд░ @joshtriplett рджреНрд╡рд╛рд░рд╛ рдКрдкрд░ рдмрддрд╛рдпрд╛ рдЧрдпрд╛ рд╣реИ, type Type: Trait рдЕрдзреВрд░рд╛ рд▓рдЧрддрд╛ рд╣реИред рдФрд░ рдЬрдмрдХрд┐ рдпрд╣ trait рдШреЛрд╖рдгрд╛рдУрдВ рдореЗрдВ рд╕рдордЭ рдореЗрдВ рдЖрддрд╛ рд╣реИ (рдпрд╣ рд╡рд╛рд╕реНрддрд╡ рдореЗрдВ рдЕрдкреВрд░реНрдг рд╣реЛрдиреЗ рдХреЗ рд▓рд┐рдП рдбрд┐рдЬрд╝рд╛рдЗрди рдХрд┐рдпрд╛ рдЧрдпрд╛ рд╣реИ, рднрд▓реЗ рд╣реА рдпрд╣ рдЕрдЬреАрдм рд╣реИ рдХрд┐ рдпрд╣ рдПрдХрд╛рдзрд┐рдХ рдкрд░рд┐рднрд╛рд╖рд╛рдУрдВ рдХреА рдЕрдиреБрдорддрд┐ рдирд╣реАрдВ рджреЗрддрд╛ рд╣реИ), рдпрд╣ impl Trait рдмреНрд▓реЙрдХ рдореЗрдВ рд╕рдордЭ рдореЗрдВ рдирд╣реАрдВ рдЖрддрд╛ рд╣реИ , рдЬрд╣рд╛рдВ рдкреНрд░рдХрд╛рд░ рдирд┐рд╢реНрдЪрд┐рдд рд░реВрдк рд╕реЗ рдЬреНрдЮрд╛рдд рд╣реЛрдирд╛ рдЪрд╛рд╣рд┐рдП (рдФрд░ рд╡рд░реНрддрдорд╛рди рдореЗрдВ рдХреЗрд╡рд▓ type Type = RealType рд░реВрдк рдореЗрдВ рд▓рд┐рдЦрд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИ)

impl Trait рдХрд╛ рдЙрдкрдпреЛрдЧ рд░рд┐рдЯрд░реНрди рд╕реНрдерд┐рддрд┐ рдореЗрдВ рдЕрд╕реНрддрд┐рддреНрд╡рдЧрдд рдкрд░рд┐рдорд╛рдгреАрдХрд░рдг рдФрд░ рддрд░реНрдХ рд╕реНрдерд┐рддрд┐ рдореЗрдВ рд╕рд╛рд░реНрд╡рднреМрдорд┐рдХ рдкрд░рд┐рдорд╛рдгреАрдХрд░рдг рдХреЗ рд▓рд┐рдП рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИред

рд╣рд╛рдВ, рдореИрдВрдиреЗ рдЗрд╕реЗ рд▓рд┐рдЦрддреЗ рд╕рдордп рддрд░реНрдХ рдХреА рд╕реНрдерд┐рддрд┐ рдореЗрдВ impl Trait рдмрд╛рд░реЗ рдореЗрдВ рднреА рд╕реЛрдЪрд╛ рдерд╛, рдФрд░ рдореБрдЭреЗ рдЖрд╢реНрдЪрд░реНрдп рд╣реБрдЖ рдХрд┐ рдХреНрдпрд╛ рдореБрдЭреЗ рдХрд╣рдирд╛ рдЪрд╛рд╣рд┐рдП рдХрд┐ рдореИрдВ рддрд░реНрдХ рд╕реНрдерд┐рддрд┐ рдореЗрдВ impl Trait рд▓рд┐рдП рдЙрд╕реА рддрд░реНрдХ рдХрд╛ рд╕рдорд░реНрдерди рдХрд░рддрд╛, рдореБрдЭреЗ рдкрддрд╛ рдерд╛ рдХрд┐ рдпрд╣ рд╕реНрдерд┐рд░реАрдХрд░рдг рдХреЗ рджреМрд░ рд╕реЗ рдЧреБрдЬрд░ рд░рд╣рд╛ рдерд╛ . рдЙрд╕рдиреЗ рдХрд╣рд╛ рдХрд┐ рдореБрдЭреЗ рд▓рдЧрддрд╛ рд╣реИ рдХрд┐ рдЗрд╕ рдмрд╣рд╕ рдХреЛ рдлрд┐рд░ рд╕реЗ рдкреНрд░рдЬреНрд╡рд▓рд┐рдд рди рдХрд░рдирд╛ рдмреЗрд╣рддрд░ рд╣реЛрдЧрд╛ :)

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

рдЗрд╖реНрдЯрддрдо рдФрд░ рд╕рд░рд▓рддрд╛

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

impl Trait рдФрд░ :

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

рдПрдХ рд╢реБрд░реБрдЖрдд рдХрд░рдиреЗ рд╡рд╛рд▓реЗ рдХреА рдХрд▓реНрдкрдирд╛ рдХрд░реЗрдВ рдЬрд┐рд╕рдиреЗ рд╣рдореЗрд╢рд╛ type Type: Trait рдХреЛ рдЕрдкрдиреЗ рдкрд╣рд▓реЗ type Type = impl Trait ред рд╡реЗ рд╢рд╛рдпрдж рдЕрдиреБрдорд╛рди рд▓рдЧрд╛ рд╕рдХрддреЗ рд╣реИрдВ рдХрд┐ рдХреНрдпрд╛ рд╣реЛ рд░рд╣рд╛ рд╣реИ, рд▓реЗрдХрд┐рди рдореБрдЭреЗ рдкреВрд░рд╛ рдпрдХреАрди рд╣реИ рдХрд┐ "рдбрдмреНрд▓реНрдпреВрдЯреАрдПрдл рдХреНрдпрд╛ рд╡рд╣ рд╣реИ? рдореИрдВ рд╡рд░реНрд╖реЛрдВ рд╕реЗ рд░рд╕реНрдЯ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░ рд░рд╣рд╛ рд╣реВрдВ рдФрд░ рдЕрднреА рднреА рд╕рд┐рдВрдЯреИрдХреНрд╕ рд╣реИ рдЬреЛ рдореИрдВрдиреЗ рдХрднреА рдирд╣реАрдВ рджреЗрдЦрд╛?"ред рдЬреЛ рдХрдореЛрдмреЗрд╢ рд╡рд╣ рдЬрд╛рд▓ рд╣реИ рдЬрд┐рд╕рдореЗрдВ C++ рдЧрд┐рд░ рдЧрдпрд╛ред

рдлрд╝реАрдЪрд░ рдмреНрд▓реЛрдЯ

рдореИрдВ рдЬреЛ рд╕реЛрдЪ рд░рд╣рд╛ рд╣реВрдВ, рдореВрд▓ рд░реВрдк рд╕реЗ, рдЗрд╕рдореЗрдВ рдЬрд┐рддрдиреА рдЕрдзрд┐рдХ рд╡рд┐рд╢реЗрд╖рддрд╛рдПрдВ рд╣реИрдВ, рднрд╛рд╖рд╛ рдХреЛ рд╕реАрдЦрдирд╛ рдЙрддрдирд╛ рд╣реА рдХрдард┐рди рд╣реИред рдФрд░ рдореБрдЭреЗ type Type: Trait рд╕реЗ рдЕрдзрд┐рдХ type Type = impl Trait рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдиреЗ рдХрд╛ рдХреЛрдИ рдмрдбрд╝рд╛ рд▓рд╛рдн рдирд╣реАрдВ рджрд┐рдЦ рд░рд╣рд╛ рд╣реИ: рдпрд╣ 6 рд╡рд░реНрдгреЛрдВ рдХреА рддрд░рд╣ рд╕рд╣реЗрдЬрд╛ рдЧрдпрд╛ рд╣реИ?

рдмреАрдд рд░рд╣рд╛ рд╣реИ rustc рдЬрдм рджреЗрдЦрдХрд░ рдЙрддреНрдкрд╛рджрди рдПрдХ рддреНрд░реБрдЯрд┐ type Type: Trait рдХрд╛ рдХрд╣рдирд╛ рд╣реИ рдХрд┐ рд╡реНрдпрдХреНрддрд┐ рдЗрд╕реЗ рд▓рд┐рдЦрдиреЗ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдиреЗ рдХреЗ type Type = impl Trait рдореЗрд░реЗ рд▓рд┐рдП рдФрд░ рдЕрдзрд┐рдХ рд╕рдордЭ рдмрдирд╛рдиреЗ рд╣реИрдВ: рдХрдо рд╕реЗ рдХрдо рд╡рд╣рд╛рдБ рдмрд╛рддреЗрдВ рд▓рд┐рдЦрдиреЗ рдХреА рдПрдХ рднреА рддрд░реАрдХрд╛ рд╣реИ , рдпрд╣ рд╕рднреА рдХреЗ рд▓рд┐рдП рд╕рдордЭ рдореЗрдВ рдЖрддрд╛ рд╣реИ ( impl Trait рдкрд╣рд▓реЗ рд╕реЗ рд╣реА рд╕реНрдкрд╖реНрдЯ рд░реВрдк рд╕реЗ рд╡рд╛рдкрд╕реА рдХреА рд╕реНрдерд┐рддрд┐ рдореЗрдВ рдПрдХ рдЕрд╕реНрддрд┐рддреНрд╡ рдХреЗ рд░реВрдк рдореЗрдВ рдкрд╣рдЪрд╛рдирд╛ рдЬрд╛рддрд╛ рд╣реИ), рдФрд░ рдЗрд╕рдореЗрдВ рд╕рднреА рдЙрдкрдпреЛрдЧ рдХреЗ рдорд╛рдорд▓реЗ рд╢рд╛рдорд┐рд▓ рд╣реИрдВред рдФрд░ рдЕрдЧрд░ рд▓реЛрдЧ рдЬреЛ рд╕реЛрдЪрддреЗ рд╣реИрдВ рдЙрд╕рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдиреЗ рдХреА рдХреЛрд╢рд┐рд╢ рдХрд░рддреЗ рд╣реИрдВ (рд╣рд╛рд▓рд╛рдВрдХрд┐ рдореИрдВ рдЗрд╕рд╕реЗ рдЕрд╕рд╣рдордд рд╣реВрдВ, рдореЗрд░реЗ рд▓рд┐рдП = impl Trait рд╡рд░реНрддрдорд╛рди = i32 рдХреА рддреБрд▓рдирд╛ рдореЗрдВ рдЕрдзрд┐рдХ рд╕рд╣рдЬ рд╣реИ), рд╡реЗ рд╕рд╣реА рддрд░реАрдХреЗ рд╕реЗ рдкреБрдирд░реНрдирд┐рд░реНрджреЗрд╢рд┐рдд рд╣реЛ рдЬрд╛рддреЗ рд╣реИрдВ рдЗрд╕реЗ рд▓рд┐рдЦрдиреЗ рдХрд╛ рдкрд╛рд░рдВрдкрд░рд┐рдХ-рд╕рд╣реА рддрд░реАрдХрд╛ред

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

1.5 рд╕рд╛рд▓ рдкрд╣рд▓реЗ рдЦреЛрд▓реЗ рдЧрдП рдЕрдВрдХ рдореЗрдВ typeof рдкрд░ рд╕рдВрдХреНрд╖реЗрдк рдореЗрдВ рдЪрд░реНрдЪрд╛ рдХреА рдЧрдИ рдереА: https://github.com/rust-lang/rfcs/issues/1738#issuecomment -258353755

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

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

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

рд╡рд╛рд╣, рдпрд╣ рдмрд┐рд▓реНрдХреБрд▓ рдирд╣реАрдВ рд╣реИ рдЬреЛ рдореБрдЭреЗ рд╕рдордЭ рдореЗрдВ рдЖрдпрд╛ред рдзрдиреНрдпрд╡рд╛рдж @ Nemo157 рдореБрдЭреЗ рд╕реАрдзрд╛ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП!

рдЙрд╕ рд╕реНрдерд┐рддрд┐ рдореЗрдВ, рдореИрдВ рд╡рд╛рд╕реНрддрд╡ рдореЗрдВ = рд╡рд╛рдХреНрдпрд╡рд┐рдиреНрдпрд╛рд╕ рдкрд╕рдВрдж рдХрд░реВрдВрдЧрд╛ред

@ рдПрдХреНрд▓реЛрдЧ

рддреЛ рдореБрдЭреЗ рд▓рдЧрддрд╛ рд╣реИ рдХрд┐ рдпрд╣ type Type: Trait рд╕рд┐рдВрдЯреИрдХреНрд╕ рдХреЗ рд╕рд╛рде рдПрдХ рд╕рдорд╕реНрдпрд╛ рд╣реИред

рдЗрд╕рдХреА рдЕрдиреБрдорддрд┐ рджреА рдЬрд╛ рд╕рдХрддреА рд╣реИ рдФрд░ рдЗрд╕реЗ рдкреВрд░реА рддрд░рд╣ рд╕реЗ рдкрд░рд┐рднрд╛рд╖рд┐рдд рдХрд┐рдпрд╛ рдЬрд╛рдПрдЧрд╛, рд▓реЗрдХрд┐рди рдЖрдк рдЖрдорддреМрд░ рдкрд░ where Type: Foo + Bar рдмрдЬрд╛рдп where Type: Foo, Type: Bar рд▓рд┐рдЦрддреЗ рд╣реИрдВ, рддрд╛рдХрд┐ рдпрд╣ рдмрд╣реБрдд рдЕрдЪреНрдЫрд╛ рд╡рд┐рдЪрд╛рд░ рди рд▓рдЧреЗред рдЖрдк рдЗрд╕ рдорд╛рдорд▓реЗ рдХреЗ рд▓рд┐рдП рдПрдХ рдЕрдЪреНрдЫрд╛ рддреНрд░реБрдЯрд┐ рд╕рдВрджреЗрд╢ рднреА рдЖрд╕рд╛рдиреА рд╕реЗ рд╕рдХреНрд░рд┐рдп рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ, рдпрд╣ рд╕реБрдЭрд╛рд╡ рджреЗрддреЗ рд╣реБрдП рдХрд┐ рдЖрдк рд╕рдВрдмрдВрдзрд┐рдд рдкреНрд░рдХрд╛рд░ рдХреЗ рдорд╛рдорд▓реЗ рдореЗрдВ рдЗрд╕рдХреЗ рдмрдЬрд╛рдп Foo + Bar рд▓рд┐рдЦрддреЗ рд╣реИрдВред

type Foo = impl Bar; рднреА рд╕рдордЭрдиреЗ рдпреЛрдЧреНрдп рд╕рдорд╕реНрдпрд╛рдПрдВ рд╣реИрдВ рдЬрд┐рд╕рдореЗрдВ рдЖрдк = impl Bar рдФрд░ рдирд┐рд╖реНрдХрд░реНрд╖ рдирд┐рдХрд╛рд▓рддреЗ рд╣реИрдВ рдХрд┐ рдЖрдк рдЗрд╕реЗ рдкреНрд░рддреНрдпреЗрдХ рдШрдЯрдирд╛ рдкрд░ рдкреНрд░рддрд┐рд╕реНрдерд╛рдкрд┐рдд рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ рдЬрд╣рд╛рдВ рдЗрд╕реЗ -> impl Bar рд░реВрдк рдореЗрдВ рдЙрдкрдпреЛрдЧ рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИ; рд▓реЗрдХрд┐рди рдпрд╣ рдХрд╛рдо рдирд╣реАрдВ рдХрд░реЗрдЧрд╛ред @ рдорд╛рд░реНрдХ-рдЖрдИрдПрдо рдиреЗ рдпрд╣ рд╡реНрдпрд╛рдЦреНрдпрд╛ рдХреА рд╣реИ, рдЬреЛ рдХрд┐ рдПрдХ рдФрд░ рдЕрдзрд┐рдХ рд╕рдВрднрд╛рд╡рд┐рдд рдЧрд▓рддреА рдХреА рддрд░рд╣ рд▓рдЧрддрд╛ рд╣реИред рдЗрд╕рд▓рд┐рдП, рдореИрдВ рдпрд╣ рдирд┐рд╖реНрдХрд░реНрд╖ рдирд┐рдХрд╛рд▓рддрд╛ рд╣реВрдВ рдХрд┐ рд╕реАрдЦрдиреЗ рдХреА рдХреНрд╖рдорддрд╛ рдХреЗ рд▓рд┐рдП type Foo: Bar; рдмреЗрд╣рддрд░ рд╡рд┐рдХрд▓реНрдк рд╣реИред

рд╣рд╛рд▓рд╛рдБрдХрд┐, рдЬреИрд╕рд╛ рдХрд┐ @stjepang рдФрд░ @joshtriplett рджреНрд╡рд╛рд░рд╛ рдКрдкрд░ рдмрддрд╛рдпрд╛ рдЧрдпрд╛ рд╣реИ, рдЯрд╛рдЗрдк рдХрд░реЗрдВ: рд╡рд┐рд╢реЗрд╖рддрд╛ рдЕрдзреВрд░рд╛ рд▓рдЧрддрд╛ рд╣реИред

рдпрд╣ рдПрдХ рд╡рд┐рд╕реНрддрд╛рд░рд┐рдд рдкреАрдУрд╡реА рд╕реЗ рдЕрдзреВрд░рд╛ рдирд╣реАрдВ рд╣реИред рдЖрдкрдХреЛ type Foo: Bar; рд╕реЗ рдареАрдХ рдЙрддрдиреА рд╣реА рдЬрд╛рдирдХрд╛рд░реА рдорд┐рд▓рддреА рд╣реИ рдЬрд┐рддрдиреА рдЖрдкрдХреЛ type Foo = impl Bar; рд╕реЗ рдорд┐рд▓рддреА рд╣реИред рддреЛ рдЖрдк type Foo: Bar; рд╕рд╛рде рдХреНрдпрд╛ рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ , рдЗрд╕ рдкрд░рд┐рдкреНрд░реЗрдХреНрд╖реНрдп рд╕реЗ, рдпрд╣ рдкреВрд░рд╛ рд╣реЛ рдЧрдпрд╛ рд╣реИред рд╡рд╛рд╕реНрддрд╡ рдореЗрдВ, рдмрд╛рдж рд╡рд╛рд▓реЗ рдХреЛ type _0: Bar; type Foo = _0; рд░реВрдк рдореЗрдВ рдЙрддрд╛рд░рд╛ рдЬрд╛рддрд╛ рд╣реИред

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

рдЙрд╕рдиреЗ рдХрд╣рд╛ рдХрд┐ рдореБрдЭреЗ рд▓рдЧрддрд╛ рд╣реИ рдХрд┐ рдЗрд╕ рдмрд╣рд╕ рдХреЛ рдлрд┐рд░ рд╕реЗ рдкреНрд░рдЬреНрд╡рд▓рд┐рдд рди рдХрд░рдирд╛ рдмреЗрд╣рддрд░ рд╣реЛрдЧрд╛ :)

рд╡рд╣ рдПрдХ рдЕрдЪреНрдЫрд╛ рд╡рд┐рдЪрд╛рд░ рд╣реИред рд╣рдореЗрдВ рднрд╛рд╖рд╛ рдкрд░ рд╡рд┐рдЪрд╛рд░ рдХрд░рдирд╛ рдЪрд╛рд╣рд┐рдП рдХреНрдпреЛрдВрдХрд┐ рдпрд╣ рдбрд┐рдЬрд╛рдЗрди рдХрд░рддреЗ рд╕рдордп рд╣реИ, рди рдХрд┐ рдЬреИрд╕рд╛ рд╣рдо рдЪрд╛рд╣рддреЗ рдереЗред

рдЦреИрд░, рдореБрдЭреЗ рд▓рдЧрддрд╛ рд╣реИ рдХрд┐ рдХрднреА-рдХрднреА рд╕рд╛рджрдЧреА рдХреЗ рдкрдХреНрд╖ рдореЗрдВ рдЗрд╖реНрдЯрддрдо рдЦреЛрдирд╛ рдЕрдЪреНрдЫреА рдмрд╛рдд рд╣реИред

рдЕрдЧрд░ рд╣рдореЗрдВ рд╕рд╛рджрдЧреА рдХреЗ рд▓рд┐рдП рдЬрд╛рдирд╛ рдЪрд╛рд╣рд┐рдП, рддреЛ рдореИрдВ рдЗрд╕рдХреЗ рдмрдЬрд╛рдп type Foo = impl Bar; рджреВрдВрдЧрд╛ред
рдпрд╣ рдзреНрдпрд╛рди рджрд┐рдпрд╛ рдЬрд╛рдирд╛ рдЪрд╛рд╣рд┐рдП рдХрд┐ рд╕реА рдХреА рд╕рд╛рджрдЧреА (рдорд╛рдирд╛ рдЬрд╛рддрд╛ рд╣реИ, рдХреНрдпреЛрдВрдХрд┐ рд╣рд╛рд╕реНрдХреЗрд▓ рдХреЛрд░ рдФрд░ рдЗрд╕реА рддрд░рд╣ рдХреА рдЪреАрдЬреЗрдВ рд╢рд╛рдпрдж рдзреНрд╡рдирд┐ рдХреЗ рджреМрд░рд╛рди рд╕рд░рд▓ рд╣реЛрддреА рд╣реИрдВ ..) рдЕрднрд┐рд╡реНрдпрдХреНрддрд┐ рдФрд░ рд╕реБрджреГрдврд╝рддрд╛ рдХреА рдмрд╛рдд рдХрд░рддреЗ рд╕рдордп рдПрдХ рддреЗрдЬ рдХреАрдордд рдкрд░ рдЖрддреА рд╣реИред рднрд╛рд╖рд╛ рдбрд┐рдЬрд╛рдЗрди рдореЗрдВ рд╕реА рдореЗрд░рд╛ рдЙрддреНрддрд░ рд╕рд┐рддрд╛рд░рд╛ рдирд╣реАрдВ рд╣реИ; рд╕реЗ рдмрд╣реБрдд рджреВрд░ред

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

рд▓реЗрдХрд┐рди рд╡реЗ рдЕрдкрдиреЗ рд╢рдмреНрджрд╛рд░реНрде рдореЗрдВ рднрд┐рдиреНрди рдирд╣реАрдВ рд╣реЛрдВрдЧреЗред рдПрдХ рджреВрд╕рд░реЗ рдХреЗ рд▓рд┐рдП desugarsред
рдореБрдЭреЗ рд▓рдЧрддрд╛ рд╣реИ рдХрд┐ type Foo: Bar; рдпрд╛ type Foo = impl Bar рд▓рд┐рдЦрдиреЗ рдХреА рдХреЛрд╢рд┐рд╢ рдХрд░рдиреЗ рдХрд╛ рднреНрд░рдо рдХреЗрд╡рд▓ рдЙрдирдореЗрдВ рд╕реЗ рдПрдХ рдХреЗ рд▓рд┐рдП рдХрд╛рдо рдирд╣реАрдВ рдХрд░рдирд╛ рд╣реИ, рднрд▓реЗ рд╣реА рджреЛрдиреЛрдВ рдХреЗ рдкрд╛рд╕ рдкреВрд░реА рддрд░рд╣ рд╕реЗ рдкрд░рд┐рднрд╛рд╖рд┐рдд рдЕрд░реНрдерд╢рд╛рд╕реНрддреНрд░ рд╣реИ, рдХреЗрд╡рд▓ рдЙрдкрдпреЛрдЧрдХрд░реНрддрд╛ рдХреЗ рд░рд╛рд╕реНрддреЗ рдореЗрдВ рд╣реИред рдпрджрд┐ рдХреЛрдИ рдЙрдкрдпреЛрдЧрдХрд░реНрддрд╛ type Foo = impl Bar; рд▓рд┐рдЦрдиреЗ рдХрд╛ рдкреНрд░рдпрд╛рд╕ рдХрд░рддрд╛ рд╣реИ, рддреЛ рдПрдХ рд▓рд┐рдВрдЯ рдЖрдЧ рд▓рдЧрддреА рд╣реИ рдФрд░ type Foo: Bar; рдХрд╛ рдкреНрд░рд╕реНрддрд╛рд╡ рдХрд░рддреА рд╣реИред рдПрдХ рдкреНрд░рдХрд╛рд░ рдХрд╛ рд╡реГрдХреНрд╖ рдЙрдкрдпреЛрдЧрдХрд░реНрддрд╛ рдХреЛ рдЕрдиреНрдп рд╡рд╛рдХреНрдп рд░рдЪрдирд╛ рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рд╕рд┐рдЦрд╛ рд░рд╣рд╛ рд╣реИред
рдореЗрд░реЗ рд▓рд┐рдП, рдпрд╣ рдорд╣рддреНрд╡рдкреВрд░реНрдг рд╣реИ рдХрд┐ рднрд╛рд╖рд╛ рдПрдХ рд╕рдорд╛рди рдФрд░ рд╕реБрд╕рдВрдЧрдд рд╣реЛ; рдпрджрд┐ рд╣рдордиреЗ рдХрд╣реАрдВ рджреЛрдиреЛрдВ рд╕рд┐рдВрдЯреИрдХреНрд╕ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдиреЗ рдХрд╛ рдирд┐рд░реНрдгрдп рд▓рд┐рдпрд╛ рд╣реИ, рддреЛ рд╣рдореЗрдВ рдЙрд╕ рдирд┐рд░реНрдгрдп рдХреЛ рд▓рдЧрд╛рддрд╛рд░ рд▓рд╛рдЧреВ рдХрд░рдирд╛ рдЪрд╛рд╣рд┐рдПред

рдПрдХ рд╢реБрд░реБрдЖрдд рдХрд░рдиреЗ рд╡рд╛рд▓реЗ рдХреА рдХрд▓реНрдкрдирд╛ рдХрд░реЗрдВ рдЬрд┐рд╕рдиреЗ рд╣рдореЗрд╢рд╛ type Type: Trait рдХреЛ рдЕрдкрдиреЗ рдкрд╣рд▓реЗ type Type = impl Trait ред

рдЗрд╕ рд╡рд┐рд╢рд┐рд╖реНрдЯ рдорд╛рдорд▓реЗ рдореЗрдВ, рдПрдХ рд▓рд┐рдВрдЯ рдЖрдЧ рд▓рдЧ рдЬрд╛рдПрдЧрд╛, рдФрд░ рдкреВрд░реНрд╡ рд╕рд┐рдВрдЯреИрдХреНрд╕ рдХреА рд╕рд┐рдлрд╛рд░рд┐рд╢ рдХрд░реЗрдЧрд╛ред рдЬрдм type Foo = (impl Bar, impl Baz); рдмрд╛рдд рдЖрддреА рд╣реИ, рддреЛ рд╢реБрд░реБрдЖрдд рдХрд░рдиреЗ рд╡рд╛рд▓реЗ рдХреЛ рдХрд┐рд╕реА рднреА рдорд╛рдорд▓реЗ рдореЗрдВ -> impl Trait рд╕реАрдЦрдирд╛ рд╣реЛрдЧрд╛, рддрд╛рдХрд┐ рд╡реЗ рдЗрд╕рдХрд╛ рдЕрд░реНрде рдирд┐рдХрд╛рд▓рдиреЗ рдореЗрдВ рд╕рдХреНрд╖рдо рд╣реЛрдВред

рдЬреЛ рдХрдореЛрдмреЗрд╢ рд╡рд╣ рдЬрд╛рд▓ рд╣реИ рдЬрд┐рд╕рдореЗрдВ C++ рдЧрд┐рд░ рдЧрдпрд╛ред

рд╕реА ++ рдХреА рд╕рдорд╕реНрдпрд╛ рдореБрдЦреНрдп рд░реВрдк рд╕реЗ рдпрд╣ рд╣реИ рдХрд┐ рдпрд╣ рдХрд╛рдлреА рдкреБрд░рд╛рдиреА рд╣реИ, рдЗрд╕рдореЗрдВ рд╕реА рдХрд╛ рд╕рд╛рдорд╛рди рд╣реИ, рдФрд░ рдмрд╣реБрдд рд╕рд╛рд░реА рд╕реБрд╡рд┐рдзрд╛рдПрдВ рдмрд╣реБрдд рд╕рд╛рд░реЗ рдкреНрд░рддрд┐рдорд╛рдиреЛрдВ рдХрд╛ рд╕рдорд░реНрдерди рдХрд░рддреА рд╣реИрдВред рдпреЗ рдЕрд▓рдЧ-рдЕрд▓рдЧ рд╡рд┐рд╢реЗрд╖рддрд╛рдПрдВ рдирд╣реАрдВ рд╣реИрдВ, рдмрд╕ рдЕрд▓рдЧ-рдЕрд▓рдЧ рд╕рд┐рдВрдЯреИрдХреНрд╕ рд╣реИрдВред

рдореИрдВ рдЬреЛ рд╕реЛрдЪ рд░рд╣рд╛ рд╣реВрдВ, рдореВрд▓ рд░реВрдк рд╕реЗ, рдЗрд╕рдореЗрдВ рдЬрд┐рддрдиреА рдЕрдзрд┐рдХ рд╡рд┐рд╢реЗрд╖рддрд╛рдПрдВ рд╣реИрдВ, рднрд╛рд╖рд╛ рдХреЛ рд╕реАрдЦрдирд╛ рдЙрддрдирд╛ рд╣реА рдХрдард┐рди рд╣реИред

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

рдФрд░ рдореБрдЭреЗ type Type: Trait рд╕реЗ рдЕрдзрд┐рдХ type Type = impl Trait: рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдиреЗ рдХрд╛ рдХреЛрдИ рдмрдбрд╝рд╛ рд▓рд╛рдн рдирд╣реАрдВ рджрд┐рдЦ рд░рд╣рд╛ рд╣реИ, рдЬреИрд╕реЗ, 6 рд╡рд░реНрдг рд╕рд╣реЗрдЬреЗ рдЧрдП рд╣реИрдВ?

рд╣рд╛рдБ, рдХреЗрд╡рд▓ 6 рд╡рд░реНрдг рд╕рд╣реЗрдЬреЗ рдЧрдП рд╣реИрдВред рд▓реЗрдХрд┐рди рдЕрдЧрд░ рд╣рдо type Foo: Iterator<Item: Iterator<Item: Display>>; , рддреЛ рд╣рдо рдЗрд╕рдХреЗ рдмрдЬрд╛рдп рдкреНрд░рд╛рдкреНрдд рдХрд░реЗрдВрдЧреЗ: type Foo = impl Iterator<Item = impl Iterator<Item = impl Display>>; рдЬрд┐рд╕рдореЗрдВ рдмрд╣реБрдд рдЕрдзрд┐рдХ рд╢реЛрд░ рд╣реИред type Foo: Bar; рднреА рдмрд╛рдж рдХреА рддреБрд▓рдирд╛ рдореЗрдВ рдЕрдзрд┐рдХ рдкреНрд░рддреНрдпрдХреНрд╖ рд╣реИ, рдЧрд▓рдд рд╡реНрдпрд╛рдЦреНрдпрд╛ (рдкреБрдирдГ рдкреНрд░рддрд┐рд╕реНрдерд╛рдкрди ..) рдХреЗ рд▓рд┐рдП рдХрдо рдкреНрд░рд╡рдг рд╣реИ, рдФрд░ рд╕рдВрдмрдВрдзрд┐рдд рдкреНрд░рдХрд╛рд░реЛрдВ рдХреЗ рд▓рд┐рдП рдмреЗрд╣рддрд░ рдХрд╛рдо рдХрд░рддрд╛ рд╣реИ (рдкреНрд░рдХрд╛рд░ рдХреЛ рд╡рд┐рд╢реЗрд╖рддрд╛ рд╕реЗ рдХреЙрдкреА рдХрд░реЗрдВ ..)ред
рдЗрд╕рдХреЗ рдЕрд▓рд╛рд╡рд╛, type Foo: Bar рдХреЛ рд╕реНрд╡рд╛рднрд╛рд╡рд┐рдХ рд░реВрдк рд╕реЗ type Foo: Bar = ConcreteType; рддрдХ рдмрдврд╝рд╛рдпрд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИ рдЬреЛ рдареЛрд╕ рдкреНрд░рдХрд╛рд░ рдХреЛ рдЙрдЬрд╛рдЧрд░ рдХрд░реЗрдЧрд╛ рд▓реЗрдХрд┐рди рдпрд╣ рднреА рд╕реБрдирд┐рд╢реНрдЪрд┐рдд рдХрд░реЗрдЧрд╛ рдХрд┐ рдпрд╣ Bar рд╕рдВрддреБрд╖реНрдЯ рдХрд░рддрд╛ рд╣реИред type Foo = impl Trait; рд▓рд┐рдП рдРрд╕рд╛ рдХреБрдЫ рдирд╣реАрдВ рдХрд┐рдпрд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИред

type Type: Trait рджреЗрдЦрддреЗ рд╕рдордп rustc рдЖрдЙрдЯрдкреБрдЯ рдореЗрдВ рддреНрд░реБрдЯрд┐ рд╣реЛрдиреЗ рдкрд░ рдЬреЛ рдХрд╣рддрд╛ рд╣реИ рдХрд┐ рдЗрд╕реЗ рд▓рд┐рдЦрдиреЗ рд╡рд╛рд▓рд╛ рд╡реНрдпрдХреНрддрд┐ type Type = impl Trait рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдореБрдЭреЗ рдФрд░ рдЕрдзрд┐рдХ рд╕рдордЭ рдореЗрдВ рдЖрддрд╛ рд╣реИ: рдХрдо рд╕реЗ рдХрдо рдЪреАрдЬреЛрдВ рдХреЛ рд▓рд┐рдЦрдиреЗ рдХрд╛ рдПрдХ рд╣реА рддрд░реАрдХрд╛ рд╣реИ,

рд╡реЗ рдЗрд╕реЗ рд▓рд┐рдЦрдиреЗ рдХреЗ рдкрд╛рд░рдВрдкрд░рд┐рдХ-рд╕рд╣реА рддрд░реАрдХреЗ рд╕реЗ рд╕рд╣реА рддрд░реАрдХреЗ рд╕реЗ рдкреБрдирд░реНрдирд┐рд░реНрджреЗрд╢рд┐рдд рд╣реЛ рдЬрд╛рддреЗ рд╣реИрдВред

рдореИрдВ рдкреНрд░рд╕реНрддрд╛рд╡ рдХрд░ рд░рд╣рд╛ рд╣реВрдВ рдХрд┐ рдЪреАрдЬреЛрдВ рдХреЛ рд▓рд┐рдЦрдиреЗ рдХрд╛ рдПрдХ рдкрд╛рд░рдВрдкрд░рд┐рдХ рддрд░реАрдХрд╛ рд╣реЛ; type Foo: Bar; ред

@lnicola

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

рдореИрдВ рджреЛрд╣рд░рд╛рддрд╛ рд╣реВрдБ рдХрд┐ рдкреНрд░рдХрд╛рд░ рдХреЗ рдЙрдкрдирд╛рдореЛрдВ рдХреЛ рд╡рд╛рд╕реНрддрд╡ рдореЗрдВ рд╕рдВрдмрджреНрдз рдкреНрд░рдХрд╛рд░реЛрдВ рдХреЗ рд░реВрдк рдореЗрдВ рджреЗрдЦрд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИред рдЖрдк рдХрд╣ рд╕рдХреЗрдВрдЧреЗ:

trait Foo        { type Baz: Quux; }
// User of `Bar::Baz` can conclude `Quux` but nothing more!
impl Foo for Bar { type Baz: Quux; }

// User of `Wibble` can conclude `Quux` but nothing more!
type Wibble: Quux;

рд╣рдо рджреЗрдЦрддреЗ рд╣реИрдВ рдХрд┐ рдпрд╣ рд╕рдВрдмрджреНрдз рдкреНрд░рдХрд╛рд░реЛрдВ рдФрд░ рдкреНрд░рдХрд╛рд░ рдХреЗ рдЙрдкрдирд╛рдореЛрдВ рдореЗрдВ рдареАрдХ рдЙрд╕реА рддрд░рд╣ рдХрд╛рдо рдХрд░рддрд╛ рд╣реИред

рд╣рд╛рдБ, рдХреЗрд╡рд▓ 6 рд╡рд░реНрдг рд╕рд╣реЗрдЬреЗ рдЧрдП рд╣реИрдВред рд▓реЗрдХрд┐рди рдЕрдЧрд░ рд╣рдо type Foo: Iterator<Item: Iterator<Item: Display>>; , рддреЛ рд╣рдо рдЗрд╕рдХреЗ рдмрдЬрд╛рдп рдкреНрд░рд╛рдкреНрдд рдХрд░реЗрдВрдЧреЗ: type Foo = impl Iterator<Item = impl Iterator<Item = impl Display>> ; рдЬрд┐рд╕рдореЗрдВ рдмрд╣реБрдд рдЕрдзрд┐рдХ рд╢реЛрд░ рд╣реЛрддрд╛ рд╣реИред

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

type Foo: Iterator<Item: Iterator<Item: Display>>;
type Foo = impl Iterator<Item: Iterator<Item: Display>>;
existential type Foo: Iterator<Item: Iterator<Item: Display>>;
existential type Foo = impl Iterator<Item: Iterator<Item: Display>>;

рдЕрдкрдиреЗ рдкреНрд░рд╕реНрддрд╛рд╡рд┐рдд рд╢реЙрд░реНрдЯрд╣реИрдВрдб Trait<AssociatedType: Bound> рдмрдЬрд╛рдп Trait<AssociatedType = impl Bound> рд╕рд┐рдВрдЯреИрдХреНрд╕ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдиреЗ рдореЗрдВ рд╕рдХреНрд╖рдо рд╣реЛрдиреЗ рдХреЗ рдХрд╛рд░рдг рд╕рдВрдмрдВрдзрд┐рдд рдкреНрд░рдХрд╛рд░ рдХреЗ рдЕрд╕реНрддрд┐рддреНрд╡ рдХреЗ рдкреНрд░рдХрд╛рд░ (рдпрд╛ рддреЛ рдирд╛рдорд┐рдд рдпрд╛ рдЕрдЬреНрдЮрд╛рдд) рдХреЗ рд▓рд┐рдП рдЕрдЬреНрдЮрд╛рдд рдЕрд╕реНрддрд┐рддреНрд╡ рдкреНрд░рдХрд╛рд░ рдШреЛрд╖рд┐рдд рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдПрдХ рд╕реНрд╡рддрдВрддреНрд░ рд╡рд┐рд╢реЗрд╖рддрд╛ рд╣реИ (рд▓реЗрдХрд┐рди рд╢рд╛рдпрдж рдЗрд╕рдореЗрдВ рдкреНрд░рд╛рд╕рдВрдЧрд┐рдХ рд╣реИ) рдЕрд╕реНрддрд┐рддреНрд╡рдЧрдд рдкреНрд░рдХрд╛рд░ рдХреА рд╡рд┐рд╢реЗрд╖рддрд╛рдУрдВ рдХреЗ рдкреВрд░реЗ рд╕реЗрдЯ рдХреЛ рд╕реБрд╕рдВрдЧрдд рд░рдЦрдиреЗ рдХреА рд╢рд░реНрддреЗрдВ)ред

@ Nemo157 рд╡реЗ рдЕрд▓рдЧ-рдЕрд▓рдЧ рд╡рд┐рд╢реЗрд╖рддрд╛рдПрдВ рд╣реИрдВ, рд╣рд╛рдБ; рд▓реЗрдХрд┐рди рдореБрдЭреЗ рд▓рдЧрддрд╛ рд╣реИ рдХрд┐ рдирд┐рд░рдВрддрд░рддрд╛ рдХреЗ рд▓рд┐рдП рдЙрди рдкрд░ рдПрдХ рд╕рд╛рде рд╡рд┐рдЪрд╛рд░ рдХрд░рдирд╛ рд╕реНрд╡рд╛рднрд╛рд╡рд┐рдХ рд╣реИред

@рд╕реЗрдВрдЯреНрд░рд┐рд▓

рдореБрдЭреЗ рдЦреЗрдж рд╣реИ, рд▓реЗрдХрд┐рди рд╡реЗ рдЧрд▓рдд рд╣реИрдВред рдпрд╣ рдПрдХ рд╡рд┐рд╕реНрддрд╛рд░рд┐рдд рдкреАрдУрд╡реА рд╕реЗ рдЕрдзреВрд░рд╛ рдирд╣реАрдВ рд╣реИред

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

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

рдореБрдЭреЗ рд▓рдЧрддрд╛ рд╣реИ рдХрд┐ рдпрд╣ рд▓реЛрдЧреЛрдВ рдХреЛ рдпрд╣ рдмрддрд╛рдиреЗ рдореЗрдВ рдорджрдж рдХрд░рддрд╛ рд╣реИ рдХрд┐ рд╡реЗ -> impl Trait рдмрд╛рд░реЗ рдореЗрдВ рд╡реЗ рд╕рднреА рдЪреАрдЬреЗрдВ рд▓реЗ рд╕рдХрддреЗ рд╣реИрдВ рдЬреЛ рд╡реЗ рдЬрд╛рдирддреЗ рд╣реИрдВ рдФрд░ рдЙрдиреНрд╣реЗрдВ type Foo = impl Trait рд▓рд╛рдЧреВ рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ; рдПрдХ рд╕рд╛рдорд╛рдиреНрдпреАрдХреГрдд рдЕрд╡рдзрд╛рд░рдгрд╛ рд╣реИ impl Trait рдЬрд┐рд╕реЗ рд╡реЗ рджреЛрдиреЛрдВ рдЬрдЧрд╣реЛрдВ рдкрд░ рдмрд┐рд▓реНрдбрд┐рдВрдЧ рдмреНрд▓реЙрдХ рдХреЗ рд░реВрдк рдореЗрдВ рдЙрдкрдпреЛрдЧ рдХрд░рддреЗ рд╣реБрдП рджреЗрдЦ рд╕рдХрддреЗ рд╣реИрдВред type Foo: Trait рдЬреИрд╕рд╛ рд╕рд┐рдВрдЯреИрдХреНрд╕ рдЙрд╕ рд╕рд╛рдорд╛рдиреНрдпреАрдХреГрдд рдмрд┐рд▓реНрдбрд┐рдВрдЧ рдмреНрд▓реЙрдХ рдХреЛ рдЫреБрдкрд╛рддрд╛ рд╣реИред

@joshtriplett

рдореИрдВ рд╕реБрдЭрд╛рд╡ рджреЗ рд░рд╣рд╛ рдерд╛ рдХрд┐ рдпрд╣ рдЕрдзреВрд░рд╛ рд▓рдЧрддрд╛ рд╣реИ; рдпрд╣ рдореБрдЭреЗ рдФрд░ рджреВрд╕рд░реЛрдВ рдХреЛ рдЧрд▓рдд рд▓рдЧрддрд╛ рд╣реИред

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

рдпрд╣ рднреА рджреЗрдЦреЗрдВ рдХрд┐ рдЗрд╕ рдзрд╛рдЧреЗ рдореЗрдВ, рд▓реЛрдЧреЛрдВ рдиреЗ рдЗрд╕ рд╕рдЯреАрдХ рд╡рд╛рдХреНрдпрд╡рд┐рдиреНрдпрд╛рд╕ рдЕрдВрддрд░ рдХреЗ рд╕рд╛рде рдПрдХ рд╡реНрдпрд╛рдЦреНрдпрд╛ рд╕рдорд╕реНрдпрд╛ рдХрд╛ рдкреНрд░рджрд░реНрд╢рди рдХрд┐рдпрд╛ред

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

рдХреБрдЫ рдиреЗ рдХрд╣рд╛ рд╣реИ рдХрд┐ type Foo: Bar; рднреНрд░рдорд┐рдд рдХрд░рдиреЗ рд╡рд╛рд▓рд╛ рд╣реИ, рд▓реЗрдХрд┐рди рдореБрдЭреЗ рдпрдХреАрди рдирд╣реАрдВ рд╣реИ рдХрд┐ type Foo: Bar; рдХреА рд╡реИрдХрд▓реНрдкрд┐рдХ рд╡реНрдпрд╛рдЦреНрдпрд╛ рдХреНрдпрд╛ рд╣реИ рдЬреЛ рдЗрдЪреНрдЫрд┐рдд рдЕрд░реНрде рд╕реЗ рдЕрд▓рдЧ рд╣реИред рдореБрдЭреЗ рд╡реИрдХрд▓реНрдкрд┐рдХ рд╡реНрдпрд╛рдЦреНрдпрд╛рдУрдВ рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рд╕реБрдирдиреЗ рдореЗрдВ рджрд┐рд▓рдЪрд╕реНрдкреА рд╣реЛрдЧреАред

@рд╕реЗрдВрдЯреНрд░рд┐рд▓

рдореИрдВ рджреЛрд╣рд░рд╛рддрд╛ рд╣реВрдБ рдХрд┐ рдкреНрд░рдХрд╛рд░ рдХреЗ рдЙрдкрдирд╛рдореЛрдВ рдХреЛ рд╡рд╛рд╕реНрддрд╡ рдореЗрдВ рд╕рдВрдмрджреНрдз рдкреНрд░рдХрд╛рд░реЛрдВ рдХреЗ рд░реВрдк рдореЗрдВ рджреЗрдЦрд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИред

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

рдЗрд╕рдХреА рддреБрд▓рдирд╛ рдПрдХ рд╡рд┐рд╢реЗрд╖рддрд╛ рдкрд░рд┐рднрд╛рд╖рд╛ рдореЗрдВ рд╕рдВрдмрджреНрдз рдкреНрд░рдХрд╛рд░реЛрдВ рдХреЛ рджреЗрдЦрдиреЗ рд╕реЗ рдХрд░реЗрдВред рдЙрд╕ рд╕реНрдерд┐рддрд┐ рдореЗрдВ рдЖрдкрдХреЛ рд▓рдЧрддрд╛ рд╣реИ рдХрд┐ рдпрд╣ рдХреБрдЫ рдРрд╕рд╛ рд╣реИ рдЬрд┐рд╕реЗ рдЕрдиреНрдп structs рдХреЛ рдкрд░рд┐рднрд╛рд╖рд┐рдд рдпрд╛ рдХрд╛рд░реНрдпрд╛рдиреНрд╡рд┐рдд рдХрд░рдирд╛ рд╣реЛрдЧрд╛ред рд▓реЗрдХрд┐рди рдЕрдЧрд░ рдЖрдк рдХрд┐рд╕реА рд╡рд┐рд╢реЗрд╖рддрд╛ рдХреЗ рдмрд╛рд╣рд░ type Foo: Debug рдкрд╛рддреЗ рд╣реИрдВ, рддреЛ рдЖрдк рдирд╣реАрдВ рдЬрд╛рди рдкрд╛рдПрдВрдЧреЗ рдХрд┐ рд╡рд╣ рдХреНрдпрд╛ рд╣реИред рдЗрд╕реЗ рд▓рд╛рдЧреВ рдХрд░рдиреЗ рд╡рд╛рд▓рд╛ рдХреЛрдИ рдирд╣реАрдВ рд╣реИ, рддреЛ рдХреНрдпрд╛ рдпрд╣ рдХрд┐рд╕реА рдкреНрд░рдХрд╛рд░ рдХреА рдЖрдЧреЗ рдХреА рдШреЛрд╖рдгрд╛ рд╣реИ? рдХреНрдпрд╛ рдЗрд╕рдХрд╛ рд╡рд┐рд░рд╛рд╕рдд рд╕реЗ рдХреЛрдИ рд▓реЗрдирд╛-рджреЗрдирд╛ рд╣реИ, рдЬреИрд╕рд╛ рдХрд┐ C++ рдореЗрдВ рд╣реЛрддрд╛ рд╣реИ? рдХреНрдпрд╛ рдпрд╣ рдПрдХ рдПрдордПрд▓ рдореЙрдбреНрдпреВрд▓ рдХреА рддрд░рд╣ рд╣реИ рдЬрд╣рд╛рдВ рдХреЛрдИ рдФрд░ рдкреНрд░рдХрд╛рд░ рдЪреБрдирддрд╛ рд╣реИ? рдФрд░ рдЕрдЧрд░ рдЖрдкрдиреЗ рдкрд╣рд▓реЗ impl Trait рджреЗрдЦрд╛ рд╣реИ, рддреЛ рдЙрдирдХреЗ рдмреАрдЪ рд▓рд┐рдВрдХ рдмрдирд╛рдиреЗ рдХреЗ рд▓рд┐рдП рдХреБрдЫ рднреА рдирд╣реАрдВ рд╣реИред рд╣рдо fn foo() -> impl ToString рд▓рд┐рдЦрддреЗ рд╣реИрдВ, рди рдХрд┐ fn foo(): ToString ред

рдЯрд╛рдЗрдк рдлреВ = рдЗрдореНрдкреНрд▓рд╛ рдмрд╛рд░; рдЗрд╕рдореЗрдВ рд╕рдордЭрдиреЗ рдпреЛрдЧреНрдп рд╕рдорд╕реНрдпрд╛рдПрдВ рднреА рд╣реИрдВ рдЬрд┐рдирдореЗрдВ рдЖрдк = рдЗрдореНрдкреНрд▓рд╛ рдмрд╛рд░ рджреЗрдЦрддреЗ рд╣реИрдВ рдФрд░ рдирд┐рд╖реНрдХрд░реНрд╖ рдирд┐рдХрд╛рд▓рддреЗ рд╣реИрдВ рдХрд┐ рдЖрдк рдЗрд╕реЗ рдкреНрд░рддреНрдпреЗрдХ рдШрдЯрдирд╛ рдкрд░ рдкреНрд░рддрд┐рд╕реНрдерд╛рдкрд┐рдд рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ рдЬрд╣рд╛рдВ рдЗрд╕рдХрд╛ рдЙрдкрдпреЛрдЧ -> рдЗрдореНрдкреНрд▓рд╛ рдмрд╛рд░ рдХреЗ рд░реВрдк рдореЗрдВ рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИ

рдореИрдВ рдЗрд╕реЗ рдпрд╣рд╛рдБ рдХрд╣рд╛ рд╣реИ рд╕реЗ рдкрд╣рд▓реЗ, рд▓реЗрдХрд┐рди рд╕реЛрдЪ рдХреА рддрд░рд╣ рдХрд╛ рд╣реИ рдХрд┐ let x = foo(); рд╕рд╛рдзрди рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░ рд╕рдХрддреЗ x рдХреЗ рдмрдЬрд╛рдп foo() ред рдХрд┐рд╕реА рднреА рдорд╛рдорд▓реЗ рдореЗрдВ, рдпрд╣ рдПрдХ рд╡рд┐рд╡рд░рдг рд╣реИ рдХрд┐ рдЬрд░реВрд░рдд рдкрдбрд╝рдиреЗ рдкрд░ рдХреЛрдИ рд╡реНрдпрдХреНрддрд┐ рдЬрд▓реНрджреА рд╕реЗ рджреЗрдЦ рд╕рдХрддрд╛ рд╣реИ, рд▓реЗрдХрд┐рди рдореВрд▓ рд░реВрдк рд╕реЗ рдЕрд╡рдзрд╛рд░рдгрд╛ рдХреЛ рдирд╣реАрдВ рдмрджрд▓рддрд╛ рд╣реИред

рдпрд╛рдиреА, рдпрд╣ рдкрддрд╛ рд▓рдЧрд╛рдирд╛ рдЖрд╕рд╛рди рд╣реИ рдХрд┐ рдпрд╣ рдХрд┐рд╕ рдмрд╛рд░реЗ рдореЗрдВ рд╣реИ (рдПрдХ рдШрдЯрд╛ рд╣реБрдЖ рдкреНрд░рдХрд╛рд░ рдЬреИрд╕реЗ -> impl Trait ), рднрд▓реЗ рд╣реА рдЖрдк рдирд╣реАрдВ рдЬрд╛рдирддреЗ рдХрд┐ рдпрд╣ рд╡рд╛рд╕реНрддрд╡ рдореЗрдВ рдХреИрд╕реЗ рдХрд╛рдо рдХрд░рддрд╛ рд╣реИ (рдХреНрдпрд╛ рд╣реЛрддрд╛ рд╣реИ рдЬрдм рдЖрдкрдХреЗ рдкрд╛рд╕ рдЗрд╕рдХреЗ рд▓рд┐рдП рдкрд░рд╕реНрдкрд░ рд╡рд┐рд░реЛрдзреА рдкрд░рд┐рднрд╛рд╖рд╛рдПрдВ рд╣реЛрддреА рд╣реИрдВ)ред рдЕрдиреНрдп рд╡рд╛рдХреНрдпрд╡рд┐рдиреНрдпрд╛рд╕ рдХреЗ рд╕рд╛рде рдпрд╣ рд╕рдордЭрдирд╛ рднреА рдореБрд╢реНрдХрд┐рд▓ рд╣реИ рдХрд┐ рдпрд╣ рдХреНрдпрд╛ рд╣реИред

@рд╕реЗрдВрдЯреНрд░рд┐рд▓

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

"рдЕрдкреВрд░реНрдг" рдХрд╛ рдорддрд▓рдм рдЬрд╛рдирдХрд╛рд░реА рдХреА рдХрдореА рдирд╣реАрдВ рд╣реИ, рдЗрд╕рдХрд╛ рдорддрд▓рдм рдпрд╣ рд╣реЛ рд╕рдХрддрд╛ рд╣реИ рдХрд┐ рдХреБрдЫ рдРрд╕рд╛ рд▓рдЧрддрд╛ рд╣реИ рдХрд┐ рдЗрд╕рдореЗрдВ рдХреБрдЫ рдФрд░ рд╣реЛрдирд╛ рдЪрд╛рд╣рд┐рдП рдФрд░ рдирд╣реАрдВред

type Foo: Trait; рдПрдХ рдкреВрд░реНрдг рдШреЛрд╖рдгрд╛ рдХреА рддрд░рд╣ рдирд╣реАрдВ рджрд┐рдЦрддрд╛ рд╣реИред рдРрд╕рд╛ рд▓рдЧрддрд╛ рд╣реИ рдХрд┐ рдЗрд╕рдореЗрдВ рдХреБрдЫ рдХрдореА рд╣реИред рдФрд░ рдпрд╣ type Foo = SomeType<X, Y, Z>; рд╕реЗ рдЕрдирд╛рд╡рд╢реНрдпрдХ рд░реВрдк рд╕реЗ рдЕрд▓рдЧ рд▓рдЧрддрд╛ рд╣реИред

рд╢рд╛рдпрдж рд╣рдо рдЗрд╕ рдмрд┐рдВрджреБ рдкрд░ рдкрд╣реБрдВрдЪ рд░рд╣реЗ рд╣реИрдВ рдХрд┐ рд╣рдорд╛рд░реЗ рд╡рди-рд▓рд╛рдЗрдирд░реНрд╕ рд╡рд╛рд╕реНрддрд╡ рдореЗрдВ type Inferred: Trait рдФрд░ type Inferred = impl Trait рдмреАрдЪ рдЗрд╕ рдЖрдо рд╕рд╣рдорддрд┐ рдХреЗ рдЕрдВрддрд░ рдХреЛ рдкрд╛рдЯ рдирд╣реАрдВ рд╕рдХрддреЗ рд╣реИрдВред

рдХреНрдпрд╛ рдЖрдкрдХреЛ рд▓рдЧрддрд╛ рд╣реИ рдХрд┐ рдХрд┐рд╕реА рднреА рд╕рд┐рдВрдЯреИрдХреНрд╕ (рдпрд╣рд╛рдВ рддрдХ тАЛтАЛтАЛтАЛрдХрд┐ рдЖрд░рдПрдлрд╕реА рдореЗрдВ рдирд┐рд░реНрджрд┐рд╖реНрдЯ рдПрдХ) рдХреЗ рд╕рд╛рде рдЗрд╕ рд╕реБрд╡рд┐рдзрд╛ рдХреЗ рдкреНрд░рдпреЛрдЧрд╛рддреНрдордХ рдХрд╛рд░реНрдпрд╛рдиреНрд╡рдпрди рдХреЛ рдПрдХ рд╕рд╛рде рд░рдЦрдирд╛ рдЙрдЪрд┐рдд рд╣реЛрдЧрд╛ рддрд╛рдХрд┐ рд╣рдо рдмрдбрд╝реЗ рдХрд╛рд░реНрдпрдХреНрд░рдореЛрдВ рдореЗрдВ рдЗрд╕рдХреЗ рд╕рд╛рде рдЦреЗрд▓рдирд╛ рд╢реБрд░реВ рдХрд░ рд╕рдХреЗрдВ рдХрд┐ рдпрд╣ рд╕рдВрджрд░реНрдн рдореЗрдВ рдХреИрд╕реЗ рдлрд┐рдЯ рдмреИрдарддрд╛ рд╣реИ?

@lnicola

[..] impl Trait рд╣рд░ рдЬрдЧрд╣ рдХрд╛рдо рдХрд░рддрд╛ рд╣реИ, рдпрд╛ рд▓рдЧрднрдЧ

рдЦреИрд░, Foo: Bound рднреА рд▓рдЧрднрдЧ рд╣рд░ рдЬрдЧрд╣ рдХрд╛рдо рдХрд░рддрд╛ рд╣реИ;)

рд▓реЗрдХрд┐рди рдЕрдЧрд░ рдЖрдк рдХрд┐рд╕реА рд╡рд┐рд╢реЗрд╖рддрд╛ рдХреЗ рдмрд╛рд╣рд░ type Foo: Debug рдкрд╛рддреЗ рд╣реИрдВ, рддреЛ рдЖрдк рдирд╣реАрдВ рдЬрд╛рди рдкрд╛рдПрдВрдЧреЗ рдХрд┐ рд╡рд╣ рдХреНрдпрд╛ рд╣реИред

рдореБрдЭреЗ рд▓рдЧрддрд╛ рд╣реИ рдХрд┐ рдЗрд╕рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдиреЗ рдХреА рдкреНрд░рдЧрддрд┐: рд╡рд┐рд╢реЗрд╖рддрд╛ -> impl -> рд╕реАрдЦрдиреЗ рдореЗрдВ рдЙрдкрдирд╛рдо рдПрдбреНрд╕ рдЯрд╛рдЗрдк рдХрд░реЗрдВред
рдЗрд╕рдХреЗ рдЕрд▓рд╛рд╡рд╛, рдореБрдЭреЗ рд▓рдЧрддрд╛ рд╣реИ рдХрд┐ рдЕрдиреБрдорд╛рди рд╣реИ рдХрд┐ "рдлреВ рдкреНрд░рдХрд╛рд░ рдбрд┐рдмрдЧ рд▓рд╛рдЧреВ рдХрд░рддрд╛ рд╣реИ" рдХреА рд╕рдВрднрд╛рд╡рдирд╛ рд╣реИ
type Foo: Debug рд▓рдХреНрд╖рдгреЛрдВ рдореЗрдВ рдФрд░ рд╕рд╛рдорд╛рдиреНрдп рд╕реАрдорд╛ рд╕реЗ рджреЗрдЦрдирд╛ рдФрд░ рдпрд╣ рднреА рд╕рд╣реА рд╣реИред

рдХреНрдпрд╛ рдЗрд╕рдХрд╛ рд╡рд┐рд░рд╛рд╕рдд рд╕реЗ рдХреЛрдИ рд▓реЗрдирд╛-рджреЗрдирд╛ рд╣реИ, рдЬреИрд╕рд╛ рдХрд┐ C++ рдореЗрдВ рд╣реЛрддрд╛ рд╣реИ?

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

рдХреНрдпрд╛ рдпрд╣ рдПрдХ рдПрдордПрд▓ рдореЙрдбреНрдпреВрд▓ рдХреА рддрд░рд╣ рд╣реИ рдЬрд╣рд╛рдВ рдХреЛрдИ рдФрд░ рдкреНрд░рдХрд╛рд░ рдЪреБрдирддрд╛ рд╣реИ?

рдпрд╣ рдЕрдиреБрдорд╛рди type Foo = impl Bar; рдХреЗ рд▓рд┐рдП рднреА рдмрдирд╛рдпрд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИ рдХреНрдпреЛрдВрдХрд┐ arg: impl Bar рдЬрд╣рд╛рдВ рдХреЙрд▓рд░ (рдЙрдкрдпреЛрдЧрдХрд░реНрддрд╛) рдкреНрд░рдХрд╛рд░ рдЪреБрдирддрд╛ рд╣реИред рдореЗрд░реЗ рд▓рд┐рдП, рдЙрдкрдпреЛрдЧрдХрд░реНрддрд╛ рдЬрд┐рд╕ рдкреНрд░рдХрд╛рд░ рдХрд╛ рдЪрдпрди рдХрд░рддрд╛ рд╣реИ, рдЙрд╕рдХреЗ рд▓рд┐рдП type Foo: Bar; рд╕рдВрднрд╛рд╡рдирд╛ рдХрдо рд▓рдЧрддреА рд╣реИред

рдореИрдВ рдЗрд╕реЗ рдпрд╣рд╛рдБ рдХрд╣рд╛ рд╣реИ рд╕реЗ рдкрд╣рд▓реЗ, рд▓реЗрдХрд┐рди рд╕реЛрдЪ рдХреА рддрд░рд╣ рдХрд╛ рд╣реИ рдХрд┐ let x = foo(); рд╕рд╛рдзрди рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░ рд╕рдХрддреЗ x рдХреЗ рдмрдЬрд╛рдп foo() ред

рдпрджрд┐ рднрд╛рд╖рд╛ рд╕рдВрджрд░реНрднрд╛рддреНрдордХ рд░реВрдк рд╕реЗ рдкрд╛рд░рджрд░реНрд╢реА рд╣реИ, рддреЛ рдЖрдк x рдХреЛ foo() рдкреНрд░рддрд┐рд╕реНрдерд╛рдкрд┐рдд рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ ред рдЬрдм рддрдХ рд╣рдо рд╕рд┐рд╕реНрдЯрдо рдореЗрдВ type Foo = impl Foo; рдЬреЛрдбрд╝рддреЗ рд╣реИрдВ, рддрдм рддрдХ рдЙрдкрдирд╛рдореЛрдВ рдХреЛ рд╕рдВрджрд░реНрднрд┐рдд рд░реВрдк рд╕реЗ рдкрд╛рд░рджрд░реНрд╢реА рдЯрд╛рдЗрдк рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИред рдЗрд╕рдХреЗ рд╡рд┐рдкрд░реАрдд, рдРрд╕реЗ рдореЗрдВ рдкрд╣рд▓реЗ рд╕реЗ рд╣реА рд╣реИ рдХрд┐ рдЕрдЧрд░ рдПрдХ рдмрд╛рдзреНрдпрдХрд╛рд░реА x = foo() рдЙрдкрд▓рдмреНрдз рд╣реИ, рддреЛ рдЕрдиреНрдп foo() рдореЗрдВ рд╕рд╛рде рдмрджрд▓реА рд╣реИрдВ x ред

@joshtriplett

"рдЕрдкреВрд░реНрдг" рдХрд╛ рдорддрд▓рдм рдЬрд╛рдирдХрд╛рд░реА рдХреА рдХрдореА рдирд╣реАрдВ рд╣реИ, рдЗрд╕рдХрд╛ рдорддрд▓рдм рдпрд╣ рд╣реЛ рд╕рдХрддрд╛ рд╣реИ рдХрд┐ рдХреБрдЫ рдРрд╕рд╛ рд▓рдЧрддрд╛ рд╣реИ рдХрд┐ рдЗрд╕рдореЗрдВ рдХреБрдЫ рдФрд░ рд╣реЛрдирд╛ рдЪрд╛рд╣рд┐рдП рдФрд░ рдирд╣реАрдВред

рдХрд╛рдлреА рдЙрдЪрд┐рдд; рд▓реЗрдХрд┐рди рдХреНрдпрд╛ рд╣реЛрдирд╛ рдЪрд╛рд╣рд┐рдП рдерд╛ рдХрд┐ рдпрд╣ рдирд╣реАрдВ рд╣реИ?

type Foo: Trait; рдПрдХ рдкреВрд░реНрдг рдШреЛрд╖рдгрд╛ рдХреА рддрд░рд╣ рдирд╣реАрдВ рджрд┐рдЦрддрд╛ рд╣реИред

рдореБрдЭреЗ рдкреВрд░рд╛ рд▓рдЧрддрд╛ рд╣реИред рдпрд╣ рдПрдХ рдирд┐рд░реНрдгрдп рдХреА рддрд░рд╣ рджрд┐рдЦрддрд╛ рд╣реИ рдХрд┐ Foo Trait рд╕рдВрддреБрд╖реНрдЯ рдХрд░рддрд╛ рд╣реИ рдЬреЛ рдХрд┐ рд╕рдЯреАрдХ рдЕрд░реНрде рд╣реИред

@ рдореЗрд░реЗ рд▓рд┐рдП "рдХреБрдЫ рдЧрд╛рдпрдм" рд╡рд╛рд╕реНрддрд╡рд┐рдХ рдкреНрд░рдХрд╛рд░ рд╣реИ рдЬрд┐рд╕рдХреЗ рд▓рд┐рдП рдпрд╣ рдЙрдкрдирд╛рдо рд╣реИред рдпрд╣ рдореЗрд░реЗ рдкрд╣рд▓реЗ рдХреЗ рднреНрд░рдо рд╕реЗ рдереЛрдбрд╝рд╛ рд╕рдВрдмрдВрдзрд┐рдд рд╣реИред рдРрд╕рд╛ рдирд╣реАрдВ рд╣реИ рдХрд┐ рдРрд╕рд╛ рдХреЛрдИ рдкреНрд░рдХрд╛рд░ рдирд╣реАрдВ рд╣реИ, рдмрд╕ рд╡рд╣ рдкреНрд░рдХрд╛рд░ рдЧреБрдордирд╛рдо рд╣реИ... = рд╕реВрдХреНрд╖реНрдорддрд╛ рд╕реЗ рдЙрдкрдпреЛрдЧ рдХрд░рдиреЗ рдХрд╛ рдЕрд░реНрде рд╣реИ рдХрд┐ рдПрдХ рдкреНрд░рдХрд╛рд░ рд╣реИ рдФрд░ рдпрд╣ рд╣рдореЗрд╢рд╛ рдПрдХ рд╣реА рдкреНрд░рдХрд╛рд░ рдХрд╛ рд╣реЛрддрд╛ рд╣реИ рд▓реЗрдХрд┐рди рд╣рдо рдЗрд╕рдХрд╛ рдирд╛рдо рдирд╣реАрдВ рджреЗ рд╕рдХрддреЗред

рдореБрдЭреЗ рд▓рдЧрддрд╛ рд╣реИ рдХрд┐ рд╣рдо рд╣рд╛рд▓рд╛рдВрдХрд┐ рдЗрди рддрд░реНрдХреЛрдВ рдХреЛ рд╕рдорд╛рдкреНрдд рдХрд░ рд░рд╣реЗ рд╣реИрдВред рдкреНрд░рдпреЛрдЧрд╛рддреНрдордХ рд░реВрдк рд╕реЗ рджреЛрдиреЛрдВ рд╡рд╛рдХреНрдпрд╡рд┐рдиреНрдпрд╛рд╕реЛрдВ рдХреЛ рд▓рд╛рдЧреВ рдХрд░рдирд╛ рдФрд░ рдпрд╣ рджреЗрдЦрдирд╛ рдмрд╣реБрдд рдЕрдЪреНрдЫрд╛ рд╣реЛрдЧрд╛ рдХрд┐ рд╕рдмрд╕реЗ рдЕрдЪреНрдЫрд╛ рдХреНрдпрд╛ рдХрд╛рдо рдХрд░рддрд╛ рд╣реИред

@ рдорд╛рд░реНрдХ-рдЗрдо

@ рдореЗрд░реЗ рд▓рд┐рдП "рдХреБрдЫ рдЧрд╛рдпрдм" рд╡рд╛рд╕реНрддрд╡рд┐рдХ рдкреНрд░рдХрд╛рд░ рд╣реИ рдЬрд┐рд╕рдХреЗ рд▓рд┐рдП рдпрд╣ рдЙрдкрдирд╛рдо рд╣реИред рдпрд╣ рдореЗрд░реЗ рдкрд╣рд▓реЗ рдХреЗ рднреНрд░рдо рд╕реЗ рдереЛрдбрд╝рд╛ рд╕рдВрдмрдВрдзрд┐рдд рд╣реИред рдРрд╕рд╛ рдирд╣реАрдВ рд╣реИ рдХрд┐ рдРрд╕рд╛ рдХреЛрдИ рдкреНрд░рдХрд╛рд░ рдирд╣реАрдВ рд╣реИ, рдмрд╕ рд╡рд╣ рдкреНрд░рдХрд╛рд░ рдЧреБрдордирд╛рдо рд╣реИ... = рд╕реВрдХреНрд╖реНрдорддрд╛ рд╕реЗ рдЙрдкрдпреЛрдЧ рдХрд░рдиреЗ рдХрд╛ рдЕрд░реНрде рд╣реИ рдХрд┐ рдПрдХ рдкреНрд░рдХрд╛рд░ рд╣реИ рдФрд░ рдпрд╣ рд╣рдореЗрд╢рд╛ рдПрдХ рд╣реА рдкреНрд░рдХрд╛рд░ рдХрд╛ рд╣реЛрддрд╛ рд╣реИ рд▓реЗрдХрд┐рди рд╣рдо рдЗрд╕рдХрд╛ рдирд╛рдо рдирд╣реАрдВ рджреЗ рд╕рдХрддреЗред

рдареАрдХ рдРрд╕рд╛ рд╣реА рдореБрдЭреЗ рднреА рд▓рдЧрддрд╛ рд╣реИред

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

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

@varkor рдХреНрдпрд╛ рд╢рдмреНрджрд╛рд░реНрде рдЕрд╕реНрдкрд╖реНрдЯ рд╣реИрдВ? AFAIK impl Trait рдХреЗ рд╢рдмреНрджрд╛рд░реНрде рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рдХреБрдЫ рднреА RFC 1951 рдХреЗ рдмрд╛рдж рд╕реЗ рдирд╣реАрдВ рдмрджрд▓рд╛ рд╣реИ, рдФрд░ 2071 рдореЗрдВ рд╡рд┐рд╕реНрддрд╛рд░рд┐рдд рд╣реБрдЖ рд╣реИред

@alexreg рдореЗрд░реЗ рдкрд╛рд╕ рдХреЛрдИ рдпреЛрдЬрдирд╛ рдирд╣реАрдВ рдереА, рд▓реЗрдХрд┐рди рдпрд╣рд╛рдВ рдПрдХ рдореЛрдЯрд╛ рд░реВрдкрд░реЗрдЦрд╛ рд╣реИ: рдкрд╛рд░реНрд╕рд┐рдВрдЧ рдХреЛ рдЬреЛрдбрд╝рдиреЗ рдХреЗ рдмрд╛рдж, рдЖрдкрдХреЛ static s рдФрд░ const s рдХреЗ рдкреНрд░рдХрд╛рд░реЛрдВ рдХреЛ рдПрдХ рдЕрд╕реНрддрд┐рддреНрд╡рдЧрдд рдирд┐рд╣рд┐рддрд╛рд░реНрде рдХреЗ рдЕрдВрджрд░ рдХрдо рдХрд░рдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реИ рд╡рд┐рд╢реЗрд╖рддрд╛ рд╕рдВрджрд░реНрдн, рдЬреИрд╕рд╛ рдХрд┐ рдпрд╣рд╛рдВ рд░рд┐рдЯрд░реНрди рдкреНрд░рдХрд╛рд░ рдХреЗ рдХрд╛рд░реНрдпреЛрдВ рдХреЗ рд▓рд┐рдП рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИ DefId рдХреЛ ImplTraitContext::Existential рд╡реИрдХрд▓реНрдкрд┐рдХ рдмрдирд╛рдирд╛ рдЪрд╛рд╣реЗрдВрдЧреЗ, рдХреНрдпреЛрдВрдХрд┐ рдЖрдк рдирд╣реАрдВ рдЪрд╛рд╣рддреЗ рдХрд┐ рдЖрдкрдХрд╛ impl Trait рдкреЗрд░реЗрдВрдЯ рдлрд╝рдВрдХреНрд╢рди рдкрд░рд┐рднрд╛рд╖рд╛ рд╕реЗ рдЬреЗрдирд░рд┐рдХ рдЪреБрдиреЗрдВред рдпрд╣ рдЖрдкрдХреЛ рдПрдХ рд╕рднреНрдп рддрд░реАрдХреЗ рд╕реЗ рдкреНрд░рд╛рдкреНрдд рдХрд░рдирд╛ рдЪрд╛рд╣рд┐рдПред рдпрджрд┐ рдЖрдк @ oli-obk рдХреЗ рдЕрд╕реНрддрд┐рддреНрд╡рдЧрдд рдкреНрд░рдХрд╛рд░ PR рдХреЗ рд╢реАрд░реНрд╖ рдкрд░ рдЖрдзрд╛рд░рд┐рдд рд╣реИрдВ рддреЛ рдЖрдкрдХреЗ рдкрд╛рд╕ рдПрдХ рдЖрд╕рд╛рди рд╕рдордп рд╣реЛ рд╕рдХрддрд╛ рд╣реИред

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

@varkor

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

рдЕрд░реНрде RFC 2071 рдореЗрдВ рдирд┐рд░реНрджрд┐рд╖реНрдЯ рдХрд┐рдпрд╛ рдЧрдпрд╛ рдерд╛ред

@cramertj : рдЖрд░рдПрдлрд╕реА 2071 рдореЗрдВ рдЕрд░реНрде рдЕрд╕реНрдкрд╖реНрдЯ рд╣реИ рдФрд░ "рдЕрд╕реНрддрд┐рддреНрд╡рд╡рд╛рджреА рдкреНрд░рдХрд╛рд░" рд╡рд╛рдХреНрдпрд╛рдВрд╢ рдХрд╛ рдЕрд░реНрде рдХреНрдпрд╛ рд╣реИ рдЗрд╕рдХреА рдХрдИ рд╡реНрдпрд╛рдЦреНрдпрд╛рдУрдВ рдХреА рдЕрдиреБрдорддрд┐ рджреЗрддрд╛ рд╣реИред

рдЯреАрдПрд▓; рдбреАрдЖрд░ - рдореИрдВрдиреЗ impl Trait рд▓рд┐рдП рдПрдХ рд╕рдЯреАрдХ рдЕрд░реНрде рдирд┐рд░реНрдзрд╛рд░рд┐рдд рдХрд░рдиреЗ рдХрд╛ рдкреНрд░рдпрд╛рд╕ рдХрд┐рдпрд╛ рд╣реИ, рдЬреЛ рдореБрдЭреЗ рд▓рдЧрддрд╛ рд╣реИ рдХрд┐ рд╡рд┐рд╡рд░рдг рд╕реНрдкрд╖реНрдЯ рдХрд░рддрд╛ рд╣реИ рдЬреЛ рдХрдо рд╕реЗ рдХрдо рд╕рд╣рдЬ рд░реВрдк рд╕реЗ рдЕрд╕реНрдкрд╖реНрдЯ рдереЗ; рдПрдХ рдирдП рдкреНрд░рдХрд╛рд░ рдХреЗ рдЙрдкрдирд╛рдо рд╡рд╛рдХреНрдпрд╡рд┐рдиреНрдпрд╛рд╕ рдХреЗ рдкреНрд░рд╕реНрддрд╛рд╡ рдХреЗ рд╕рд╛рдеред

рдЬрдВрдЧ рдореЗрдВ рдореМрдЬреВрдж рдкреНрд░рдХрд╛рд░ (рдкреЛрд╕реНрдЯ)


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

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

рдЗрд╕рдореЗрдВ, рдореИрдВ рдПрдХ "рдЕрд╕реНрддрд┐рддреНрд╡ рдкреНрд░рдХрд╛рд░ рдХреЗ рдЙрдкрдирд╛рдо" рдХреА рд╕рд╛рдорд╛рдиреНрдп рд░реВрдк рд╕реЗ рдмрддрд╛рдИ рдЧрдИ рдЖрд╡рд╢реНрдпрдХрддрд╛рдУрдВ рдХреЛ рдкреВрд░рд╛ рдХрд░рдиреЗ рд╡рд╛рд▓рд╛ рдПрдХ рдирдпрд╛ рд╡рд╛рдХреНрдпрд╡рд┐рдиреНрдпрд╛рд╕ рдкреНрд░рд╕реНрддрд╛рд╡рд┐рдд рдХрд░рддрд╛ рд╣реВрдВ:
type Foo: Bar = _;

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

рдЬрдВрдЧ рдореЗрдВ рдореМрдЬреВрдж рдкреНрд░рдХрд╛рд░ (рдкреЛрд╕реНрдЯ)

@varkor

RFC 2071 рдЕрд╕реНрдкрд╖реНрдЯ рд╣реИ рдФрд░ "рдЕрд╕реНрддрд┐рддреНрд╡рд╡рд╛рджреА рдкреНрд░рдХрд╛рд░" рд╡рд╛рдХреНрдпрд╛рдВрд╢ рдХрд╛ рдХреНрдпрд╛ рдЕрд░реНрде рд╣реИ, рдЗрд╕рдХреА рдХрдИ рд╡реНрдпрд╛рдЦреНрдпрд╛рдУрдВ рдХреА рдЕрдиреБрдорддрд┐ рджреЗрддрд╛ рд╣реИред

рдпрд╣ рдХреИрд╕реЗ рдЕрд╕реНрдкрд╖реНрдЯ рд╣реИ? рдореИрдВрдиреЗ рдЖрдкрдХреА рдкреЛрд╕реНрдЯ рдкрдврд╝ рд▓реА рд╣реИ-- рдореИрдВ рдЕрднреА рднреА рд╕реНрдерд┐рд░рд╛рдВрдХ рдФрд░ рд╕реНрдерд┐рд░рд╛рдВрдХ рдореЗрдВ рдЧреИрд░-рдЧрддрд┐рд╢реАрд▓ рдЕрд╕реНрддрд┐рддреНрд╡ рдХреЗ рдХреЗрд╡рд▓ рдПрдХ рдЕрд░реНрде рд╕реЗ рдЕрд╡рдЧрдд рд╣реВрдВред рдпрд╣ рдЙрд╕реА рддрд░рд╣ рд╡реНрдпрд╡рд╣рд╛рд░ рдХрд░рддрд╛ рд╣реИ рдЬреИрд╕реЗ рдкреНрд░рддрд┐-рдЖрдЗрдЯрдо рдПрдХ рдирдИ рдЕрд╕реНрддрд┐рддреНрд╡ рдкреНрд░рдХрд╛рд░ рдкрд░рд┐рднрд╛рд╖рд╛ рдкреЗрд╢ рдХрд░рдХреЗ рд╡рд╛рдкрд╕реА рд╕реНрдерд┐рддрд┐ impl Trait рдХрд░рддрд╛ рд╣реИред

type Foo: Bar = _;

рд╣рдордиреЗ RFC 2071 рдХреЗ рджреМрд░рд╛рди рдЗрд╕ рд╕рд┐рдВрдЯреИрдХреНрд╕ рдкрд░ рдЪрд░реНрдЪрд╛ рдХреАред рдЬреИрд╕рд╛ рдХрд┐ рдореИрдВрдиреЗ рд╡рд╣рд╛рдВ рдХрд╣рд╛, рдореБрдЭреЗ рдпрд╣ рдкрд╕рдВрдж рд╣реИ рдХрд┐ рдпрд╣ рд╕реНрдкрд╖реНрдЯ рд░реВрдк рд╕реЗ рдкреНрд░рджрд░реНрд╢рд┐рдд рдХрд░рддрд╛ рд╣реИ рдХрд┐ Foo рдПрдХ рдПрдХрд▓ рдЕрдиреБрдорд╛рдирд┐рдд рдкреНрд░рдХрд╛рд░ рд╣реИ рдФрд░ рдпрд╣ рдЧреИрд░-рдЕрдиреБрдорд╛рдирд┐рдд рдкреНрд░рдХрд╛рд░реЛрдВ рдХреЗ рд▓рд┐рдП рдЬрдЧрд╣ рдЫреЛрдбрд╝ рджреЗрддрд╛ рд╣реИ рдЬреЛ рд╡рд░реНрддрдорд╛рди рдореЙрдбреНрдпреВрд▓ рдХреЗ рдмрд╛рд╣рд░ рдЕрд╕реНрддрд┐рддреНрд╡ рдореЗрдВ рд╣реИрдВ ( рдЙрджрд╛рд╣рд░рдг рдХреЗ рд▓рд┐рдП type Foo: Bar = u32; )ред рдореБрдЭреЗ рдЗрд╕рдХреЗ рджреЛ рдкрд╣рд▓реВ рдирд╛рдкрд╕рдВрдж рдереЗ: (1) рдЗрд╕рдХрд╛ рдХреЛрдИ рдХреАрд╡рд░реНрдб рдирд╣реАрдВ рд╣реИ, рдФрд░ рдЗрд╕рд▓рд┐рдП рдЗрд╕реЗ рдЦреЛрдЬрдирд╛ рдХрдард┐рди рд╣реИ рдФрд░ (рдмреА) рдЗрд╕рдореЗрдВ type Foo = impl Trait рддреБрд▓рдирд╛ рдореЗрдВ рд╕рдорд╛рди рд╡рд░реНрдмреЛрд╕рд┐рдЯреА рд╕рдорд╕реНрдпрд╛ рд╣реИ рдХрд┐ abstract type Foo: Bar; рд╕рд┐рдВрдЯреИрдХреНрд╕ рд╣реИ: type Foo = impl Iterator<Item = impl Display>; type Foo: Iterator<Item = MyDisplay> = _; type MyDisplay: Display = _; рдмрди рдЬрд╛рддрд╛ рд╣реИред рдореБрдЭреЗ рдирд╣реАрдВ рд▓рдЧрддрд╛ рдХрд┐ рдЗрдирдореЗрдВ рд╕реЗ рдХреЛрдИ рднреА рдбреАрд▓-рдмреНрд░реЗрдХрд░ рд╣реИ, рд▓реЗрдХрд┐рди рдпрд╣ рдПрдХ рддрд░рд╣ рд╕реЗ рдпрд╛ рдХрд┐рд╕реА рдЕрдиреНрдп IMO рдХреА рд╕реНрдкрд╖реНрдЯ рдЬреАрдд рдирд╣реАрдВ рд╣реИред

@cramertj рдЕрд╕реНрдкрд╖реНрдЯрддрд╛ рдпрд╣рд╛рдБ рд╕рд╛рдордиреЗ рдЖрддреА рд╣реИ:

type Foo = impl Bar;
fn f() -> Foo { .. }
fn g() -> Foo { .. }

рдпрджрд┐ Foo рд╡рд╛рд╕реНрддрд╡ рдореЗрдВ рдПрдХ рдЕрд╕реНрддрд┐рддреНрд╡рдЧрдд рдкреНрд░рдХрд╛рд░ рдХреЗ рд▓рд┐рдП рдПрдХ рдкреНрд░рдХрд╛рд░ рдХрд╛ рдЙрдкрдирд╛рдо рдерд╛, рддреЛ f рдФрд░ g рд╡рд┐рднрд┐рдиреНрди рдареЛрд╕ рд░рд┐рдЯрд░реНрди рдкреНрд░рдХрд╛рд░реЛрдВ рдХрд╛ рд╕рдорд░реНрдерди рдХрд░реЗрдВрдЧреЗред рдХрдИ рд▓реЛрдЧреЛрдВ рдиреЗ рд╕рд╣рдЬ рд░реВрдк рд╕реЗ рдЙрд╕ рд╕рд┐рдВрдЯреИрдХреНрд╕ рдХреЛ рдЗрд╕ рддрд░рд╣ рд╕реЗ рдкрдврд╝рд╛ рд╣реИ, рдФрд░ рд╡рд╛рд╕реНрддрд╡ рдореЗрдВ RFC 2071 рд╕рд┐рдВрдЯреИрдХреНрд╕ рдЪрд░реНрдЪрд╛ рдореЗрдВ рдХреБрдЫ рдкреНрд░рддрд┐рднрд╛рдЧрд┐рдпреЛрдВ рдиреЗ рдХреЗрд╡рд▓ рдпрд╣ рдорд╣рд╕реВрд╕ рдХрд┐рдпрд╛ рд╣реИ рдХрд┐ рд╣рд╛рд▓рд┐рдпрд╛ рдбрд┐рд╕реНрдХреЙрд░реНрдб рдЪрд░реНрдЪрд╛ рдХреЗ рд╣рд┐рд╕реНрд╕реЗ рдХреЗ рд░реВрдк рдореЗрдВ рдкреНрд░рд╕реНрддрд╛рд╡ рдЗрд╕ рддрд░рд╣ рдХрд╛рдо рдирд╣реАрдВ рдХрд░рддрд╛ рд╣реИ ред

рд╕рдорд╕реНрдпрд╛ рдпрд╣ рд╣реИ рдХрд┐, рд╡рд┐рд╢реЗрд╖ рд░реВрдк рд╕реЗ рддрд░реНрдХ-рд╕реНрдерд┐рддрд┐ impl Trait рдХреЗ рд╕рд╛рдордиреЗ, рдпрд╣ рдмрд┐рд▓реНрдХреБрд▓ рд╕реНрдкрд╖реНрдЯ рдирд╣реАрдВ рд╣реИ рдХрд┐ рдЕрд╕реНрддрд┐рддреНрд╡рдЧрдд рдХреНрд╡рд╛рдВрдЯрд┐рдлрд╛рдпрд░ рдХрд╣рд╛рдВ рдЬрд╛рдирд╛ рд╣реИред рддрд░реНрдХреЛрдВ рдХреЗ рд▓рд┐рдП рдпрд╣ рдХрд╕рдХрд░ рдЧреБрдВрдЬрд╛рдЗрд╢ рд╣реИ; рд╡рд╛рдкрд╕реА рдХреА рд╕реНрдерд┐рддрд┐ рдХреЗ рд▓рд┐рдП рдпрд╣ рдХрд╕рдХрд░ рдЧреБрдВрдЬрд╛рдЗрд╢ рд▓рдЧрддрд╛ рд╣реИ рд▓реЗрдХрд┐рди рдЗрд╕рд╕реЗ рдХрд╣реАрдВ рдЕрдзрд┐рдХ рдЪреМрдбрд╝рд╛ рд╣реЛ рдЬрд╛рддрд╛ рд╣реИ; type Foo = impl Bar рджреЛрдиреЛрдВ рд╕реНрдерд┐рддрд┐рдпрд╛рдВ рдкреНрд░рд╢рдВрд╕рдиреАрдп рд╣реИрдВред _ -рдЖрдзрд╛рд░рд┐рдд рд╕рд┐рдВрдЯреИрдХреНрд╕ рдПрдХ рд╡реНрдпрд╛рдЦреНрдпрд╛ рдХреА рдУрд░ рдЗрд╢рд╛рд░рд╛ рдХрд░рддрд╛ рд╣реИ рдЬрд┐рд╕рдореЗрдВ "рдЕрд╕реНрддрд┐рддреНрд╡рд╡рд╛рджреА" рднреА рд╢рд╛рдорд┐рд▓ рдирд╣реАрдВ рд╣реИ, рдЗрд╕ рд╕рдорд╕реНрдпрд╛ рдХреЛ рдмрдбрд╝реЗ рдХрд░реАрдиреЗ рд╕реЗ рджреВрд░ рдХрд░рдирд╛ред

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

(рдЬреЛрд░ рдореЗрд░рд╛)ред рдореИрдВрдиреЗ рдкрдврд╝рд╛ рд╣реИ рдХрд┐ 'рдП' 'рдПрдХ рд╡рд┐рд╢рд┐рд╖реНрдЯ' рдХреЗ рд░реВрдк рдореЗрдВ рдЬрд┐рд╕рдХрд╛ рдЕрд░реНрде рд╣реИ f рдФрд░ g _not_ рд╡рд┐рднрд┐рдиреНрди рдареЛрд╕ рд░рд┐рдЯрд░реНрди рдкреНрд░рдХрд╛рд░реЛрдВ рдХрд╛ рд╕рдорд░реНрдерди рдХрд░реЗрдЧрд╛, рдХреНрдпреЛрдВрдХрд┐ рд╡реЗ рдПрдХ рд╣реА рдЕрд╕реНрддрд┐рддреНрд╡ рдХреЗ рдкреНрд░рдХрд╛рд░ рдХреЛ рд╕рдВрджрд░реНрднрд┐рдд рдХрд░рддреЗ рд╣реИрдВред рдореИрдВрдиреЗ рд╣рдореЗрд╢рд╛ type Foo = impl Bar; рдХреЛ let foo: impl Bar; рдХреЗ рд╕рдорд╛рди рдЕрд░реНрде рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рддреЗ рд╣реБрдП рджреЗрдЦрд╛ рд╣реИ, рдпрд╛рдиреА рдПрдХ рдирдпрд╛ рдЕрдЬреНрдЮрд╛рдд рдЕрд╕реНрддрд┐рддреНрд╡ рдкреНрд░рдХрд╛рд░ рдкреЗрд╢ рдХрд░рдирд╛; рдЕрдкрдиреЗ рдЙрджрд╛рд╣рд░рдг рдХреЛ рдХреЗ рдмрд░рд╛рдмрд░ рдмрдирд╛рдирд╛

existential type _0: Bar;
type Foo = _0;
fn f() -> Foo { .. }
fn g() -> Foo { .. }

рдЬреЛ рдореБрдЭреЗ рдЙрдореНрдореАрдж рд╣реИ рдХрд┐ рдЕрдкреЗрдХреНрд╖рд╛рдХреГрдд рд╕реНрдкрд╖реНрдЯ рд╣реИред


рдПрдХ рдореБрджреНрджрд╛ рдпрд╣ рд╣реИ рдХрд┐ " impl Trait рдкреНрд░рдХрд╛рд░ рдХреЗ рдЙрдкрдирд╛рдореЛрдВ рдореЗрдВ" рдХрд╛ рдЕрд░реНрде рдХрднреА рднреА RFC рдореЗрдВ рдирд┐рд░реНрджрд┐рд╖реНрдЯ рдирд╣реАрдВ рдХрд┐рдпрд╛ рдЧрдпрд╛ рд╣реИред рдЗрд╕рдХрд╛ рд╕рдВрдХреНрд╖реЗрдк рдореЗрдВ RFC 2071 рдХреЗ "рд╡рд┐рдХрд▓реНрдк" рдЦрдВрдб рдореЗрдВ рдЙрд▓реНрд▓реЗрдЦ рдХрд┐рдпрд╛ рдЧрдпрд╛ рд╣реИ, рд▓реЗрдХрд┐рди рдЗрди рдЕрдВрддрд░реНрдирд┐рд╣рд┐рдд рд╢рд┐рдХреНрд╖рдг рдЕрд╕реНрдкрд╖реНрдЯрддрд╛рдУрдВ рдХреЗ рдХрд╛рд░рдг рд╕реНрдкрд╖реНрдЯ рд░реВрдк рд╕реЗ рдЫреВрдЯ рджреА рдЧрдИ рд╣реИред

рдореБрдЭреЗ рдпрд╣ рднреА рд▓рдЧрддрд╛ рд╣реИ рдХрд┐ рдореИрдВрдиреЗ рдХреБрдЫ рдЙрд▓реНрд▓реЗрдЦ рджреЗрдЦрд╛ рд╣реИ рдХрд┐ рдЙрдкрдирд╛рдо рдкрд╣рд▓реЗ рд╕реЗ рд╣реА рд╕рдВрджрд░реНрднрд┐рдд рд░реВрдк рд╕реЗ рдкрд╛рд░рджрд░реНрд╢реА рдирд╣реАрдВ рд╣реИрдВред рдореБрдЭреЗ рд▓рдЧрддрд╛ рд╣реИ рдХрд┐ рдпрд╣ url.o рдкрд░ рдерд╛, рд▓реЗрдХрд┐рди рдореБрдЭреЗ рдХреБрдЫ рдЦреЛрдЬ рдХреЗ рдмрд╛рдж рдЪрд░реНрдЪрд╛ рдирд╣реАрдВ рдорд┐рд▓реАред

@cramertj
@rpjohnst рдХреЗ рдмрд┐рдВрджреБ рд╕реЗ рдЕрдиреБрд╕рд░рдг рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП, impl Trait рдХреЗ рд╢рдмреНрджрд╛рд░реНрде рдХреА рдХрдИ рд╡реНрдпрд╛рдЦреНрдпрд╛рдПрдВ рд╣реИрдВ, рдЬреЛ рд╕рднреА рд╣рд╕реНрддрд╛рдХреНрд╖рд░реЛрдВ рдореЗрдВ рд╡рд░реНрддрдорд╛рди рдЙрдкрдпреЛрдЧ рдХреЗ рдЕрдиреБрд░реВрдк рд╣реИрдВ, рд▓реЗрдХрд┐рди impl Trait рдХреЛ рджреВрд╕рд░реЗ рддрдХ рд╡рд┐рд╕реНрддрд╛рд░рд┐рдд рдХрд░рддреЗ рд╕рдордп рдЕрд▓рдЧ-рдЕрд▓рдЧ рдкрд░рд┐рдгрд╛рдо рд╣реЛрддреЗ рд╣реИрдВред рд╕реНрдерд╛рди (рдореИрдВ рдкреЛрд╕реНрдЯ рдореЗрдВ рд╡рд░реНрдгрд┐рдд рдПрдХ рдХреЗ рдЕрд▓рд╛рд╡рд╛ 2 рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рдЬрд╛рдирддрд╛ рд╣реВрдВ, рд▓реЗрдХрд┐рди рдЬреЛ рдЪрд░реНрдЪрд╛ рдХреЗ рд▓рд┐рдП рдмрд┐рд▓реНрдХреБрд▓ рддреИрдпрд╛рд░ рдирд╣реАрдВ рд╣реИрдВ)ред рдФрд░ рдореБрдЭреЗ рдирд╣реАрдВ рд▓рдЧрддрд╛ рдХрд┐ рдпрд╣ рд╕рдЪ рд╣реИ рдХрд┐ рдкреЛрд╕реНрдЯ рдореЗрдВ рд╡реНрдпрд╛рдЦреНрдпрд╛ рдЕрдирд┐рд╡рд╛рд░реНрдп рд░реВрдк рд╕реЗ рд╕рдмрд╕реЗ рд╕реНрдкрд╖реНрдЯ рд╣реИ (рдореИрдВрдиреЗ рд╡реНрдпрдХреНрддрд┐рдЧрдд рд░реВрдк рд╕реЗ рдЙрд╕ рдкрд░рд┐рдкреНрд░реЗрдХреНрд╖реНрдп рд╕реЗ рдПрдкреАрдЖрдИрдЯреА рдФрд░ рдЖрд░рдЯреАрдЖрдИрдкреА рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рдХреЛрдИ рд╕рдорд╛рди рд╕реНрдкрд╖реНрдЯреАрдХрд░рдг рдирд╣реАрдВ рджреЗрдЦрд╛)ред

type Foo: Bar = _; рд╕рдВрдмрдВрдз рдореЗрдВ, рдореБрдЭреЗ рд▓рдЧрддрд╛ рд╣реИ рдХрд┐ рд╢рд╛рдпрдж рдЗрд╕ рдкрд░ рдлрд┐рд░ рд╕реЗ рдЪрд░реНрдЪрд╛ рдХреА рдЬрд╛рдиреА рдЪрд╛рд╣рд┐рдП - рдкреБрд░рд╛рдиреЗ рд╡рд┐рдЪрд╛рд░реЛрдВ рдХреЛ рдирдП рд╕рд┐рд░реЗ рд╕реЗ рджреЗрдЦрдиреЗ рдореЗрдВ рдХреЛрдИ рдмреБрд░рд╛рдИ рдирд╣реАрдВ рд╣реИред рдЗрд╕рдХреЗ рд╕рд╛рде рдЖрдкрдХреЗ рдореБрджреНрджреЛрдВ рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ:
(1) рдЗрд╕рдХрд╛ рдХреЛрдИ рдХреАрд╡рд░реНрдб рдирд╣реАрдВ рд╣реИ, рд▓реЗрдХрд┐рди рдпрд╣ рдХрд╣реАрдВ рднреА рдЯрд╛рдЗрдк рдЗрдВрдЯреНрд░реЗрдВрд╕ рдХреЗ рд╕рдорд╛рди рд╕рд┐рдВрдЯреИрдХреНрд╕ рд╣реИред "рдЕрдВрдбрд░рд╕реНрдХреЛрд░"/"рдЕрдВрдбрд░рд╕реНрдХреЛрд░ рдЯрд╛рдЗрдк"/рдЖрджрд┐ рдХреЗ рд▓рд┐рдП рдЦреЛрдЬ рджрд╕реНрддрд╛рд╡реЗрдЬ рдЖрд╕рд╛рдиреА рд╕реЗ рдЯрд╛рдЗрдк рдЕрдиреБрдорд╛рди рдкрд░ рдПрдХ рдкреЗрдЬ рдкреНрд░рджрд╛рди рдХрд░ рд╕рдХрддрд╛ рд╣реИред
(2) рд╣рд╛рдБ, рдпрд╣ рд╕рдЪ рд╣реИред рд╣рдо рдЗрд╕рдХреЗ рд╕рдорд╛рдзрд╛рди рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рд╕реЛрдЪ рд░рд╣реЗ рд╣реИрдВ, рдЬреЛ рдореБрдЭреЗ рд▓рдЧрддрд╛ рд╣реИ рдХрд┐ рдЕрдВрдбрд░рд╕реНрдХреЛрд░ рдиреЛрдЯреЗрд╢рди рдХреЗ рд╕рд╛рде рдЕрдЪреНрдЫреА рддрд░рд╣ рд╕реЗ рдлрд┐рдЯ рдмреИрдарддрд╛ рд╣реИ, рдЬреЛ рдЙрдореНрдореАрдж рд╣реИ рдХрд┐ рдЬрд▓реНрдж рд╣реА рд╕реБрдЭрд╛рд╡ рджреЗрдиреЗ рдХреЗ рд▓рд┐рдП рддреИрдпрд╛рд░ рд╣реЛрдЧрд╛ред

@Cramertj рдХреА рддрд░рд╣ рдореИрдВ рд╡рд╛рд╕реНрддрд╡ рдореЗрдВ рдпрд╣рд╛рдБ рддрд░реНрдХ рдирд╣реАрдВ рджреЗрдЦ рд░рд╣рд╛ рд╣реВрдБред

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

рд╕реНрдХреЛрдкрд┐рдВрдЧ рдЕрд╕реНрдкрд╖реНрдЯрддрд╛ рдЬреЛ @rpjohnst рд╡рд░реНрдгрди рдХрд░рддреА рд╣реИ рд╡рд╣ рдПрдХ рдЧрдВрднреАрд░ рд╕рдорд╕реНрдпрд╛ рд╣реИ, рд▓реЗрдХрд┐рди рдкреНрд░рддреНрдпреЗрдХ рдкреНрд░рд╕реНрддрд╛рд╡рд┐рдд рд╡рд╛рдХреНрдпрд╡рд┐рдиреНрдпрд╛рд╕ рд╕рдВрднрд╛рд╡рд┐рдд рд░реВрдк рд╕реЗ рдХрд┐рд╕реА рднреА рдкреНрд░рдХрд╛рд░ рдХреЗ рдПрд▓рд┐рд╕ рдпрд╛ рд╕рдВрдмрдВрдзрд┐рдд рдкреНрд░рдХрд╛рд░реЛрдВ рдХреЗ рд╕рд╛рде рднреНрд░рдорд┐рдд рд╣реИред рдЙрди рднреНрд░рдореЛрдВ рдореЗрдВ рд╕реЗ рдХреМрди рд╕рд╛ "рдмрджрддрд░" рдпрд╛ "рдЕрдзрд┐рдХ рд╕рдВрднрд╛рд╡рдирд╛" рд╣реИ, рд╡рд╛рд╕реНрддрд╡ рдореЗрдВ рдХрднреА рди рдЦрддреНрдо рд╣реЛрдиреЗ рд╡рд╛рд▓рд╛ рдмрд╛рдЗрдХрд╢реЗрдб рд╣реИ рдЬрд┐рд╕реЗ рд╣рдо рдкрд╣рд▓реЗ рд╣реА рдХрдИ рд╕реМ рдЯрд┐рдкреНрдкрдгрд┐рдпреЛрдВ рдХреЗ рдмрд╛рдж рд╣рд▓ рдХрд░рдиреЗ рдореЗрдВ рд╡рд┐рдлрд▓ рд░рд╣реЗ рд╣реИрдВред рдореБрдЭреЗ рдпрд╣ рдкрд╕рдВрдж рд╣реИ рдХрд┐ type Foo: Bar = _; рдХрд┐рд╕реА рднреА рдЧреИрд░-рддреБрдЪреНрдЫ рдЕрд╕реНрддрд┐рддреНрд╡ рдХреЛ рдШреЛрд╖рд┐рдд рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдХрдИ рдмрдпрд╛рдиреЛрдВ рдХреЗ рд╡рд┐рд╕реНрдлреЛрдЯ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рдХреА type Foo: Bar; рдХреА рд╕рдорд╕реНрдпрд╛ рдХреЛ рдареАрдХ рдХрд░рддрд╛ рдкреНрд░рддреАрдд рд╣реЛрддрд╛ рд╣реИ, рд▓реЗрдХрд┐рди рдореБрдЭреЗ рдирд╣реАрдВ рд▓рдЧрддрд╛ рдХрд┐ рдпрд╣ рд╡рд╛рд╕реНрддрд╡ рдореЗрдВ рдмрджрд▓рдиреЗ рдХреЗ рд▓рд┐рдП рдкрд░реНрдпрд╛рдкреНрдд рд╣реИ "рдХрднреА-рдХрднреА рдмрд╛рдЗрдХрд╢реЗрдб" рд╕реНрдерд┐рддрд┐ред

рдореБрдЭреЗ рдЗрд╕ рдмрд╛рдд рдХрд╛ рдкреВрд░рд╛ рдпрдХреАрди рд╣реИ рдХрд┐ рд╣рдо рдЬрд┐рд╕ рднреА рд╡рд╛рдХреНрдп рд░рдЪрдирд╛ рдХреЗ рд╕рд╛рде рд╕рдорд╛рдкреНрдд рд╣реЛрддреЗ рд╣реИрдВ, рдЙрд╕рдХреЗ рд▓рд┐рдП type рдЕрд▓рд╛рд╡рд╛ рдПрдХ рдХреАрд╡рд░реНрдб рд╣реЛрдирд╛ рдЪрд╛рд╣рд┐рдП, рдХреНрдпреЛрдВрдХрд┐ рд╕рднреА "рд╕рд┐рд░реНрдл type " рд╡рд╛рдХреНрдп рд░рдЪрдирд╛ рдмрд╣реБрдд рднреНрд░рд╛рдордХ рд╣реИрдВред рд╡рд╛рд╕реНрддрд╡ рдореЗрдВ, рд╢рд╛рдпрдж рд╕рд┐рдВрдЯреИрдХреНрд╕ _at all_ рдореЗрдВ type рдХрд╛ рдЙрдкрдпреЛрдЧ рди рдХрд░реЗрдВ,

existential Foo = impl Trait;
fn f() -> Foo { .. }
fn g() -> Foo { .. }
existential Foo: Trait;
fn f() -> Foo { .. }
fn g() -> Foo { .. }



md5-b59626c5715ed89e0a93d9158c9c2535



existential Foo: Trait = _;
fn f() -> Foo { .. }
fn g() -> Foo { .. }

рдпрд╣ рдореЗрд░реЗ рд▓рд┐рдП рд╕реНрдкрд╖реНрдЯ рдирд╣реАрдВ рд╣реИ рдХрд┐ рдЗрдирдореЗрдВ рд╕реЗ рдХреЛрдИ рднреА рдкреВрд░реА рддрд░рд╣ рд╕реЗ _prevent_ рдЧрд▓рдд рд╡реНрдпрд╛рдЦреНрдпрд╛ рд╣реИ рдХрд┐ f рдФрд░ g рджреЛ рдЕрд▓рдЧ-рдЕрд▓рдЧ рдкреНрд░рдХрд╛рд░реЛрдВ рдХреЛ рд▓рд╛рдЧреВ рдХрд░ рд╕рдХрддрд╛ рд╣реИ Trait , рд▓реЗрдХрд┐рди рдореБрдЭреЗ рд╕рдВрджреЗрд╣ рд╣реИ рдХрд┐ рдпрд╣ рд░реЛрдХрдерд╛рдо рдХреЗ рдЬрд┐рддрдирд╛ рдХрд░реАрдм рд╣реИ рд╣рдо рд╕рдВрднрд╡рддрдГ рдкреНрд░рд╛рдкреНрдд рдХрд░ рд╕рдХрддреЗ рд╣реИрдВред

@Ixrec
рд╡рд╛рдХреНрдпрд╛рдВрд╢ "рдЕрд╕реНрддрд┐рддреНрд╡рд╡рд╛рджреА рдкреНрд░рдХрд╛рд░" рд╡рд┐рд╢реЗрд╖ рд░реВрдк рд╕реЗ рд╕реНрдХреЛрдкрд┐рдВрдЧ рдЕрд╕реНрдкрд╖реНрдЯрддрд╛ рдХреЗ _рдХреНрдпреЛрдВрдХрд┐_ рд╕рдорд╕реНрдпрд╛рдЧреНрд░рд╕реНрдд рд╣реИред рдореИрдВрдиреЗ рдХрд┐рд╕реА рдФрд░ рдХреЛ рдпрд╣ рдХрд╣рддреЗ рд╣реБрдП рдирд╣реАрдВ рджреЗрдЦрд╛ рдХрд┐ рдПрдкреАрдЖрдИрдЯреА рдФрд░ рдЖрд░рдкреАрдЖрдИрдЯреА рдХреЗ рд▓рд┐рдП рджрд╛рдпрд░рд╛ рдкреВрд░реА рддрд░рд╣ рд╕реЗ рдЕрд▓рдЧ рд╣реИред рдЗрд╕рдХрд╛ рдорддрд▓рдм рд╣реИ рдХрд┐ type Foo = impl Bar рдЬреИрд╕рд╛ рд╕рд┐рдВрдЯреИрдХреНрд╕, рдЬрд╣рд╛рдВ impl Bar рдПрдХ "рдЕрд╕реНрддрд┐рддреНрд╡рд╡рд╛рджреА рдкреНрд░рдХрд╛рд░" рд╣реИ, рд╕реНрд╡рд╛рднрд╛рд╡рд┐рдХ рд░реВрдк рд╕реЗ рдЕрд╕реНрдкрд╖реНрдЯ рд╣реИред

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

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

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

рдореБрдЭреЗ рдЗрд╕ рдмрд╛рдд рдХрд╛ рдкреВрд░рд╛ рдпрдХреАрди рд╣реИ рдХрд┐ рд╣рдо рдЬрд┐рд╕ рднреА рд╡рд╛рдХреНрдп рд░рдЪрдирд╛ рдХреЗ рд╕рд╛рде рд╕рдорд╛рдкреНрдд рд╣реЛрддреЗ рд╣реИрдВ, рдЙрд╕рдХреЗ рд▓рд┐рдП type рдЕрд▓рд╛рд╡рд╛ рдХреЛрдИ рдЕрдиреНрдп рдХреАрд╡рд░реНрдб рд╣реЛрдирд╛ рдЪрд╛рд╣рд┐рдП

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

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

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

рдореИрдВрдиреЗ рдХрд┐рд╕реА рдФрд░ рдХреЛ рдпрд╣ рдХрд╣рддреЗ рд╣реБрдП рдирд╣реАрдВ рджреЗрдЦрд╛ рдХрд┐ рдПрдкреАрдЖрдИрдЯреА рдФрд░ рдЖрд░рдкреАрдЖрдИрдЯреА рдХреЗ рд▓рд┐рдП рджрд╛рдпрд░рд╛ рдкреВрд░реА рддрд░рд╣ рд╕реЗ рдЕрд▓рдЧ рд╣реИред

рдореИрдВрдиреЗ рд╕реЛрдЪрд╛ рдерд╛ рдХрд┐ рд╕реНрдХреЛрдкрд┐рдВрдЧ рд╣рдореЗрд╢рд╛ рдирд┐рд╣рд┐рдд рд╡рд┐рд╢реЗрд╖рддрд╛ рдкреНрд░рд╕реНрддрд╛рд╡реЛрдВ рдХрд╛ рдПрдХ рд╕реНрдкрд╖реНрдЯ рд╣рд┐рд╕реНрд╕рд╛ рдерд╛, рдЗрд╕рд▓рд┐рдП рдЗрд╕реЗ "рдЗрдВрдЧрд┐рдд рдХрд░рдиреЗ" рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рдирд╣реАрдВ рдереАред рдЖрдкрдиреЗ рд╕реНрдХреЛрдкрд┐рдВрдЧ рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рдЬреЛ рдХреБрдЫ рднреА рдХрд╣рд╛ рд╣реИ, рдРрд╕рд╛ рд▓рдЧрддрд╛ рд╣реИ рдХрд┐ рдпрд╣ рд╡рд╣реА рджреЛрд╣рд░рд╛ рд░рд╣рд╛ рд╣реИ рдЬрд┐рд╕реЗ рд╣рдордиреЗ рдкрд╣рд▓реЗ рд╣реА рдкрд┐рдЫрд▓реЗ RFC рдореЗрдВ рд╕реНрд╡реАрдХрд╛рд░ рдХрд░ рд▓рд┐рдпрд╛ рд╣реИред рдореБрдЭреЗ рд▓рдЧрддрд╛ рд╣реИ рдХрд┐ рдпрд╣ рд╡рд╛рдХреНрдп рд░рдЪрдирд╛ рд╕реЗ рд╕рднреА рдХреЗ рд▓рд┐рдП рд╕реНрдкрд╖реНрдЯ рдирд╣реАрдВ рд╣реИ рдФрд░ рдпрд╣ рдПрдХ рд╕рдорд╕реНрдпрд╛ рд╣реИ, рд▓реЗрдХрд┐рди рдРрд╕рд╛ рдирд╣реАрдВ рд╣реИ рдХрд┐ рдЗрд╕рд╕реЗ рдкрд╣рд▓реЗ рдХрд┐рд╕реА рдиреЗ рдЗрд╕реЗ рдирд╣реАрдВ рд╕рдордЭрд╛ред рд╡рд╛рд╕реНрддрд╡ рдореЗрдВ, рдореИрдВрдиреЗ рд╕реЛрдЪрд╛ рдерд╛ рдХрд┐ RFC 2701 рдкрд░ рдЪрд░реНрдЪрд╛ рдХрд╛ рдПрдХ рдмрдбрд╝рд╛ рд╣рд┐рд╕реНрд╕рд╛ рдЗрд╕ рдмрд╛рд░реЗ рдореЗрдВ рдерд╛ рдХрд┐ type Foo = impl Trait; рдХрд╛ рджрд╛рдпрд░рд╛ рдХреНрдпрд╛ рд╣реЛрдирд╛ рдЪрд╛рд╣рд┐рдП, рдЗрд╕ рдЕрд░реНрде рдореЗрдВ рдХрд┐ рдХрд┐рд╕ рдкреНрд░рдХрд╛рд░ рдХрд╛ рдЕрдиреБрдорд╛рди рд╣реИ рдФрд░ рдЗрд╕реЗ рджреЗрдЦрдиреЗ рдХреА рдЕрдиреБрдорддрд┐ рдирд╣реАрдВ рд╣реИред

рдПрдХ рд╕реБрд╕рдВрдЧрдд рд╕рд┐рдВрдЯреИрдХреНрд╕ рдХреЗ рд╕рд╛рде рдЖрдирд╛ рд╕рдВрднрд╡ рд╣реИ рдЬрд┐рд╕рдореЗрдВ рдпрд╣ рднреНрд░рдо рди рд╣реЛред

рдХреНрдпрд╛ рдЖрдк рдпрд╣ рдХрд╣рдиреЗ рдХреА рдХреЛрд╢рд┐рд╢ рдХрд░ рд░рд╣реЗ рд╣реИрдВ рдХрд┐ type Foo: Bar = _; рд╡рд╣ рд╡рд╛рдХреНрдп-рд╡рд┐рдиреНрдпрд╛рд╕ рд╣реИ, рдпрд╛ рдЖрдкрдХреЛ рд▓рдЧрддрд╛ рд╣реИ рдХрд┐ рд╣рдореЗрдВ рд╡рд╣ рдЕрднреА рддрдХ рдирд╣реАрдВ рдорд┐рд▓рд╛ рд╣реИ?

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

рдЖрдкрдиреЗ рдкреВрд░реА рддрд░рд╣ рд╕реЗ рдирдП рдиреЛрдЯреЗрд╢рди рдХрд╛ рдЖрд╡рд┐рд╖реНрдХрд╛рд░ рдХрд┐рдпрд╛ рд╣реИ

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

рдЗрд╕рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рд╕реЛрдЪреЗрдВ, рдХреНрдпреЛрдВрдХрд┐ рд╣рдо рдЗрд╕ рд╕рдордп "рдЕрд╕реНрддрд┐рддреНрд╡" рдХрд╛ рджреБрд░реБрдкрдпреЛрдЧ рдХрд░ рд░рд╣реЗ рд╣реИрдВ, рдЗрд╕рдХрд╛ рдорддрд▓рдм рд╣реИ рдХрд┐ existential Foo: Trait / = impl Trait рд╢рд╛рдпрдж рдЕрдм рд╡реИрдз рд╡рд╛рдХреНрдпрд╡рд┐рдиреНрдпрд╛рд╕ рдирд╣реАрдВ рд╣реИрдВред

рдЗрд╕рд▓рд┐рдП рд╣рдореЗрдВ рдЙрди рдирд╛рдореЛрдВ рдХреЗ рд╕рд╛рдордиреЗ рдПрдХ рдирдпрд╛ рдХреАрд╡рд░реНрдб рд░рдЦрдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реИ рдЬреЛ рдХреБрдЫ рдЕрдЬреНрдЮрд╛рдд-рд╕реЗ-рдмрд╛рд╣рд░реА-рдХреЛрдб рдкреНрд░рдХрд╛рд░ рдХреЛ рд╕рдВрджрд░реНрднрд┐рдд рдХрд░рддреЗ рд╣реИрдВ ... рдФрд░ рдореИрдВ рдЗрд╕ рдкрд░ рдПрдХ рд░рд┐рдХреНрдд рд╕реНрдерд╛рди рдмрдирд╛ рд░рд╣рд╛ рд╣реВрдВред alias , secret , internal , рдЖрджрд┐ рд╕рднреА рдмрд╣реБрдд рднрдпрд╛рдирдХ рд▓рдЧрддреЗ рд╣реИрдВ, рдФрд░ type рд╕реЗ рдХрдо "рд╡рд┐рд╢рд┐рд╖реНрдЯрддрд╛ рднреНрд░рдо" рд╣реЛрдиреЗ рдХреА рд╕рдВрднрд╛рд╡рдирд╛ рдирд╣реАрдВ рд╣реИред

рдЗрд╕рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рд╕реЛрдЪреЗрдВ, рдХреНрдпреЛрдВрдХрд┐ рд╣рдо рдЗрд╕ рд╕рдордп "рдЕрд╕реНрддрд┐рддреНрд╡" рдХрд╛ рджреБрд░реБрдкрдпреЛрдЧ рдХрд░ рд░рд╣реЗ рд╣реИрдВ, рдЗрд╕рдХрд╛ рдорддрд▓рдм рд╣реИ рдХрд┐ existential Foo: Trait / = impl Trait рд╢рд╛рдпрдж рдЕрдм рд╡реИрдз рд╡рд╛рдХреНрдпрд╡рд┐рдиреНрдпрд╛рд╕ рдирд╣реАрдВ рд╣реИрдВред

рд╣рд╛рдВ, рдореИрдВ рдкреВрд░реА рддрд░рд╣ рд╕реЗ рд╕рд╣рдордд рд╣реВрдВ - рдореБрдЭреЗ рд▓рдЧрддрд╛ рд╣реИ рдХрд┐ рд╣рдореЗрдВ "рдЕрд╕реНрддрд┐рддреНрд╡рд╡рд╛рджреА" рд╢рдмреНрдж рд╕реЗ рдкреВрд░реА рддрд░рд╣ рд╕реЗ рджреВрд░ рдЬрд╛рдиреЗ рдХреА рдЬрд░реВрд░рдд рд╣реИ* ( impl Trait рдЕрдЪреНрдЫреА рддрд░рд╣ рд╕реЗ рд╕рдордЭрд╛рддреЗ рд╣реБрдП рдЗрд╕реЗ рдХреИрд╕реЗ рдХрд┐рдпрд╛ рдЬрд╛рдП, рдЗрд╕рдХреЗ рд▓рд┐рдП рдХреБрдЫ рдЕрд╕реНрдерд╛рдпреА рд╡рд┐рдЪрд╛рд░ рд╣реИрдВ)ред

*(рд╕рдВрднрд╡рддрдГ рдХреЗрд╡рд▓ dyn Trait рд▓рд┐рдП рд╢рдмреНрдж рдЖрд░рдХреНрд╖рд┐рдд рдХрд░рдирд╛)

@joshtriplett , @Ixrec : рдореИрдВ рд╕рд╣рдордд рд╣реВрдВ рдХрд┐ _ рд╕рдВрдХреЗрддрди рдХрд╛ рдЕрд░реНрде рд╣реИ рдХрд┐ рдЖрдк рдЕрдм рдЙрд╕реА рд╣рдж рддрдХ рд╕реНрдерд╛рдирд╛рдкрдиреНрди рдирд╣реАрдВ рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ рдЬреЛ рдЖрдк рдкрд╣рд▓реЗ рдХрд░ рд╕рдХрддреЗ рдереЗ, рдФрд░ рдпрджрд┐ рдЗрд╕реЗ рд░рдЦрдирд╛ рдкреНрд░рд╛рдердорд┐рдХрддрд╛ рд╣реИ, рддреЛ рд╣рдореЗрдВ рдПрдХ рдЕрд▓рдЧ рд╕рд┐рдВрдЯреИрдХреНрд╕ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реЛрдЧреАред

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

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

рдХреНрдпрд╛ рдЖрдк рд╣рдореЗрдВ рдмрддрд╛ рд╕рдХрддреЗ рд╣реИрдВ рдХрд┐ рдЗрд╕рдХрд╛ рд╡рд╛рд╕реНрддрд╡ рдореЗрдВ рдХреНрдпрд╛ рдЕрд░реНрде рд╣реИ? рдореБрдЭреЗ "рд░реЗрдлрд╝рд░реЗрдВрд╢рд┐рдпрд▓ рдЯреНрд░рд╛рдВрд╕рдкреЗрд░реЗрдВрд╕реА" рдХреА рдзрд╛рд░рдгрд╛ рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рдкрддрд╛ рдирд╣реАрдВ рдерд╛ рдЬреЛ _ рдкреНрд░рднрд╛рд╡рд┐рдд рд╣реИред

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

рдореБрдЭреЗ рдпрдХреАрди рдирд╣реАрдВ рд╣реИ рдХрд┐ рдпрд╣ рдПрдХ _рдкреНрд░рд╛рдердорд┐рдХрддрд╛_ рд╣реИред рдореЗрд░реЗ рд▓рд┐рдП рдпрд╣ рдХреЗрд╡рд▓ рдПрдХрдорд╛рддреНрд░ рдЙрджреНрджреЗрд╢реНрдп-рдЖрд╢ рддрд░реНрдХ рдерд╛ рдЬрд┐рд╕реЗ рд╣рдордиреЗ рдХрднреА рдкрд╛рдпрд╛ рдерд╛ рдЬреЛ рджреВрд╕рд░реЗ рдкрд░ рдПрдХ рд╡рд╛рдХреНрдпрд╡рд┐рдиреНрдпрд╛рд╕ рдкрд╕рдВрдж рдХрд░рддрд╛ рдерд╛ред рд▓реЗрдХрд┐рди type рдХреЛ рдмрджрд▓рдиреЗ рдХреЗ рд▓рд┐рдП рд╣рдо рдХреМрди рд╕реЗ рдХреАрд╡рд░реНрдб рд▓реЗрдХрд░ рдЖ рд╕рдХрддреЗ рд╣реИрдВ, рдЗрд╕рдХреЗ рдЖрдзрд╛рд░ рдкрд░ рдпрд╣ рдкреВрд░реА рддрд░рд╣ рдмрджрд▓ рд╕рдХрддрд╛ рд╣реИред

рдХреНрдпрд╛ рдЖрдк рд╣рдореЗрдВ рдмрддрд╛ рд╕рдХрддреЗ рд╣реИрдВ рдХрд┐ рдЗрд╕рдХрд╛ рд╡рд╛рд╕реНрддрд╡ рдореЗрдВ рдХреНрдпрд╛ рдЕрд░реНрде рд╣реИ? рдореБрдЭреЗ "рд░реЗрдлрд╝рд░реЗрдВрд╢рд┐рдпрд▓ рдЯреНрд░рд╛рдВрд╕рдкреЗрд░реЗрдВрд╕реА" рдХреА рдзрд╛рд░рдгрд╛ рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рдкрддрд╛ рдирд╣реАрдВ рдерд╛ рдЬреЛ _ рдкреНрд░рднрд╛рд╡рд┐рдд рд╣реИред

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

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

fn foo() -> usize {
    println!("ey!");
    42
}

fn main() {
    let bar = foo();
    let baz = bar + bar;
}

рдпрджрд┐ рд╣рдо bar рдХреА рдкреНрд░рддреНрдпреЗрдХ рдШрдЯрдирд╛ рдХреЛ foo() ( bar рдХреА рдкрд░рд┐рднрд╛рд╖рд╛) рд╕реЗ рдкреНрд░рддрд┐рд╕реНрдерд╛рдкрд┐рдд рдХрд░рддреЗ рд╣реИрдВ, рддреЛ рд╣рдореЗрдВ рд╕реНрдкрд╖реНрдЯ рд░реВрдк рд╕реЗ рдПрдХ рдЕрд▓рдЧ рдЖрдЙрдЯрдкреБрдЯ рдорд┐рд▓рддрд╛ рд╣реИред

рд╣рд╛рд▓рд╛рдБрдХрд┐, рдЯрд╛рдЗрдк рдЙрдкрдирд╛рдореЛрдВ рдХреЗ рд▓рд┐рдП, рдЗрд╕ рд╕рдордп рд░реЗрдлрд╝рд░реЗрдВрд╢рд┐рдпрд▓ рдЯреНрд░рд╛рдВрд╕рдкреЗрд░реЗрдВрд╕реА рд╣реЛрд▓реНрдб (AFAIK) рд╣реИред рдпрджрд┐ рдЖрдкрдХреЗ рдкрд╛рд╕ рдЙрдкрдирд╛рдо рд╣реИ:

type Foo = Definition;

рддреЛ рдлрд┐рд░ рддреБрдо рдХреНрдпрд╛ рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ (рдкрд░ рдХрдмреНрдЬрд╛ рдкрд░рд╣реЗрдЬ) рдХреЗ рдЙрддреНрдкрдиреНрди рд╣реЛрдиреЗ рдХреА рдкреНрд░рддрд┐рд╕реНрдерд╛рдкрди Foo рдХреЗ рд▓рд┐рдП Definition рдФрд░ рдХреЗ рдЙрддреНрдкрдиреНрди рд╣реЛрдиреЗ рдХреА рдкреНрд░рддрд┐рд╕реНрдерд╛рдкрди Definition рдХреЗ рд▓рд┐рдП Foo рдЕрдкрдиреЗ рдХрд╛рд░реНрдпрдХреНрд░рдо рдХреЗ рд╢рдмреНрджреЛрдВ рдХреЛ рдмрджрд▓реЗ рдмрд┐рдирд╛ , рдпрд╛ рдЗрд╕рдХреЗ рдкреНрд░рдХрд╛рд░ рдХреА рд╢реБрджреНрдзрддрд╛ред

рдкрд░рд┐рдЪрдп:

type Foo = impl Bar;

рдЗрд╕рдХрд╛ рдорддрд▓рдм рдпрд╣ рд╣реИ рдХрд┐ Foo рдХреА рдкреНрд░рддреНрдпреЗрдХ рдШрдЯрдирд╛ рдПрдХ рд╣реА рдкреНрд░рдХрд╛рд░ рдХреА рд╣реИ рдЬрд┐рд╕рдХрд╛ рдЕрд░реНрде рд╣реИ рдХрд┐ рдпрджрд┐ рдЖрдк рд▓рд┐рдЦрддреЗ рд╣реИрдВ:

fn stuff() -> Foo { .. }
fn other_stuff() -> Foo { .. }

рдЖрдк рдХреА рдШрдЯрдирд╛рдУрдВ рдХреЛ рд╕реНрдерд╛рдирд╛рдкрдиреНрди рдирд╣реАрдВ рдХрд░ рд╕рдХрддрд╛ Foo рдХреЗ рд▓рд┐рдП impl Bar рдФрд░ рдЗрд╕рдХреЗ рд╡рд┐рдкрд░реАрддред рдпрд╛рдиреА рдЕрдЧрд░ рдЖрдк рд▓рд┐рдЦрддреЗ рд╣реИрдВ:

fn stuff() -> impl Bar { .. }
fn other_stuff() -> impl Bar { .. }

рд╡рд╛рдкрд╕реА рдкреНрд░рдХрд╛рд░ Foo рд╕рд╛рде рдПрдХреАрдХреГрдд рдирд╣реАрдВ рд╣реЛрдВрдЧреЗред рдЗрд╕ рдкреНрд░рдХрд╛рд░ рдЙрдирдХреЗ рдЕрдВрджрд░ RFC 2071 рдХреЗ рд╢рдмреНрджрд╛рд░реНрде рдХреЗ рд╕рд╛рде impl Trait рдкреЗрд╢ рдХрд░рдХреЗ рдкреНрд░рдХрд╛рд░ рдХреЗ рдЙрдкрдирд╛рдореЛрдВ рдХреЗ рд▓рд┐рдП рд╕рдВрджрд░реНрднрд╛рддреНрдордХ рдкрд╛рд░рджрд░реНрд╢рд┐рддрд╛ рдХреЛ рддреЛрдбрд╝рд╛ рдЧрдпрд╛ рд╣реИред

рд░реЗрдлрд╝рд░реЗрдВрд╢рд┐рдпрд▓ рдкрд╛рд░рджрд░реНрд╢рд┐рддрд╛ рдФрд░ type Foo = _; рдЬрд╛рд░реА рд░рдЦрдиреЗ рдХреЗ рд▓рд┐рдП... (@varkor рджреНрд╡рд╛рд░рд╛)

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

рдЕрдЪреНрдЫреА рдмрд╛рддред рд▓реЗрдХрд┐рди рдХреНрдпрд╛ = _ рдЕрд╕рд╛рдЗрдирдореЗрдВрдЯ рдмрд┐рдЯ рдХрд╛ рдЕрд░реНрде рдпрд╣ рдирд╣реАрдВ рд╣реИ рдХрд┐ рдпрд╣ рдХреЗрд╡рд▓ рдПрдХ рд╣реА рдкреНрд░рдХрд╛рд░ рд╣реИ?

рдореИрдВрдиреЗ рдЗрд╕реЗ рдкрд╣рд▓реЗ рднреА рд▓рд┐рдЦрд╛ рд╣реИ, рд▓реЗрдХрд┐рди...

рдкреБрди: рд╕рдВрджрд░реНрднрд┐рдд рдкрд╛рд░рджрд░реНрд╢рд┐рддрд╛: рдореБрдЭреЗ рд▓рдЧрддрд╛ рд╣реИ рдХрд┐ рд╕реА рдкреНрд░реАрдкреНрд░реЛрд╕реЗрд╕рд░-рдЬреИрд╕реЗ рдкреНрд░рддрд┐рд╕реНрдерд╛рдкрди рдХреЗ рдмрдЬрд╛рдп type рдХреЛ рдмрд╛рдзреНрдпрдХрд╛рд░реА (рдЬреИрд╕реЗ let ) рдХреЗ рд░реВрдк рдореЗрдВ рджреЗрдЦрдирд╛ рдЕрдзрд┐рдХ рдЙрдкрдпреЛрдЧреА рд╣реИред рдПрдХ рдмрд╛рд░ рдЬрдм рдЖрдк рдЗрд╕реЗ рдЗрд╕ рддрд░рд╣ рд╕реЗ рджреЗрдЦрддреЗ рд╣реИрдВ, рддреЛ type Foo = impl Trait рдЕрд░реНрде рдареАрдХ рд╡реИрд╕рд╛ рд╣реА рд╣реЛрддрд╛ рд╣реИ рдЬреИрд╕рд╛ рдпрд╣ рджрд┐рдЦрддрд╛ рд╣реИред

рдореБрдЭреЗ рд▓рдЧрддрд╛ рд╣реИ рдХрд┐ рд╢реБрд░реБрдЖрддреА рд▓реЛрдЧреЛрдВ рдХреЗ рд▓рд┐рдП impl Trait рдХреЛ рдЕрд╕реНрддрд┐рддреНрд╡рдЧрдд рдмрдирд╛рдо рд╕рд╛рд░реНрд╡рднреМрдорд┐рдХ рдкреНрд░рдХрд╛рд░ рдХреЗ рд░реВрдк рдореЗрдВ рд╕реЛрдЪрдиреЗ рдХреА рд╕рдВрднрд╛рд╡рдирд╛ рдХрдо рд╣реЛрдЧреА, рд▓реЗрдХрд┐рди "рдПрдХ рдРрд╕реА рдЪреАрдЬрд╝ рдХреЗ рд░реВрдк рдореЗрдВ рдЬреЛ impl sa рд╡рд┐рд╢реЗрд╖рддрд╛ . If they want to know more, they can read the impl Trait` рджрд╕реНрддрд╛рд╡реЗрдЬрд╝реАрдХрд░рдгред рдПрдХ рдмрд╛рд░ рдЬрдм рдЖрдк рд╕рд┐рдВрдЯреИрдХреНрд╕ рдмрджрд▓реЗрдВ, рдЖрдк рдЗрд╕рдХреЗ рдФрд░ рдореМрдЬреВрджрд╛ рд╕реБрд╡рд┐рдзрд╛ рдХреЗ рдмреАрдЪ рд╕рдВрдмрдВрдз рдЦреЛ рджреЗрддреЗ рд╣реИрдВ рдФрд░ рдЕрдзрд┐рдХ рд▓рд╛рдн рдирд╣реАрдВ рд╣реЛрддрд╛ рд╣реИред _рдЖрдк рдХреЗрд╡рд▓ рдПрдХ рд╕рдВрднрд╛рд╡рд┐рдд рднреНрд░рд╛рдордХ рд╕рд┐рдВрдЯреИрдХреНрд╕ рдХреЛ рджреВрд╕рд░реЗ рдХреЗ рд╕рд╛рде рдмрджрд▓ рд░рд╣реЗ рд╣реИрдВред_

рдкреБрди type Foo = _ , рдпрд╣ рдкреВрд░реА рддрд░рд╣ рд╕реЗ рдЕрд╕рдВрдмрдВрдзрд┐рдд рдЕрд░реНрде рдХреЗ рд╕рд╛рде _ рдХреЛ рдЕрдзрд┐рднрд╛рд░рд┐рдд рдХрд░рддрд╛ рд╣реИред рдпрд╣ рджрд╕реНрддрд╛рд╡реЗрдЬрд╝реАрдХрд░рдг рдФрд░/рдпрд╛ Google рдореЗрдВ рдЦреЛрдЬрдиреЗ рдореЗрдВ рднреА рдореБрд╢реНрдХрд┐рд▓ рд▓рдЧ рд╕рдХрддрд╛ рд╣реИред

@lnicola рдЖрдк const рдмрд╛рдЗрдВрдбрд┐рдВрдЧ рдХреЗ рдмрдЬрд╛рдп let рдмрд╛рдЗрдВрдбрд┐рдВрдЧ рдХреЗ рд╕рд╛рде рднреА рдЬрд╛ рд╕рдХрддреЗ рд╣реИрдВ, рдЬрд╣рд╛рдВ рдкреВрд░реНрд╡ рд╕рдВрджрд░реНрднрд┐рдд рд░реВрдк рд╕реЗ рдкрд╛рд░рджрд░реНрд╢реА рд╣реИред let (рдЬреЛ fn рдЕрдВрджрд░ рд╕рдВрджрд░реНрднрд┐рдд рд░реВрдк рд╕реЗ рдкрд╛рд░рджрд░реНрд╢реА рдирд╣реАрдВ рд╣реЛрддрд╛ рд╣реИ) рдЪреБрдирдирд╛ рдПрдХ рдордирдорд╛рдирд╛ рд╡рд┐рдХрд▓реНрдк рд╣реИ рдЬреЛ рдореБрдЭреЗ рдирд╣реАрдВ рд▓рдЧрддрд╛ рдХрд┐ рд╡рд┐рд╢реЗрд╖ рд░реВрдк рд╕реЗ рд╕рд╣рдЬ рд╣реИред рдореБрдЭреЗ рд▓рдЧрддрд╛ рд╣реИ рдХрд┐ рдкреНрд░рдХрд╛рд░ рдХреЗ рдЙрдкрдирд╛рдореЛрдВ рдХрд╛ рд╕рд╣рдЬ рджреГрд╖реНрдЯрд┐рдХреЛрдг рдпрд╣ рд╣реИ рдХрд┐ рд╡реЗ рд╕рдВрджрд░реНрднрд┐рдд рд░реВрдк рд╕реЗ рдкрд╛рд░рджрд░реНрд╢реА рд╣реИрдВ (рднрд▓реЗ рд╣реА рдЙрд╕ рд╢рдмреНрдж рдХрд╛ рдЙрдкрдпреЛрдЧ рди рдХрд┐рдпрд╛ рдЧрдпрд╛ рд╣реЛ) рдХреНрдпреЛрдВрдХрд┐ рд╡реЗ рдЙрдкрдирд╛рдо рд╣реИрдВ ред

рдореИрдВ рд╕реА рдкреНрд░реАрдкреНрд░реЛрд╕реЗрд╕рд░ рдкреНрд░рддрд┐рд╕реНрдерд╛рдкрди рдХреЗ рд░реВрдк рдореЗрдВ type рдХреЛ рднреА рдирд╣реАрдВ рджреЗрдЦ рд░рд╣рд╛ рд╣реВрдВ рдХреНрдпреЛрдВрдХрд┐ рдЗрд╕реЗ рдЬреЗрдирд░рд┐рдХ рд╕реЗ рдмрдЪрдиреЗ рдФрд░ рд╕рдореНрдорд╛рди рдХрд░рдиреЗ рдкрд░ рдХрдмреНрдЬрд╛ рдХрд░рдирд╛ рд╣реИ (рдХреЛрдИ SFINAE рдирд╣реАрдВ)ред рдЗрд╕рдХреЗ рдмрдЬрд╛рдп, рдореИрдВ type рдареАрдХ рд╕реЗ рд╕реЛрдЪ рд░рд╣рд╛ рд╣реВрдВ рдХреНрдпреЛрдВрдХрд┐ рдореИрдВ рдЗрджрд░реАрд╕ рдпрд╛ рдЕрдЧрдбрд╛ рдЬреИрд╕реА рднрд╛рд╖рд╛ рдореЗрдВ рдмрд╛рдзреНрдпрдХрд╛рд░реА рд╣реВрдВ рдЬрд╣рд╛рдВ рд╕рднреА рдмрд╛рдЗрдВрдбрд┐рдВрдЧ рд╢реБрджреНрдз рд╣реИрдВред

рдореБрдЭреЗ рд▓рдЧрддрд╛ рд╣реИ рдХрд┐ рд╢реБрд░реБрдЖрддреА рд▓реЛрдЧреЛрдВ рдХреЗ рд▓рд┐рдП impl Trait рдХреЛ рдЕрд╕реНрддрд┐рддреНрд╡рдЧрдд рдмрдирд╛рдо рд╕рд╛рд░реНрд╡рднреМрдорд┐рдХ рдкреНрд░рдХрд╛рд░ рдХреЗ рд░реВрдк рдореЗрдВ рд╕реЛрдЪрдиреЗ рдХреА рд╕рдВрднрд╛рд╡рдирд╛ рдХрдо рд╣реЛрдЧреА, рд▓реЗрдХрд┐рди "рдПрдХ рдРрд╕реА рдЪреАрдЬ рдЬреЛ рдПрдХ рд╡рд┐рд╢реЗрд╖рддрд╛ рдХреЛ рджрд░реНрд╢рд╛рддреА рд╣реИ"

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

рдкреБрди type Foo = _ , рдпрд╣ рдкреВрд░реА рддрд░рд╣ рд╕реЗ рдЕрд╕рдВрдмрдВрдзрд┐рдд рдЕрд░реНрде рдХреЗ рд╕рд╛рде _ рдХреЛ рдЕрдзрд┐рднрд╛рд░рд┐рдд рдХрд░рддрд╛ рд╣реИред

рдРрд╕рд╛ рдХреИрд╕реЗ? type Foo = _; рдпрд╣рд╛рдВ рдЕрдиреНрдп рд╕рдВрджрд░реНрднреЛрдВ рдореЗрдВ _ рдХреЗ рдЙрдкрдпреЛрдЧ рдХреЗ рд╕рд╛рде рд╕рдВрд░реЗрдЦрд┐рдд рд╣реЛрддрд╛ рд╣реИ рдЬрд╣рд╛рдВ рдПрдХ рдкреНрд░рдХрд╛рд░ рдХреА рдЕрдкреЗрдХреНрд╖рд╛ рдХреА рдЬрд╛рддреА рд╣реИред
рдЗрд╕рдХрд╛ рдЕрд░реНрде рд╣реИ "рд╡рд╛рд╕реНрддрд╡рд┐рдХ рдкреНрд░рдХрд╛рд░ рдХрд╛ рдЕрдиреБрдорд╛рди рд▓рдЧрд╛рдПрдВ", рдЬреИрд╕реЗ рдХрд┐ рдЬрдм рдЖрдк .collect::<Vec<_>>() рд▓рд┐рдЦрддреЗ рд╣реИрдВред

рдпрд╣ рджрд╕реНрддрд╛рд╡реЗрдЬрд╝реАрдХрд░рдг рдФрд░/рдпрд╛ Google рдореЗрдВ рдЦреЛрдЬрдиреЗ рдореЗрдВ рднреА рдореБрд╢реНрдХрд┐рд▓ рд▓рдЧ рд╕рдХрддрд╛ рд╣реИред

рдЗрддрдирд╛ рдореБрд╢реНрдХрд┐рд▓ рдирд╣реАрдВ рд╣реЛрдирд╛ рдЪрд╛рд╣рд┐рдП? "рдЙрдкрдирд╛рдо рдЕрдВрдбрд░рд╕реНрдХреЛрд░ рдЯрд╛рдЗрдк рдХрд░реЗрдВ" рдЙрдореНрдореАрдж рд╕реЗ рд╡рд╛рдВрдЫрд┐рдд рдкрд░рд┐рдгрд╛рдо рд▓рд╛рдирд╛ рдЪрд╛рд╣рд┐рдП ...?
"рдЯрд╛рдЗрдк рдЙрдкрдирд╛рдо рдЗрдореНрдкреНрд▓рд╛рдВрдЯ рд╡рд┐рд╢реЗрд╖рддрд╛" рдХреА рдЦреЛрдЬ рдХрд░рдиреЗ рд╕реЗ рдХреЛрдИ рдЕрд▓рдЧ рдкреНрд░рддреАрдд рдирд╣реАрдВ рд╣реЛрддрд╛ рд╣реИред

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

@рд╕реЗрдВрдЯреНрд░рд┐рд▓

рдРрд╕рд╛ рдХреИрд╕реЗ? type Foo = _; рдпрд╣рд╛рдВ рдЕрдиреНрдп рд╕рдВрджрд░реНрднреЛрдВ рдореЗрдВ _ рдХреЗ рдЙрдкрдпреЛрдЧ рдХреЗ рд╕рд╛рде рд╕рдВрд░реЗрдЦрд┐рдд рд╣реЛрддрд╛ рд╣реИ рдЬрд╣рд╛рдВ рдПрдХ рдкреНрд░рдХрд╛рд░ рдХреА рдЕрдкреЗрдХреНрд╖рд╛ рдХреА рдЬрд╛рддреА рд╣реИред
рдЗрд╕рдХрд╛ рдЕрд░реНрде рд╣реИ "рд╡рд╛рд╕реНрддрд╡рд┐рдХ рдкреНрд░рдХрд╛рд░ рдХрд╛ рдЕрдиреБрдорд╛рди рд▓рдЧрд╛рдПрдВ", рдЬреИрд╕реЗ рдХрд┐ рдЬрдм рдЖрдк рд▓рд┐рдЦрддреЗ рд╣реИрдВ .рд╕рдВрдЧреНрд░рд╣ ::>().

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

Google рд╡рд┐рд╢реЗрд╖ рд╡рд░реНрдгреЛрдВ рдХреЛ рдЕрдиреБрдХреНрд░рдорд┐рдд рдирд╣реАрдВ рдХрд░рддрд╛ рд╣реИред

рдпрд╣ рдЕрдм рд╕рдЪ рдирд╣реАрдВ рд╣реИ (рд╣рд╛рд▓рд╛рдВрдХрд┐ рд╕рдВрднрд╡рддрдГ рд╡реНрд╣рд╛рдЗрдЯрд╕реНрдкреЗрд╕-рдирд┐рд░реНрднрд░ ..?)

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

type Foo = _; рдХрд╛ рд╕реБрдЭрд╛рдпрд╛ рдЧрдпрд╛ рд╢рдмреНрджрд╛рд░реНрде рдкреВрд░реА рддрд░рд╣ рд╕реЗ рдЕрдиреБрдорд╛рди рдкрд░ рдЖрдзрд╛рд░рд┐рдд рдЕрд╕реНрддрд┐рддреНрд╡рдЧрдд рдкреНрд░рдХрд╛рд░ рдХреЗ рдЙрдкрдирд╛рдо рдХреЗ рд╡рд┐рдХрд▓реНрдк рдХреЗ рд░реВрдк рдореЗрдВ рд╣реИред рдЕрдЧрд░ рдпрд╣ рдкреВрд░реА рддрд░рд╣ рд╕реЗ рд╕реНрдкрд╖реНрдЯ рдирд╣реАрдВ рдерд╛, рддреЛ рдореИрдВ рдЬрд▓реНрдж рд╣реА рдХреБрдЫ рдРрд╕рд╛ рдХрд░рдиреЗ рдЬрд╛ рд░рд╣рд╛ рд╣реВрдВ рдЬреЛ рдЗрд░рд╛рджреЛрдВ рдХреЛ рдереЛрдбрд╝рд╛ рдмреЗрд╣рддрд░ рддрд░реАрдХреЗ рд╕реЗ рд╕рдордЭрд╛рдПред

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

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

@рд╕реЗрдВрдЯреНрд░рд┐рд▓

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

рдХреНрд╖рдорд╛ рдХрд░реЗрдВ, рдореИрдВ рдЕрднреА рднреА рдЗрд╕рдХреЗ рдЪрд╛рд░реЛрдВ рдУрд░ рдЕрдкрдирд╛ рд╕рд┐рд░ рдирд╣реАрдВ рд▓рдкреЗрдЯ рд╕рдХрддрд╛ рдХреНрдпреЛрдВрдХрд┐ рдореЗрд░рд╛ рдЕрдВрддрд░реНрдЬреНрдЮрд╛рди рдкреВрд░реА рддрд░рд╣ рд╕реЗ рдкреАрдЫреЗ рдХреА рдУрд░ рд╣реИред

рдЙрджрд╛рд╣рд░рдг рдХреЗ рд▓рд┐рдП, рдпрджрд┐ рд╣рдорд╛рд░реЗ рдкрд╛рд╕ type Foo = Bar , рддреЛ рдореЗрд░рд╛ рдЕрдВрддрд░реНрдЬреНрдЮрд╛рди рдХрд╣рддрд╛ рд╣реИ:
"рд╣рдо Foo рдШреЛрд╖рд┐рдд рдХрд░ рд░рд╣реЗ рд╣реИрдВ, рдЬреЛ Bar рдХреЗ рд╕рдорд╛рди рдкреНрд░рдХрд╛рд░ рдмрди рдЬрд╛рддрд╛ рд╣реИред"

рдлрд┐рд░, рдЕрдЧрд░ рд╣рдо type Foo = impl Bar рд▓рд┐рдЦрддреЗ рд╣реИрдВ, рддреЛ рдореЗрд░рд╛ рдЕрдВрддрд░реНрдЬреНрдЮрд╛рди рдХрд╣рддрд╛ рд╣реИ:
"рд╣рдо Foo рдШреЛрд╖рд┐рдд рдХрд░ рд░рд╣реЗ рд╣реИрдВ, рдЬреЛ рдПрдХ рдкреНрд░рдХрд╛рд░ рдмрди рдЬрд╛рддрд╛ рд╣реИ рдЬреЛ Bar ред"

рдпрджрд┐ Foo рдХреЗ рд▓рд┐рдП рд╕рд┐рд░реНрдл рдПрдХ рд╢рд╛рдмреНрджрд┐рдХ рдЙрд░реНрдл рд╣реИ impl Bar , рддреЛ рд╡рд╣ рдореЗрд░реЗ рд▓рд┐рдП рд╕реБрдкрд░ unintuitive рд╣реЛрдЧреАред рдореБрдЭреЗ рдЗрд╕реЗ рдЯреЗрдХреНрд╕реНрдЯреБрдЕрд▓ рдмрдирд╛рдо рд╕рд┐рдореЗрдВрдЯрд┐рдХ рдЙрдкрдирд╛рдо рдХреЗ рд░реВрдк рдореЗрдВ рд╕реЛрдЪрдирд╛ рдкрд╕рдВрдж рд╣реИред

рддреЛ рдЕрдЧрд░ Foo рдХреЛ impl Bar рдмрджрд▓рд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИ, рддреЛ рдпрд╣ рдХрд╣реАрдВ рднреА рджрд┐рдЦрд╛рдИ рджреЗрддрд╛ рд╣реИ, рдпрд╣ рдПрдХ рдЯреЗрдХреНрд╕реНрдЯ рдЙрдкрдирд╛рдо рд╣реИ, рдЬреЛ рдореЗрд░реЗ рд▓рд┐рдП рдореИрдХреНрд░реЛрдЬрд╝ рдФрд░ рдореЗрдЯрд╛рдкреНрд░реЛрдЧреНрд░рд╛рдорд┐рдВрдЧ рдХреА рдпрд╛рдж рджрд┐рд▓рд╛рддрд╛ рд╣реИред рд▓реЗрдХрд┐рди рдЕрдЧрд░ Foo рдХреЛ рдШреЛрд╖рдгрд╛ рдХреЗ рдмрд┐рдВрджреБ рдкрд░ рдПрдХ рдЕрд░реНрде рд╕реМрдВрдкрд╛ рдЧрдпрд╛ рдерд╛ рдФрд░ рдЙрд╕ рдореВрд▓ рдЕрд░реНрде рдХреЗ рд╕рд╛рде рдХрдИ рд╕реНрдерд╛рдиреЛрдВ рдкрд░ рдЙрдкрдпреЛрдЧ рдХрд┐рдпрд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИ (рдкреНрд░рд╛рд╕рдВрдЧрд┐рдХ рдЕрд░реНрде рдирд╣реАрдВ!), рддреЛ рдпрд╣ рдПрдХ рдЕрд░реНрдердкреВрд░реНрдг рдЙрдкрдирд╛рдо рд╣реИред

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

рд╢рд╛рдпрдж рдореБрдЭреЗ рдореЗрд░реА рдЧреИрд░-рд╣рд╛рд╕реНрдХреЗрд▓ рдкреГрд╖реНрдарднреВрдорд┐ рдХреЗ рдХрд╛рд░рдг рд╕рдВрджрд░реНрднрд╛рддреНрдордХ рдкрд╛рд░рджрд░реНрд╢рд┐рддрд╛ рдЕрдирдЬрд╛рдиреА рд▓рдЧрддреА рд╣реИ, рдХреМрди рдЬрд╛рдирддрд╛ рд╣реИ... :)

@Nemo157 @stjepang

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

(рдЬреЛрд░ рдореЗрд░рд╛)ред рдореИрдВрдиреЗ рдкрдврд╝рд╛ рд╣реИ рдХрд┐ 'рдП' 'рдПрдХ рд╡рд┐рд╢рд┐рд╖реНрдЯ' рдХреЗ рд░реВрдк рдореЗрдВ рдЬрд┐рд╕рдХрд╛ рдЕрд░реНрде рд╣реИ f рдФрд░ g рд╡рд┐рднрд┐рдиреНрди рдареЛрд╕ рд░рд┐рдЯрд░реНрди рдкреНрд░рдХрд╛рд░реЛрдВ рдХрд╛ рд╕рдорд░реНрдерди рдирд╣реАрдВ рдХрд░реЗрдВрдЧреЗ, рдХреНрдпреЛрдВрдХрд┐ рд╡реЗ рдПрдХ рд╣реА рдЕрд╕реНрддрд┐рддреНрд╡ рдХреЗ рдкреНрд░рдХрд╛рд░ рдХреЛ рд╕рдВрджрд░реНрднрд┐рдд рдХрд░рддреЗ рд╣реИрдВред

рдпрд╣ "рдЕрд╕реНрддрд┐рддреНрд╡рд╡рд╛рджреА рдкреНрд░рдХрд╛рд░" рд╢рдмреНрдж рдХрд╛ рджреБрд░реБрдкрдпреЛрдЧ рд╣реИ, рдпрд╛ рдХрдо рд╕реЗ рдХрдо рдПрдХ рдРрд╕рд╛ рддрд░реАрдХрд╛ рд╣реИ рдЬреЛ @varkor рдХреА рдкреЛрд╕реНрдЯ рдХреЗ type Foo = impl Bar рдмрдирд╛рдиреЗ рдХреЗ рд▓рд┐рдП рдкреНрд░рдХрдЯ рд╣реЛ рд╕рдХрддреЗ рд╣реИрдВ Foo рдкреНрд░рдХрд╛рд░ рдХреЗ рд▓рд┐рдП рдПрдХ рдЙрдкрдирд╛рдо тИГ T. T: Trait - рдФрд░ рдЖрдк рд╕реНрдерд╛рдирд╛рдкрдиреНрди рдЕрдЧрд░ тИГ T. T: Trait рд╣рд░ рдЬрдЧрд╣ рдЖрдк рдХрд╛ рдЙрдкрдпреЛрдЧ Foo , рдпрд╣рд╛рдВ рддрдХ рдХрд┐ рдЧреИрд░ -рдкрд╛рдареНрдп рд░реВрдк рд╕реЗ , рдЖрдк рдкреНрд░рддреНрдпреЗрдХ рд╕реНрдерд┐рддрд┐ рдореЗрдВ рдПрдХ рдЕрд▓рдЧ рдареЛрд╕ рдкреНрд░рдХрд╛рд░ рдкреНрд░рд╛рдкреНрдд рдХрд░ рд╕рдХрддреЗ рд╣реИрдВред

рдЗрд╕ тИГ T рдХреНрд╡рд╛рдВрдЯрд┐рдлрд╛рдпрд░ рдХрд╛ рджрд╛рдпрд░рд╛ (рдЖрдкрдХреЗ рдЙрджрд╛рд╣рд░рдг рдореЗрдВ existential type _0 рд░реВрдк рдореЗрдВ рд╡реНрдпрдХреНрдд рдХрд┐рдпрд╛ рдЧрдпрд╛) рдкреНрд░рд╢реНрди рдХреА рдмрд╛рдд рд╣реИред рдПрдкреАрдЖрдИрдЯреА рдореЗрдВ рдпрд╣ рдЗрд╕ рддрд░рд╣ рддрдВрдЧ рд╣реИ- рдХреЙрд▓рд░ рдХрд┐рд╕реА рднреА рдореВрд▓реНрдп рдХреЛ рдкрд╛рд░рд┐рдд рдХрд░ рд╕рдХрддрд╛ рд╣реИ рдЬреЛ тИГ T. T: Trait рд╕рдВрддреБрд╖реНрдЯ рдХрд░рддрд╛ рд╣реИред рд▓реЗрдХрд┐рди рдпрд╣ RPIT рдореЗрдВ рдирд╣реАрдВ рд╣реИ, рдФрд░ рдЖрд░рдПрдлрд╕реА рдореЗрдВ рдирд╣реАрдВ 2071 рдХреЗ existential type рдШреЛрд╖рдгрд╛рдУрдВ, рдФрд░ рдЕрдкрдиреЗ desugaring рдореЗрдВ рдЙрджрд╛рд╣рд░рдг рд╡рд╣рд╛рдБ рдирд╣реАрдВ, рдкрд░рд┐рдорд╛рдгрдХ рдЖрдЧреЗ, рдмрд╛рд╣рд░ рд╣реИ рдкреВрд░реЗ рд╕рдорд╛рд░реЛрд╣ рдпрд╛ рдкреВрд░реЗ рдореЙрдбреНрдпреВрд▓ рд╕реНрддрд░ рдкрд░ рд╣реИ, рдФрд░ рдЖрдк рдХреЗ рд╕рд╛рде рд╕реМрджрд╛ рд╡рд╣реА T рд╣рд░ рдЬрдЧрд╣ред

рдЗрд╕ рдкреНрд░рдХрд╛рд░ рдЕрд╕реНрдкрд╖реНрдЯрддрд╛- рд╣рдорд╛рд░реЗ рдкрд╛рд╕ рдкрд╣рд▓реЗ рд╕реЗ рд╣реА impl Trait рдЬреЛ рдЗрд╕рдХреЗ рдХреНрд╡рд╛рдВрдЯрд┐рдлрд╛рдпрд░ рдХреЛ рдЙрд╕рдХреА рд╕реНрдерд┐рддрд┐ рдХреЗ рдЖрдзрд╛рд░ рдкрд░ рдЕрд▓рдЧ-рдЕрд▓рдЧ рд╕реНрдерд╛рдиреЛрдВ рдкрд░ рд░рдЦрддрд╛ рд╣реИ, рдЗрд╕рд▓рд┐рдП рд╣рдореЗрдВ type T = impl Trait рд▓рд┐рдП рдХрд┐рд╕рдХреА рдЕрдкреЗрдХреНрд╖рд╛ рдХрд░рдиреА рдЪрд╛рд╣рд┐рдП? рдХреБрдЫ рдЕрдиреМрдкрдЪрд╛рд░рд┐рдХ рд╕рд░реНрд╡реЗрдХреНрд╖рдг, рд╕рд╛рде рд╣реА RFC 2071 рдереНрд░реЗрдб рдореЗрдВ рдкреНрд░рддрд┐рднрд╛рдЧрд┐рдпреЛрдВ рджреНрд╡рд╛рд░рд╛ рдХреБрдЫ рддрдереНрдп-рдкреНрд░рд╛рдкреНрддрд┐ рдХреЗ рдмрд╛рдж, рдпрд╣ рд╕рд╛рдмрд┐рдд рдХрд░рддреЗ рд╣реИрдВ рдХрд┐ рдпрд╣ рдПрдХ рдпрд╛ рджреВрд╕рд░реЗ рддрд░реАрдХреЗ рд╕реЗ рд╕реНрдкрд╖реНрдЯ рдирд╣реАрдВ рд╣реИред

рдпрд╣реА рдХрд╛рд░рдг рд╣реИ рдХрд┐ рд╣рдо рдЕрд╕реНрддрд┐рддреНрд╡ рдХреЗ рд╕рд╛рде рдХреБрдЫ рднреА рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП impl Trait рдХреА рд╡реНрдпрд╛рдЦреНрдпрд╛ рд╕реЗ рджреВрд░ рдЬрд╛рдирд╛ рдЪрд╛рд╣рддреЗ рд╣реИрдВ, рдФрд░ рдЗрд╕рдХреЗ рдмрдЬрд╛рдп рдкреНрд░рдХрд╛рд░ рдХреЗ рдЕрдиреБрдорд╛рди рдХреЗ рд╕рдВрджрд░реНрдн рдореЗрдВ рдЗрд╕рдХреЗ рд╢рдмреНрджрд╛рд░реНрде рдХрд╛ рд╡рд░реНрдгрди рдХрд░рддреЗ рд╣реИрдВред type T = _ рдореЗрдВ рдПрдХ рд╣реА рдкреНрд░рдХрд╛рд░ рдХреА рдЕрд╕реНрдкрд╖реНрдЯрддрд╛ рдирд╣реАрдВ рд╣реИ- рдЕрднреА рднреА рд╕рддрд╣-рд╕реНрддрд░ рд╣реИ " _ рдХреЗ рд╕реНрдерд╛рди рдкрд░ T _ рдХреЛ рдХреЙрдкреА-рдкреЗрд╕реНрдЯ рдирд╣реАрдВ рдХрд░ рд╕рдХрддрд╛," рд▓реЗрдХрд┐рди рдЕрдм рдФрд░ рдирд╣реАрдВ рд╣реИ " рдПрдХрд▓ рдкреНрд░рдХрд╛рд░ рдЬреЛ T рдХрд╛ рдЙрдкрдирд╛рдо рд╣реИ, рдХрд╛ рдЕрд░реНрде рдХрдИ рдареЛрд╕ рдкреНрд░рдХрд╛рд░ рд╣реЛ рд╕рдХрддрд╛ рд╣реИред" (рдЕрдкрд╛рд░рджрд░реНрд╢реА/рдПрдХрдЬреБрдЯ рдирд╣реАрдВ рд╣реЛрдиреЗ рд╡рд╛рд▓рд╛ рд╡реНрдпрд╡рд╣рд╛рд░ рд╡рд╣ рдЪреАрдЬ рд╣реИ рдЬрд┐рд╕ рдкрд░ @varkor рдЕрдиреБрд╕рд░рдг рдХрд░рдиреЗ рдХреА рдмрд╛рдд рдХрд░ рд░рд╣рд╛ рд╣реИред)

рд╕рдВрджрд░реНрднрд╛рддреНрдордХ рдкрд╛рд░рджрд░реНрд╢рд┐рддрд╛

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

рдПрдХ рдЙрджрд╛рд╣рд░рдг рдХреЗ рд░реВрдк рдореЗрдВ, const рдЖрдЗрдЯрдо рд░реЗрдлрд░реЗрдВрд╢рд┐рдпрд▓ рдЯреНрд░рд╛рдВрд╕рдкреЗрд░реЗрдВрдЯ рд╣реИ (рдЗрд╕рдХрд╛ рдЙрд▓реНрд▓реЗрдЦ https://github.com/rust-lang/rust/issues/34511#issuecomment-402520768) рд╣реИ, рдФрд░ рдЗрд╕рд╕реЗ рд╡рд╛рд╕реНрддрд╡ рдореЗрдВ рдирдП рдФрд░ рдкреБрд░рд╛рдиреЗ рд▓реЛрдЧреЛрдВ рдХреЗ рд▓рд┐рдП рднреНрд░рдо рдкреИрджрд╛ рд╣реБрдЖ рд╣реИред рдЙрдкрдпреЛрдЧрдХрд░реНрддрд╛ (рдЬрдВрдЧ-рд▓рдВрдЧ-рдирд░реНрд╕рд░реА/рдЬрдВрдЧ-рдХреНрд▓рд┐рдкреНрдкреА#1560)ред

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

@stjepang @kennytm рдореИрдВ рдпрд╣ рдирд╣реАрдВ рдХрд╣ рд░рд╣рд╛ рд╣реВрдВ рдХрд┐ рд╣рд░ рдХреЛрдИ рдЙрдореНрдореАрдж рдХрд░реЗрдЧрд╛ рдХрд┐ рдЙрд╕ рдкреНрд░рдХрд╛рд░ рдХреЗ рдЙрдкрдирд╛рдо type Foo = impl Trait; рдХреЗ рд╕рд╛рде рдПрдХ рд╕рдВрджрд░реНрднрд┐рдд рдкрд╛рд░рджрд░реНрд╢реА рддрд░реАрдХреЗ рд╕реЗ рдХрд╛рд░реНрдп рдХрд░реЗрдВрдЧреЗред рд▓реЗрдХрд┐рди рдореБрдЭреЗ рд▓рдЧрддрд╛ рд╣реИ рдХрд┐ рдЙрдкрдпреЛрдЧрдХрд░реНрддрд╛рдУрдВ рдХреА рдПрдХ рдЧреИрд░-рддреБрдЪреНрдЫ рд░рд╛рд╢рд┐, рдЬреИрд╕рд╛ рдХрд┐ рдЗрд╕ рдзрд╛рдЧреЗ рдФрд░ рдЕрдиреНрдп рдЬрдЧрд╣реЛрдВ рдореЗрдВ рднреНрд░рдо рд╕реЗ рдкреНрд░рдорд╛рдгрд┐рдд рд╣реИ (рдЬреЛ

рдЗрд╕ рдорд╛рдорд▓реЗ рдореЗрдВ рдХреНрдпрд╛ рдХрд┐рдпрд╛ рдЬрд╛рдирд╛ рдЪрд╛рд╣рд┐рдП, рдЗрд╕ рдкрд░ рдореЗрд░реА рд╡рд░реНрддрдорд╛рди рд╕реЛрдЪ @varkor рдФрд░ @rpjohnst рдХреЗ рдЕрдиреБрд░реВрдк рд╣реИред

рдкреБрди: рд╕рдВрджрд░реНрднрд╛рддреНрдордХ рдкрд╛рд░рджрд░реНрд╢рд┐рддрд╛

type Foo<T> = (T, T);

type Bar = Foo<impl Copy>;   // not equivalent to (impl Copy, impl Copy)

рджреВрд╕рд░реЗ рд╢рдмреНрджреЛрдВ рдореЗрдВ, рдпрд╣рд╛рдВ рддрдХ тАЛтАЛтАЛтАЛрдХрд┐ рд╣рд░ рдЙрджрд╛рд╣рд░рдг рдкрд░ рдирдП рдкреНрд░рдХрд╛рд░ рдЙрддреНрдкрдиреНрди рдХрд░рдирд╛ рд╕рд╛рдорд╛рдиреНрдп рдкреНрд░рдХрд╛рд░ рдХреЗ рдЙрдкрдирд╛рдореЛрдВ рдХреЗ рд╕рдВрджрд░реНрдн рдореЗрдВ рд╕рдВрджрд░реНрднрд┐рдд рд░реВрдк рд╕реЗ рдкрд╛рд░рджрд░реНрд╢реА рдирд╣реАрдВ рд╣реИред

@centril рдЬрдм Foo рдореЗрдВ type Foo = impl Bar; рд▓рд┐рдП рд╕рдВрджрд░реНрднрд╛рддреНрдордХ рдкрд╛рд░рджрд░реНрд╢рд┐рддрд╛ рдХреА рдЕрдкреЗрдХреНрд╖рд╛ рдХрд░рдиреЗ рдХреА рдмрд╛рдд рдЖрддреА рд╣реИ рддреЛ рдореИрдВ рдЕрдкрдирд╛ рд╣рд╛рде рдЙрдард╛рддрд╛ рд╣реВрдВред рд╣рд╛рд▓рд╛рдВрдХрд┐, type Foo: Bar = _; , рдореИрдВ рд╕рдВрджрд░реНрднрд╛рддреНрдордХ рдкрд╛рд░рджрд░реНрд╢рд┐рддрд╛ рдХреА рдЕрдкреЗрдХреНрд╖рд╛ рдирд╣реАрдВ рдХрд░реВрдВрдЧрд╛ред

рдпрд╣ рднреА рд╕рдВрднрд╡ рд╣реИ рдХрд┐ рд╣рдо рдХрд┐рд╕реА рднреА рдкреНрд░рдХрд╛рд░ рдХреЗ enum impl Trait -рд╕рдорд╛рди рддрдВрддреНрд░ рдХреЗ рдмрд┐рдирд╛, рдХреЙрд▓рд░ рдХреЛ рдореЛрдиреЛрдореЛрд░реНрдлрд╛рдЗрдЬрд┐рдВрдЧ (рдЯреБрдХрдбрд╝реЛрдВ рдХреЗ) рджреНрд╡рд╛рд░рд╛, рдХрдИ рдкреНрд░рдХрд╛рд░реЛрдВ рдХрд╛ рд╕рдорд░реНрдерди рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рд╡рд╛рдкрд╕реА-рд╕реНрдерд┐рддрд┐ impl Trait рдмрдврд╝рд╛ рд╕рдХрддреЗ рд╣реИрдВред рдпрд╣ рдордЬрдмреВрдд " impl Trait рд╡реНрдпрд╛рдЦреНрдпрд╛ рд╣рдореЗрд╢рд╛ рдЕрд╕реНрддрд┐рддреНрд╡ рд╣реИ", рдпрд╣ рдХреЗ рд╕рд╛рде рд▓рд╛рдЗрди рдореЗрдВ рдХрд░реАрдм рд▓рд╛рддрд╛ рд╣реИ dyn Trait , рдФрд░ рдкрддрд╛ рдЪрд▓рддрд╛ рд╣реИ рдПрдХ abstract type рд╕рд┐рдВрдЯреИрдХреНрд╕ рдХрд╛ рдЙрдкрдпреЛрдЧ рдирд╣реАрдВ рдХрд░рддрд╛ impl Trait рдмрд┐рд▓реНрдХреБрд▓ рднреАред

рдореИрдВрдиреЗ рдЗрд╕реЗ рдпрд╣рд╛рдВ рдЗрдВрдЯрд░реНрдирд▓ рдкрд░ рд▓рд┐рдЦрд╛ рд╣реИ: https://internals.rust-lang.org/t/extending-impl-trait-to-allow-multiple-return-types/7921

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

"рдЕрд╕реНрддрд┐рддреНрд╡рд╡рд╛рджреА" рдкреНрд░рдХрд╛рд░реЛрдВ рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рдмрд╛рдд рдХрд░рдиреЗ рд╕реЗ рдЪреАрдЬреЗрдВ рд╕рд╛рдл рд╣реЛрддреА рдирд╣реАрдВ рджрд┐рдЦ рд░рд╣реА рд╣реИрдВред рдореИрдВ рдХрд╣реВрдВрдЧрд╛ рдХрд┐ impl Trait рдПрдХ рд╡рд┐рд╢рд┐рд╖реНрдЯ, рдЕрдиреБрдорд╛рдирд┐рдд рдкреНрд░рдХрд╛рд░ рдХреЛ рд▓рд╛рдЧреВ рдХрд░рдиреЗ рд╡рд╛рд▓реА рд╡рд┐рд╢реЗрд╖рддрд╛ рдХреЗ рд▓рд┐рдП рд╣реИред рдЗрд╕ рддрд░рд╣ рд╕реЗ рд╡рд░реНрдгрд┐рдд, type Foo = impl Bar рд╕реНрдкрд╖реНрдЯ рд░реВрдк рд╕реЗ рдПрдХ рд╡рд┐рд╢рд┐рд╖реНрдЯ, рд╣рдореЗрд╢рд╛ рд╕рдорд╛рди, рдкреНрд░рдХрд╛рд░ рд╣реИ- рдФрд░ рдпрд╣ рднреА рдПрдХрдорд╛рддреНрд░ рд╡реНрдпрд╛рдЦреНрдпрд╛ рд╣реИ рдЬреЛ рд╡рд╛рд╕реНрддрд╡ рдореЗрдВ рдЙрдкрдпреЛрдЧреА рд╣реИ: рдЗрд╕рд▓рд┐рдП рдЗрд╕рдХрд╛ рдЙрдкрдпреЛрдЧ рдЕрдиреНрдп рд╕рдВрджрд░реНрднреЛрдВ рдореЗрдВ рдХрд┐рдпрд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИ, рдЬрд┐рд╕рдХреЗ рдЕрд▓рд╛рд╡рд╛ рдЗрд╕рдХрд╛ рдЕрдиреБрдорд╛рди рд▓рдЧрд╛рдпрд╛ рдЧрдпрд╛ рдерд╛, рдЬреИрд╕реЗ рд╕реНрдЯреНрд░рдХреНрдЪрд░реНрд╕ рдореЗрдВред

рдЗрд╕ рдЕрд░реНрде рдореЗрдВ, impl Trait рдХреЛ _ : Trait рд░реВрдк рдореЗрдВ рд▓рд┐рдЦрдирд╛ рднреА рд╕рдордЭ рдореЗрдВ рдЖрддрд╛ рд╣реИред

@rpjohnst ,

рдпрд╣ рднреА рд╕рдВрднрд╡ рд╣реИ рдХрд┐ рд╣рдо рдХрдИ рдкреНрд░рдХрд╛рд░реЛрдВ рдХрд╛ рд╕рдорд░реНрдерди рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рд╡рд╛рдкрд╕реА-рд╕реНрдерд┐рддрд┐ impl Trait рдмрдврд╝рд╛ рд╕рдХреЗрдВ

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

@ jan-hudec рд╡реЗ рд╡рд┐рдЪрд╛рд░ рдбрд┐рд╕реНрдХреЙрд░реНрдб рдкрд░ рдЪрд░реНрдЪрд╛ рдореЗрдВ рдЖрдП рд╣реИрдВ, рдФрд░ рдХреБрдЫ рдореБрджреНрджреЗ рд╣реИрдВ, рдореБрдЦреНрдп рд░реВрдк рд╕реЗ рдЗрд╕ рддрдереНрдп рдХреЗ рдЖрдзрд╛рд░ рдкрд░ рдХрд┐ рд╡рд╛рдкрд╕реА-рд╕реНрдерд┐рддрд┐ рдФрд░ рддрд░реНрдХ-рд╕реНрдерд┐рддрд┐ impl Trait рдХреА рд╡рд░реНрддрдорд╛рди рд╡реНрдпрд╛рдЦреНрдпрд╛ рдЕрд╕рдВрдЧрдд рд╣реИред

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

рдЙрджрд╛рд╣рд░рдг рдХреЗ рд▓рд┐рдП, рдПрдХ рдмрд╛рд░ impl Trait рдЕрд░реНрде рд╣реИ "рдЗрд╕ рдирдП рдкреНрд░рдХрд╛рд░ рдХреЗ рдЕрдиреБрдорд╛рди рдХрд╛ рдЙрдкрдпреЛрдЧ рдПрдХ рдмрд╣реБрд░реВрдкреА-рдЬреИрд╕рд╛-рд╕рдВрднрд╡ рдкреНрд░рдХрд╛рд░ рдЦреЛрдЬрдиреЗ рдХреЗ рд▓рд┐рдП рдХрд░реЗрдВ рдЬреЛ Trait ," type Foo = impl Bar рдореЙрдбреНрдпреВрд▓ рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рдЪреАрдЬреЛрдВ рдХреЛ рдЗрдВрдЧрд┐рдд рдХрд░рдирд╛ рд╢реБрд░реВ рдХрд░ рджреЗрддрд╛ рд╣реИред abstract type рдХрд╛ рдЕрдиреБрдорд╛рди рд▓рдЧрд╛рдиреЗ рдХреЗ рддрд░реАрдХреЗ рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ RFC 2071 рдирд┐рдпрдо рдХрд╣рддрд╛ рд╣реИ рдХрд┐ рд╕рднреА рдЙрдкрдпреЛрдЧреЛрдВ рдХреЛ рд╕реНрд╡рддрдВрддреНрд░ рд░реВрдк рд╕реЗ рдПрдХ рд╣реА рдкреНрд░рдХрд╛рд░ рдХрд╛ рдЕрдиреБрдорд╛рди рд▓рдЧрд╛рдирд╛ рдЪрд╛рд╣рд┐рдП, рд▓реЗрдХрд┐рди рдпрд╣ рдмрд╣реБрд░реВрдкреА рдЕрдиреБрдорд╛рди рдХрдо рд╕реЗ рдХрдо рдпрд╣ рд╕рдВрдХреЗрдд рджреЗрдЧрд╛ рдХрд┐ рдЕрдзрд┐рдХ рд╕рдВрднрд╡ рд╣реИред рдФрд░ рдЕрдЧрд░ рд╣рдореЗрдВ рдХрднреА рдкреИрд░рд╛рдореАрдЯреНрд░рд┐рдЬреНрдб рдореЙрдбреНрдпреВрд▓ рдорд┐рд▓реЗ (рдпрд╣рд╛рдВ рддрдХ тАЛтАЛтАЛтАЛрдХрд┐ рд╕рд┐рд░реНрдл рдЬреАрд╡рдирдХрд╛рд▓ рдореЗрдВ, рдПрдХ рдХрд╣реАрдВ рдЕрдзрд┐рдХ рдкреНрд░рд╢рдВрд╕рдиреАрдп рд╡рд┐рдЪрд╛рд░), рддреЛ рдЙрд╕ рдмрд╛рддрдЪреАрдд рдХреЗ рдЖрд╕рдкрд╛рд╕ рдкреНрд░рд╢реНрди рд╣реЛрдВрдЧреЗред

рдПрдХ рддрдереНрдп рдпрд╣ рднреА рд╣реИ рдХрд┐ рдХреБрдЫ рд▓реЛрдЧ рд╣рдореЗрд╢рд╛ type Foo = impl Bar рд╡рд╛рдХреНрдп рд░рдЪрдирд╛ рдХреЛ рдПрдХ рдЕрд╕реНрддрд┐рддреНрд╡ рдХреЗ рд▓рд┐рдП рдЙрдкрдирд╛рдо рдХреЗ рд░реВрдк рдореЗрдВ рд╡реНрдпрд╛рдЦреНрдпрд╛рдпрд┐рдд рдХрд░реЗрдВрдЧреЗ, рднрд▓реЗ рд╣реА рд╡реЗ "рдЕрд╕реНрддрд┐рддреНрд╡рд╡рд╛рджреА" рд╢рдмреНрдж рдХреЛ рд╕рдордЭрддреЗ рд╣реЛрдВ рдФрд░ рдЪрд╛рд╣реЗ рд╣рдо рдЗрд╕реЗ рдХреИрд╕реЗ рднреА рдкрдврд╝рд╛рддреЗ рд╣реЛрдВред рддреЛ рдПрдХ рд╡реИрдХрд▓реНрдкрд┐рдХ рд╡рд╛рдХреНрдпрд╡рд┐рдиреНрдпрд╛рд╕ рдЪреБрдирдирд╛, рднрд▓реЗ рд╣реА рдпрд╣ рдЕрдиреБрдорд╛рди-рдЖрдзрд╛рд░рд┐рдд рд╡реНрдпрд╛рдЦреНрдпрд╛ рдХреЗ рд╕рд╛рде рдХрд╛рдо рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рд╣реЛрддрд╛ рд╣реИ, рд╢рд╛рдпрдж рдЕрднреА рднреА рдПрдХ рдЕрдЪреНрдЫрд╛ рд╡рд┐рдЪрд╛рд░ рд╣реИред

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

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

рд╡реЗ рд╡рд┐рдЪрд╛рд░ рдбрд┐рд╕реНрдХреЙрд░реНрдб рдкрд░ рдЪрд░реНрдЪрд╛ рдореЗрдВ рдЖрдП рд╣реИрдВ, рдФрд░ рдХреБрдЫ рдореБрджреНрджреЗ рд╣реИрдВ, рдореБрдЦреНрдп рд░реВрдк рд╕реЗ рдЗрд╕ рддрдереНрдп рдХреЗ рдЖрдзрд╛рд░ рдкрд░ рдХрд┐ рд╡рд╛рдкрд╕реА-рд╕реНрдерд┐рддрд┐ рдФрд░ рддрд░реНрдХ-рд╕реНрдерд┐рддрд┐ impl Trait рдХреА рд╡рд░реНрддрдорд╛рди рд╡реНрдпрд╛рдЦреНрдпрд╛ рдЕрд╕рдВрдЧрдд рд╣реИред

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

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

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

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

@rpjohnst

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

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

@mikeyhew рдЖрдк рдореБрдЭреЗ рдЧрд▓рдд рд╕рдордЭрддреЗ рд╣реИрдВ- рдпрд╣ рдмрдВрдж рдпрд╛ рдЕрдиреНрдп рдЕрдЬреНрдЮрд╛рдд рдкреНрд░рдХрд╛рд░реЛрдВ рдХреЗ рд▓рд┐рдП рдареАрдХ рдХрд╛рдо рдХрд░рддрд╛ рд╣реИ, рдХреНрдпреЛрдВрдХрд┐ рдореИрдВ рдЖрд░рдПрдлрд╕реА 2071 abstract type рд╡рд╛рдХреНрдпрд╡рд┐рдиреНрдпрд╛рд╕ рдХреЗ рдорд╛рдзреНрдпрдо рд╕реЗ рдПрдХ рдирд╛рдо рдХрд╛ рдЖрд╡рд┐рд╖реНрдХрд╛рд░ рдХрд░рдиреЗ рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рдмрд╛рдд рдХрд░ рд░рд╣рд╛ рд╣реВрдВред рдЖрдк рднрд▓реЗ рд╣реА рдПрдХ рдирд╛рдо рдХрд╛ рдЖрд╡рд┐рд╖реНрдХрд╛рд░ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдЖрдк рдХрд╣реАрдВ рдФрд░ рд╣реА рдкреНрд░рдХрд╛рд░ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдЬрд╛ рд░рд╣реЗ рд╣реИрдВ рдХреА рд╣реИред

@rpjohnst рдУрд╣, рдореИрдВ рджреЗрдЦрддрд╛ рд╣реВрдВ, рд╕реНрдкрд╖реНрдЯреАрдХрд░рдг рдХреЗ рд▓рд┐рдП рдзрдиреНрдпрд╡рд╛рдж

let x: impl Trait рдмреЗрд╕рдмреНрд░реА рд╕реЗ рдЗрдВрддрдЬрд╝рд╛рд░ рд╣реИред

let x: impl Trait рд▓рд┐рдП рдПрдХ рдФрд░ рд╡реЛрдЯ рдХреЗ рд░реВрдк рдореЗрдВ рдпрд╣ futures рдЙрджрд╛рд╣рд░рдгреЛрдВ рдореЗрдВ рд╕реЗ рдХреБрдЫ рдХреЛ рд╕рд░рд▓ рдмрдирд╛ рджреЗрдЧрд╛, рдпрд╣рд╛рдВ рдПрдХ рдЙрджрд╛рд╣рд░рдг рдЙрджрд╛рд╣рд░рдг рд╣реИ , рд╡рд░реНрддрдорд╛рди рдореЗрдВ рдпрд╣ рдХреЗрд╡рд▓ impl Trait рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдиреЗ рдХреА рдХреНрд╖рдорддрд╛ рдкреНрд░рд╛рдкреНрдд рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдлрд╝рдВрдХреНрд╢рди рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░ рд░рд╣рд╛ рд╣реИ:

fn make_sink_async() -> impl Future<Output = Result<
    impl Sink<SinkItem = T, SinkError = E>,
    E,
>> { // ... }

рдЗрд╕рдХреЗ рдмрдЬрд╛рдп рдЗрд╕реЗ рд╕рд╛рдорд╛рдиреНрдп рд▓реЗрдЯ рдмрд╛рдЗрдВрдбрд┐рдВрдЧ рдХреЗ рд░реВрдк рдореЗрдВ рд▓рд┐рдЦрд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИ:

let future_sink: impl Future<Output = Result<
    impl Sink<SinkItem = T, SinkError = E>,
    E,
>> = // ...;

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

рдЗрд╕реА рддрд░рд╣ рд╣рдо https://github.com/rust-lang/rust/blob/master/src/librustc/hir/lowering.rs#L3159 рдореЗрдВ рд░рд┐рдЯрд░реНрди рдЯрд╛рдЗрдк рдЗрдореНрдкреНрд▓рд╛рдВрдЯ рдЯреНрд░реИрдЯ рдкрд░ рдХреИрд╕реЗ рдЬрд╛рддреЗ рд╣реИрдВ, рд╣рдореЗрдВ https рдореЗрдВ рд╕реНрдерд╛рдиреАрдп рд▓реЛрдЧреЛрдВ рдХреЗ рдкреНрд░рдХрд╛рд░ рдХрд╛ рджреМрд░рд╛ рдХрд░рдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реИ

рдлрд┐рд░, рд╕реНрдерд╛рдиреАрдп рд▓реЛрдЧреЛрдВ рдХреЗ рдкреНрд░рдХрд╛рд░ рдкрд░ рдЬрд╛рдХрд░, рдЗрд╕реЗ рд╡рд╛рд╕реНрддрд╡ рдореЗрдВ рд╕рдХреНрд╖рдо рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП ExistentialContext рд╕реЗ Return рдкрд░ рд╕реЗрдЯ рдХрд░рдирд╛ рд╕реБрдирд┐рд╢реНрдЪрд┐рдд рдХрд░реЗрдВред

рдпрд╣ рд╣рдореЗрдВ рдкрд╣рд▓реЗ рд╕реЗ рд╣реА рдмрд╣реБрдд рджреВрд░ рд▓реЗ рдЬрд╛рдирд╛ рдЪрд╛рд╣рд┐рдПред рд╕реБрдирд┐рд╢реНрдЪрд┐рдд рдирд╣реАрдВ рд╣реИ рдХрд┐ рд╕рднреА рддрд░рд╣ рд╕реЗ, рдпрд╣ рд╡рд╛рдкрд╕реА рдХреА рд╕реНрдерд┐рддрд┐ рдХреА рддрд░рд╣ 100% рдирд╣реАрдВ рд╣реИ, рд▓реЗрдХрд┐рди рдЬреНрдпрд╛рджрд╛рддрд░ рдРрд╕рд╛ рд╡реНрдпрд╡рд╣рд╛рд░ рдХрд░рдирд╛ рдЪрд╛рд╣рд┐рдПред

@rpjohnst ,

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

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

рдореИрдВрдиреЗ рдПрдХ рдЖрд░рдПрдлрд╕реА рдЦреЛрд▓рд╛ рд╣реИ рдЬрд┐рд╕рдореЗрдВ existential type рдХрдВрдХреНрд░реАрдЯ рд╕рд┐рдВрдЯреИрдХреНрд╕ рдХреЗ рд▓рд┐рдП рдПрдХ рдкреНрд░рд╕реНрддрд╛рд╡ рдкреНрд░рд╕реНрддрд╛рд╡рд┐рдд рдХрд┐рдпрд╛ рдЧрдпрд╛ рд╣реИ, рдЗрд╕ рдзрд╛рдЧреЗ рдореЗрдВ рдЪрд░реНрдЪрд╛ рдХреЗ рдЖрдзрд╛рд░ рдкрд░, рдореВрд▓ рдЖрд░рдПрдлрд╕реА рдФрд░ рддреБрд▓реНрдпрдХрд╛рд▓рд┐рдХ рдЪрд░реНрдЪрд╛: https://github.com/rust-lang/rfcs/pull /2515.

рд╡рд░реНрддрдорд╛рди рдЕрд╕реНрддрд┐рддреНрд╡ рдХреЗ рдкреНрд░рдХрд╛рд░ рдХреЗ рдХрд╛рд░реНрдпрд╛рдиреНрд╡рдпрди рдХрд╛ рдЙрдкрдпреЛрдЧ рд╕рднреА рдореМрдЬреВрджрд╛ рд░рд┐рдЯрд░реНрди рд╕реНрдерд┐рддрд┐ impl Trait рдкрд░рд┐рднрд╛рд╖рд╛рдУрдВ рдХрд╛ рдкреНрд░рддрд┐рдирд┐рдзрд┐рддреНрд╡ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдирд╣реАрдВ рдХрд┐рдпрд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИ, рдХреНрдпреЛрдВрдХрд┐ impl Trait рдкреНрд░рддреНрдпреЗрдХ рд╕рд╛рдорд╛рдиреНрдп рдкреНрд░рдХрд╛рд░ рдХреЗ рддрд░реНрдХ рдХреЛ рдХреИрдкреНрдЪрд░ рдХрд░рддрд╛ рд╣реИ, рднрд▓реЗ рд╣реА рдЕрдкреНрд░рдпреБрдХреНрдд рд╣реЛ, рдЗрд╕реЗ existential type рд╕рд╛рде рдХрд░рдирд╛ рд╕рдВрднрд╡ рд╣реЛрдирд╛ рдЪрд╛рд╣рд┐рдП (рдЦреЗрд▓ рдХрд╛ рдореИрджрд╛рди)

fn foo<T>(_: T) -> impl ::std::fmt::Display {
    5
}

existential type Bar<T>: ::std::fmt::Display;
fn bar<T>(_: T) -> Bar<T> {
    5
}

рдпрд╣ рдорд╣рддреНрд╡рдкреВрд░реНрдг рд╣реЛ рд╕рдХрддрд╛ рд╣реИ рдХреНрдпреЛрдВрдХрд┐ рдкреНрд░рдХрд╛рд░ рдкреИрд░рд╛рдореАрдЯрд░ рдореЗрдВ рдЖрдВрддрд░рд┐рдХ рдЬреАрд╡рдирдХрд╛рд▓ рд╣реЛ рд╕рдХрддрд╛ рд╣реИ рдЬреЛ рд▓реМрдЯрд╛рдП рдЧрдП impl Trait рдЬреАрд╡рдирдХрд╛рд▓ рдХреЛ рдкреНрд░рддрд┐рдмрдВрдзрд┐рдд рдХрд░рддрд╛ рд╣реИ, рднрд▓реЗ рд╣реА рдореВрд▓реНрдп рд╕реНрд╡рдпрдВ рдЕрдкреНрд░рдпреБрдХреНрдд рд╣реЛ, рдЦреЗрд▓ рдХреЗ рдореИрджрд╛рди рдореЗрдВ <T> рд╕реЗ Bar рдХреЛ рд╣рдЯрд╛ рджреЗрдВ рдпрд╣ рджреЗрдЦрдиреЗ рдХреЗ рд▓рд┐рдП рдХрд┐ foo рдХреЙрд▓ рд╡рд┐рдлрд▓ рд╣реЛ рдЬрд╛рддреА рд╣реИ рд▓реЗрдХрд┐рди bar рдХрд╛рдо рдХрд░рддреА рд╣реИред

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

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

@ oli-obk рдЕрддрд┐рд░рд┐рдХреНрдд рд╕рд▓рд╛рд╣ рдХреЗ рд▓рд┐рдП рдзрдиреНрдпрд╡рд╛рджред рдЖрдкрдХреА рдкрд┐рдЫрд▓реА рд╕рд▓рд╛рд╣ рдФрд░ @cramertj рд╕реЗ рдХреБрдЫ рдХреЗ рд╕рд╛рде, рдореИрдВ рд╢рд╛рдпрдж рдЬрд▓реНрдж рд╣реА рдЗрд╕ рдкрд░ рдЬрд╛ рд╕рдХрддрд╛ рд╣реВрдВред

@fasihrana @ Nemo157 рдКрдкрд░ рджреЗрдЦреЗрдВред рд╢рд╛рдпрдж рдХреБрдЫ рд╣рдлреНрддреЛрдВ рдореЗрдВ! :-)

рдХреНрдпрд╛ рдХреЛрдИ рд╕реНрдкрд╖реНрдЯ рдХрд░ рд╕рдХрддрд╛ рд╣реИ рдХрд┐ existential type рдХрд╛ рд╡реНрдпрд╡рд╣рд╛рд░ рдкреНрд░рдХрд╛рд░ рдХреЗ рдорд╛рдкрджрдВрдбреЛрдВ рдХреЛ рдкрд░реЛрдХреНрд╖ рд░реВрдк рд╕реЗ рдХреИрдкреНрдЪрд░ рдирд╣реАрдВ рдХрд░ рд░рд╣рд╛ рд╣реИ (рдЬреЛ рдХрд┐ @ Nemo157 рдХрд╛ рдЙрд▓реНрд▓реЗрдЦ рдХрд┐рдпрд╛ рдЧрдпрд╛ рд╣реИ) рдЬрд╛рдирдмреВрдЭрдХрд░ рд╣реИ рдФрд░ рдЬреИрд╕рд╛ рд╣реИ рд╡реИрд╕рд╛ рд╣реА рд░рд╣реЗрдЧрд╛? рдореБрдЭреЗ рдпрд╣ рдкрд╕рдВрдж рд╣реИ рдХреНрдпреЛрдВрдХрд┐ рдпрд╣ #42940 . рдХреЛ рд╣рд▓ рдХрд░рддрд╛ рд╣реИ

рдореИрдВрдиреЗ рдЗрд╕реЗ рдЗрд╕ рддрд░рд╣ рд╕реЗ рдмрд╣реБрдд рдЙрджреНрджреЗрд╢реНрдп рд╕реЗ рд▓рд╛рдЧреВ рдХрд┐рдпрд╛

@Arnavion рд╣рд╛рдБ, рдпрд╣ рдЬрд╛рдирдмреВрдЭрдХрд░ рдХрд┐рдпрд╛ рдЧрдпрд╛ рд╣реИ, рдФрд░ рдЕрдиреНрдп рдЖрдЗрдЯрдо рдШреЛрд╖рдгрд╛рдУрдВ (рдЬреИрд╕реЗ рдиреЗрд╕реНрдЯреЗрдб рдлрд╝рдВрдХреНрд╢рдВрд╕) рдХреЗ рд░рд╕реНрдЯ рдореЗрдВ рдХрд╛рдо рдХрд░рдиреЗ рдХреЗ рддрд░реАрдХреЗ рд╕реЗ рдореЗрд▓ рдЦрд╛рддрд╛ рд╣реИред

рдХреНрдпрд╛ existential_type рдФрд░ never_type рдХреЗ рдмреАрдЪ рдмрд╛рддрдЪреАрдд рдкрд░ рдкрд╣рд▓реЗ рд╣реА рдЪрд░реНрдЪрд╛ рд╣реЛ рдЪреБрдХреА рд╣реИ?

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

existential type Mystery : TraitThatIsHardToEvenStartImplementing;

fn hack_to_make_it_compile() -> Mystery { unimplemented!() }

рдпрд╛ рдХреНрдпрд╛ рдХреЛрдИ рд╡рд┐рд╢реЗрд╖ рдЕрдЫреВрдд рдкреНрд░рдХрд╛рд░ рд╣реЛрдЧрд╛ рдЬреЛ рдЯрд╛рдЗрдк-рд▓реЗрд╡рд▓ unimplemented!() рдХрд░ рд░рд╣рд╛ рд╣реИ рдЬреЛ рдХрд┐рд╕реА рднреА рдЕрд╕реНрддрд┐рддреНрд╡рдЧрдд рдкреНрд░рдХрд╛рд░ рдХреЛ рд╕реНрд╡рдЪрд╛рд▓рд┐рдд рд░реВрдк рд╕реЗ рд╕рдВрддреБрд╖реНрдЯ рдХрд░рдиреЗ рдореЗрдВ рд╕рдХреНрд╖рдо рд╣реИ?

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

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

existential type рдкрд╣рд▓реЗ рд╕реЗ рд╣реА рд╡рд┐рд╢реЗрд╖рддрд╛ рд╡рд┐рдзрд┐рдпреЛрдВ рдХреЗ рд▓рд┐рдП рдХрд╛рдо рдХрд░рддрд╛ рд╣реИред Wrt impl Trait , рдХреНрдпрд╛ рд╡рд╣ рднреА RFC рджреНрд╡рд╛рд░рд╛ рдХрд╡рд░ рдХрд┐рдпрд╛ рдЧрдпрд╛ рд╣реИ?

@alexreg рдореЗрд░рд╛ рдорд╛рдирдирд╛ тАЛтАЛтАЛтАЛрд╣реИ рдХрд┐ рдЬрдм рдЖрдкрдХреЗ рдкрд╛рд╕ fn foo<T>(..) -> impl Bar<T> (рд▓рдЧрднрдЧ -> Self::AnonBar0<T> ) рдЬреИрд╕рд╛ рдХреБрдЫ рд╣реЛрддрд╛ рд╣реИ рддреЛ GATs рдХреЛ рдПрдХ рдЕрдЬреНрдЮрд╛рдд рд╕рдВрдмрджреНрдз рдкреНрд░рдХрд╛рд░ рдореЗрдВ desugar рдХрд░рдиреЗ рдореЗрдВ рд╕рдХреНрд╖рдо рд╣реЛрдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реЛрддреА рд╣реИред

@Centril рдХреНрдпрд╛ рдЖрдкрдХрд╛ рдорддрд▓рдм <T> рдкрд░ impl Bar рдерд╛? impl Trait рдирд┐рд╣рд┐рдд рдкреНрд░рдХрд╛рд░ рдХреЗ рдХреИрдкреНрдЪрд░ рд╡реНрдпрд╡рд╣рд╛рд░ рдХрд╛ рдЕрд░реНрде рд╣реИ рдХрд┐ рдЖрдкрдХреЛ fn foo<T>(self, t: T) -> impl Bar; рдЬреИрд╕реА рдХрд┐рд╕реА рдЪреАрдЬрд╝ рдХреЗ рд╕рд╛рде рднреА GAT рдХреА рд╕рдорд╛рди рдЖрд╡рд╢реНрдпрдХрддрд╛ рдорд┐рд▓рддреА рд╣реИред

@ Nemo157 рдирд╣реАрдВ, рдХреНрд╖рдорд╛ рдХрд░реЗрдВ рдореИрдВрдиреЗ рдирд╣реАрдВ рдХрд┐рдпрд╛ред рд▓реЗрдХрд┐рди рдЖрдкрдХрд╛ рдЙрджрд╛рд╣рд░рдг рд╕рдорд╕реНрдпрд╛ рдХреЛ рдФрд░ рднреА рдмреЗрд╣рддрд░ рддрд░реАрдХреЗ рд╕реЗ рджрд┐рдЦрд╛рддрд╛ рд╣реИред рдЖрдкрдХреЛ рдзрдиреНрдпрд╡рд╛рдж :)

@alexreg рдореЗрд░рд╛ рдорд╛рдирдирд╛ тАЛтАЛтАЛтАЛрд╣реИ рдХрд┐ рдЬрдм рдЖрдкрдХреЗ рдкрд╛рд╕ fn foo рдЬреИрд╕рд╛ рдХреБрдЫ рд╣реЛрддрд╛ рд╣реИ, рддреЛ GAT рдХреЛ рдПрдХ рдЕрдирд╛рдо рд╕рдВрдмрджреНрдз рдкреНрд░рдХрд╛рд░ рдХреЗ рд▓рд┐рдП рд╕рдХреНрд╖рдо рд╣реЛрдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реЛрддреА рд╣реИ(..) -> impl Bar(рдореЛрдЯреЗ рддреМрд░ рдкрд░ рд╣реЛ рдЬрд╛рддрд╛ рд╣реИ -> Self::AnonBar0)

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

рдЯреНрд░рд╛рдЗрдПрдЬ: https://github.com/rust-lang/rust/pull/53542 рдХреЛ рдорд░реНрдЬ рдХрд░ рджрд┐рдпрд╛ рдЧрдпрд╛ рд╣реИ, рдЗрд╕рд▓рд┐рдП рдореБрдЭреЗ рд▓рдЧрддрд╛ рд╣реИ рдХрд┐ {let,const,static} foo: impl Trait рдХреЗ рдЯрд┐рдХ рдмреЙрдХреНрд╕ рдХреЛ рдЪреЗрдХ рдХрд┐рдпрд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИред

рдХреНрдпрд╛ рдореИрдВ рдХрднреА рд▓рд┐рдЦ рдкрд╛рдКрдВрдЧрд╛:

trait Foo {
    fn GetABar() -> impl Bar;
}

??

рд╢рд╛рдпрдж рдирд╣реАрдВред рд▓реЗрдХрд┐рди рд╕рдм рдХреБрдЫ рддреИрдпрд╛рд░ рдХрд░рдиреЗ рдХреА рдпреЛрдЬрдирд╛рдПрдБ рдЪрд▓ рд░рд╣реА рд╣реИрдВ рддрд╛рдХрд┐ рд╣рдореЗрдВ рдорд┐рд▓ рд╕рдХреЗ

trait Foo {
    type Assoc: Bar;
    fn get_a_bar() -> Assoc;
}

impl Foo for SomeType {
    fn get_a_bar() -> impl Bar {
        SomeThingImplingBar
    }
}

рдЖрдк рдЗрд╕ рд╕реБрд╡рд┐рдзрд╛ рдХреЗ рд╕рд╛рде рд░рд╛рдд рдореЗрдВ рдХреЗ рд░реВрдк рдореЗрдВ рдкреНрд░рдпреЛрдЧ рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ

impl Foo for SomeType {
    existential type Assoc;
    fn get_a_bar() -> Assoc {
        SomeThingImplingBar
    }
}

рдЗрд╕рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рдЕрдзрд┐рдХ рдЬрд╛рдирдХрд╛рд░реА рдкреНрд░рд╛рдкреНрдд рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдПрдХ рдЕрдЪреНрдЫреА рд╢реБрд░реБрдЖрдд рд╣реИ https://github.com/rust-lang/rfcs/pull/2071 (рдФрд░ рдЗрд╕рд╕реЗ рдЬреБрдбрд╝реА рд╣рд░ рдЪреАрдЬ)

@ oli-obk rustc 1.32.0-nightly (00e03ee57 2018-11-22) , рдореБрдЭреЗ impl рдмреНрд▓реЙрдХ рдореЗрдВ рдХрд╛рдо рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП existential type рд▓рд┐рдП рд╡рд┐рд╢реЗрд╖рддрд╛ рд╕реАрдорд╛рдПрдВ рднреА рджреЗрдиреА рд╣реЛрдВрдЧреАред рдХреНрдпрд╛ рдпрд╣ рдЕрдкреЗрдХреНрд╖рд┐рдд рд╣реИ?

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

impl Foo for SomeDebuggableType {
    existential type Assoc: Bar + Debug;
    fn get_a_bar() -> Assoc {
        SomeThingImplingBarAndDebug
    }
}

fn use_debuggable_foo<F>(f: F) where F: Foo, F::Assoc: Debug {
    println!("bar is: {:?}", f.get_a_bar())
}

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

@ Nemo157 рдЖрд╣, рдХреНрд╖рдорд╛ рдХрд░реЗрдВ, рдореЗрд░рд╛ рдорддрд▓рдм рдпрд╣ рд╣реИ рдХрд┐ рд╡рд░реНрддрдорд╛рди рдореЗрдВ рдЖрдк _must_ рдХреА рд╕реАрдорд╛рдПрдБ рд╣реИрдВред рдпрд╣реА рд╣реИ, рдпрд╣ рд╕рдВрдХрд▓рд┐рдд рдирд╣реАрдВ рд╣реЛрдЧрд╛:

impl A for B {
    existential type Assoc;
    // ...
}

рдЬрдмрдХрд┐ рдпрд╣ рд╣реЛрдЧрд╛:

impl A for B {
    existential type Assoc: Debug;
    // ...
}

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

trait Foo {
    type Assoc;
    fn foo() -> Self::Assoc;
}

struct Bar;
impl Foo for Bar {
    existential type Assoc: ;
    fn foo() -> Self::Assoc { Bar }
}

рдпрд╣ рдореЗрд░реЗ рд▓рд┐рдП рдПрдХ рдХрд┐рдирд╛рд░реЗ рдХреЗ рдорд╛рдорд▓реЗ рдХреА рддрд░рд╣ рд▓рдЧрддрд╛ рд╣реИ, рдПрдХ рдмрд╛рдзреНрдп-рдХрдо рдЕрд╕реНрддрд┐рддреНрд╡ рдХреЗ рдкреНрд░рдХрд╛рд░ рдХрд╛ рдорддрд▓рдм рд╣реИ рдХрд┐ рдпрд╣ рдЙрдкрдпреЛрдЧрдХрд░реНрддрд╛рдУрдВ рдХреЛ _no_ рд╕рдВрдЪрд╛рд▓рди рдкреНрд░рджрд╛рди рдХрд░рддрд╛ рд╣реИ (рдСрдЯреЛ-рд▓рдХреНрд╖рдгреЛрдВ рдХреЗ рдЕрд▓рд╛рд╡рд╛), рддреЛ рдЗрд╕рдХрд╛ рдХреНрдпрд╛ рдЙрдкрдпреЛрдЧ рдХрд┐рдпрд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИ?

рдпрд╣ рднреА рдзреНрдпрд╛рди рджреЗрдиреЗ рдпреЛрдЧреНрдп рд╣реИ рдХрд┐ -> impl Trait рд╕рд╛рде рдРрд╕рд╛ рдХрд░рдиреЗ рдХрд╛ рдХреЛрдИ рддрд░реАрдХрд╛ рдирд╣реАрдВ рд╣реИ, -> impl () рдПрдХ рд╕рд┐рдВрдЯреИрдХреНрд╕ рддреНрд░реБрдЯрд┐ рд╣реИ рдФрд░ -> impl рдЕрдкрдиреЗ рдЖрдк рдореЗрдВ error: at least one trait must be specified ; рдпрджрд┐ рдЕрд╕реНрддрд┐рддреНрд╡рдЧрдд рдкреНрд░рдХрд╛рд░ рдХрд╛ рд╕рд┐рдВрдЯреИрдХреНрд╕ type Assoc = impl Debug; рдпрд╛ рд╕рдорд╛рди рд╣реЛ рдЬрд╛рддрд╛ рд╣реИ рддреЛ рдРрд╕рд╛ рд▓рдЧрддрд╛ рд╣реИ рдХрд┐ рд╕рдВрдмрдВрдзрд┐рдд рдкреНрд░рдХрд╛рд░ рдХреЛ рдХрдо рд╕реЗ рдХрдо рдПрдХ рд╡рд┐рд╢реЗрд╖рддрд╛ рдмрд╛рдзреНрдп рдХрд┐рдП рдмрд┐рдирд╛ рдирд┐рд░реНрджрд┐рд╖реНрдЯ рдХрд░рдиреЗ рдХрд╛ рдХреЛрдИ рддрд░реАрдХрд╛ рдирд╣реАрдВ рд╣реЛрдЧрд╛ред

@ Nemo157 рд╣рд╛рдБ, рдореБрдЭреЗ рдХреЗрд╡рд▓ рдЗрд╕рд▓рд┐рдП рдПрд╣рд╕рд╛рд╕ рд╣реБрдЖ рдХреНрдпреЛрдВрдХрд┐ рдореИрдВрдиреЗ рдЖрдкрдХреЗ рджреНрд╡рд╛рд░рд╛ рдКрдкрд░ рд╕реБрдЭрд╛рдП рдЧрдП рдХреЛрдб рдХрд╛ рд╢рд╛рдмреНрджрд┐рдХ рд░реВрдк рд╕реЗ рдкреНрд░рдпрд╛рд╕ рдХрд┐рдпрд╛ рдерд╛, рдФрд░ рдпрд╣ рдХрд╛рдо рдирд╣реАрдВ рдХрд┐рдпрд╛: p рдореБрдЭреЗ рд▓рдЧрддрд╛ рд╣реИ рдХрд┐ рдпрд╣ рд╡рд┐рд╢реЗрд╖рддрд╛ рд╕реЗ рд╕реАрдорд╛ рдХрд╛ рдЕрдиреБрдорд╛рди рд▓рдЧрд╛рдПрдЧрд╛ред рдЙрджрд╛рд╣рд░рдг рдХреЗ рд▓рд┐рдП:

trait Foo {
    type Assoc: Future<Output = u32>;
}

struct Bar;
impl Foo for Bar {
    existential type Assoc;
}

рджреВрд╕рд░реА рдмрд╛рд░ Future<Output = u32> рдирд┐рд░реНрджрд┐рд╖реНрдЯ рдирд╣реАрдВ рдХрд░рдирд╛ рдЙрдЪрд┐рдд рдкреНрд░рддреАрдд рд╣реЛрддрд╛ рд╣реИ, рд▓реЗрдХрд┐рди рдпрд╣ рдХрд╛рдо рдирд╣реАрдВ рдХрд░рддрд╛ рд╣реИред рдореБрдЭреЗ рд▓рдЧрддрд╛ рд╣реИ рдХрд┐ existential type Assoc: ; (рдЬреЛ рд╕реБрдкрд░ рдЕрдЬреАрдм рд╕рд┐рдВрдЯреИрдХреНрд╕ рдХреА рддрд░рд╣ рднреА рд▓рдЧрддрд╛ рд╣реИ) рдЙрд╕ рдЕрдиреБрдорд╛рди рдХреЛ рднреА рдирд╣реАрдВ рдХрд░реЗрдЧрд╛?

trait Foo {
    type Assoc;
    fn foo() -> Self::Assoc;
}

struct Bar;
impl Foo for Bar {
    existential type Assoc: ;
    fn foo() -> Self::Assoc { Bar }
}

рдпрд╣ рдореЗрд░реЗ рд▓рд┐рдП рдПрдХ рдХрд┐рдирд╛рд░реЗ рдХреЗ рдорд╛рдорд▓реЗ рдХреА рддрд░рд╣ рд▓рдЧрддрд╛ рд╣реИ, рдПрдХ рдмрд╛рдзреНрдп-рдХрдо рдЕрд╕реНрддрд┐рддреНрд╡ рдХреЗ рдкреНрд░рдХрд╛рд░ рдХрд╛ рдорддрд▓рдм рд╣реИ рдХрд┐ рдпрд╣ рдЙрдкрдпреЛрдЧрдХрд░реНрддрд╛рдУрдВ рдХреЛ _no_ рд╕рдВрдЪрд╛рд▓рди рдкреНрд░рджрд╛рди рдХрд░рддрд╛ рд╣реИ (рдСрдЯреЛ-рд▓рдХреНрд╖рдгреЛрдВ рдХреЗ рдЕрд▓рд╛рд╡рд╛), рддреЛ рдЗрд╕рдХрд╛ рдХреНрдпрд╛ рдЙрдкрдпреЛрдЧ рдХрд┐рдпрд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИ?

рдХреНрдпрд╛ рдЗрдирдХрд╛ рдЙрдкрдпреЛрдЧ рд╕рдорд╛рди рд╡рд┐рд╢реЗрд╖рддрд╛ рдХрд╛рд░реНрдпрд╛рдиреНрд╡рдпрди рдореЗрдВ рдЙрдкрднреЛрдЧ рдХреЗ рд▓рд┐рдП рдирд╣реАрдВ рдХрд┐рдпрд╛ рдЬрд╛ рд╕рдХрддрд╛ рдерд╛? рдХреБрдЫ рдЗрд╕ рддрд░рд╣:

trait Foo {
    type Assoc;
    fn create_constructor() -> Self::Assoc;
    fn consume(marker: Self::Assoc) -> Self;
    fn consume_box(marker: Self::Assoc) -> Box<Foo>;
}

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

trait MarkupSystem {
    type Cache;
    fn create_cache() -> Cache;
    fn translate(cache: &mut Self::Cache, input: &str) -> String;
}

рдЗрди рджреЛрдиреЛрдВ рд╣реА рдорд╛рдорд▓реЛрдВ рдореЗрдВ existential type Assoc; рдЙрдкрдпреЛрдЧреА рд╣реЛрдЧрд╛ред

рдЕрдВрддрд░реНрдирд┐рд╣рд┐рдд рд╡рд┐рд╢реЗрд╖рддрд╛ рдХреЗ рд▓рд┐рдП рд╕рдВрдмрджреНрдз рдкреНрд░рдХрд╛рд░реЛрдВ рдХреЛ рдкрд░рд┐рднрд╛рд╖рд┐рдд рдХрд░рдиреЗ рдХрд╛ рдЙрдЪрд┐рдд рддрд░реАрдХрд╛ рдХреНрдпрд╛ рд╣реИ?

рдЙрджрд╛рд╣рд░рдг рдХреЗ рд▓рд┐рдП, рдпрджрд┐ рдореЗрд░реЗ рдкрд╛рд╕ Action рд╡рд┐рд╢реЗрд╖рддрд╛ рд╣реИ рдФрд░ рдореИрдВ рдпрд╣ рд╕реБрдирд┐рд╢реНрдЪрд┐рдд рдХрд░рдирд╛ рдЪрд╛рд╣рддрд╛ рд╣реВрдВ рдХрд┐ рд╡рд┐рд╢реЗрд╖рддрд╛ рдХреЗ рд╕рдВрдмрдВрдзрд┐рдд рдкреНрд░рдХрд╛рд░ рдХрд╛ рдХрд╛рд░реНрдпрд╛рдиреНрд╡рдпрди рднреЗрдЬрдиреЗ рдпреЛрдЧреНрдп рд╣реИ, рддреЛ рдХреНрдпрд╛ рдореИрдВ рдРрд╕рд╛ рдХреБрдЫ рдХрд░ рд╕рдХрддрд╛ рд╣реВрдВ:

pub trait Action {
    type Result;
    fn call(&self) -> Self::Result;
}

impl MyStruct {
    pub fn new(name: String) -> impl Action 
    where 
        Return::Result: Send //This Return should be the `impl Action`
    {
        ActionImplementation::new()
    }
}

рдХреНрдпрд╛ рдРрд╕рд╛ рдХреБрдЫ рд╡рд░реНрддрдорд╛рди рдореЗрдВ рд╕рдВрднрд╡ рдирд╣реАрдВ рд╣реИ?

@acyclozebra рдореБрдЭреЗ рд▓рдЧрддрд╛ рд╣реИ рдХрд┐ рдЗрд╕рдХреЗ рд▓рд┐рдП рд╡рд╛рдХреНрдпрд╡рд┐рдиреНрдпрд╛рд╕ -> impl Action<Result = impl Send> - рдпрд╣ рд╡рд╣реА рд╡рд╛рдХреНрдпрд╡рд┐рдиреНрдпрд╛рд╕ рд╣реИ, рдЙрджрд╛рд╣рд░рдг рдХреЗ рд▓рд┐рдП, -> impl Iterator<Item = u32> рд╕рд┐рд░реНрдл рдПрдХ рдФрд░ рдЕрдЬреНрдЮрд╛рдд impl Trait рдкреНрд░рдХрд╛рд░ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░ред

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

struct Iter<'a> {
    inner: std::collections::hash_map::Iter<'a, i32, i32>,
}

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

рд╣рд╛рд▓рд╛рдВрдХрд┐ рдЖрдИрдЖрдИрдЖрд░рд╕реА, рдореБрдЭреЗ рдирд╣реАрдВ рд▓рдЧрддрд╛ рдХрд┐ рдЗрд╕ рд╕рдордп impl Trait рд╕рд╛рде рдХрдИ рд╕реАрдорд╛рдПрдВ рдирд┐рд░реНрджрд┐рд╖реНрдЯ рдХрд░рдиреЗ рдХрд╛ рдХреЛрдИ рддрд░реАрдХрд╛ рд╣реИ, рдЗрд╕рд▓рд┐рдП рдореИрдВ Clone рдЬреИрд╕реА рдХреБрдЫ рдЙрдкрдпреЛрдЧреА рдЪреАрдЬреЗрдВ рдЦреЛ

@AGausmann рдЗрд╕ рд╡рд┐рд╖рдп рдкрд░ рдирд╡реАрдирддрдо рдЪрд░реНрдЪрд╛ https://github.com/rust-lang/rfcs/pull/2515 рдореЗрдВ рд╣реИред рдпрд╣ рдЖрдкрдХреЛ type Foo = impl Bar; struct Baz { field: Foo } ... рдХрд╣рдиреЗ рдХреА рдЕрдиреБрдорддрд┐ рджреЗрдЧрд╛ред рдореБрдЭреЗ рд▓рдЧрддрд╛ рд╣реИ рдХрд┐ рд╣рдо рд╡рд┐рдЪрд╛рд░ рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ field: impl Trait рд╕реНрдерд┐рд░ рдХреЗ рдмрд╛рдж рдЙрд╕ рдХреЗ рд▓рд┐рдП рдЪреАрдиреА рдХреЗ рд░реВрдк рдореЗрдВ type Foo = impl Bar; ред рдпрд╣ рдПрдХ рдЙрдЪрд┐рдд рдореИрдХреНрд░реЛ-рдлреНрд░реЗрдВрдбрд▓реА рд╕реБрд╡рд┐рдзрд╛-рд╡рд┐рд╕реНрддрд╛рд░ рдХреА рддрд░рд╣ рдорд╣рд╕реВрд╕ рдХрд░рддрд╛ рд╣реИред

@рд╕реЗрдВрдЯреНрд░рд┐рд▓ ,

рдореБрдЭреЗ рд▓рдЧрддрд╛ рд╣реИ рдХрд┐ рд╣рдо рдЪреАрдиреА рдХреЗ рд░реВрдк рдореЗрдВ field: impl Trait рдкрд░ рд╡рд┐рдЪрд╛рд░ рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ

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

рдпрд╣ рдЗрд╕рдХрд╛ рдЕрдиреБрдорд╛рди рд▓рдЧрд╛ рд╕рдХрддрд╛ рд╣реИ, рд▓реЗрдХрд┐рди рдпрджрд┐ рдЖрдкрдХреЗ рдкрд╛рд╕ рдПрдХрд╛рдзрд┐рдХ рдХрд╛рд░реНрдп рд╣реИрдВ рддреЛ рдпрд╣ рдкрддрд╛ рд▓рдЧрд╛рдирд╛ рдЗрддрдирд╛ рдЖрд╕рд╛рди рдирд╣реАрдВ рд╣реЛрдЧрд╛ рдХрд┐ рдпрд╣ рдХреМрди рд╕рд╛ рд╣реИ

рдЖрдк рдореВрд▓ рдкреНрд░рдХрд╛рд░ рдХреЗ рдЙрдкрдпреЛрдЧ рдХреЛ рдкрд░рд┐рднрд╛рд╖рд┐рдд рдХрд░рдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рдХреЛ рдкреВрд░рд╛ рдХрд░реЗрдВрдЧреЗред рдпрд╣ рддрдм рдЙрд╕реА рдореЙрдбреНрдпреВрд▓ рдореЗрдВ рд╡реЗ рд╕рднреА рдХрд╛рд░реНрдп рд╣реЛрдВрдЧреЗ рдЬреЛ рдореВрд▓ рдкреНрд░рдХрд╛рд░ рд▓реМрдЯрд╛рддреЗ рд╣реИрдВред рдореБрдЭреЗ рдпрд╣ рд╕рдм рдЦреЛрдЬрдирд╛ рдЗрддрдирд╛ рдХрдард┐рди рдирд╣реАрдВ рд▓рдЧрддрд╛ред рдореБрдЭреЗ рд▓рдЧрддрд╛ рд╣реИ рдХрд┐ рд╣рд╛рд▓рд╛рдВрдХрд┐ рд╣рдо рд╡рд┐рд╕реНрддрд╛рд░ рдХреЗ рд╕рд╛рде рдЖрдЧреЗ рдмрдврд╝рдиреЗ рд╕реЗ рдкрд╣рд▓реЗ рдХрд╣рд╛рдиреА рдХреЛ type Foo = impl Bar; рдкрд░ рд╡реНрдпрд╡рд╕реНрдерд┐рдд рдХрд░рдирд╛ рдЪрд╛рд╣рддреЗ рд╣реИрдВред

рдореБрдЭреЗ рд▓рдЧрддрд╛ рд╣реИ рдХрд┐ рдореБрдЭреЗ рд╡рд░реНрддрдорд╛рди existential type рдХрд╛рд░реНрдпрд╛рдиреНрд╡рдпрди рдореЗрдВ рдПрдХ рдмрдЧ рдорд┐рд▓рд╛ред


рдХреЛрдб

trait Collection {
    type Element;
}
impl<T> Collection for Vec<T> {
    type Element = T;
}

existential type Existential<T>: Collection<Element = T>;

fn return_existential<I>(iter: I) -> Existential<I::Item>
where
    I: IntoIterator,
    I::Item: Collection,
{
    let item = iter.into_iter().next().unwrap();
    vec![item]
}


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

error: type parameter `I` is part of concrete type but not used in parameter list for existential type
  --> src/lib.rs:16:1
   |
16 | / {
17 | |     let item = iter.into_iter().next().unwrap();
18 | |     vec![item]
19 | | }
   | |_^

error: defining existential type use does not fully define existential type
  --> src/lib.rs:12:1
   |
12 | / fn return_existential<I>(iter: I) -> Existential<I::Item>
13 | | where
14 | |     I: IntoIterator,
15 | |     I::Item: Collection,
...  |
18 | |     vec![item]
19 | | }
   | |_^

error: could not find defining uses
  --> src/lib.rs:10:1
   |
10 | existential type Existential<T>: Collection<Element = T>;
   | ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^

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

рдЖрдк рдЗрд╕реЗ рд╕реНрдЯреИрдХ рдУрд╡рд░рдлреНрд▓реЛ рдкрд░ рднреА рдкрд╛ рд╕рдХрддреЗ рд╣реИрдВред

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

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

fn return_existential<I, J>(iter: I) -> Existential<J>
where
    I: IntoIterator<Item = J>,
{
    let item = iter.into_iter().next().unwrap();
    vec![item]
}

рдзрдиреНрдпрд╡рд╛рдж!
рд╣рд╛рдБ, рдореИрдВрдиреЗ рд╕реНрдЯреИрдХ рдУрд╡рд░рдлреНрд▓реЛ рдкреЛрд╕реНрдЯ рдкрд░ рдкреЛрд╕реНрдЯ рдХреЗ рд░реВрдк рдореЗрдВ рдпрд╣реА рдХрд┐рдпрд╛ рд╣реИ:

fn return_existential<I, T>(iter: I) -> Existential<T>
where
    I: IntoIterator<Item = T>,
    I::Item: Collection,
{
    let item = iter.into_iter().next().unwrap();
    vec![item]
}

рдХреНрдпрд╛ рд╡рд┐рд╢реЗрд╖рддрд╛ рдХреЗ рд╕рдВрджрд░реНрдн рдореЗрдВ impl Trait рдЙрдкрд▓рдмреНрдз рд╣реЛрдиреЗ рдХреА рдХреЛрдИ рдпреЛрдЬрдирд╛ рд╣реИ?
рди рдХреЗрд╡рд▓ рд╕рдВрдмрджреНрдз рдкреНрд░рдХрд╛рд░ рдХреЗ рд░реВрдк рдореЗрдВ, рдмрд▓реНрдХрд┐ рд╡рд┐рдзрд┐рдпреЛрдВ рдореЗрдВ рд╡рд╛рдкрд╕реА рдореВрд▓реНрдп рдХреЗ рд░реВрдк рдореЗрдВ рднреАред

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

@cramertj рд╡рд╛рдХреНрдпрд╡рд┐рдиреНрдпрд╛рд╕ рд▓рдЧрднрдЧ рд╣рд▓ рд╣реЛ рдЧрдпрд╛ рд╣реИред рдореЗрд░рд╛ рдорд╛рдирдирд╛ тАЛтАЛрд╣реИ рдХрд┐ рдореБрдЦреНрдп рдЕрд╡рд░реЛрдзрдХ рдЕрдм GAT рд╣реИред

@alexreg : https://github.com/rust-lang/rfcs/pull/2515 рдЕрднреА рднреА @withboats рдкрд░ рдкреНрд░рддреАрдХреНрд╖рд╛ рдХрд░ рд░рд╣рд╛ рд╣реИред

@varkor рд╣рд╛рдБ, рдореИрдВ рдЖрд╢рд╛рд╡рд╛рджреА рд╣реВрдВ рдХрд┐ рд╡реЗ рдЬрд▓реНрдж рд╣реА рдЙрд╕ рдЖрд░рдПрдлрд╕реА рдХреЗ рд╕рд╛рде рдкреНрд░рдХрд╛рд╢ рджреЗрдЦреЗрдВрдЧреЗред ;-)

рдХреНрдпрд╛ рдирд┐рдореНрдирд▓рд┐рдЦрд┐рдд рдЬреИрд╕рд╛ рдХреБрдЫ рд╕рдВрднрд╡ рд╣реЛрдЧрд╛?

#![feature(existential_type)]

trait MyTrait {}

existential type Interface: MyTrait;

struct MyStruct {}
impl MyTrait for MyStruct {}

fn with<F, U>(cb: F) -> U
where
    F: FnOnce(&mut Interface) -> U
{
    let mut s = MyStruct {};
    cb(&mut s)
}

рдЖрдк рдЗрд╕реЗ рдЕрднреА рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ, рд╣рд╛рд▓рд╛рдВрдХрд┐ рдХреЗрд╡рд▓ hint рдлрд╝рдВрдХреНрд╢рди рдХреЗ рд╕рд╛рде Interface рдХреЗ рдареЛрд╕ рдкреНрд░рдХрд╛рд░ рдХреЛ рдирд┐рд░реНрджрд┐рд╖реНрдЯ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП

#![feature(existential_type)]

trait MyTrait {}

existential type Interface: MyTrait;

struct MyStruct {}
impl MyTrait for MyStruct {}

fn with<F, U>(cb: F) -> U
where
    F: FnOnce(&mut Interface) -> U
{

    fn hint(x: &mut MyStruct) -> &mut Interface { x }

    let mut s = MyStruct {};
    cb(hint(&mut s))
}

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

@CryZe рдЬреЛ рдЖрдк рдЦреЛрдЬ рд░рд╣реЗ рд╣реИрдВ рд╡рд╣ impl Trait рд╕реЗ рдЕрд╕рдВрдмрдВрдзрд┐рдд рд╣реИред рдореИрдВ рдЗрд╕рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рдЬреЛ рдХреБрдЫ рднреА рдЬрд╛рдирддрд╛ рд╣реВрдВ, рдЙрд╕рдХреЗ рд▓рд┐рдП https://github.com/rust-lang/rfcs/issues/2413 рджреЗрдЦреЗрдВред

рдпрд╣ рд╕рдВрднрд╛рд╡рд┐рдд рд░реВрдк рд╕реЗ рдРрд╕рд╛ рдХреБрдЫ рджрд┐рдЦрд╛рдИ рджреЗрдЧрд╛:

trait MyTrait {}

struct MyStruct {}
impl MyTrait for MyStruct {}

fn with<F, U>(cb: F) -> U
where
    F: for<I: Interface> FnOnce(&mut I) -> U
{
    let mut s = MyStruct {};
    cb(hint(&mut s))
}

@ рдХреГрд╖реНрдгрд╛рд╕рдирд╕реА рдЖрд╣, рджрд┐рд▓рдЪрд╕реНрдкред рдзрдиреНрдпрд╡рд╛рдж!

рдХреНрдпрд╛ рдпрд╣ рдХрд╛рдо рдХрд░рдирд╛ рдЪрд╛рд╣рд┐рдП?

#![feature(existential_type)]

trait MyTrait {
    type AssocType: Send;
    fn ret(&self) -> Self::AssocType;
}

impl MyTrait for () {
    existential type AssocType: Send;
    fn ret(&self) -> Self::AssocType {
        ()
    }
}

impl<'a> MyTrait for &'a () {
    existential type AssocType: Send;
    fn ret(&self) -> Self::AssocType {
        ()
    }
}

trait MyLifetimeTrait<'a> {
    type AssocType: Send + 'a;
    fn ret(&self) -> Self::AssocType;
}

impl<'a> MyLifetimeTrait<'a> for &'a () {
    existential type AssocType: Send + 'a;
    fn ret(&self) -> Self::AssocType {
        *self
    }
}

рдХреНрдпрд╛ рд╣рдореЗрдВ existential рдХреАрд╡рд░реНрдб рдХреЛ existential_type рдлреАрдЪрд░ рдХреЗ рд▓рд┐рдП рднрд╛рд╖рд╛ рдореЗрдВ рд░рдЦрдирд╛ рд╣реЛрдЧрд╛?

@рдЬреЗрдереНрд░реЛрдЧрдм рд╣рд╛рдВред рддрдереНрдп рдпрд╣ рд╣реИ рдХрд┐ рдпрд╣ рд╡рд░реНрддрдорд╛рди рдореЗрдВ рдПрдХ рдмрдЧ рдирд╣реАрдВ рд╣реИред

@cramertj рдареАрдХ рд╣реИред рдХреНрдпрд╛ рдореБрдЭреЗ рдЗрд╕рдХреЗ рд▓рд┐рдП рдПрдХ рдЕрд▓рдЧ рдореБрджреНрджрд╛ рджрд░реНрдЬ рдХрд░рдирд╛ рдЪрд╛рд╣рд┐рдП рдпрд╛ рдореЗрд░реА рдкреЛрд╕реНрдЯ рдпрд╣рд╛рдБ рдкрд░реНрдпрд╛рдкреНрдд рд╣реИ?

рдореБрджреНрджрд╛ рджрд░реНрдЬ рдХрд░рдирд╛ рдмрд╣реБрдд рдЕрдЪреНрдЫрд╛ рд╣реЛрдЧрд╛, рдзрдиреНрдпрд╡рд╛рдж! :)

рдХреНрдпрд╛ рд╣рдореЗрдВ existential рдХреАрд╡рд░реНрдб рдХреЛ existential_type рдлреАрдЪрд░ рдХреЗ рд▓рд┐рдП рднрд╛рд╖рд╛ рдореЗрдВ рд░рдЦрдирд╛ рд╣реЛрдЧрд╛?

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

рд╣рд╛рд▓рд╛рдВрдХрд┐ рд╢рд╛рдпрдж рдХреЛрдИ рд╕реНрдкрд╖реНрдЯ рдХрд░ рд╕рдХрддрд╛ рд╣реИред

рдЗрд╕реЗ рдореЗрдЯрд╛-рдЗрд╢реНрдпреВ рдХреЗ рдкрдХреНрд╖ рдореЗрдВ рдмрдВрдж рдХрд░рдирд╛ рдЬреЛ рдЖрдорддреМрд░ рдкрд░ impl Trait рдЕрдзрд┐рдХ рдЯреНрд░реИрдХ рдХрд░рддрд╛ рд╣реИ: https://github.com/rust-lang/rust/issues/63066

рдЗрдореНрдкреНрд▓рд╛рдВрдЯ рдЯреНрд░реЗрдЯ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдиреЗ рдХреЗ рддрд░реАрдХреЗ рдкрд░ рдХрд╣реАрдВ рднреА рдПрдХ рднреА рдЕрдЪреНрдЫрд╛ рдЙрджрд╛рд╣рд░рдг рдирд╣реАрдВ рд╣реИ, рдмрд╣реБрдд рджреБрдЦ рдХреА рдмрд╛рдд рд╣реИ

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

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

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

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

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

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

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