Rust: рдкрддрд╛ рд▓рдЧрд╛рдПрдВ рдХрд┐ "рдЕрдкреНрд░рддрд┐рдмрдВрдзрд┐рдд рдкреНрд░рдХрд╛рд░ рдкреИрд░рд╛рдореАрдЯрд░" рдПрдХ рдПрдлрдПрди рдХреЙрд▓ рдХреЛ рд╕реНрдкрд╖реНрдЯ рд░реВрдк рд╕реЗ рдкреНрд░рджрд╛рди рдХрд┐рдпрд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИ

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

https://github.com/rust-lang/rust/pull/39361 рдкрд░ рдирд┐рд░реНрдорд╛рдг, рд╣рдо рдЗрд╕ рдкрд░ рд╡рд┐рдЪрд╛рд░ рдХрд░рдирд╛ рдЪрд╛рд╣реЗрдВрдЧреЗ рдХрд┐ рдЙрдкрдпреЛрдЧрдХрд░реНрддрд╛рдУрдВ рдХреЛ fn рдХреЙрд▓ рдореЗрдВ рд╕реНрдкрд╖реНрдЯ рдкреНрд░рдХрд╛рд░ рдкреИрд░рд╛рдореАрдЯрд░ рдХрдм рдЬреЛрдбрд╝рдирд╛ рдЪрд╛рд╣рд┐рдПред рдореИрдВ рдЗрд╕ рддрд░рд╣ рдПрдХ рдЙрджрд╛рд╣рд░рдг рдХреА рдХрд▓реНрдкрдирд╛ рдХрд░ рд░рд╣рд╛ рд╣реВрдБ:

fn foo<T>() { }

fn main() {
    foo();
}

рдпрд╣ рд╕реБрдЭрд╛рд╡ рджреЗрдирд╛ рдЕрдЪреНрдЫрд╛ рд╣реЛрдЧрд╛ рдХрд┐ рдЙрдкрдпреЛрдЧрдХрд░реНрддрд╛ рдХреБрдЫ рд╕реНрдкрд╖реНрдЯ T рдХреЗ рд▓рд┐рдП foo::<T> рд▓рд┐рдЦреЗрдВред рдЗрд╕рдХреЗ рд▓рд┐рдП рдереЛрдбрд╝рд╛ рд╡рд┐рдЪрд╛рд░ рдХрд░рдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реЛрдЧреА:

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

рдПрдХ рдЙрджрд╛рд╣рд░рдг:

fn foo<T>() -> Option<T> { }

fn main() {
    let x = foo();
}

рдХреНрдпрд╛ рд╣рдореЗрдВ x: Option<T> рдпрд╛ foo::<T> рд▓реЗрдмрд▓ рдХрд░рдиреЗ рдХрд╛ рд╕реБрдЭрд╛рд╡ рджреЗрдирд╛ рдЪрд╛рд╣рд┐рдП? рдпрд╣ рдорд╛рдорд▓рд╛ рд╕реАрдорд╛ рд░реЗрдЦрд╛ рд╣реИ, рд▓реЗрдХрд┐рди рдпрджрд┐ рдЖрдк Option рдХреЛ рдХреБрдЫ рдФрд░ рдЬрдЯрд┐рд▓ рдкреНрд░рдХрд╛рд░ рд╕реЗ рдмрджрд▓рддреЗ рд╣реИрдВ рддреЛ рдпрд╣ рд╢реЗрд╖ рд░рд╛рд╢рд┐ рдХреЛ рдФрд░ рдЭреБрдХрд╛ рджреЗрддрд╛ рд╣реИред

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

fn foo<T, U>() -> T { }

fn main() {
    let x: i32 = foo();
}

рдпрд╣рд╛рдВ рд╣рдо T рдЬрд╛рдирддреЗ рд╣реИрдВ, рд▓реЗрдХрд┐рди U рдирд╣реАрдВред рдХреНрдпрд╛ рд╣рдореЗрдВ foo::<_, XXX> рдХрд╛ рд╕реБрдЭрд╛рд╡ рджреЗрдирд╛ рдЪрд╛рд╣рд┐рдП? рд╣рдо рдЙрдкрдпреЛрдЧрдХрд░реНрддрд╛ рдХреЛ рдпрд╣ рдмрддрд╛рдиреЗ рдХреЗ рд▓рд┐рдП XXX рдХреИрд╕реЗ рд╡рд╛рдХреНрдпрд╛рдВрд╢ рджреЗрддреЗ рд╣реИрдВ рдХрд┐ рдпрд╣ рд╡рд╣ рдЪреАрдЬ рд╣реИ рдЬрд┐рд╕реЗ рдЙрдиреНрд╣реЗрдВ рдкреНрд░рджрд╛рди рдХрд░рдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реИ?

cc @cengizIO -- рдкреАрдЫрд╛ рдХрд░рдиреЗ рдореЗрдВ рджрд┐рд▓рдЪрд╕реНрдк рд╣реИ?

cc @estebank @jonathandturner -- рд╡рд╛рдХреНрдпрд╛рдВрд╢ рдХреИрд╕реЗ рдХрд░реЗрдВ, рдЗрд╕ рдкрд░ рд╡рд┐рдЪрд╛рд░?

A-diagnostics C-enhancement E-needs-mentor T-compiler WG-compiler-errors

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

рдореМрдЬреВрджрд╛ рдЙрддреНрдкрд╛рджрди:

error[E0282]: type annotations needed
  --> $DIR/xxx.rs:xx:xx
   |
14 |     let x: i32 = foo();
   |                  ^^^ cannot infer type for `U`
   |
   = note: type annotations or generic parameter binding required

рдХреБрдЫ рд╡рд┐рдХрд▓реНрдк:

error[E0282]: type annotations needed
  --> $DIR/xxx.rs:xx:xx
   |
14 |     let x: i32 = foo();
   |                  ^^^ cannot infer type for `U`
   |
   = note: type annotations or generic parameter binding required
   = note: generic parameter `U` needs to be specified for foo::<T, U>()
error[E0282]: type annotations needed
  --> $DIR/xxx.rs:xx:xx
   |
14 |     let x: i32 = foo();
   |                  ^^^ cannot infer type for `U`
   |                  |
   |                  you can specify the generic parameter here using `foo::<_, U>()`
   |
   = note: generic parameter `U` needs to be specified for `fn foo::<T, U>() -> T`
error[E0282]: type annotations needed
  --> $DIR/xxx.rs:xx:xx
   |
14 |     let x: i32 = foo();
   |                  ^^^ cannot infer type for `U` in `fn foo<T, U>() -> T`
   |                  |
   |                  specify `U` using `foo::<_, U>()`
   |

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

рд╣реИрд▓реЛ @nikomatsakis

рдореИрдВ рдЗрд╕ рдкрд░ рдХрд╛рдо рдХрд░реВрдВрдЧрд╛ред

рдПрдХ рдмрд╛рд░ рдлрд┐рд░ рдзрдиреНрдпрд╡рд╛рдж!

рдореМрдЬреВрджрд╛ рдЙрддреНрдкрд╛рджрди:

error[E0282]: type annotations needed
  --> $DIR/xxx.rs:xx:xx
   |
14 |     let x: i32 = foo();
   |                  ^^^ cannot infer type for `U`
   |
   = note: type annotations or generic parameter binding required

рдХреБрдЫ рд╡рд┐рдХрд▓реНрдк:

error[E0282]: type annotations needed
  --> $DIR/xxx.rs:xx:xx
   |
14 |     let x: i32 = foo();
   |                  ^^^ cannot infer type for `U`
   |
   = note: type annotations or generic parameter binding required
   = note: generic parameter `U` needs to be specified for foo::<T, U>()
error[E0282]: type annotations needed
  --> $DIR/xxx.rs:xx:xx
   |
14 |     let x: i32 = foo();
   |                  ^^^ cannot infer type for `U`
   |                  |
   |                  you can specify the generic parameter here using `foo::<_, U>()`
   |
   = note: generic parameter `U` needs to be specified for `fn foo::<T, U>() -> T`
error[E0282]: type annotations needed
  --> $DIR/xxx.rs:xx:xx
   |
14 |     let x: i32 = foo();
   |                  ^^^ cannot infer type for `U` in `fn foo<T, U>() -> T`
   |                  |
   |                  specify `U` using `foo::<_, U>()`
   |

рдпрд╣ рдиреЛрдЯ рд╡рд┐рд╢реЗрд╖ рд░реВрдк рд╕реЗ рдореЗрд░реА рдЖрдБрдЦреЛрдВ рдХреЛ рдЪрдордХрд╛ рджреЗрддрд╛ рд╣реИ:

   = note: type annotations or generic parameter binding required

рдЖрдЗрдП рдирд┐рд╢реНрдЪрд┐рдд рд░реВрдк рд╕реЗ рдЗрд╕реЗ рд╣рдЯрд╛ рджреЗрдВред :)

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

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

lambda-fairy picture lambda-fairy  ┬╖  3рдЯрд┐рдкреНрдкрдгрд┐рдпрд╛рдБ

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

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

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

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