Rust: `!` рдХреЛ рдПрдХ рдкреНрд░рдХрд╛рд░ рдХреЗ рдкреНрд░рдЪрд╛рд░ рдХреЗ рд▓рд┐рдП рдЯреНрд░реИрдХрд┐рдВрдЧ рд╕рдорд╕реНрдпрд╛ (рдЖрд░рдПрдлрд╕реА 1216)

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

рд░рд╕реНрдЯ-рд▓реИрдВрдЧ/rfcs#1216 рдХреЗ рд▓рд┐рдП рдЯреНрд░реИрдХрд┐рдВрдЧ рд╕рдорд╕реНрдпрд╛, рдЬреЛ рдПрдХ рдкреНрд░рдХрд╛рд░ рдХреЗ рд▓рд┐рдП ! рдХреЛ рдмрдврд╝рд╛рд╡рд╛ рджреЗрддреА рд╣реИред

рд╣рд▓ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рд▓рдВрдмрд┐рдд рдореБрджреНрджреЗ

  • [ ] рдлреЙрд▓рдмреИрдХ рд╕реЗ () рддрдХ рдкреНрд░рддрд┐рдЧрдорди https://github.com/rust-lang/rust/issues/67225
  • [ ] рдбрд╛рдпрд╡рд░реНрдЬрд┐рдВрдЧ рдПрдХреНрд╕рдкреНрд░реЗрд╢рди рдХреЗ рдлреЙрд▓рдмреИрдХ рдХреЛ рдХреИрд╕реЗ рд╣реИрдВрдбрд▓ рдХрд░реЗрдВ https://github.com/rust-lang/rust/issues/65992

рджрд┐рд▓рдЪрд╕реНрдк рдШрдЯрдирд╛рдПрдБ рдФрд░ рд▓рд┐рдВрдХ

A-typesystem B-RFC-approved B-unstable C-tracking-issue F-never_type Libs-Tracked T-lang T-libs finished-final-comment-period

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

@petrochenkov ! рднреВрд▓ рдЬрд╛рдУ рдФрд░ рдмрд╕ рдПрдирдо рдХреЛ рджреЗрдЦреЛред

рдЕрдЧрд░ рдореЗрд░реЗ рдкрд╛рд╕ рджреЛ рдкреНрд░рдХрд╛рд░реЛрдВ рдХреЗ рд╕рд╛рде рдПрдХ рдПрдирдо рд╣реИ рддреЛ рдореИрдВ рдЙрд╕ рдкрд░ рджреЛ рдорд╛рдорд▓реЛрдВ рд╕реЗ рдореЗрд▓ рдЦрд╛ рд╕рдХрддрд╛ рд╣реВрдВ:

enum Foo {
    Flim,
    Flam,
}

let foo: Foo = ...;
match foo {
    Foo::Flim => ...,
    Foo::Flam => ...,
}

рдпрд╣ рдХрд┐рд╕реА рднреА n рдХреЗ рд▓рд┐рдП рдХрд╛рдо рдХрд░рддрд╛ рд╣реИ, рд╕рд┐рд░реНрдл рджреЛ рдХреЗ рд▓рд┐рдП рдирд╣реАрдВред рдЗрд╕рд▓рд┐рдП рдпрджрд┐ рдореЗрд░реЗ рдкрд╛рд╕ рд╢реВрдиреНрдп рд╡реЗрд░рд┐рдПрдВрдЯ рд╡рд╛рд▓рд╛ рдПрдирдо рд╣реИ рддреЛ рдореИрдВ рдЙрд╕ рдкрд░ рд╢реВрдиреНрдп рдорд╛рдорд▓реЛрдВ рдХреЗ рд╕рд╛рде рдореЗрд▓ рдХрд░ рд╕рдХрддрд╛ рд╣реВрдВред

enum Void {
}

let void: Void = ...;
match void {
}

рдЕрдм рддрдХ рд╕рдм рдареАрдХ рд╣реИред рд▓реЗрдХрд┐рди рджреЗрдЦреЛ рдХреНрдпрд╛ рд╣реЛрддрд╛ рд╣реИ рд╣рдо рдиреЗрд╕реНрдЯреЗрдб рдкреИрдЯрд░реНрди рдкрд░ рдорд┐рд▓рд╛рди рдХрд░рдиреЗ рдХрд╛ рдкреНрд░рдпрд╛рд╕ рдХрд░рддреЗ рд╣реИрдВред рдпрд╣рд╛рдВ Result рдЕрдВрджрд░ рджреЛ-рд╕рдВрд╕реНрдХрд░рдг рд╡рд╛рд▓реЗ рдПрдирдо рдкрд░ рдорд┐рд▓рд╛рди рдХрд┐рдпрд╛ рдЬрд╛ рд░рд╣рд╛ рд╣реИред

enum Foo {
    Flim,
    Flam,
}

let result_foo: Result<T, Foo> = ...;
match result_foo {
    Ok(t) => ...,
    Err(Flim) => ...,
    Err(Flam) => ...,
}

рд╣рдо рдмрд╛рд╣рд░реА рдкреИрдЯрд░реНрди рдХреЗ рдЕрдВрджрд░ рдЖрдВрддрд░рд┐рдХ рдкреИрдЯрд░реНрди рдХрд╛ рд╡рд┐рд╕реНрддрд╛рд░ рдХрд░ рд╕рдХрддреЗ рд╣реИрдВред рджреЛ Foo рдкреНрд░рдХрд╛рд░ рд╣реИрдВ, рдЗрд╕рд▓рд┐рдП Err рд▓рд┐рдП рджреЛ рдорд╛рдорд▓реЗ рд╣реИрдВред рд╣рдореЗрдВ Result рдФрд░ Foo рдкрд░ рдорд┐рд▓рд╛рди рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдЕрд▓рдЧ-рдЕрд▓рдЧ рдорд┐рд▓рд╛рди рд╡рд┐рд╡рд░рдгреЛрдВ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рдирд╣реАрдВ рд╣реИред рдпрд╣ рдХрд┐рд╕реА рднреА рдкреНрд░рдХрд╛рд░ рдХреЗ рд╡реЗрд░рд┐рдПрдВрдЯ рдХреЗ рд╕рд╛рде рдХрд╛рдо рдХрд░рддрд╛ рд╣реИ... _рд╕рд┐рд╡рд╛рдп рд╢реВрдиреНрдп_ред

enum Void {
}

let result_void: Result<T, Void> = ...;
match result_void {
    Ok(t) => ...,
    // ERROR!
}

рдпрд╣ рдХрд╛рдо рдХреНрдпреЛрдВ рдирд╣реАрдВ рдХрд░рдирд╛ рдЪрд╛рд╣рд┐рдП? рдореИрдВ рдЗрд╕реЗ рдирд┐рд░реНрдЬрди рдкреНрд░рдХрд╛рд░реЛрдВ рдХреЗ рд▓рд┐рдП "рд╡рд┐рд╢реЗрд╖ рд╕рдорд░реНрдерди" рдЬреЛрдбрд╝рдиреЗ рдХреЛ рдареАрдХ рдирд╣реАрдВ рдХрд╣реВрдВрдЧрд╛, рдореИрдВ рдЗрд╕реЗ рдПрдХ рдЕрд╕рдВрдЧрддрд┐ рдХреЛ рдареАрдХ рдХрд░рдирд╛ рдХрд╣реВрдВрдЧрд╛ред

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

рд╣реБрдЬрд╝рд╛рд╣!

рдпрд╣рд╛рдБ рдЗрд╕рдХрд╛ WIP рдХрд╛рд░реНрдпрд╛рдиреНрд╡рдпрди рд╣реИ: https://github.com/canndrew/rust/tree/bang_type_coerced

рдпрд╣ рд╡рд░реНрддрдорд╛рди рд╕реНрдерд┐рддрд┐ рд╣реИ: рдпрд╣ рдкреБрд░рд╛рдиреЗ-рдЯреНрд░рд╛рдВрд╕ рдХреЗ рд╕рд╛рде рдмрдирд╛рддрд╛ рд╣реИ рдФрд░ рдкреНрд░рдпреЛрдЧ рдХрд░рдиреЗ рдпреЛрдЧреНрдп рд╣реИ рд▓реЗрдХрд┐рди рдЗрд╕рдореЗрдВ рдХреБрдЫ рдЕрд╕рдлрд▓ рдкрд░реАрдХреНрд╖рдг рд╣реИрдВред рдХреБрдЫ рдкрд░реАрдХреНрд╖рдг рдПрдХ рдмрдЧ рдХреЗ рдХрд╛рд░рдг рд╡рд┐рдлрд▓ рд╣реЛ рдЬрд╛рддреЗ рд╣реИрдВ рдЬрд┐рд╕рдХреЗ рдХрд╛рд░рдг if (return) {} рдЬреИрд╕реЗ рдХреЛрдб рдЯреНрд░рд╛рдВрд╕ рдХреЗ рджреМрд░рд╛рди рдХреНрд░реИрд╢ рд╣реЛ рдЬрд╛рддреЗ рд╣реИрдВред рдЕрдиреНрдп рдкрд░реАрдХреНрд╖рдг рд▓рд┐рдВрдХ-рдЯрд╛рдЗрдо-рдСрдкреНрдЯрд┐рдорд╛рдЗрдЬрд╝реЗрд╢рди рдХреЗ рд╕рд╛рде рдХрд░рдирд╛ рд╣реИ рдФрд░ рдореЗрд░реЗ рд▓рд┐рдП рд╣рдореЗрд╢рд╛ рдЫреЛрдЯреА рдЧрд╛рдбрд╝реА рд░рд╣реА рд╣реИ, рдЗрд╕рд▓рд┐рдП рдореБрдЭреЗ рдирд╣реАрдВ рдкрддрд╛ рдХрд┐ рдЙрдирдХрд╛ рдореЗрд░реЗ рдкрд░рд┐рд╡рд░реНрддрдиреЛрдВ рд╕реЗ рдХреЛрдИ рд▓реЗрдирд╛-рджреЗрдирд╛ рд╣реИ рдпрд╛ рдирд╣реАрдВред

рдореЗрд░рд╛ рд╡рд░реНрддрдорд╛рди рд░реЛрдбрдореИрдк рд╣реИ:

  • рдЗрд╕реЗ рдПрдордЖрдИрдЖрд░ рдХреЗ рд╕рд╛рде рдХрд╛рдо рдХрд░реЗрдВред рдЙрдореНрдореАрдж рд╣реИ рдХрд┐ рдпрд╣ рдмрд╣реБрдд рдХрдард┐рди рдирд╣реАрдВ рд╣реЛрдЧрд╛ рдХреНрдпреЛрдВрдХрд┐ рдЗрд╕ рддрд░рд╣ рдореИрдВрдиреЗ рдЗрд╕реЗ рдХрд╛рд░реНрдпрд╛рдиреНрд╡рд┐рдд рдХрд░рдирд╛ рд╢реБрд░реВ рдХрд░ рджрд┐рдпрд╛ рд╣реИ, рд▓реЗрдХрд┐рди рдореБрдЭреЗ рдПрдХ рд╕рдорд╕реНрдпрд╛ рд╣реИ рдЬрд╣рд╛рдВ рдПрдордЖрдИрдЖрд░ рд╕рдВрдХрд▓рди рдХреЗ рджреМрд░рд╛рди рд╕реЗрдЧрдлреЙрд▓реНрдЯ рдмрдирд╛рддрд╛ рд╣реИред
  • рд╕рдВрдХрд▓рдХ рд╕реЗ рдЕрдкреНрд░рдЪрд▓рд┐рдд рд╡рд┐рдЪрд▓рди рд╕рд╛рдордЧреНрд░реА рдХреЛ рд╢реБрджреНрдз рдХрд░реЗрдВ ( FnOutput , FnDiverging рдФрд░ рд╕рдВрдмрдВрдзрд┐рдд)ред
  • рдлреАрдЪрд░ рдЧреЗрдЯ рдХреЗ рдкреАрдЫреЗ рдирдП рдкреНрд░рдХрд╛рд░ рдХреЛ рдЫрд┐рдкрд╛рдПрдВред рдЗрд╕рдХрд╛ рдорддрд▓рдм рд╣реЛрдЧрд╛, рдЬрдм рд╕реБрд╡рд┐рдзрд╛ рдЕрдХреНрд╖рдо рд╣реЛ:

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

    • рдбрд╛рдЗрд╡рд░реНрдЬрд┐рдВрдЧ рдЯрд╛рдЗрдк рд╡реЗрд░рд┐рдПрдмрд▓ рдбрд┐рдлрд╝реЙрд▓реНрдЯ рд░реВрдк рд╕реЗ () ред

  • рдпрд╣ рдкрддрд╛ рд▓рдЧрд╛рдПрдВ рдХрд┐ рдЬрдм рдХрд┐рд╕реА рд╡рд┐рд╢реЗрд╖рддрд╛ рдХреЛ рд╣рд▓ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдбрд┐рдлрд╝реЙрд▓реНрдЯ () рдЙрдкрдпреЛрдЧ рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИ рддреЛ рд╣рдо рд╕рдВрдЧрддрддрд╛ рдЪреЗрддрд╛рд╡рдирд┐рдпрд╛рдВ рдХреИрд╕реЗ рдмрдврд╝рд╛ рд╕рдХрддреЗ рд╣реИрдВред рдРрд╕рд╛ рдХрд░рдиреЗ рдХрд╛ рдПрдХ рддрд░реАрдХрд╛ DefaultedUnit рдирд╛рдордХ рдПрдПрд╕рдЯреА рдореЗрдВ рдПрдХ рдирдпрд╛ рдкреНрд░рдХрд╛рд░ рдЬреЛрдбрд╝рдирд╛ рд╣реЛ рд╕рдХрддрд╛ рд╣реИред рдпрд╣ рдкреНрд░рдХрд╛рд░ () рдЬреИрд╕рд╛ рд╡реНрдпрд╡рд╣рд╛рд░ рдХрд░рддрд╛ рд╣реИ рдФрд░ рдХреБрдЫ рдкрд░рд┐рд╕реНрдерд┐рддрд┐рдпреЛрдВ рдореЗрдВ () рдореЗрдВ рдмрджрд▓ рдЬрд╛рдПрдЧрд╛, рд▓реЗрдХрд┐рди рдЬрдм рдпрд╣ рдПрдХ рд╡рд┐рд╢реЗрд╖рддрд╛ рдХреЛ рд╣рд▓ рдХрд░рддрд╛ рд╣реИ рддреЛ рдЪреЗрддрд╛рд╡рдиреА рджреЗрддрд╛ рд╣реИ (рдЬреИрд╕реЗ () )ред рдЗрд╕ рджреГрд╖реНрдЯрд┐рдХреЛрдг рдХреЗ рд╕рд╛рде рд╕рдорд╕реНрдпрд╛ рдпрд╣ рд╣реИ рдХрд┐ рдореБрдЭреЗ рд▓рдЧрддрд╛ рд╣реИ рдХрд┐ рдХрд╛рд░реНрдпрд╛рдиреНрд╡рдпрди рдХреЗ рд╕рд╛рде рд╕рднреА рдмрдЧреЛрдВ рдХреЛ рдкрдХрдбрд╝рдирд╛ рдФрд░ рдареАрдХ рдХрд░рдирд╛ рдореБрд╢реНрдХрд┐рд▓ рд╣реЛрдЧрд╛ - рд╣рдо рд▓реЛрдЧреЛрдВ рдХреЗ рдХреЛрдб рдХреЛ рддреЛрдбрд╝рдиреЗ рд╕реЗ рдмрдЪрд╛рдиреЗ рдХреЗ рд▓рд┐рдП рд▓реЛрдЧреЛрдВ рдХреЗ рдХреЛрдб рдХреЛ рддреЛрдбрд╝ рджреЗрдВрдЧреЗред

рдХреНрдпрд╛ рдЗрд╕ рд╕реВрдЪреА рдореЗрдВ рдХреБрдЫ рдЬреЛрдбрд╝рдиреЗ рдХреА рдЬрд░реВрд░рдд рд╣реИ? рдХреНрдпрд╛ рдпрд╣ рд╕рд┐рд░реНрдл рдореИрдВ рд╣реА рдЗрд╕ рдкрд░ рдХрд╛рдо рдХрд░рдиреЗ рд╡рд╛рд▓рд╛ рд╣реВрдВ? рдФрд░ рдХреНрдпрд╛ рдЗрд╕ рд╢рд╛рдЦрд╛ рдХреЛ рдореБрдЦреНрдп рднрдВрдбрд╛рд░ рдореЗрдВ рд▓реЗ рдЬрд╛рдпрд╛ рдЬрд╛рдирд╛ рдЪрд╛рд╣рд┐рдП?

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

@eddyb , @ arielb1 , @anyone_else : рдЗрд╕ рджреГрд╖реНрдЯрд┐рдХреЛрдг рдкрд░ рд╡рд┐рдЪрд╛рд░? рдореИрдВ рдЗрд╕ рд╕реНрддрд░ рддрдХ рдХрд╛рдлреА рдКрдкрд░ рд╣реВрдВ (рдХреБрдЫ рдЕрд╕рдлрд▓ рдкрд░реАрдХреНрд╖рдгреЛрдВ рдХреЗ рдмрд┐рдирд╛ рдЬреЛ рдореИрдВ (рдмрд╣реБрдд рдзреАрд░реЗ-рдзреАрд░реЗ) рдареАрдХ рдХрд░рдиреЗ рдХреА рдХреЛрд╢рд┐рд╢ рдХрд░ рд░рд╣рд╛ рд╣реВрдВ)ред

рд╣рдореЗрдВ рдХрд┐рди рд▓рдХреНрд╖рдгреЛрдВ рдХреЛ рд▓рд╛рдЧреВ рдХрд░рдирд╛ рдЪрд╛рд╣рд┐рдП !? рдкреНрд░рд╛рд░рдВрднрд┐рдХ рдкреАрдЖрд░ #35162 рдореЗрдВ рдСрд░реНрдб рдФрд░ рдХреБрдЫ рдЕрдиреНрдп рд╢рд╛рдорд┐рд▓ рд╣реИрдВред

рдХреНрдпрд╛ ! рд╕реНрд╡рдЪрд╛рд▓рд┐рдд рд░реВрдк рд╕реЗ _all_ рд▓рдХреНрд╖рдг рд▓рд╛рдЧреВ рдирд╣реАрдВ рдХрд░рдирд╛ рдЪрд╛рд╣рд┐рдП?

рдЗрд╕ рдкреНрд░рдХрд╛рд░ рдХрд╛ рдХреЛрдб рдХрд╛рдлреА рд╕рд╛рдорд╛рдиреНрдп рд╣реИ:

trait Baz { ... }

trait Foo {
    type Bar: Baz;

    fn do_something(&self) -> Self::Bar;
}

рдореБрдЭреЗ рдЙрдореНрдореАрдж рд╣реИ рдХрд┐ ! Foo::Bar рд▓рд┐рдП рдкреНрд░рдпреЛрдЧ рдХрд░рдиреЗ рдпреЛрдЧреНрдп рд╣реЛрдЧрд╛ рддрд╛рдХрд┐ рдпрд╣ рдЗрдВрдЧрд┐рдд рдХрд┐рдпрд╛ рдЬрд╛ рд╕рдХреЗ рдХрд┐ Bar рд╡рд╛рд╕реНрддрд╡ рдореЗрдВ рдХрднреА рдореМрдЬреВрдж рдирд╣реАрдВ рд╣реЛ рд╕рдХрддрд╛ рд╣реИ:

impl Foo for MyStruct {
    type Bar = !;
    fn do_something(&self) -> ! { panic!() }
}

рд▓реЗрдХрд┐рди рдпрд╣ рддрднреА рд╕рдВрднрд╡ рд╣реИ рдЬрдм ! рд╕рднреА рд▓рдХреНрд╖рдгреЛрдВ рдХреЛ рд▓рд╛рдЧреВ рдХрд░реЗред

@tomaka рдЗрд╕рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ RFC рд╣реИ: https://github.com/rust-lang/rfcs/pull/1637

рд╕рдорд╕реНрдпрд╛ рдпрд╣ рд╣реИ рдХрд┐ рдпрджрд┐ ! Trait рд▓рд╛рдЧреВ рдХрд░рддрд╛ рд╣реИ рддреЛ рдЙрд╕реЗ !Trait рднреА рд▓рд╛рдЧреВ рдХрд░рдирд╛ рдЪрд╛рд╣рд┐рдП ...

рд╕рдорд╕реНрдпрд╛ рдпрд╣ рд╣реИ рдХрд┐ рдЕрдЧрд░! рдЧреБрдг рдХреЛ рд▓рд╛рдЧреВ рдХрд░рддрд╛ рд╣реИ рдЙрд╕реЗ рднреА рд▓рд╛рдЧреВ рдХрд░рдирд╛ рдЪрд╛рд╣рд┐рдП !рд╡рд┐рд╢реЗрд╖рддрд╛...

рдлрд┐рд░ рд╡рд┐рд╢реЗрд╖-рдорд╛рдорд▓рд╛ ! рддрд╛рдХрд┐ рдпрд╣ рдХрд┐рд╕реА рднреА рд╡рд┐рд╢реЗрд╖рддрд╛ рдЖрд╡рд╢реНрдпрдХрддрд╛ рдХреЛ рдЕрдирджреЗрдЦрд╛ рдХрд░ рджреЗ?

@tomaka ! _all_ рд▓рдХреНрд╖рдгреЛрдВ рдХреЛ рд╕реНрд╡рдЪрд╛рд▓рд┐рдд рд░реВрдк рд╕реЗ рд▓рд╛рдЧреВ рдирд╣реАрдВ рдХрд░ рд╕рдХрддрд╛ рдХреНрдпреЛрдВрдХрд┐ рд▓рдХреНрд╖рдгреЛрдВ рдореЗрдВ рд╕реНрдерд┐рд░ рддрд░реАрдХреЗ рдФрд░ рд╕рдВрдмрдВрдзрд┐рдд рдкреНрд░рдХрд╛рд░/рд╕реНрдерд┐рд░ рд╣реЛ рд╕рдХрддреЗ рд╣реИрдВред рдпрд╣ рд╕реНрд╡рдЪрд╛рд▓рд┐рдд рд░реВрдк рд╕реЗ рдЙрди рд▓рдХреНрд╖рдгреЛрдВ рдХреЛ рд▓рд╛рдЧреВ рдХрд░ рд╕рдХрддрд╛ рд╣реИ рдЬрд┐рдирдореЗрдВ рдХреЗрд╡рд▓ рдЧреИрд░-рд╕реНрдереИрддрд┐рдХ рд╡рд┐рдзрд┐рдпрд╛рдВ рд╣реИрдВ (рдпрд╛рдиреА рд╡рд┐рдзрд┐рдпрд╛рдВ рдЬреЛ Self рд▓реЗрддреА рд╣реИрдВ)ред

!Trait , рдХрд┐рд╕реА рдиреЗ рд╕реБрдЭрд╛рд╡ рджрд┐рдпрд╛ рдХрд┐ ! Trait _and_ !Trait рджреЛрдиреЛрдВ рдХреЛ рд╕реНрд╡рддрдГ рдХрд╛рд░реНрдпрд╛рдиреНрд╡рд┐рдд рдХрд░ рд╕рдХрддрд╛ рд╣реИред рдореБрдЭреЗ рдпрдХреАрди рдирд╣реАрдВ рд╣реИ рдХрд┐ рдпрд╣ рдзреНрд╡рдирд┐ рд╣реИ, рд▓реЗрдХрд┐рди рдореБрдЭреЗ рд╕рдВрджреЗрд╣ рд╣реИ рдХрд┐ рдирдХрд╛рд░рд╛рддреНрдордХ рд▓рдХреНрд╖рдг рдмрд┐рд▓реНрдХреБрд▓ рднреА рдзреНрд╡рдирд┐ рдирд╣реАрдВ рд╣реИрдВред

рд▓реЗрдХрд┐рди рд╣рд╛рдБ, рдпрд╣ рдЕрдЪреНрдЫрд╛ рд╣реЛ рд╕рдХрддрд╛ рд╣реИ рдпрджрд┐ ! рдЙрджрд╛рд╣рд░рдг рдореЗрдВ Baz рдХреЛ рд╕реНрд╡рддрдГ рдХрд╛рд░реНрдпрд╛рдиреНрд╡рд┐рдд рдХрд░ рд╕рдХрддрд╛ рд╣реИ рдЬреЛ рдЖрдкрдиреЗ рдЗрд╕ рдкреНрд░рдХрд╛рд░ рдХреЗ рдорд╛рдорд▓реЛрдВ рдХреЗ рд▓рд┐рдП рджрд┐рдпрд╛ рдерд╛ред

рдЬрдм рд╣рдо рд╡рд╛рд╕реНрддрд╡ рдореЗрдВ () / ! рд▓рд┐рдП рдбрд╛рдпрд╡рд░реНрдЬрд┐рдВрдЧ рдЯрд╛рдЗрдк рд╡реИрд░рд┐рдПрдмрд▓ рдХреЛ рдбрд┐рдлреЙрд▓реНрдЯ рдХрд░рддреЗ рд╣реИрдВ рдФрд░ рд╣рдо рдкрд░реНрдпрд╛рдкреНрдд рдкреНрд░рдХрд╛рд░ рдХреА рдЬрд╛рдирдХрд╛рд░реА рдХрд╛ рдЕрдиреБрдорд╛рди рд▓рдЧрд╛рдиреЗ рдореЗрдВ рд╕рдХреНрд╖рдо рдирд╣реАрдВ рд╣реЛрдиреЗ рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рдПрдХ рддреНрд░реБрдЯрд┐ рдХрдм рдлреЗрдВрдХрддреЗ рд╣реИрдВ? рдХреНрдпрд╛ рдпрд╣ рдХрд╣реАрдВ рдирд┐рд░реНрджрд┐рд╖реНрдЯ рд╣реИ? рдореИрдВ рдирд┐рдореНрдирд▓рд┐рдЦрд┐рдд рдХреЛрдб рд╕рдВрдХрд▓рд┐рдд рдХрд░рдиреЗ рдореЗрдВ рд╕рдХреНрд╖рдо рд╣реЛрдирд╛ рдЪрд╛рд╣рддрд╛ рд╣реВрдВ:

let Ok(x) = Ok("hello");

рд▓реЗрдХрд┐рди рдореБрдЭреЗ рдорд┐рд▓рдиреЗ рд╡рд╛рд▓реА рдкрд╣рд▓реА рддреНрд░реБрдЯрд┐ " unable to infer enough type information about _ " рд╣реИред рдЗрд╕ рдорд╛рдорд▓реЗ рдореЗрдВ рдореБрдЭреЗ рд▓рдЧрддрд╛ рд╣реИ рдХрд┐ рдпрд╣ _ рд▓рд┐рдП рдбрд┐рдлрд╝реЙрд▓реНрдЯ рд░реВрдк рд╕реЗ ! рд▓рд┐рдП рд╕рдордЭ рдореЗрдВ рдЖрддрд╛ рд╣реИред рд╣рд╛рд▓рд╛рдБрдХрд┐ рдЬрдм рдореИрдВ рдбрд┐рдлрд╝реЙрд▓реНрдЯ рд╡реНрдпрд╡рд╣рд╛рд░ рдХреЗ рдЖрд╕рдкрд╛рд╕ рдкрд░реАрдХреНрд╖рдг рд▓рд┐рдЦ рд░рд╣рд╛ рдерд╛ рддреЛ рдореБрдЭреЗ рдПрдХ рдкреНрд░рдХрд╛рд░ рдХрд╛ рдЪрд░ рдбрд┐рдлрд╝реЙрд▓реНрдЯ рдмрдирд╛рдирд╛ рдЖрд╢реНрдЪрд░реНрдпрдЬрдирдХ рд░реВрдк рд╕реЗ рдХрдард┐рди рд▓рдЧрд╛ред рдЗрд╕рд▓рд┐рдП рдпреЗ рдкрд░реАрдХреНрд╖рдг рдЗрддрдиреЗ рдЬрдЯрд┐рд▓ рд╣реИрдВред

рдореИрдВ рд╕реНрдкрд╖реНрдЯ рд░реВрдк рд╕реЗ рдЬрд╛рдирдирд╛ рдЪрд╛рд╣рддрд╛ рд╣реВрдВ рдХрд┐ рд╣рдорд╛рд░реЗ рдкрд╛рд╕ рдпрд╣ рдбрд┐рдлрд╝реЙрд▓реНрдЯ рд╡реНрдпрд╡рд╣рд╛рд░ рдХреНрдпреЛрдВ рд╣реИ рдФрд░ рдЗрд╕реЗ рдХрдм рд▓рд╛рдЧреВ рдХрд┐рдпрд╛ рдЬрд╛рдирд╛ рдЪрд╛рд╣рд┐рдПред

рд▓реЗрдХрд┐рди рдкрд╣рд▓реА рддреНрд░реБрдЯрд┐ рдореБрдЭреЗ рдорд┐рд▓рддреА рд╣реИ "_ рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рдкрд░реНрдпрд╛рдкреНрдд рдкреНрд░рдХрд╛рд░ рдХреА рдЬрд╛рдирдХрд╛рд░реА рдХрд╛ рдЕрдиреБрдорд╛рди рд▓рдЧрд╛рдиреЗ рдореЗрдВ рдЕрд╕рдорд░реНрде"ред рдЗрд╕ рдорд╛рдорд▓реЗ рдореЗрдВ рдореБрдЭреЗ рд▓рдЧрддрд╛ рд╣реИ рдХрд┐ рдпрд╣ _ рдХреЗ рд▓рд┐рдП рдбрд┐рдлрд╝реЙрд▓реНрдЯ рд░реВрдк рд╕реЗ рд╕рдордЭ рдореЗрдВ рдЖрддрд╛ рд╣реИ! рд╣рд╛рд▓рд╛рдБрдХрд┐ рдЬрдм рдореИрдВ рдбрд┐рдлрд╝реЙрд▓реНрдЯ рд╡реНрдпрд╡рд╣рд╛рд░ рдХреЗ рдЖрд╕рдкрд╛рд╕ рдкрд░реАрдХреНрд╖рдг рд▓рд┐рдЦ рд░рд╣рд╛ рдерд╛ рддреЛ рдореБрдЭреЗ рдПрдХ рдкреНрд░рдХрд╛рд░ рдХрд╛ рдЪрд░ рдбрд┐рдлрд╝реЙрд▓реНрдЯ рдмрдирд╛рдирд╛ рдЖрд╢реНрдЪрд░реНрдпрдЬрдирдХ рд░реВрдк рд╕реЗ рдХрдард┐рди рд▓рдЧрд╛ред рдЗрд╕рд▓рд┐рдП рдпреЗ рдкрд░реАрдХреНрд╖рдг рдЗрддрдиреЗ рдЬрдЯрд┐рд▓ рд╣реИрдВред

рдореЗрд░реА рд░рд╛рдп рдореЗрдВ рдпрд╣ рдмрд╣реБрдд рдЕрдЪреНрдЫрд╛ рд╡рд┐рдЪрд╛рд░ рд╣реИред None рд▓рд┐рдП рд╕рдорд╛рди рдЬреЛ рдЙрджрд╛рд╣рд░рдг рдХреЗ рд▓рд┐рдП рдбрд┐рдлрд╝реЙрд▓реНрдЯ рд░реВрдк рд╕реЗ Option<!> ред

@carllerche

unit_fallback рдкрд░реАрдХреНрд╖рдг рдирд┐рд╢реНрдЪрд┐рдд рд░реВрдк рд╕реЗ рдЗрд╕реЗ рдкреНрд░рджрд░реНрд╢рд┐рдд рдХрд░рдиреЗ рдХрд╛ рдПрдХ рдЕрдЬреАрдм рддрд░реАрдХрд╛ рд╣реИред рдПрдХ рдХрдо-рдореИрдХреНрд░реЛ-рдЖрдИ рд╕рдВрд╕реНрдХрд░рдг рд╣реИ

trait Balls: Default {}
impl Balls for () {}

struct Flah;

impl Flah {
    fn flah<T: Balls>(&self) -> T {
        Default::default()
    }
}

fn doit(cond: bool) {
    let _ = if cond {
        Flah.flah()
    } else {
        return
    };
}

fn main() {
    let _ = doit(true);
}

рдХреЗрд╡рд▓ return / break / panic!() рджреНрд╡рд╛рд░рд╛ рдмрдирд╛рдпрд╛ рдЧрдпрд╛ рдкреНрд░рдХрд╛рд░ рдЪрд░ рдХрд┐рд╕реА рднреА рдЪреАрдЬрд╝ рдХреЗ рд▓рд┐рдП рдбрд┐рдлрд╝реЙрд▓реНрдЯ рд╣реИред

рдЬрдм рд╣рдо рд╡рд╛рд╕реНрддрд╡ рдореЗрдВ ()/! рдФрд░ рд╣рдо рдкрд░реНрдпрд╛рдкреНрдд рдкреНрд░рдХрд╛рд░ рдХреА рдЬрд╛рдирдХрд╛рд░реА рдХрд╛ рдЕрдиреБрдорд╛рди рд▓рдЧрд╛рдиреЗ рдореЗрдВ рд╕рдХреНрд╖рдо рдирд╣реАрдВ рд╣реЛрдиреЗ рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рддреНрд░реБрдЯрд┐ рдХрдм рдХрд░рддреЗ рд╣реИрдВ? рдХреНрдпрд╛ рдпрд╣ рдХрд╣реАрдВ рдирд┐рд░реНрджрд┐рд╖реНрдЯ рд╣реИ?

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

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

https://github.com/rust-lang/rust/issues/36011
https://github.com/rust-lang/rust/issues/36038
https://github.com/rust-lang/rust/issues/35940

рд▓рдВрдмрд┐рдд рдореБрджреНрджреЛрдВ рдХреА рд╕реВрдЪреА рдореЗрдВ рдЬреЛрдбрд╝рдиреЗ рдХреЗ рд▓рд┐рдП рдХреБрдЫ рдмрдЧ рд╣реИрдВред

@canndrew рд╡реЗ рдХреБрдЫ рд╣рдж рддрдХ https://github.com/rust-lang/rust/issues/12609 рдХреЗ рд╕рдорд╛рди рджрд┐рдЦрддреЗ рд╣реИрдВ

рд▓рдбрд╝рдХрд╛, рдпрд╣ рдПрдХ рдкреБрд░рд╛рдирд╛ рдмрдЧ рд╣реИ! рд▓реЗрдХрд┐рди рд╣рд╛рдБ, рдореИрдВ рдХрд╣реВрдВрдЧрд╛ рдХрд┐ рдореЗрд░рд╛ # 36038 рдЙрд╕реА рдХрд╛ рдПрдХ рдзреЛрдЦрд╛ рд╣реИ (рдореИрдВрдиреЗ рд╕реЛрдЪрд╛ рдХрд┐ рдореИрдВрдиреЗ рдЗрд╕реЗ рдкрд╣рд▓реЗ рдХрд╣реАрдВ рджреЗрдЦрд╛ рд╣реЛрдЧрд╛)ред рдореБрдЭреЗ рдирд╣реАрдВ рд▓рдЧрддрд╛ рдХрд┐ ! рдХреЛ рд╡рд╛рд╕реНрддрд╡ рдореЗрдВ рдкреНрд░рд╛рдЗрдо рдЯрд╛рдЗрдо рдХреЗ рд▓рд┐рдП рдорд╛рдирд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИ рдЬрдм рддрдХ рдХрд┐ рдпрд╣ рддрдп рди рд╣реЛ рдЬрд╛рдПред

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

#![feature(never_type)]

fn main() {
    let result: Result<_, !> = Ok(1);
    match result {
//        ^^^^^^ pattern `Err(_)` not covered
        Ok(i) => println!("{}", i),
    }
}

@tikue рд╣рд╛рдБ, рдпрд╣ рдКрдкрд░ рд╕реВрдЪреАрдмрджреНрдз рдмрдЧреЛрдВ рдореЗрдВ рд╕реЗ рдПрдХ рд╣реИред

@lрдлреЗрдпрд░реА рд╡реВрдкреНрд╕, рдЗрд╕реЗ рдирд╣реАрдВ рджреЗрдЦрд╛ рдХреНрдпреЛрдВрдХрд┐ рдпрд╣ рд╢реАрд░реНрд╖ рдкрд░ рд╕реНрдерд┐рдд рдЪреЗрдХрдмреЙрдХреНрд╕ рдореЗрдВ рд╕реВрдЪреАрдмрджреНрдз рдирд╣реАрдВ рдерд╛ред рдзрдиреНрдпрд╡рд╛рдж!

рдХреНрдпрд╛ From<!> for T рдФрд░ Add<T> for ! ( ! рдЖрдЙрдЯрдкреБрдЯ рдкреНрд░рдХрд╛рд░ рдХреЗ рд╕рд╛рде) рдХреЛ рд▓рд╛рдЧреВ рдХрд░рдиреЗ рдХреА рдХреЛрдИ рдпреЛрдЬрдирд╛ рд╣реИ? рдореБрдЭреЗ рдкрддрд╛ рд╣реИ рдХрд┐ рдпрд╣ рд╡рд╛рд╕реНрддрд╡ рдореЗрдВ рдЕрдЬреАрдм рддрд░рд╣ рд╕реЗ рд╡рд┐рд╢рд┐рд╖реНрдЯ рдЕрдиреБрд░реЛрдз рд╣реИ-- рдореИрдВ рдЗрд╕ рдкреАрдЖрд░ рдореЗрдВ рджреЛрдиреЛрдВ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдиреЗ рдХреА рдХреЛрд╢рд┐рд╢ рдХрд░ рд░рд╣рд╛ рд╣реВрдВред

From<!> for T рдирд┐рд╢реНрдЪрд┐рдд рд░реВрдк рд╕реЗред Add<T> for ! рд╢рд╛рдпрдж libs рдЯреАрдо рдХреЗ рдирд┐рд░реНрдгрдп рдХреЗ рд▓рд┐рдП рддреИрдпрд╛рд░ рд╣реИ, рд▓реЗрдХрд┐рди рдореБрдЭреЗ рд╡реНрдпрдХреНрддрд┐рдЧрдд рд░реВрдк рд╕реЗ рд▓рдЧрддрд╛ рд╣реИ рдХрд┐ ! рдХреЛ рдкреНрд░рддреНрдпреЗрдХ рд╡рд┐рд╢реЗрд╖рддрд╛ рдХреЛ рд▓рд╛рдЧреВ рдХрд░рдирд╛ рдЪрд╛рд╣рд┐рдП рдЬрд┐рд╕рдХреЗ рд▓рд┐рдП рддрд╛рд░реНрдХрд┐рдХ, рд╡рд┐рд╣рд┐рдд рдХрд╛рд░реНрдпрд╛рдиреНрд╡рдпрди рд╣реИред

@canndrew рдзрдиреНрдпрд╡рд╛рдж! рдореБрдЭреЗ рд╕реНрдХреИрд▓рд╛ рдХреЗ Nothing рд╡рд┐рд╢реЗрд╖рддрд╛ рдХреЗ рд▓рд┐рдП рдЙрдкрдпреЛрдЧ рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИ рдЬреЛ рд╣рд░ рдкреНрд░рдХрд╛рд░ рдХрд╛ рдЙрдк рдкреНрд░рдХрд╛рд░ рд╣реИ, рдФрд░ рдЗрд╕ рдкреНрд░рдХрд╛рд░ рдХрд╣реАрдВ рднреА рдПрдХ рдореВрд▓реНрдп рджрд┐рдЦрд╛рдИ рджреЗ рд╕рдХрддрд╛ рд╣реИред рд╣рд╛рд▓рд╛рдВрдХрд┐, рдореИрдВ рдирд┐рд╢реНрдЪрд┐рдд рд░реВрдк рд╕реЗ рдЙрди рдкреНрд░рднрд╛рд╡реЛрдВ рдХреЛ рд╕рдордЭрдиреЗ рдХреА рдЗрдЪреНрдЫрд╛ рдХреЗ рд╕рд╛рде рд╕рд╣рд╛рдиреБрднреВрддрд┐ рд░рдЦрддрд╛ рд╣реВрдВ рдЬреЛ impl All for ! рдпрд╛ рдЗрд╕реА рддрд░рд╣ рдХреЗ рдЬрдВрдЧ рдХреЗ рдкреНрд░рдХрд╛рд░ рдкреНрд░рдгрд╛рд▓реА рдкрд░ рд╣реЛрдВрдЧреЗ, рд╡рд┐рд╢реЗрд╖ рд░реВрдк рд╕реЗ рдирдХрд╛рд░рд╛рддреНрдордХ рд╡рд┐рд╢реЗрд╖рддрд╛ рд╕реАрдорд╛рдУрдВ рдФрд░ рдЗрд╕реА рддрд░рд╣ рдХреЗ рд╡рд┐рд╖рдп рдореЗрдВред

рдкреНрд░рддрд┐ https://github.com/rust-lang/rfcs/issues/1723#issuecomment -241595070 From<!> for T рдореЗрдВ рд╕реБрд╕рдВрдЧрддрддрд╛ рдХреЗ рдореБрджреНрджреЗ рд╣реИрдВред

рдЖрд╣ рдареАрдХ рд╣реИ, рд╣рд╛рдБред рд╣рдореЗрдВ рдЗрд╕рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рдХреБрдЫ рдХрд░рдиреЗ рдХреА рдЬрд░реВрд░рдд рд╣реИред

рдпрд╣ рдЕрдЪреНрдЫрд╛ рд╣реЛрдЧрд╛ рдпрджрд┐ рд╡рд┐рд╢реЗрд╖рддрд╛ рд╕рдВрдХреЗрдд рд╕реНрдкрд╖реНрдЯ рд░реВрдк рд╕реЗ рдмрддрд╛ рд╕рдХреЗрдВ рдХрд┐ рд╡реЗ рдЕрдиреНрдп рд╡рд┐рд╢реЗрд╖рддрд╛ рдирд┐рд╣рд┐рддрд╛рд░реНрдереЛрдВ рд╕реЗ рдЕрдзрд┐рдХ рд╣реИрдВред рдХреБрдЫ рдЗрд╕ рддрд░рд╣:

impl<T> From<T> for T
    overridden_by<T> From<!> for T
{ ... }

impl<T> From<!> for T { ... }

рдХреНрдпрд╛ рдпрд╣ рд╡рд┐рд╢реЗрд╖рдЬреНрдЮрддрд╛ рдХреЗ рджрд╛рдпрд░реЗ рдореЗрдВ рдирд╣реАрдВ рдЖрддрд╛? рд╕рдВрдкрд╛рджрд┐рдд рдХрд░реЗрдВ: рдореЗрд░рд╛ рдорд╛рдирдирд╛ тАЛтАЛтАЛтАЛрд╣реИ рдХрд┐ рдпрд╣ рдЬрд╛рд▓реА рдХрд╛ рдирд┐рдпрдо рд╣реИред

рдХреНрдпрд╛ рдирд┐рд░реНрдЬрди рдкреНрд░рдХрд╛рд░реЛрдВ рдХреЗ рд▓рд┐рдП рдпрдерд╛рд╕рдВрднрд╡ рд╡рд┐рд╢реЗрд╖ рд╕рд╣рд╛рдпрддрд╛ рд╕реЗ рдмрдЪрдиреЗ рдХреЗ рд▓рд┐рдП рдпрд╣ рдПрдХ рд╡реНрдпрд╡рд╣рд╛рд░реНрдп рд╡рд┐рдХрд▓реНрдк рд╣реИ?

рдпреЗ рд╕рднреА match (res: Res<A, !>) { Ok(a) /* No Err */ } , Result рд▓рд┐рдП рд╡рд┐рд╢реЗрд╖ рддрд░реАрдХреЗ рдмрд╣реБрдд рд╣реА рдХрд╛рд▓реНрдкрдирд┐рдХ рд▓рдЧрддреЗ рд╣реИрдВ, рдЬреИрд╕реЗ рд╕реБрд╡рд┐рдзрд╛рдУрдВ рдХреЗ рд▓рд┐рдП рд╕реБрд╡рд┐рдзрд╛рдПрдБ, рдФрд░ рдкреНрд░рдпрд╛рд╕ рдФрд░ рдЬрдЯрд┐рд▓рддрд╛ рдХреЗ рд▓рд╛рдпрдХ рдирд╣реАрдВ рд▓рдЧрддреЗ рд╣реИрдВред
рдореИрдВ рд╕рдордЭрддрд╛ рд╣реВрдВ рдХрд┐ ! рдПрдХ @canndrew рдХреА рдкрд╛рд▓рддреВ рд╡рд┐рд╢реЗрд╖рддрд╛ рд╣реИ рдФрд░ рд╡рд╣ рдЗрд╕реЗ рдФрд░ рд╡рд┐рдХрд╕рд┐рдд рдХрд░рдирд╛ рдЪрд╛рд╣рддрд╛ рд╣реИ, рд▓реЗрдХрд┐рди рд╣реЛ рд╕рдХрддрд╛ рд╣реИ рдХрд┐ рд╢реБрд░реБрдЖрдд рд╕реЗ рд╣реА рдпрд╣ рдЧрд▓рдд рджрд┐рд╢рд╛ рд╣реЛ рдФрд░ #12609 рдХреЛрдИ рдмрдЧ рднреА рдирд╣реАрдВ рд╣реИ?

@petrochenkov # 12609 рдиреЗрд╡рд░ рдЯрд╛рдЗрдк рдХреЗ рд▓рд┐рдП рдХреЛрдИ рд╡рд┐рд╢реЗрд╖ рд╡рд┐рд╢реЗрд╖рддрд╛ рдирд╣реАрдВ рд╣реИред рдХреБрдЫ рд╕реНрдкрд╖реНрдЯ рд░реВрдк рд╕реЗ рдкрд╣реБрдВрдЪ рдпреЛрдЧреНрдп рдХреЛрдб рдХрд╛ рдкрддрд╛ рд▓рдЧрд╛рдиреЗ рдХреЗ рд▓рд┐рдП рдпрд╣ рд╕рд┐рд░реНрдл рдПрдХ рдмрдЧ рдлрд┐рдХреНрд╕ рд╣реИред

@petrochenkov ! рднреВрд▓ рдЬрд╛рдУ рдФрд░ рдмрд╕ рдПрдирдо рдХреЛ рджреЗрдЦреЛред

рдЕрдЧрд░ рдореЗрд░реЗ рдкрд╛рд╕ рджреЛ рдкреНрд░рдХрд╛рд░реЛрдВ рдХреЗ рд╕рд╛рде рдПрдХ рдПрдирдо рд╣реИ рддреЛ рдореИрдВ рдЙрд╕ рдкрд░ рджреЛ рдорд╛рдорд▓реЛрдВ рд╕реЗ рдореЗрд▓ рдЦрд╛ рд╕рдХрддрд╛ рд╣реВрдВ:

enum Foo {
    Flim,
    Flam,
}

let foo: Foo = ...;
match foo {
    Foo::Flim => ...,
    Foo::Flam => ...,
}

рдпрд╣ рдХрд┐рд╕реА рднреА n рдХреЗ рд▓рд┐рдП рдХрд╛рдо рдХрд░рддрд╛ рд╣реИ, рд╕рд┐рд░реНрдл рджреЛ рдХреЗ рд▓рд┐рдП рдирд╣реАрдВред рдЗрд╕рд▓рд┐рдП рдпрджрд┐ рдореЗрд░реЗ рдкрд╛рд╕ рд╢реВрдиреНрдп рд╡реЗрд░рд┐рдПрдВрдЯ рд╡рд╛рд▓рд╛ рдПрдирдо рд╣реИ рддреЛ рдореИрдВ рдЙрд╕ рдкрд░ рд╢реВрдиреНрдп рдорд╛рдорд▓реЛрдВ рдХреЗ рд╕рд╛рде рдореЗрд▓ рдХрд░ рд╕рдХрддрд╛ рд╣реВрдВред

enum Void {
}

let void: Void = ...;
match void {
}

рдЕрдм рддрдХ рд╕рдм рдареАрдХ рд╣реИред рд▓реЗрдХрд┐рди рджреЗрдЦреЛ рдХреНрдпрд╛ рд╣реЛрддрд╛ рд╣реИ рд╣рдо рдиреЗрд╕реНрдЯреЗрдб рдкреИрдЯрд░реНрди рдкрд░ рдорд┐рд▓рд╛рди рдХрд░рдиреЗ рдХрд╛ рдкреНрд░рдпрд╛рд╕ рдХрд░рддреЗ рд╣реИрдВред рдпрд╣рд╛рдВ Result рдЕрдВрджрд░ рджреЛ-рд╕рдВрд╕реНрдХрд░рдг рд╡рд╛рд▓реЗ рдПрдирдо рдкрд░ рдорд┐рд▓рд╛рди рдХрд┐рдпрд╛ рдЬрд╛ рд░рд╣рд╛ рд╣реИред

enum Foo {
    Flim,
    Flam,
}

let result_foo: Result<T, Foo> = ...;
match result_foo {
    Ok(t) => ...,
    Err(Flim) => ...,
    Err(Flam) => ...,
}

рд╣рдо рдмрд╛рд╣рд░реА рдкреИрдЯрд░реНрди рдХреЗ рдЕрдВрджрд░ рдЖрдВрддрд░рд┐рдХ рдкреИрдЯрд░реНрди рдХрд╛ рд╡рд┐рд╕реНрддрд╛рд░ рдХрд░ рд╕рдХрддреЗ рд╣реИрдВред рджреЛ Foo рдкреНрд░рдХрд╛рд░ рд╣реИрдВ, рдЗрд╕рд▓рд┐рдП Err рд▓рд┐рдП рджреЛ рдорд╛рдорд▓реЗ рд╣реИрдВред рд╣рдореЗрдВ Result рдФрд░ Foo рдкрд░ рдорд┐рд▓рд╛рди рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдЕрд▓рдЧ-рдЕрд▓рдЧ рдорд┐рд▓рд╛рди рд╡рд┐рд╡рд░рдгреЛрдВ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рдирд╣реАрдВ рд╣реИред рдпрд╣ рдХрд┐рд╕реА рднреА рдкреНрд░рдХрд╛рд░ рдХреЗ рд╡реЗрд░рд┐рдПрдВрдЯ рдХреЗ рд╕рд╛рде рдХрд╛рдо рдХрд░рддрд╛ рд╣реИ... _рд╕рд┐рд╡рд╛рдп рд╢реВрдиреНрдп_ред

enum Void {
}

let result_void: Result<T, Void> = ...;
match result_void {
    Ok(t) => ...,
    // ERROR!
}

рдпрд╣ рдХрд╛рдо рдХреНрдпреЛрдВ рдирд╣реАрдВ рдХрд░рдирд╛ рдЪрд╛рд╣рд┐рдП? рдореИрдВ рдЗрд╕реЗ рдирд┐рд░реНрдЬрди рдкреНрд░рдХрд╛рд░реЛрдВ рдХреЗ рд▓рд┐рдП "рд╡рд┐рд╢реЗрд╖ рд╕рдорд░реНрдерди" рдЬреЛрдбрд╝рдиреЗ рдХреЛ рдареАрдХ рдирд╣реАрдВ рдХрд╣реВрдВрдЧрд╛, рдореИрдВ рдЗрд╕реЗ рдПрдХ рдЕрд╕рдВрдЧрддрд┐ рдХреЛ рдареАрдХ рдХрд░рдирд╛ рдХрд╣реВрдВрдЧрд╛ред

@petrochenkov рд╢рд╛рдпрдж рдЖрдк рдЬреЛ рдХрд╣ рд░рд╣реЗ рдереЗ рдЙрд╕реЗ рдЧрд▓рдд рд╕рдордЭрд╛ред #12609 рд╕реВрддреНрд░ рдореЗрдВ рджреЛ рдкреНрд░рд╢реНрдиреЛрдВ рдкрд░ рдЪрд░реНрдЪрд╛ рдХреА рдЧрдИ рд╣реИ:

(0) рдХреНрдпрд╛ рдЗрд╕ рдХреЛрдб рдХреЛ рд╕рдВрдХрд▓рд┐рдд рдХрд░рдиреЗ рдХреА рдЕрдиреБрдорддрд┐ рджреА рдЬрд╛рдиреА рдЪрд╛рд╣рд┐рдП?

let res: Result<u32, !> = ...;
match res {
    Ok(x) => ...,
}

(1) рдХреНрдпрд╛ рдЗрд╕ рдХреЛрдб рдХреЛ рд╕рдВрдХрд▓рд┐рдд рдХрд░рдиреЗ рдХреА рдЕрдиреБрдорддрд┐ рджреА рдЬрд╛рдиреА рдЪрд╛рд╣рд┐рдП?

let res: Result<u32, !> = ...;
match res {
    Ok(x) => ...,
    Err(_) => ...,
}

рдЬреИрд╕рд╛ рдХрд┐ рд╡рд░реНрддрдорд╛рди рдореЗрдВ рд▓рд╛рдЧреВ рдХрд┐рдпрд╛ рдЧрдпрд╛ рд╣реИ, рдЙрддреНрддрд░ рдХреНрд░рдорд╢рдГ "рдирд╣реАрдВ" рдФрд░ "рд╣рд╛рдВ" рд╣реИрдВред #12609 (1) рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рд╡рд┐рд╢реЗрд╖ рд░реВрдк рд╕реЗ рдореБрджреНрджреЗ рдореЗрдВ рд╣реА рдмрд╛рдд рдХрд░рддрд╛ рд╣реИ рд▓реЗрдХрд┐рди рдЬрдм рдореИрдВрдиреЗ рдЬрд╡рд╛рдм рджрд┐рдпрд╛ рддреЛ рдореИрдВ (0) рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рд╕реЛрдЪ рд░рд╣рд╛ рдерд╛ред рдЬрд╣рд╛рдВ рддрдХ тАЛтАЛрдЙрддреНрддрд░ _ should_ рд╣реЛрдирд╛ рдЪрд╛рд╣рд┐рдП, рдореБрдЭреЗ рд▓рдЧрддрд╛ рд╣реИ рдХрд┐ (0) рдирд┐рд╢реНрдЪрд┐рдд рд░реВрдк рд╕реЗ "рд╣рд╛рдВ" рд╣реЛрдирд╛ рдЪрд╛рд╣рд┐рдП, рд▓реЗрдХрд┐рди (1) рдХреЗ рд▓рд┐рдП рдореБрдЭреЗ рднреА рдпрдХреАрди рдирд╣реАрдВ рд╣реИред

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

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

рд╡реИрд╕реЗ, рдореИрдВрдиреЗ рдпрд╣рд╛рдВ (0) рдХреЛ рдЖрдЬрдорд╛рдиреЗ рдФрд░ рдареАрдХ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдПрдХ рдкреАрдЖрд░ рдХрд┐рдпрд╛ рд╣реИ: https://github.com/rust-lang/rust/pull/36476

рдореБрдЭреЗ рдкреВрд░реА рддрд░рд╣ рд╕реЗ рдЦреБрд╢реА рд╣реЛрдЧреА рдЕрдЧрд░ рдпрд╣ рдпреЛрдЬрдирд╛ рд╕рдВрдХрд▓рдХ рдореЗрдВ рдкреИрдЯрд░реНрди рдХреА рдЬрд╛рдБрдЪ рдХреЗ рдХрд╛рд░реНрдпрд╛рдиреНрд╡рдпрди рдкрд░ рд╕реНрд╡рд╛рднрд╛рд╡рд┐рдХ рд░реВрдк рд╕реЗ рдирд┐рд╣рд┐рдд рд╣реИ рдФрд░ рдЬреЛрдбрд╝рдиреЗ рдХреА рддреБрд▓рдирд╛ рдореЗрдВ рдЕрдзрд┐рдХ рд╡рд┐рд╢реЗрд╖ рдХреЛрдб рдХреЛ рд╣рдЯрд╛ рджреЗрддрд╛ рд╣реИред

рдРрд╕рд╛ рдирд╣реАрдВ рд╣реИ, рдЕрдЬреАрдм рддрд░рд╣ рд╕реЗред рд▓реЗрдХрд┐рди рдпрд╣ рд╕рдВрднрд╡рдд: рдЬрд┐рд╕ рддрд░рд╣ рд╕реЗ рдореИрдВрдиреЗ рдЗрд╕реЗ рдореМрдЬреВрджрд╛ рдХреЛрдб рдореЗрдВ рд╣реИрдХ рдХрд┐рдпрд╛ рд╣реИ, рдЙрд╕рдХреЗ рдмрдЬрд╛рдп рдпрд╣ рдПрдХ рд╢рд╛рдирджрд╛рд░ рддрд░реАрдХрд╛ рдирд╣реАрдВ рд╣реИред

рдореБрдЭреЗ рд▓рдЧрддрд╛ рд╣реИ рдХрд┐ рдореИрдХреНрд░реЛрдЬрд╝ рдХреЗ рд▓рд┐рдП рдпрд╣ рдЙрдкрдпреЛрдЧреА рд╣реИ (1) рдПрдХ рдХрдард┐рди рддреНрд░реБрдЯрд┐ рдирд╣реАрдВ рд╣реИред

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

fn a() -> u32 {
    return 4;
    5
}
warning: unreachable expression, #[warn(unreachable_code)] on by default

рдЬрдмрдХрд┐ рд╣рдо рдЗрд╕ рдкрд░ рд╣реИрдВ, рдХреНрдпрд╛ ! рдХреЗ рд╕рд╛рдордиреЗ рдХреБрдЫ рдкреИрдЯрд░реНрди рдХреЛ рдЕрдХрд╛рдЯреНрдп рдмрдирд╛рдиреЗ рдХрд╛ рдХреЛрдИ рдорддрд▓рдм рд╣реИ?

let res: Result<u32, !> = ...;
let Ok(value) = res;

рдореИрдВ рдорд╛рдирддрд╛ рд╣реВрдВ рдХрд┐ рдЧреИрд░-рд╡рд┐рд╕реНрддреГрдд рдорд┐рд▓рд╛рди рдПрдХ рддреНрд░реБрдЯрд┐ рд╣реИ, рд▓реЗрдХрд┐рди рдкрд╣реБрдВрдЪ рдпреЛрдЧреНрдп рдирд╣реАрдВ рд╣реИ рдпрд╛рдиреА рдЕрдирд╛рд╡рд╢реНрдпрдХ рдкреИрдЯрд░реНрди рдХреЗрд╡рд▓ рдПрдХ рдЪреЗрддрд╛рд╡рдиреА рд╕рдордЭ рдореЗрдВ рдЖрддрд╛ рд╣реИред

рдореЗрд░реЗ рдкрд╛рд╕ рдХреБрдЫ рдкреАрдЖрд░ рд╕рдбрд╝рд╛рдВрдз рдЗрдХрдЯреНрдард╛ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдХреБрдЫ рд╕рдордп рдХреЗ рд▓рд┐рдП рдмреИрдареЗ рд╣реИрдВред рдХреНрдпрд╛ рдЗрдирдХреА рд╕рдореАрдХреНрд╖рд╛ рдХрд░рдиреЗ рдореЗрдВ рд╕рд╣рд╛рдпрддрд╛ рдХреЗ рд▓рд┐рдП рдореИрдВ рдХреБрдЫ рдХрд░ рд╕рдХрддрд╛ рд╣реВрдВ? рд╢рд╛рдпрдж рдЙрди рдкрд░ рдХреБрдЫ рдЪрд░реНрдЪрд╛ рд╣реЛрдиреА рдЪрд╛рд╣рд┐рдПред рдореИрдВ #36476, #36449 рдФрд░ #36489 рдХреА рдмрд╛рдд рдХрд░ рд░рд╣рд╛ рд╣реВрдБред

рдореИрдВ рднрд┐рдиреНрди рдкреНрд░рдХрд╛рд░ (рдпрд╛ рдкреНрд░рдХрд╛рд░ рд╕рд┐рджреНрдзрд╛рдВрдд рдореЗрдВ "рдиреАрдЪреЗ" рдкреНрд░рдХрд╛рд░) рд╕реЛрдЪрдиреЗ рдХреЗ рд╡рд┐рдЪрд╛рд░ рдХреЗ рдЦрд┐рд▓рд╛рдл рдЦрд╛рд▓реА enum рдкреНрд░рдХрд╛рд░ (рдпрд╛ рдкреНрд░рдХрд╛рд░ рд╕рд┐рджреНрдзрд╛рдВрдд рдореЗрдВ "рд╢реВрдиреНрдп" рдкреНрд░рдХрд╛рд░) рдХреЗ рд╕рдорд╛рди рд╣реИред рд╡реЗ рдЕрд▓рдЧ-рдЕрд▓рдЧ рдЬреАрд╡ рд╣реИрдВ, рд╣рд╛рд▓рд╛рдВрдХрд┐ рджреЛрдиреЛрдВ рдХрд╛ рдХреЛрдИ рдореВрд▓реНрдп рдпрд╛ рдЙрджрд╛рд╣рд░рдг рдирд╣реАрдВ рд╣реЛ рд╕рдХрддрд╛ рд╣реИред

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

fn(A,B)->!
fn(A,fn(B,C)->!)->!

рд▓реЗрдХрд┐рди рдЖрдкрдХреЛ рдирд╣реАрдВ рдХрд╣рдирд╛ рдЪрд╛рд╣рд┐рдП

let g:! = panic!("whatever");

рдпрд╛

fn(x:!) -> !{
     x
}

рдпрд╛ рдФрд░ рднреА

type ID=fn(!)->!;

рдЪреВрдВрдХрд┐ рдХрд┐рд╕реА рднреА рдЪрд░ рдХрд╛ рдкреНрд░рдХрд╛рд░ ! рдирд╣реАрдВ рд╣реЛрдирд╛ рдЪрд╛рд╣рд┐рдП, рдФрд░ рдЗрд╕рд▓рд┐рдП рдХрд┐рд╕реА рднреА рдЗрдирдкреБрдЯ рдЪрд░ рдХрд╛ рдкреНрд░рдХрд╛рд░ ! рдирд╣реАрдВ рд╣реЛрдирд╛ рдЪрд╛рд╣рд┐рдПред

рдЦрд╛рд▓реА enum рдЗрд╕ рдорд╛рдорд▓реЗ рдореЗрдВ рдЕрд▓рдЧ рд╣реИ, рдЖрдк рдХрд╣ рд╕рдХрддреЗ рд╣реИрдВ

enum Empty {}

impl Empty {
    fn new() -> Empty {
         panic!("empty");
    }
}

рдлрд┐рд░

 match Empty::new() {}

рдХрд╣рдиреЗ рдХрд╛ рддрд╛рддреНрдкрд░реНрдп рдпрд╣ рд╣реИ рдХрд┐, ! рдФрд░ Empty рдмреАрдЪ рдПрдХ рдореВрд▓рднреВрдд рдЕрдВрддрд░ рд╣реИ: рдЖрдк ! рдЯрд╛рдЗрдк рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдХрд┐рд╕реА рднреА рдЪрд░ рдХреА рдШреЛрд╖рдгрд╛ рдирд╣реАрдВ рдХрд░ рд╕рдХрддреЗ, рд▓реЗрдХрд┐рди Empty рд▓рд┐рдП рдРрд╕рд╛ рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ .

@earthengine рджреЛ рдкреНрд░рдХрд╛рд░ рдХреЗ рдирд┐рд░реНрдЬрди рдкреНрд░рдХрд╛рд░реЛрдВ рдХреЗ рдмреАрдЪ (рдореЗрд░реА рдирдЬрд╝рд░ рдореЗрдВ рдкреВрд░реА рддрд░рд╣ рд╕реЗ рдХреГрддреНрд░рд┐рдо) рдЕрдВрддрд░ рдХреЛ рдкреЗрд╢ рдХрд░рдиреЗ рдХрд╛ рдХреНрдпрд╛ рдлрд╛рдпрджрд╛ рд╣реИ?

рдЗрд╕ рддрд░рд╣ рдХреЗ рдЕрдВрддрд░ рдХреЗ рди рд╣реЛрдиреЗ рдХреЗ рдХрдИ рдХрд╛рд░рдг рд╕рд╛рдордиреЗ рдЖрдП рд╣реИрдВ - рдЙрджрд╛рд╣рд░рдг рдХреЗ рд▓рд┐рдП, Result<!, E> рд▓рд┐рдЦрдиреЗ рдореЗрдВ рд╕рдХреНрд╖рдо рд╣реЛрдиреЗ рдХреЗ рдХрд╛рд░рдг, рдпрд╣ рдЕрд▓рдЧ-рдЕрд▓рдЧ рдХрд╛рд░реНрдпреЛрдВ рдХреЗ рд╕рд╛рде рдЕрдЪреНрдЫреА рддрд░рд╣ рд╕реЗ рдмрд╛рддрдЪреАрдд рдХрд░рддрд╛ рд╣реИ, рдЬрдмрдХрд┐ рдЕрднреА рднреА Result рдкрд░ рдореЛрдиреИрдбрд┐рдХ рд╕рдВрдЪрд╛рд▓рди рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдиреЗ рдореЗрдВ рд╕рдХреНрд╖рдо рд╣реИред map рдФрд░ map_err ред

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

рдХрд╣рдиреЗ рдХрд╛ рддрд╛рддреНрдкрд░реНрдп рдпрд╣ рд╣реИ рдХрд┐, ! рдФрд░ Empty рдмреАрдЪ рдПрдХ рдореВрд▓рднреВрдд рдЕрдВрддрд░ рд╣реИ: рдЖрдк ! рдЯрд╛рдЗрдк рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдХрд┐рд╕реА рднреА рд╡реЗрд░рд┐рдПрдмрд▓ рдХреА рдШреЛрд╖рдгрд╛ рдирд╣реАрдВ рдХрд░ рд╕рдХрддреЗ, рд▓реЗрдХрд┐рди Empty рд▓рд┐рдП рдРрд╕рд╛ рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ .

рдпрд╣реА RFC рдареАрдХ рдХрд░ рд░рд╣рд╛ рд╣реИред ! рд╡рд╛рд╕реНрддрд╡ рдореЗрдВ рдПрдХ "рдкреНрд░рдХрд╛рд░" рдирд╣реАрдВ рд╣реИ рдпрджрд┐ рдЖрдк рдЗрд╕реЗ рдПрдХ рдкреНрд░рдХрд╛рд░ рдХреА рддрд░рд╣ рдЙрдкрдпреЛрдЧ рдирд╣реАрдВ рдХрд░ рд╕рдХрддреЗ рд╣реИрдВред

@ рд░рд╛рд▓реНрдлрдЬрдВрдЧ
рд╡реЗ рдЕрд╡рдзрд╛рд░рдгрд╛рдПрдВ рд░реИрдЦрд┐рдХ рддрд░реНрдХ рд╕реЗ рд╣реИрдВ https://en.wikipedia.org/wiki/Linear_logic

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

top рдПрдХ рдореВрд▓реНрдп рд╣реИ рдЬрд┐рд╕рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд┐рд╕реА рднреА рд╕рдВрднрд╛рд╡рд┐рдд рддрд░реАрдХреЗ рд╕реЗ рдХрд┐рдпрд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИ

рд╕рдмрдЯрд╛рдЗрдкрд┐рдВрдЧ рдореЗрдВ рдЗрд╕рдХрд╛ рдХреНрдпрд╛ рдЕрд░реНрде рд╣реИ? рдХрд┐ рдпрд╣ рдХрд┐рд╕реА рднреА рдкреНрд░рдХрд╛рд░ рдХрд╛ рд╣реЛ рд╕рдХрддрд╛ рд╣реИ? рдХреНрдпреЛрдВрдХрд┐ рд╡рд╣ рддрдм bottom ред

@eddyb рдореИрдВрдиреЗ рдХреБрдЫ рдЧрд▓рддрд┐рдпрд╛рдБ рдХреА рд╣реИрдВ, рдХреГрдкрдпрд╛ рдореЗрд░реЗ рдирдП рдЕрдкрдбреЗрдЯ рдХреА рдкреНрд░рддреАрдХреНрд╖рд╛ рдХрд░реЗрдВред

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

рдПрдлрдПрдлрдПрд╕ рджреЛрд╕реНрддреЛрдВ

@canndrew рдЕрд░реНрдШ, рдореБрдЭреЗ рдЗрд╕рдХреЗ рд▓рд┐рдП рдЦреЗрдж рд╣реИред =(рдореИрдВ рдЖрдЬ рднреА рдЖрдкрдХреЗ рдкреАрдЖрд░ рдХреЛ r+' рдХрд░рдиреЗ рдХреА рдпреЛрдЬрдирд╛ рдмрдирд╛ рд░рд╣рд╛ рдерд╛...

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

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

рдПрдХ рдЙрджрд╛рд╣рд░рдг рдФрд░ рд╕рдВрджрд░реНрдн рдмрд┐рдВрджреБ рдХреЗ рд░реВрдк рдореЗрдВ https://is.gd/4EC1Dk рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдирд╛, рдХреНрдпрд╛ рд╣реЛрдЧрд╛ рдпрджрд┐ рд╣рдо рдЙрд╕рд╕реЗ рдЖрдЧреЗ рдирд┐рдХрд▓ рдЧрдП, рдФрд░ред

1) рдХрд┐рд╕реА рднреА рдлрд╝рдВрдХреНрд╢рди рдХрд╛ рдЗрд▓рд╛рдЬ рдХрд░реЗрдВ рдЬреЛ рдШрдмрд░рд╛ рд╕рдХрддрд╛ рд╣реИ рд▓реЗрдХрд┐рди рдХреЛрдИ рддреНрд░реБрдЯрд┐ рдпрд╛ рдкрд░рд┐рдгрд╛рдо рдирд╣реАрдВ рд▓реМрдЯрд╛рддрд╛ рд╣реИ, рдЗрд╕рдХрд╛ рдкреНрд░рдХрд╛рд░ рд╣рд╕реНрддрд╛рдХреНрд╖рд░ -> Foo рд╕реЗ -> Result<Foo,!> 2) any рдкрд░рд┐рдгрд╛рдо рдореЗрдВ рд╕реНрдкрд╖реНрдЯ рд░реВрдк рд╕реЗ рдмрджрд▓ рдЬрд╛рддрд╛ рд╣реИtypes would have their Error types implicitly be converted to рдПрдирдо AnonMyErrWrapper { рдбрд╛рдИ (!), рдПрд░рд░} ```
3) рдЪреВрдВрдХрд┐ ! рд╢реВрдиреНрдп рдЖрдХрд╛рд░ рдХрд╛ рд╡рд┐рдЬреНрдЮрд╛рдкрди рд░рд╣рдиреЗ рдпреЛрдЧреНрдп рдирд╣реАрдВ рд╣реИ, рдкреНрд░рдХрд╛рд░реЛрдВ рдХреЗ рдмреАрдЪ рд░реВрдкрд╛рдВрддрд░рдг рдХреЗ рд▓рд┐рдП рд╢реВрдиреНрдп рд▓рд╛рдЧрдд рд╣реЛрдЧреА, рдФрд░ рдЗрд╕реЗ рдкреАрдЫреЗ рдХреА рдУрд░ рд╕рдВрдЧрдд рдмрдирд╛рдиреЗ рдХреЗ рд▓рд┐рдП рдЕрдВрддрд░реНрдирд┐рд╣рд┐рдд рд░реВрдкрд╛рдВрддрд░рдг рдЬреЛрдбрд╝рд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИред

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

рдореБрдЭреЗ рдПрд╣рд╕рд╛рд╕ рд╣реИ рдХрд┐ рдпрд╣ ... рдПрдХ рд╕рдореБрджрд╛рдп рдХреЗ рджреГрд╖реНрдЯрд┐рдХреЛрдг рд╕реЗ рдЧреИрд░-рддреБрдЪреНрдЫ рд╣реЛрдЧрд╛, рдпрджрд┐ рддрдХрдиреАрдХреА рд░реВрдк рд╕реЗ рдирд╣реАрдВред :)

рд╕рд╛рде рд╣реА, рдпрд╣ рд╕рдВрднрд╡рдд: рд╕рдВрднрд╛рд╡рд┐рдд рднрд╛рд╡реА рдкреНрд░рднрд╛рд╡ рдкреНрд░рдгрд╛рд▓реА рдХреЗ рд╕рд╛рде рдУрд╡рд░рд▓реИрдк рд╣реЛрддрд╛ рд╣реИред

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

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

@nikomatsakis рд▓рдВрдмрд┐рдд рдореБрджреНрджреЛрдВ рдХреЗ рд╕рдВрдмрдВрдз рдореЗрдВ, рдЗрди рджреЛрдиреЛрдВ рдкрд░

  • # 35162 рд╕реЗ рдХреЛрдб рд╕рдлрд╛рдИ, expr_ty рдХреЛ рдХреЙрд▓ рдХрд░рдиреЗ рдХреЗ рдмрдЬрд╛рдп рд░рд┐рдЯрд░реНрди рд╕реНрдерд┐рддрд┐ рдХреЗ рдорд╛рдзреНрдпрдо рд╕реЗ рдЯрд╛рдЗрдкреЗрдХ рдХреЛ рдереНрд░реЗрдб рдкреНрд░рдХрд╛рд░реЛрдВ рдореЗрдВ рдереЛрдбрд╝рд╛ рд╕рд╛ рдкреБрди: рд╡реНрдпрд╡рд╕реНрдерд┐рдд рдХрд░реЗрдВ
  • рдорд╛рдЪрд┐рд╕ рдореЗрдВ рдирд┐рд░реНрдЬрди рдкреНрд░рдХрд╛рд░ рдХреЗ рдЙрдкрдЪрд╛рд░ рдХрд╛ рд╕рдорд╛рдзрд╛рди

рдореИрдВ рдЗрд╕ рдкрд░ рдПрдХ рдФрд░ рджрд░рд╛рд░ рд╢реБрд░реВ рдХрд░рдиреЗ рдЬрд╛ рд░рд╣рд╛ рд╣реВрдБ:

  • () рдкрд░ рднрд░реЛрд╕рд╛ рдХрд░рдиреЗ рд╡рд╛рд▓реЗ рд▓реЛрдЧреЛрдВ рдХреЗ рд▓рд┐рдП рдЪреЗрддрд╛рд╡рдирд┐рдпреЛрдВ рдХреЛ рдХреИрд╕реЗ рд▓рд╛рдЧреВ рдХрд░реЗрдВ: рдЯреНрд░реЗрдЯ рдлреЙрд▓рдмреИрдХ рдЬрд╣рд╛рдВ рднрд╡рд┐рд╖реНрдп рдореЗрдВ рд╡рд╣ рд╡реНрдпрд╡рд╣рд╛рд░ рдмрджрд▓ рд╕рдХрддрд╛ рд╣реИ?

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

@canndrew

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

рдареАрдХ рд╣реИ рдЕрдЪреНрдЫрд╛ рд╣реИ!

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

рдореЗрд░рд╛ рдорддрд▓рдм рд╣реИ рдХрд┐ рдореИрдВ TyTuple рдПрдХ рдмреВрд▓ рдЬреЛрдбрд╝ рд░рд╣рд╛ рд╣реВрдБ

TyTuple(&'tcx Slice<Ty<'tcx>>, bool),

рдЬреЛ рдЗрдВрдЧрд┐рдд рдХрд░рддрд╛ рд╣реИ рдХрд┐ рдпрджрд┐ рд╣рдо рдЗрд╕ рдкрд░ рдХреБрдЫ рд▓рдХреНрд╖рдгреЛрдВ рдХрд╛ рдЪрдпрди рдХрд░рдиреЗ рдХрд╛ рдкреНрд░рдпрд╛рд╕ рдХрд░рддреЗ рд╣реИрдВ рддреЛ рд╣рдореЗрдВ рдЗрд╕ (рдЗрдХрд╛рдИ) рдЯрдкрд▓ рдкрд░ рдЪреЗрддрд╛рд╡рдиреА рджреЗрдиреА рдЪрд╛рд╣рд┐рдПред рдпрд╣ рдПрдХ рдФрд░ TyDefaultedUnit рдЬреЛрдбрд╝рдиреЗ рдХреЗ рдореЗрд░реЗ рдореВрд▓ рджреГрд╖реНрдЯрд┐рдХреЛрдг рд╕реЗ рдЕрдзрд┐рдХ рд╕реБрд░рдХреНрд╖рд┐рдд рд╣реИред

рдЙрдореНрдореАрдж рд╣реИ рдХрд┐ рд╣рдореЗрдВ рдХреЗрд╡рд▓ рдПрдХ рдЪреЗрддрд╛рд╡рдиреА рдЪрдХреНрд░ рдХреЗ рд▓рд┐рдП рдЙрд╕ рдмреВрд▓ рдХреЛ рдЗрдзрд░-рдЙрдзрд░ рд░рдЦрдиреЗ рдХреА рдЬрд░реВрд░рдд рд╣реИред

uninitialized / transmute / MaybeUninitialized рдореБрджреНрджреЗ рдХреЗ рд╕рдВрдмрдВрдз рдореЗрдВ рдореБрдЭреЗ рд▓рдЧрддрд╛ рд╣реИ рдХрд┐ рдХрд╛рд░реНрд░рд╡рд╛рдИ рдХрд╛ рдПрдХ рд╕рдордЭрджрд╛рд░ рддрд░реАрдХрд╛ рд╣реЛрдЧрд╛:

  • рдЬреЛрдбрд╝реЗ MaybeUninitialized рдорд╛рдирдХ рдкреБрд╕реНрддрдХрд╛рд▓рдп рдХреЗ рд▓рд┐рдП, рдХреЗ рддрд╣рдд mem
  • uninitialized рдкрд░ рдПрдХ рдЪреЗрдХ рдЬреЛрдбрд╝реЗрдВ рдХрд┐ рдпрд╣ рдХрд┐рд╕ рдкреНрд░рдХрд╛рд░ рдХрд╛ рд╣реИ, рдЬрд┐рд╕реЗ рдЖрдмрд╛рдж рдорд╛рдирд╛ рдЬрд╛рддрд╛ рд╣реИред рдЪреЗрддрд╛рд╡рдиреА рджреЗрдВ рдЕрдиреНрдпрдерд╛ рдПрдХ рдиреЛрдЯ рдХреЗ рд╕рд╛рде рдпрд╣ рдХрд╣рддреЗ рд╣реБрдП рдХрд┐ рдпрд╣ рднрд╡рд┐рд╖реНрдп рдореЗрдВ рдПрдХ рдХрдард┐рди рддреНрд░реБрдЯрд┐ рд╣реЛрдЧреАред рдЗрд╕рдХреЗ рдмрдЬрд╛рдп MaybeUninitialized рдЙрдкрдпреЛрдЧ рдХрд░рдиреЗ рдХрд╛ рд╕реБрдЭрд╛рд╡ рджреЗрдВред
  • transmute рдкрд░ рдПрдХ рдЪреЗрдХ рдЬреЛрдбрд╝реЗрдВ рдХрд┐ рдпрд╣ "рд╕реЗ" рдкреНрд░рдХрд╛рд░ рдХрд╛ рд╣реИ, рдХреЗрд╡рд▓ рдирд┐рд░реНрдЬрди рд╣реИ рдпрджрд┐ рдпрд╣ "рд╕реЗ" рдкреНрд░рдХрд╛рд░ рднреА рд╣реИред рдЗрд╕реА рддрд░рд╣ рдПрдХ рдЪреЗрддрд╛рд╡рдиреА рдЙрдард╛рдПрдБ рдЬреЛ рдПрдХ рдХрдард┐рди рддреНрд░реБрдЯрд┐ рдмрди рдЬрд╛рдПрдЧреАред

рд╡рд┐рдЪрд╛рд░?

рдердХрд╛рд╡рдЯ рдореЗрдВ рд╣рд╛рд▓ рдХреЗ рдкрд░рд┐рд╡рд░реНрддрдиреЛрдВ рдкрд░ рдпрд╣ рдзрд╛рдЧрд╛ рджреЗрдЦреЗрдВ:

&! рдХреЗ рд╢рдмреНрджрд╛рд░реНрде рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рдХреБрдЫ рдЕрд╕рд╣рдорддрд┐ рдкреНрд░рддреАрдд рд╣реЛрддреА рд╣реИред #39151 рдХреЗ рдмрд╛рдж, never_type рдлреАрдЪрд░ рдЧреЗрдЯ рд╕рдХреНрд╖рдо рд╣реЛрдиреЗ рдХреЗ рд╕рд╛рде рдЗрд╕реЗ рдореИрдЪреЛрдВ рдореЗрдВ рдирд┐рд░реНрдЬрди рдорд╛рдирд╛ рдЬрд╛рддрд╛ рд╣реИред

рдпрджрд┐ ! рд▓рд┐рдП рд╕реНрд╡рдЪрд╛рд▓рд┐рдд рд╡рд┐рд╢реЗрд╖рддрд╛ рдХрд╛ рдЕрд░реНрде рдирд╣реАрдВ рд╣реЛрдЧрд╛, рддреЛ рдХрдо рд╕реЗ рдХрдо std рд╕реЗ рдЙрдкрдпреБрдХреНрдд рд▓рдХреНрд╖рдгреЛрдВ рдХреЛ рд▓рд╛рдЧреВ рдХрд░рдирд╛ рдмрд╣реБрдд рдорджрджрдЧрд╛рд░ рд╣реЛрдЧрд╛ред void::Void рдПрдХ рдмрдбрд╝реА рд╕реАрдорд╛ рдпрд╣ рд╣реИ рдХрд┐ рдпрд╣ std рдмрд╛рд╣рд░ рд░рд╣рддрд╛ рд╣реИ рдФрд░ рдЗрд╕рдХрд╛ рдорддрд▓рдм рд╣реИ рдХрд┐ рдХрдВрдмрд▓ impl<T> From<Void> for T рдЕрд╕рдВрднрд╡ рд╣реИ рдФрд░ рдпрд╣ рддреНрд░реБрдЯрд┐ рдкреНрд░рдмрдВрдзрди рдХреЛ рд╕реАрдорд┐рдд рдХрд░рддрд╛ рд╣реИред

рдореБрдЭреЗ рд▓рдЧрддрд╛ рд╣реИ рдХрд┐ рдХрдо рд╕реЗ рдХрдо From<!> рдХреЛ рд╕рднреА рдкреНрд░рдХрд╛рд░ рдХреЗ рд▓рд┐рдП рд▓рд╛рдЧреВ рдХрд┐рдпрд╛ рдЬрд╛рдирд╛ рдЪрд╛рд╣рд┐рдП рдФрд░ Error , Display рдФрд░ Debug рдХреЛ ! рд▓рд┐рдП рд▓рд╛рдЧреВ рдХрд┐рдпрд╛ рдЬрд╛рдирд╛ рдЪрд╛рд╣рд┐рдПред

рдореБрдЭреЗ рд▓рдЧрддрд╛ рд╣реИ рдХрд┐ рдХрдо рд╕реЗ рдХрдо From<!> рд╕рднреА рдкреНрд░рдХрд╛рд░ рдХреЗ рд▓рд┐рдП рд▓рд╛рдЧреВ рдХрд┐рдпрд╛ рдЬрд╛рдирд╛ рдЪрд╛рд╣рд┐рдП

рдпрд╣ рджреБрд░реНрднрд╛рдЧреНрдп рд╕реЗ From<T> for T impl рдХреЗ рд╕рд╛рде рд╡рд┐рд░реЛрдз рдХрд░рддрд╛ рд╣реИред

рдпрд╣ рджреБрд░реНрднрд╛рдЧреНрдп рд╕реЗ From<T> for T impl рдХреЗ рд╕рд╛рде рд╡рд┐рд░реЛрдз рдХрд░рддрд╛ рд╣реИред

рдХрдо рд╕реЗ рдХрдо рдЬрдм рддрдХ рдЬрд╛рд▓реА рдЗрдореНрдкреНрд▓рд╛рдВрдЯ рд╕реНрдкреЗрд╢рд▓рд╛рдЗрдЬреЗрд╢рди рд▓рд╛рдЧреВ рдирд╣реАрдВ рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИред

рдЕрдЪреНрдЫреЗ рдЕрдВрдХред рдореБрдЭреЗ рдЙрдореНрдореАрдж рд╣реИ рдХрд┐ рдПрдХ рджрд┐рди рдореИрдВ рдЗрд╕реЗ рдкреВрд░рд╛ рд╣реЛрддреЗ рд╣реБрдП рджреЗрдЦреВрдВрдЧрд╛ред

рдХреНрдпрд╛ [T; 0] рдПрдХ [!; 0] &[T] рдЙрдк-рдкреНрд░рдХрд╛рд░ рдФрд░ &[!] ? рдпрд╣ рдореЗрд░реЗ рд▓рд┐рдП рд╕рд╣рдЬ рд▓рдЧрддрд╛ рд╣реИ рдХрд┐ рдЙрддреНрддрд░ "рд╣рд╛рдВ" рд╣реЛрдирд╛ рдЪрд╛рд╣рд┐рдП, рд▓реЗрдХрд┐рди рд╡рд░реНрддрдорд╛рди рдХрд╛рд░реНрдпрд╛рдиреНрд╡рдпрди рдЕрдиреНрдпрдерд╛ рд╕реЛрдЪрддрд╛ рд╣реИред

[!; 0] рдмрд╕рд╛ рд╣реБрдЖ рд╣реИ рдФрд░ рдЗрд╕рд▓рд┐рдП &[!] рдЗрд╕рд▓рд┐рдП рдореИрдВ рдирд╣реАрдВ рдХрд╣реВрдВрдЧрд╛ред рдЗрд╕рдХреЗ рдЕрд▓рд╛рд╡рд╛, рд╣рдо рдЗрд╕ рдмрд╛рд░ рд╕рдмрдЯрд╛рдЗрдкрд┐рдВрдЧ рдХрд╛ рдЙрдкрдпреЛрдЧ рдирд╣реАрдВ рдХрд░ рд░рд╣реЗ рд╣реИрдВред

рджреЛрдиреЛрдВ [!; 0] рдФрд░ &[!] рдирд┐рд░реНрдЬрди рдирд╣реАрдВ рд╣реЛрдиреЗ рдЪрд╛рд╣рд┐рдП, рджреЛрдиреЛрдВ рдкреНрд░рдХрд╛рд░ рдХреЗ рдорд╛рди [] (рдпрд╛ &[] ) рдХреЛ рд╕реНрд╡реАрдХрд╛рд░ рдХрд░ рд╕рдХрддреЗ рд╣реИрдВред

рдХрд┐рд╕реА рдиреЗ рдирд╣реАрдВ рдХрд╣рд╛ рдХрд┐ рд╡реЗ рдирд┐рд░реНрдЬрди рд╣реИрдВ рдпрд╛ рд░рд╣рдиреЗ рдЪрд╛рд╣рд┐рдПред

let _: u32 = unsafe { mem::transmute(return) };
рд╕рд┐рджреНрдзрд╛рдВрдд рд░реВрдк рдореЗрдВ рдпрд╣ рдареАрдХ рд╣реЛ рд╕рдХрддрд╛ рд╣реИ, рд▓реЗрдХрд┐рди рд╕рдВрдХрд▓рдХ рд╢рд┐рдХрд╛рдпрдд рдХрд░рддрд╛ рд╣реИ "0 рдмрд┐рдЯреНрд╕ рдФрд░ 32 рдмрд┐рдЯреНрд╕ рдХреЗ рдмреАрдЪ рд╕рдВрдЪрд╛рд░рдг"ред

рд╣рд╛рд▓рд╛рдВрдХрд┐ ! -> () рдХреЛ рдЯреНрд░рд╛рдВрд╕рдорд┐рдЯ рдХрд░рдиреЗ рдХреА рдЕрдиреБрдорддрд┐ рд╣реИред рдореЗрд░реЗ рдкрд╛рд╕ рдЗрд╕реЗ рдЗрдВрдЧрд┐рдд рдХрд░рдиреЗ рдХрд╛ рдХреЛрдИ рд╡рд┐рд╢реЗрд╖ рдХрд╛рд░рдг рдирд╣реАрдВ рд╣реИ; рдпрд╣ рдПрдХ рдЕрд╕рдВрдЧрддрд┐ рд╣реИ, рд▓реЗрдХрд┐рди рдореИрдВ рдЗрд╕рдХреЗ рд╕рд╛рде рдПрдХ рд╡реНрдпрд╛рд╡рд╣рд╛рд░рд┐рдХ рдпрд╛ рд╕реИрджреНрдзрд╛рдВрддрд┐рдХ рд╕рдорд╕реНрдпрд╛ рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рдирд╣реАрдВ рд╕реЛрдЪ рд╕рдХрддрд╛ред

рдореИрдВ рд╕рдмрдЯрд╛рдЗрдкрд┐рдВрдЧ рдХреА рдЕрдкреЗрдХреНрд╖рд╛ рдирд╣реАрдВ рдХрд░реВрдВрдЧрд╛ рдФрд░ рд╕рдВрдХрд▓рдХ рдореЗрдВ рд╕рднреА рдкреНрд░рдХрд╛рд░ рдХреЗ рддрд░реНрдХ рдХреЛ рдЬрдЯрд┐рд▓ рдмрдирд╛рдиреЗ рд╕реЗ рдмрдЪрдиреЗ рдХреЗ рдЖрдзрд╛рд░ рдкрд░ рдЗрд╕рдХрд╛ рд╡рд┐рд░реЛрдз рдХрд░реВрдВрдЧрд╛ред рдореИрдВ рдЙрдк-рдЯрд╛рдЗрдкрд┐рдВрдЧ рдирд╣реАрдВ рдЪрд╛рд╣рддрд╛ рдЬреЛ рдореВрд▓ рд░реВрдк рд╕реЗ рдХреНрд╖реЗрддреНрд░реЛрдВ рдпрд╛ рдХреНрд╖реЗрддреНрд░ рдмрд╛рдзреНрдпрдХрд╛рд░реА рд╕реЗ рд╕рдВрдмрдВрдзрд┐рдд рдирд╣реАрдВ рд╣реИред

рдХреНрдпрд╛ Fn , FnMut рдФрд░ FnOnce рдХреЛ ! рдХреЗ рд▓рд┐рдП рдЗрд╕ рддрд░рд╣ рдХрд╛рд░реНрдпрд╛рдиреНрд╡рд┐рдд рдХрд░рдирд╛ рд╕рдВрднрд╡ рд╣реИ рдХрд┐ рдпрд╣ рд╕рднреА рдЗрдирдкреБрдЯ рдФрд░ рдЖрдЙрдЯрдкреБрдЯ рдкреНрд░рдХрд╛рд░реЛрдВ рдкрд░ рд╕рд╛рдорд╛рдиреНрдп рд╣реЛ?

рдореЗрд░реЗ рдорд╛рдорд▓реЗ рдореЗрдВ рдореЗрд░реЗ рдкрд╛рд╕ рдПрдХ рд╕рд╛рдорд╛рдиреНрдп рдирд┐рд░реНрдорд╛рддрд╛ рд╣реИ рдЬреЛ рдПрдХ рдХрд╛рд░реНрдп рдХрд░ рд╕рдХрддрд╛ рд╣реИ, рдЬрд┐рд╕реЗ рдирд┐рд░реНрдорд╛рдг рдХрд░рддреЗ рд╕рдордп рд▓рд╛рдЧреВ рдХрд┐рдпрд╛ рдЬрд╛рдПрдЧрд╛:

struct Builder<F: FnOnce(Input) -> Output> {
    func: Option<F>,
}

рдХреЗ рд░реВрдк рдореЗрдВ func рдПрдХ рд╣реИ Option , рдПрдХ рдирд┐рд░реНрдорд╛рддрд╛ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░ None рдХреЗ рдкреНрд░рдХрд╛рд░ рдХреЗ рдЕрдиреБрдорд╛рди рдирд╣реАрдВ рд▓рдЧрд╛ рд╕рдХрддрд╛ F ред рдЗрд╕рд▓рд┐рдП fn new рдХрд╛рд░реНрдпрд╛рдиреНрд╡рдпрди рдХреЛ рдмреИрдВрдЧ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдирд╛ рдЪрд╛рд╣рд┐рдП:

impl Builder<!> {
    pub fn new() -> Builder<!> {
        Builder {
            func: None,
        }
    }
}

рдмрд┐рд▓реНрдбрд░ рдХрд╛ func рдлрд╝рдВрдХреНрд╢рди рдХреБрдЫ рдЗрд╕ рддрд░рд╣ рджрд┐рдЦрдирд╛ рдЪрд╛рд╣рд┐рдП рдЬрд┐рд╕реЗ Builder<!> рдФрд░ Builder<F> рджреЛрдиреЛрдВ рдкрд░ рд▓рд╛рдЧреВ рдХрд┐рдпрд╛ рдЬрд╛ рд╕рдХреЗ:

impl<F: FnOnce(Input) -> Output> Builder<F> {
    pub fn func<F2: FnOnce(Input) -> Output>(self, func: F) -> Builder<F2> {
        Builder {
            func: func,
        }
    }
}

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

рдпрд╣ рд╡рд┐рд░реЛрдзрд╛рднрд╛рд╕реА рд▓рдЧрддрд╛ рд╣реИред рдХреНрдпрд╛ <! as Fn>::Output рдХреЛ рдПрдХ рд╣реА рдкреНрд░рдХрд╛рд░ рд╕реЗ рд╣рд▓ рдХрд░рдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рдирд╣реАрдВ рд╣реИ?

<! as Fn>::Output ! , рд╣реИ рдирд╛?

рд╕рд┐рджреНрдзрд╛рдВрдд рд░реВрдк рдореЗрдВ <! as Fn>::Output рд╣реЛрдирд╛ рдЪрд╛рд╣рд┐рдП ! , рд▓реЗрдХрд┐рди рд╡рд░реНрддрдорд╛рди рдкреНрд░рдХрд╛рд░ рдХрд╛ рдЪреЗрдХрд░ рдЪрд╛рд╣рддрд╛ рд╣реИ рдХрд┐ рд╕рдВрдмрдВрдзрд┐рдд рдкреНрд░рдХрд╛рд░ рдмрд┐рд▓реНрдХреБрд▓ рдореЗрд▓ рдЦрд╛рдПрдВ: https://is.gd/4Mkxfm

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

рдирд┐рдореНрдирд▓рд┐рдЦрд┐рдд рдХреЛрдб рдЪрд╛рд╣рд┐рдП

#![feature(never_type)]

fn with_print<T>(i:i32, r:T) -> T {
    println!("{}", i);
    r
}


fn main() {
    #[allow(unreachable_code)]
    *with_print(10,&return)
}

10 рдкреНрд░рд┐рдВрдЯ рдХрд░рддрд╛ рд╣реИ? рдЕрднреА рдпрд╣ рдХреБрдЫ рднреА рдирд╣реАрдВ рдЫрд╛рдкрддрд╛ рд╣реИред рдпрд╛ рдХреЛрдИ рдЕрдиреНрдп рд╡рд░реНрдХрдЕрд░рд╛рдЙрдВрдб рдЬреЛ рдкреНрд░рд┐рдВрдЯ рд╣реЛрдиреЗ рддрдХ return рджреЗрд░реА рдХрд░реЗрдЧрд╛?

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


рдЬреИрд╕рд╛ рдХрд┐ @RalfJung рдкрд┐рдЫрд▓реЗ рд╕рдВрд╕реНрдХрд░рдг рдореЗрдВ рд░реБрдЪрд┐ &return рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рддрд╛ рд╣реИ, рдореИрдВрдиреЗ рдХреЛрдб рдХреЛ рдлрд┐рд░ рд╕реЗ рд╕рдорд╛рдпреЛрдЬрд┐рдд рдХрд┐рдпрд╛ред рдФрд░ рдлрд┐рд░, рдореЗрд░рд╛ рдХрд╣рдирд╛ рд╣реИ рдХрд┐ рд╣рдореЗрдВ рдмрд╛рдж рдореЗрдВ return рдореЗрдВ рджреЗрд░реА рдХрд░рдиреЗ рдореЗрдВ рд╕рдХреНрд╖рдо рд╣реЛрдирд╛ рдЪрд╛рд╣рд┐рдПред рд╣рдо рдпрд╣рд╛рдВ рдХреНрд▓реЛрдЬрд░ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ рд▓реЗрдХрд┐рди рдореИрдВ рдХреЗрд╡рд▓ return рдЙрдкрдпреЛрдЧ рдХрд░ рд╕рдХрддрд╛ рд╣реВрдВ, рди рдХрд┐ break рдпрд╛ continue рдЖрджрд┐ рдХрд╛ред

рдЙрджрд╛рд╣рд░рдг рдХреЗ рд▓рд┐рдП, рдпрд╣ рдЕрдЪреНрдЫрд╛ рд╣реЛрдЧрд╛ рдпрджрд┐ рд╣рдо рд▓рд┐рдЦ рд╕рдХреЗрдВ

#![feature(never_type)]

fn with_print<T>(i:i32, r:T) -> T {
    println!("{}", i);
    r
}


fn main() {
    for i in 1..10 {
        if i==5 { with_print(i, /* delay */break) }
        with_print(i, i);
    }
}

рдмреНрд░реЗрдХ рдХреЗ рд╕рд╛рде 5 рдореБрджреНрд░рд┐рдд рд╣реЛрдиреЗ рддрдХ рджреЗрд░реА рд╣реБрдИред

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

рдХрд╛рд░рдг рдпрд╣ рд╣реИ рдХрд┐ return рдХрд╛ рдкреНрд░рдХрд╛рд░ ! рд╣реИ рдХреНрдпреЛрдВрдХрд┐ рдпрд╣ рд╡рд┐рдЪрд▓рди рдХрд░рддрд╛ рд╣реИред рдХреЛрдб рдЬреЛ return рдЕрднрд┐рд╡реНрдпрдХреНрддрд┐ рдХреЗ рдкрд░рд┐рдгрд╛рдо рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рддрд╛ рд╣реИ рдЙрд╕реЗ рдХрднреА рднреА рдирд┐рд╖реНрдкрд╛рджрд┐рдд рдирд╣реАрдВ рдХрд┐рдпрд╛ рдЬрд╛ рд╕рдХрддрд╛ рдХреНрдпреЛрдВрдХрд┐ return рдХрднреА рднреА "рд╕рдорд╛рдкреНрдд" рдирд╣реАрдВ рд╣реЛрддрд╛ рд╣реИред

o рдореБрдЭреЗ рдирд╣реАрдВ рдкрддрд╛ рдерд╛ рдХрд┐ рдЖрдк &return рд▓рд┐рдЦ рд╕рдХрддреЗ рд╣реИрдВред рдЗрд╕рдХрд╛ рдХреЛрдИ рдорддрд▓рдм рдирд╣реАрдВ рд╣реИ, рдЖрдкрдХреЛ return рдХрд╛ рдкрддрд╛ рд▓реЗрдиреЗ рдХреА рдЕрдиреБрдорддрд┐ рдХреНрдпреЛрдВ рджреА рдЬрд╛рдиреА рдЪрд╛рд╣рд┐рдП?^^

рд▓реЗрдХрд┐рди, рд╡реИрд╕реЗ рднреА, @earthengine рдЖрдкрдХреЗ рдХреЛрдб рдореЗрдВ, рддрд░реНрдХреЛрдВ рдХрд╛ рдореВрд▓реНрдпрд╛рдВрдХрди quit_with_print рд╕реЗ рдкрд╣рд▓реЗ рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИред рджреВрд╕рд░реЗ рддрд░реНрдХ рдХрд╛ рдореВрд▓реНрдпрд╛рдВрдХрди return рдЪрд▓рд╛рддрд╛ рд╣реИ, рдЬреЛ рдХрд╛рд░реНрдпрдХреНрд░рдо рдХреЛ рд╕рдорд╛рдкреНрдд рдХрд░рддрд╛ рд╣реИред рдпрд╣ рдРрд╕рд╛ рдХреБрдЫ рд▓рд┐рдЦрдиреЗ рдЬреИрд╕рд╛ рд╣реИ рдЬреИрд╕реЗ foo({ return; 2 }) -- foo рдХрднреА рдирд┐рд╖реНрдкрд╛рджрд┐рдд рдирд╣реАрдВ рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИред

@RalfJung return ! рдкреНрд░рдХрд╛рд░ рдХреА рдЕрднрд┐рд╡реНрдпрдХреНрддрд┐ рд╣реИ, рдЬреИрд╕реЗ break рдпрд╛ continue ред рдЗрд╕рдХрд╛ рдПрдХ рдкреНрд░рдХрд╛рд░ рд╣реИ, рд▓реЗрдХрд┐рди рдЗрд╕рдХрд╛ рдкреНрд░рдХрд╛рд░ рдирд┐рд░реНрдЬрди рд╣реИред

! рдХреЛ рдХреНрд░рд┐рдпрд╛рдиреНрд╡рд┐рдд рдХрд┐рдпрд╛ рдЧрдпрд╛ рд╣реИ рдФрд░ рдЕрдм рдПрдХ рд╡рд░реНрд╖ рд╕реЗ рд░рд╛рддреНрд░рд┐ рдореЗрдВ рдХрд╛рдо рдХрд░ рд░рд╣рд╛ рд╣реИред рдореИрдВ рдЬрд╛рдирдирд╛ рдЪрд╛рд╣рддрд╛ рд╣реВрдВ рдХрд┐ рдЗрд╕реЗ рд╕реНрдерд┐рд░реАрдХрд░рдг рдХреА рдУрд░ рд▓реЗ рдЬрд╛рдиреЗ рдХреЗ рд▓рд┐рдП рдХреНрдпрд╛ рдХрд░рдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реИред

рдПрдХ рдмрд╛рдд рдЬрд┐рд╕рдХрд╛ рд╕рдорд╛рдзрд╛рди рдирд╣реАрдВ рд╣реБрдЖ рд╣реИ, рд╡рд╣ рдпрд╣ рд╣реИ рдХрд┐ рдЙрди рдЖрдВрддрд░рд┐рдХ рддрддреНрд╡реЛрдВ рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рдХреНрдпрд╛ рдХрд┐рдпрд╛ рдЬрд╛рдП рдЬреЛ ! (рдпрд╛рдиреА uninitialized , ptr::read рдФрд░ transmute ) рд╡рд╛рдкрд╕ рдХрд░ рд╕рдХрддреЗ рд╣реИрдВред uninitialized , рдкрд┐рдЫрд▓реА рдмрд╛рд░ рдореИрдВрдиреЗ рд╕реБрдирд╛ рдерд╛ рдХрд┐ рдПрдХ рдЖрдо рд╕рд╣рдорддрд┐ рдереА рдХрд┐ рдЗрд╕реЗ MaybeUninit рдкреНрд░рдХрд╛рд░ рдФрд░ рд╕рдВрднрд╛рд╡рд┐рдд рднрд╡рд┐рд╖реНрдп &in , &out , &uninit рдкрдХреНрд╖ рдореЗрдВ рд╣рдЯрд╛ рджрд┐рдпрд╛ рдЬрд╛рдирд╛ рдЪрд╛рд╣рд┐рдПред рдкрд╣рд▓реЗ рдХрд╛ uninitialized рдкрджрд╛рд╡рдирдд рдХрд░рдиреЗ рдХрд╛ рдкреНрд░рд╕реНрддрд╛рд╡ рд░рдЦрд╛ рд╣реИ рдЬреЛ рдПрдХ рдирдпрд╛ Inhabited рд╡рд┐рд╢реЗрд╖рддрд╛ рд▓рд╛рдЧреВ рдирд╣реАрдВ рдХрд░рддреЗ рд╣реИрдВред рд╢рд╛рдпрдж рдЙрд╕ RFC рдХреЛ рдЦрддреНрдо рдХрд░ рджрд┐рдпрд╛ рдЬрд╛рдирд╛ рдЪрд╛рд╣рд┐рдП рдФрд░ "рдмрд╣рд┐рд╖реНрдХреГрдд uninitialized " рдФрд░ " MaybeUninit " RFCs рд╕реЗ рдмрджрд▓ рджрд┐рдпрд╛ рдЬрд╛рдирд╛ рдЪрд╛рд╣рд┐рдП?

ptr::read , рдореБрдЭреЗ рд▓рдЧрддрд╛ рд╣реИ рдХрд┐ рдЗрд╕реЗ рдпреВрдмреА рдХреЗ рд░реВрдк рдореЗрдВ рдЫреЛрдбрд╝рдирд╛ рдареАрдХ рд╣реИред рдЬрдм рдХреЛрдИ ptr::read рдкрд░ рдХреЙрд▓ рдХрд░рддрд╛ рд╣реИ рддреЛ рд╡реЗ рджрд╛рд╡рд╛ рдХрд░рддреЗ рд╣реИрдВ рдХрд┐ рдЬреЛ рдбреЗрдЯрд╛ рд╡реЗ рдкрдврд╝ рд░рд╣реЗ рд╣реИрдВ рд╡рд╣ рдорд╛рдиреНрдп рд╣реИ, рдФрд░ ! рдХреЗ рдорд╛рдорд▓реЗ рдореЗрдВ рдпрд╣ рдирд┐рд╢реНрдЪрд┐рдд рд░реВрдк рд╕реЗ рдирд╣реАрдВ рд╣реИред рд╣реЛ рд╕рдХрддрд╛ рд╣реИ рдХрд┐ рдХрд┐рд╕реА рдХреЗ рдкрд╛рд╕ рдЗрд╕ рдкрд░ рдЕрдзрд┐рдХ рдмрд╛рд░реАрдХ рд░рд╛рдп рд╣реЛ?

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

рддреЛ рдЗрд╕ рд╕рдордп рд╣рдо рдЗрдирдХреЗ рд╕рд╛рде рдХрд╣рд╛рдБ рд╣реИрдВ? (/cc @nikomatsakis)? рдХреНрдпрд╛ рд╣рдо uninitialized рдХреЛ рдкрджрд╛рд╡рдирдд рдХрд░рдиреЗ рдФрд░ MaybeUninit рдкреНрд░рдХрд╛рд░ рдЬреЛрдбрд╝рдиреЗ рдХреЗ рд╕рд╛рде рдЖрдЧреЗ рдмрдврд╝рдиреЗ рдХреЗ рд▓рд┐рдП рддреИрдпрд╛рд░ рд╣реЛрдВрдЧреЗ? рдЕрдЧрд░ рд╣рдо ! рд╕рд╛рде рдХреЙрд▓ рдХрд░рдиреЗ рдкрд░ рдЗрди рдЖрдВрддрд░рд┐рдХ рдЪреАрдЬреЛрдВ рдХреЛ рдЖрддрдВрдХрд┐рдд рдХрд░рддреЗ рд╣реИрдВ, рддреЛ рдХреНрдпрд╛ рдпрд╣ рдПрдХ рдЙрдкрдпреБрдХреНрдд рд╕реНрдЯреЙрдк-рдЧреИрдк рдЙрдкрд╛рдп рд╣реЛрдЧрд╛ рдЬреЛ рд╣рдореЗрдВ ! рдХреЛ рд╕реНрдерд┐рд░ рдХрд░рдиреЗ рдХреА рдЕрдиреБрдорддрд┐ рджреЗрдЧрд╛?

рд╕реВрдЪреАрдмрджреНрдз рд▓рдВрдмрд┐рдд рдореБрджреНрджреЗ рднреА рд╣реИрдВ:

! рд▓рд┐рдП рд╣рдореЗрдВ рдХреМрди рд╕реЗ рдЧреБрдг рд▓рд╛рдЧреВ рдХрд░рдиреЗ рдЪрд╛рд╣рд┐рдП? рдкреНрд░рд╛рд░рдВрднрд┐рдХ рдкреАрдЖрд░ #35162 рдореЗрдВ Ord рдФрд░ рдХреБрдЫ рдЕрдиреНрдп рд╢рд╛рдорд┐рд▓ рд╣реИрдВред рдпрд╣ рд╢рд╛рдпрдж рдПрдХ рдЯреА-рд▓рд┐рдмреНрд╕ рдореБрджреНрджрд╛ рд╣реИ, рдЗрд╕рд▓рд┐рдП рдореИрдВ рдЙрд╕ рдЯреИрдЧ рдХреЛ рдЗрд╕ рдореБрджреНрджреЗ рдореЗрдВ рдЬреЛрдбрд╝ рд░рд╣рд╛ рд╣реВрдВред

рд╡рд░реНрддрдорд╛рди рдореЗрдВ рдХрд╛рдлреА рдмреБрдирд┐рдпрд╛рджреА рдЪрдпрди рд╣реИ: PartialEq , Eq , PartialOrd , Ord , Debug , Display , Error ред рдЗрд╕рдХреЗ рдЕрд▓рд╛рд╡рд╛ Clone , рдЬрд┐рд╕реЗ рдирд┐рд╢реНрдЪрд┐рдд рд░реВрдк рд╕реЗ рдЙрд╕ рд╕реВрдЪреА рдореЗрдВ рдЬреЛрдбрд╝рд╛ рдЬрд╛рдирд╛ рдЪрд╛рд╣рд┐рдП, рдореИрдВ рдХрд┐рд╕реА рдЕрдиреНрдп рдХреЛ рдирд╣реАрдВ рджреЗрдЦ рд╕рдХрддрд╛ рдЬреЛ рдмреЗрд╣рдж рдорд╣рддреНрд╡рдкреВрд░реНрдг рд╣реИрдВред рдХреНрдпрд╛ рд╣рдореЗрдВ рдЗрд╕ рдкрд░ рд╕реНрдерд┐рд░реАрдХрд░рдг рдХреЛ рд░реЛрдХрдиреЗ рдХреА рдЬрд░реВрд░рдд рд╣реИ? рдЕрдЧрд░ рд╣рдо рдлрд┐рдЯ рджрд┐рдЦрддреЗ рд╣реИрдВ рддреЛ рд╣рдо рдмрд╛рдж рдореЗрдВ рдФрд░ рдЕрдзрд┐рдХ рдЗрдореНрдкреНрд▓рд╛рдВрдЯ рдЬреЛрдбрд╝ рд╕рдХрддреЗ рд╣реИрдВред

(): Trait рдлрд╝реЙрд▓рдмреИрдХ рдкрд░ рднрд░реЛрд╕рд╛ рдХрд░рдиреЗ рд╡рд╛рд▓реЗ рд▓реЛрдЧреЛрдВ рдХреЗ рд▓рд┐рдП рдЪреЗрддрд╛рд╡рдирд┐рдпреЛрдВ рдХреЛ рдХреИрд╕реЗ рдХрд╛рд░реНрдпрд╛рдиреНрд╡рд┐рдд рдХрд░реЗрдВ рдЬрд╣рд╛рдВ рднрд╡рд┐рд╖реНрдп рдореЗрдВ рд╡рд╣ рд╡реНрдпрд╡рд╣рд╛рд░ рдмрджрд▓ рд╕рдХрддрд╛ рд╣реИ?

resolve_trait_on_defaulted_unit рдЪреЗрддрд╛рд╡рдиреА рд▓рд╛рдЧреВ рд╣реИ рдФрд░ рдкрд╣рд▓реЗ рд╕реЗ рд╣реА рд╕реНрдерд┐рд░ рд╣реИред

рдЬрдмрд░рджрд╕реНрддреА рдореЗрдВ ! рд▓рд┐рдП рд╡рд╛рдВрдЫрд┐рдд рд╢рдмреНрджрд╛рд░реНрде (#40800)
рдХрд┐рд╕ рдкреНрд░рдХрд╛рд░ рдХреЗ рд╡реЗрд░рд┐рдПрдмрд▓ рдХреЛ ! (#40801) рдкрд░ рд╡рд╛рдкрд╕ рдЖрдирд╛ рдЪрд╛рд╣рд┐рдП

рдпреЗ рдЕрд╕рд▓реА рдЕрд╡рд░реЛрдзрдХреЛрдВ рдХреА рддрд░рд╣ рд▓рдЧрддреЗ рд╣реИрдВред @nikomatsakis : рдХреНрдпрд╛ рдЖрдкрдХреЗ рдкрд╛рд╕ рдЗрдирдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рдХреНрдпрд╛ рдХрд░рдирд╛ рд╣реИ рдЗрд╕рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рдХреЛрдИ рдареЛрд╕ рд╡рд┐рдЪрд╛рд░ рд╣реИ рдЬреЛ рдЕрднреА рд▓рд╛рдЧреВ рд╣реЛрдиреЗ рдХреА рдкреНрд░рддреАрдХреНрд╖рд╛ рдХрд░ рд░рд╣реЗ рд╣реИрдВ?

рдХреНрдпрд╛ рдпрд╣ ! рд▓рд┐рдП Sync рдФрд░ Send рдХреЛ рднреА рд▓рд╛рдЧреВ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рд╕рдордЭ рдореЗрдВ рдЖрддрд╛ рд╣реИ? рдРрд╕реЗ рдХрдИ рдорд╛рдорд▓реЗ рд╣реИрдВ рдЬрд╣рд╛рдВ рддреНрд░реБрдЯрд┐ рдкреНрд░рдХрд╛рд░реЛрдВ рдореЗрдВ Sync рдФрд░/рдпрд╛ Send рд╕реАрдорд╛рдПрдВ рд╣реИрдВ, рдЬрд╣рд╛рдВ ! рдХреЛ "рдЕрд╕рдлрд▓ рдирд╣реАрдВ рд╣реЛ рд╕рдХрддрд╛" рдХреЗ рд░реВрдк рдореЗрдВ рдЙрдкрдпреЛрдЧ рдХрд░рдирд╛ рдЙрдкрдпреЛрдЧреА рд╣реЛрдЧрд╛ред

@canndrew рдореИрдВ рдЗрд╕реЗ рдЕрд╕реБрд░рдХреНрд╖рд┐рдд рдХреЛрдб рдореЗрдВ рдордирд╛ рдХрд░рдиреЗ рд╕реЗ рдЕрд╕рд╣рдордд рд╣реВрдВред unreachable рдЯреЛрдХрд░рд╛ рдирд┐рд░реНрдЬрди рдкреНрд░рдХрд╛рд░ рдмрдирд╛рдиреЗ рдХреЗ рд▓рд┐рдП рдЯреНрд░рд╛рдВрд╕рдореНрдпреВрдЯ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рддрд╛ рд╣реИ рдФрд░ рдЗрд╕рд▓рд┐рдП рдЕрдиреБрдХреВрд▓рдХ рд╕рдВрдХреЗрдд рджреЗрддрд╛ рд╣реИ рдХрд┐ рдХреЛрдб рдХреА рдХреБрдЫ рд╢рд╛рдЦрд╛ рдХрднреА рдирд╣реАрдВ рд╣реЛ рд╕рдХрддреА рд╣реИред рдпрд╣ рдЕрдиреБрдХреВрд▓рди рдХреЗ рд▓рд┐рдП рдЙрдкрдпреЛрдЧреА рд╣реИред рдореЗрд░реА рдпреЛрдЬрдирд╛ рджрд┐рд▓рдЪрд╕реНрдк рддрд░реАрдХреЗ рд╕реЗ рдРрд╕реА рддрдХрдиреАрдХ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдХреЗ рдЕрдкрдирд╛ рдЦреБрдж рдХрд╛ рдЯреЛрдХрд░рд╛ рдмрдирд╛рдиреЗ рдХреА рд╣реИред

@Kixunil рдпрд╣рд╛рдВ https://doc.rust-lang.org/beta/std/intrinsics/fn.unreachable.html рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдирд╛ рдЕрдзрд┐рдХ рд╕реНрдкрд╖реНрдЯ рдирд╣реАрдВ рд╣реЛрдЧрд╛?

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

@jsgf рдХреНрд╖рдорд╛ рдХрд░реЗрдВ, рд╣рд╛рдБ, ! рд╕рднреА рдорд╛рд░реНрдХрд░ рд▓рдХреНрд╖рдгреЛрдВ ( Send , Sync , Copy , Sized ) рдХреЛ рднреА рджрд░реНрд╢рд╛рддрд╛ рд╣реИред

@ рдХрд┐рдХреНрд╕реБрдирд┐рд▓ рд╣рдореНрдо, рдпрд╣ рд╢рд░реНрдо рдХреА рдмрд╛рдд рд╣реИред рд╣рд╛рд▓рд╛рдВрдХрд┐ unreachable рдЖрдВрддрд░рд┐рдХ рдХреЛ рд╕реНрдерд┐рд░ рдХрд░рдирд╛ рдмреЗрд╣рддрд░ рд╣реЛрдЧрд╛ред

рд╕реНрдерд┐рд░реАрдХрд░рдг-рдЕрд╡рд░реЛрдзрдХ рдирд╣реАрдВ (рдХреНрдпреЛрдВрдХрд┐ рдкреВрд░реНрдг, рд╢рдмреНрджрд╛рд░реНрде рдирд╣реАрдВ), рд▓реЗрдХрд┐рди рдРрд╕рд╛ рд▓рдЧрддрд╛ рд╣реИ рдХрд┐ Result<T, !> рдПрдирдо рд▓реЗрдЖрдЙрдЯ рдпрд╛ рдореИрдЪ рдХреЛрдбрдЬреЗрди рдореЗрдВ ! рдирд┐рд░реНрдЬрдирддрд╛ рдХрд╛ рдЙрдкрдпреЛрдЧ рдирд╣реАрдВ рдХрд░ рд░рд╣рд╛ рд╣реИ: https://github.com /рдЬрдВрдЧ-рд▓рдВрдЧ/рдЬрдВрдЧ/рдореБрджреНрджреЗ/43278

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

рдХреНрдпрд╛ рдЪрд╛рдХ рд╕рдВрднрд╡рддрдГ !: Trait рдХрд╛рд░реНрдпрд╛рдиреНрд╡рдпрди рдХреЗ рд╕рдВрдмрдВрдз рдореЗрдВ рдХреБрдЫ рдХрдард┐рди рд╕рд╡рд╛рд▓реЛрдВ рдХреЗ рдЬрд╡рд╛рдм рджреЗрдиреЗ рдореЗрдВ рдорджрдж рдХрд░ рд╕рдХрддрд╛ рд╣реИ?

@ExpHP рдореБрдЭреЗ рдРрд╕рд╛ рдирд╣реАрдВ рд▓рдЧрддрд╛ред рдЙрди рд▓рдХреНрд╖рдгреЛрдВ рдХреЗ рд▓рд┐рдП !: Trait рд╕реНрд╡рддрдГ-рдХрд╛рд░реНрдпрд╛рдиреНрд╡рдпрди рдХрд░рдирд╛ рдЬрд┐рдирдХреЗ рдкрд╛рд╕ рд╕рдВрдмрджреНрдз рдкреНрд░рдХрд╛рд░/рдЖрдзрд╛рд░ рдирд╣реАрдВ рд╣реИрдВ рдФрд░ рдХреЗрд╡рд▓ рдЧреИрд░-рд╕реНрдереИрддрд┐рдХ рд╡рд┐рдзрд┐рдпреЛрдВ рдХреЛ рдзреНрд╡рдирд┐ рдорд╛рдирд╛ рдЬрд╛рддрд╛ рд╣реИред рдпрд╣ рд╕рд┐рд░реНрдл рдПрдХ рдмрд╛рдд рд╣реИ рдХрд┐ рд╣рдо рдЗрд╕реЗ рдХрд░рдирд╛ рдЪрд╛рд╣рддреЗ рд╣реИрдВ рдпрд╛ рдирд╣реАрдВред рдЕрдиреНрдп рд▓рдХреНрд╖рдгреЛрдВ рдХреЗ рд▓рд┐рдП рд╕реНрд╡рддрдГ-рдХрд╛рд░реНрдпрд╛рдиреНрд╡рдпрди рд╡рд╛рд╕реНрддрд╡ рдореЗрдВ рд╕рдордЭ рдореЗрдВ рдирд╣реАрдВ рдЖрддрд╛ рд╣реИ рдХреНрдпреЛрдВрдХрд┐ рд╕рдВрдХрд▓рдХ рдХреЛ рд╕рдВрдмрдВрдзрд┐рдд рдкреНрд░рдХрд╛рд░реЛрдВ/рд╕реНрдерд▓реЛрдВ рдХреЗ рд▓рд┐рдП рдордирдорд╛рдиреА рдорд╛рди рдбрд╛рд▓рдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реЛрдЧреА рдФрд░ рдЕрдкрдиреА рдордирдорд╛рдиреА рд╕реНрдерд┐рд░ рд╡рд┐рдзрд┐ рдХрд╛ рдЖрд╡рд┐рд╖реНрдХрд╛рд░ рдХрд░рдирд╛ рд╣реЛрдЧрд╛ред

rustc рдореЗрдВ рдкрд╣рд▓реЗ рд╕реЗ рд╣реА resolve-trait-on-defaulted-unit рдПрдХ рдкреНрд░рдХрд╛рд░ рдХрд╛ рд╡реГрдХреНрд╖ рд╣реИред рдХреНрдпрд╛ рд╕рдВрдмрдВрдзрд┐рдд рдЖрдЗрдЯрдо рдкрд░ рд╕рд╣реА рдХрд╛ рдирд┐рд╢рд╛рди рд▓рдЧрд╛рдпрд╛ рдЬрд╛рдирд╛ рдЪрд╛рд╣рд┐рдП?

@canndrew рдХреНрдпрд╛ рд╕рдВрдмрджреНрдз рдкреНрд░рдХрд╛рд░реЛрдВ рдХреЛ ! ?

@taralx рдпрд╣ рдЕрд╕реНрд╡рд╕реНрде рдирд╣реАрдВ рд╣реИ, рд▓реЗрдХрд┐рди рдпрд╣ рд╡реИрдз рдХреЛрдб рдХреЛ рдХрд╛рдо рдХрд░рдиреЗ рд╕реЗ рд░реЛрдХреЗрдЧрд╛ред рдзреНрдпрд╛рди рджреЗрдВ рдХрд┐ рдирд┐рдореНрдирд▓рд┐рдЦрд┐рдд рдХреЛрдб рдЖрдЬ рд╕рдВрдХрд▓рд┐рдд рд╣реИ:

trait Foo {
    type Bar;
    fn make_bar() -> Self::Bar;
}

impl Foo for ! {
    type Bar = (i32, bool);
    fn make_bar() -> Self::Bar { (42, true) }
}

@lрдлреЗрдпрд░реА рдпрд╣ рдЖрдкрдХреА рд░рд╛рдп рдкрд░ рдирд┐рд░реНрднрд░ рдХрд░рддрд╛ рд╣реИ рдХрд┐ "рд╡реИрдз" рдХреЛрдб рдХреНрдпрд╛ рд╣реИред рдореЗрд░реЗ рд▓рд┐рдП, рдореИрдВ рдЦреБрд╢реА-рдЦреБрд╢реА рд╕реНрд╡реАрдХрд╛рд░ рдХрд░реВрдВрдЧрд╛ рдХрд┐ рдЖрдкрдиреЗ рдЬреЛ рдХреЛрдб рджрд┐рдпрд╛ рд╣реИ рд╡рд╣ "рдЕрдорд╛рдиреНрдп" рд╣реИ, рдХреНрдпреЛрдВрдХрд┐ рдЖрдкрдХреЛ ! рд╕реЗ рдХреБрдЫ рднреА рдкреНрд░рд╛рдкреНрдд рдХрд░рдиреЗ рдореЗрдВ рд╕рдХреНрд╖рдо рдирд╣реАрдВ рд╣реЛрдирд╛ рдЪрд╛рд╣рд┐рдПред

@earthengine рдореБрдЭреЗ рд╡рд╣ рдмрд┐рдВрджреБ рдирд╣реАрдВ рджрд┐рдЦ рд░рд╣рд╛ рд╣реИ рдЬрд┐рд╕реЗ рдЖрдк рдмрдирд╛рдиреЗ рдХреА рдХреЛрд╢рд┐рд╢ рдХрд░ рд░рд╣реЗ рд╣реИрдВред рдЖрдк рдмрд┐рдирд╛ рдХрд┐рд╕реА рдЙрджрд╛рд╣рд░рдг рдХреЗ рдХрд┐рд╕реА рдкреНрд░рдХрд╛рд░ рдкрд░ рд╕реНрдерд┐рд░ рд╡рд┐рдзрд┐ рдХреЛ рдХреЙрд▓ рдХрд░ рд╕рдХрддреЗ рд╣реИрдВред рдЖрдк ! рд╕реЗ "рдХреБрдЫ рднреА рдкреНрд░рд╛рдкреНрдд" рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ рдпрд╛ рдирд╣реАрдВ, рдЗрд╕рдХрд╛ рдЗрд╕рд╕реЗ рдХреЛрдИ рд▓реЗрдирд╛-рджреЗрдирд╛ рдирд╣реАрдВ рд╣реИред

рдРрд╕рд╛ рдХреЛрдИ рдХрд╛рд░рдг рдирд╣реАрдВ рд╣реИ рдХрд┐ рдЖрдк ! рдкреНрд░рдХрд╛рд░ рд╕реЗ рдХреБрдЫ рднреА рдкреНрд░рд╛рдкреНрдд рдХрд░рдиреЗ рдореЗрдВ рд╕рдХреНрд╖рдо рди рд╣реЛрдВред рдЖрдк рдПрдХ рд╕реЗ рдХреБрдЫ рднреА рдирд╣реАрдВ рдорд┐рд▓ рд╕рдХрддрд╛ рд╣реИ ! рд╣рд╛рд▓рд╛рдВрдХрд┐, рдЬрд┐рд╕рдХреЗ рдХрд╛рд░рдг рдкрд░ рдЧреИрд░ рд╕реНрдерд┐рд░ рддрд░реАрдХреЛрдВ ! рдкреНрд░реЛрдЧреНрд░рд╛рдорд░ рдкрд░ рдХреЛрдИ рднреА рдирд┐рд░реНрдгрдп рдХреЗ рд▓рд┐рдП рдордЬрдмреВрд░ рдХрд░ рдХреЗ рдмрд┐рдирд╛ рдкреНрд░рд╛рдкреНрдд рдХрд┐рдпрд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИред

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

рд╣рдо рдЬрд┐рд╕ рдХрд┐рд╕реА рднреА рдЪреАрдЬрд╝ рдХреЗ рд╕рд╛рде рдЬрд╛рддреЗ рд╣реИрдВ рд╡рд╣ рдЙрд╕рдХреЗ рд╕рд╛рде рд╕рдорд╛рди рдпрд╛ рдЕрдзрд┐рдХ рд░реВрдврд╝рд┐рд╡рд╛рджреА рд╣реЛрдирд╛ рдЪрд╛рд╣рд┐рдП (рдЬреЛ рдХрд┐ рдХреЛрдИ рднреА рд╕реНрд╡рдЪрд╛рд▓рд┐рдд рдирд┐рд╣рд┐рддрд╛рд░реНрде рднреА рдлрд┐рдЯ рдирд╣реАрдВ рдмреИрдарддрд╛)ред

@ Ericson2314 рдореБрдЭреЗ рд╕рдордЭ рдореЗрдВ рдирд╣реАрдВ рдЖрддрд╛ рдХрд┐ рдЗрд╕рдХрд╛ рдХреНрдпрд╛ рдЕрд░реНрде рд╣реИ, рдХреНрдпрд╛ рдЖрдк рдХреБрдЫ рдЙрджрд╛рд╣рд░рдг рджреЗ рд╕рдХрддреЗ рд╣реИрдВ?

@SimonSapin "рдиреЛ panic!() рдпрд╛ loop { } , рд▓реЗрдХрд┐рди рдПрдХ v: ! рдЬреЛ рдкрд╣рд▓реЗ рд╕реЗ рд╣реА рджрд╛рдпрд░реЗ рдореЗрдВ рд╣реИ, рдареАрдХ рд╣реИред рдРрд╕реЗ рднрд╛рд╡реЛрдВ рдХреЗ рд╕рд╛рде рдЬрд┐рдиреНрд╣реЗрдВ рдЦрд╛рд░рд┐рдЬ рдХрд░ рджрд┐рдпрд╛ рдЧрдпрд╛ рд╣реИ, рдХрдИ рд▓рдХреНрд╖рдгреЛрдВ рдХреЗ рд▓рд┐рдП рдХреЗрд╡рд▓ рдПрдХ рд╣реА рд╕рдВрднрд╛рд╡рд┐рдд рдирд┐рд╣рд┐рддрд╛рд░реНрде рд╣реЛрддрд╛ рд╣реИ ! рд╡рд╣ рдЯрд╛рдЗрдк-рдЪреЗрдХред (рджреВрд╕рд░реЛрдВ рдХреЗ рдкрд╛рд╕ рдПрдХ рдЕрдиреМрдкрдЪрд╛рд░рд┐рдХ рдЕрдиреБрдмрдВрдз рд╣реЛ рд╕рдХрддрд╛ рд╣реИ рдЬреЛ 1 рдирд┐рд╣рд┐рддрд╛рд░реНрде рдХреЛ рдЫреЛрдбрд╝рдХрд░ рд╕рднреА рдХреЛ рд░рджреНрдж рдХрд░ рджреЗрддрд╛ рд╣реИ, рд▓реЗрдХрд┐рди рд╣рдо рдЙрдирд╕реЗ рд╕реНрд╡рдЪрд╛рд▓рд┐рдд рд░реВрдк рд╕реЗ рдирд┐рдкрдЯ рдирд╣реАрдВ рд╕рдХрддреЗ рд╣реИрдВред)

// two implementations: constant functions returning true and false.
// And infinitely more with side effects taken into account.
trait Foo { fn() -> bool }
// Exactly one implementation because the body is unreachable no matter what.
trait Bar { fn(Self) -> Self }

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

рд╡рд╛рд╕реНрддрд╡ рдореЗрдВ рдЗрд╕реЗ рд╕реНрдерд┐рд░реАрдХрд░рдг рд╕реЗ рдХреНрдпрд╛ рд░реЛрдХ рд░рд╣рд╛ рд╣реИ? рдХреНрдпрд╛ рдпрд╣ рдХреЗрд╡рд▓ mem::uninitialized рд╕реНрдерд┐рддрд┐ рд╣реИ рдпрд╛ рдХреБрдЫ рдФрд░?

@ arielb1 : рдореБрдЭреЗ рд▓рдЧрддрд╛ рд╣реИ рдХрд┐ рдпрд╣ #40800 рдФрд░ #40801 рднреА рд╣реИред рдХреНрдпрд╛ рдЖрдк рдЬрд╛рдирддреЗ рд╣реИрдВ рдХрд┐ рдЗрди рдкрд░ рдХреНрдпрд╛ рд╕реНрдерд┐рддрд┐ рд╣реИ?

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

рдХреНрдпрд╛ рдпрд╣ рдирд┐рд░реНрджрд┐рд╖реНрдЯ рдХрд░рдиреЗ рдХреА рдХреЛрдИ рдпреЛрдЬрдирд╛ рд╣реИ рдХрд┐ рдПрдПрд╕рдПрдо рд╡рд┐рдЪрд▓рди рдХрд░ рд░рд╣рд╛ рд╣реИ рддрд╛рдХрд┐ рд╣рдо рдЪреАрдЬреЗрдВ рд▓рд┐рдЦ рд╕рдХреЗрдВ?

#[naked]
unsafe fn error() -> !{
  asm!("hlt");
}

рдЯрд╛рдЗрдк рдЪреЗрдХрд░ рдХреЛ рдЦреБрд╢ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП loop{} рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд┐рдП рдмрд┐рдирд╛?

рд╕рдВрдкрд╛рджрд┐рдд рдХрд░реЗрдВ: рд╣рд╛рд▓рд╛рдВрдХрд┐ рдореБрдЭреЗ рд▓рдЧрддрд╛ рд╣реИ рдХрд┐ core::intrinsics::unreachable рдХрд╛ рдЙрдкрдпреЛрдЧ рдмрд╣реБрдд рдирд┐рдореНрди рд╕реНрддрд░ рдХреЗ рдХреЛрдб рдореЗрдВ рд╕реНрд╡реАрдХрд╛рд░реНрдп рд╣реЛ рд╕рдХрддрд╛ рд╣реИред

@ Eoc33 рдЬрдм ! рдПрдХ рдкреНрд░рдХрд╛рд░ рд╣реИ, рддреЛ рдЖрдк рдпрд╣ рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ:

#[naked]
unsafe fn error() -> ! {
  asm!("hlt");
  std::mem::uninitialized()
}

рддрдм рддрдХ рдЖрдк рдпрд╣ рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ:

#[naked]
unsafe fn error() -> ! {
  asm!("hlt");

  enum Never {}
  let never: Never = std::mem::uninitialized();
  match never {}
}

@Kixunil ! рд░рд╛рдд рдореЗрдВ рдПрдХ рдкреНрд░рдХрд╛рд░ рд╣реИ рдЬрд┐рд╕рдХрд╛ рдЖрдкрдХреЛ рдЙрдкрдпреЛрдЧ рдХрд░рдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реИ asm! ред рдпрд╣ рдЖрдорддреМрд░ рдкрд░ рдЗрд╕ рдкреНрд░рдХрд╛рд░ рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИ:

#[naked]
unsafe fn error() -> ! {
    asm!("hlt");
    std::intrinsics::unreachable();
}

@Kixunil рдЗрд╕реЗ std::intrinics::unreachable() рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдХреЗ рдЕрдзрд┐рдХ рдЖрд╕рд╛рдиреА рд╕реЗ рдХрд┐рдпрд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИ рдЬреЛ рд╡рд╛рд╕реНрддрд╡ рдореЗрдВ рдирд┐рд░реНрджрд┐рд╖реНрдЯ рдХрд░рддрд╛ рд╣реИ рдХрд┐ рдкрд╣рд▓реЗ рдХреЛрдб рдЕрд▓рдЧ рд╣реЛ рд░рд╣рд╛ рд╣реИред

@Kixunil рдЙрдкрд░реЛрдХреНрдд рдЪрд░реНрдЪрд╛ рд╕реЗ std::mem::uninitialized ! рд╡рд╛рдкрд╕ рдХрд░рдиреЗ рдореЗрдВ рд╕рдХреНрд╖рдо рд╣реЛрдиреЗ рдХреЗ рдмрд╛рд╡рдЬреВрдж рдкрд░рд┐рд╡рд░реНрддрди рдХреЗ рдЕрдзреАрди рдкреНрд░рддреАрдд рд╣реЛрддрд╛ рд╣реИ? рдЬрдм рддрдХ рдореИрдВрдиреЗ рдЗрд╕реЗ рдЧрд▓рдд рдирд╣реАрдВ рд╕рдордЭрд╛?

рдЙрдкрд░реЛрдХреНрдд рдЪрд░реНрдЪрд╛ рд╕реЗ std::mem::uninitialized ! рд╡рд╛рдкрд╕ рдХрд░рдиреЗ рдореЗрдВ рд╕рдХреНрд╖рдо рд╣реЛрдиреЗ рдХреЗ рдмрд╛рд╡рдЬреВрдж рдкрд░рд┐рд╡рд░реНрддрди рдХреЗ рдЕрдзреАрди рдкреНрд░рддреАрдд рд╣реЛрддрд╛ рд╣реИ? рдЬрдм рддрдХ рдореИрдВрдиреЗ рдЗрд╕реЗ рдЧрд▓рдд рдирд╣реАрдВ рд╕рдордЭрд╛?

рдореБрдЭреЗ рд▓рдЧрддрд╛ рд╣реИ рдХрд┐ uninitialized рдХреЛ рдЕрдВрддрддрдГ рдкреВрд░реА рддрд░рд╣ рд╕реЗ рд╣рдЯрд╛ рджрд┐рдпрд╛ рдЬрд╛рдПрдЧрд╛ рдФрд░, рд╕реНрдЯреЙрдк рдЧреИрдк рдХреЗ рд░реВрдк рдореЗрдВ, ! рд╕рд╛рде рдЙрдкрдпреЛрдЧ рдХрд┐рдП рдЬрд╛рдиреЗ рдкрд░ рд░рдирдЯрд╛рдЗрдо рдкрд░ рдШрдмрд░рд╛рдиреЗ рдХреЗ рд▓рд┐рдП рдмрдирд╛рдпрд╛ рдЬрд╛рдПрдЧрд╛ (рд╣рд╛рд▓рд╛рдВрдХрд┐ рдпрд╣ рдЗрд╕ рдорд╛рдорд▓реЗ рдХреЛ рдкреНрд░рднрд╛рд╡рд┐рдд рдирд╣реАрдВ рдХрд░реЗрдЧрд╛)ред

рдореБрдЭреЗ рдпрд╣ рднреА рд▓рдЧрддрд╛ рд╣реИ рдХрд┐ рд╣рдореЗрдВ std::intrinsics::unreachable рдХреЛ libcore рдореЗрдВ рдХрд╣реАрдВ рдФрд░ рд╕реНрдерд┐рд░ рдХрд░рдирд╛ рд╣реЛрдЧрд╛ рдФрд░ рдЗрд╕реЗ unchecked_unreachable рдпрд╛ unreachable! рдореИрдХреНрд░реЛ рд╕реЗ рдЕрд▓рдЧ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдХреБрдЫ рдирд╛рдо рджреЗрдирд╛ рд╣реЛрдЧрд╛ред рдореИрдВ рдЗрд╕рдХреЗ рд▓рд┐рдП рдПрдХ рдЖрд░рдПрдлрд╕реА рд▓рд┐рдЦрдиреЗ рдХрд╛ рдорддрд▓рдм рд░рд╣рд╛ рд╣реВрдВред

@eddyb рдЖрд╣, рд╣рд╛рдБ, рднреВрд▓ рдЧрдП рдХрд┐ asm!() рдЕрд╕реНрдерд┐рд░ рд╣реИ, рдЗрд╕рд▓рд┐рдП std::intrinsics::unreachable() рднреА рдЙрдкрдпреЛрдЧ рдХрд┐рдпрд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИред

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

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

@canndrew рдЖрдкрдХреЛ рдХреНрдпреЛрдВ рд▓рдЧрддрд╛ рд╣реИ рдХрд┐ uninitialized рдХреЛ рдкрджрд╛рд╡рдирдд рдХрд░ рджрд┐рдпрд╛ рдЬрд╛рдПрдЧрд╛? рдореИрдВ рдРрд╕реА рдмрд╛рдд рдкрд░ рд╡рд┐рд╢реНрд╡рд╛рд╕ рдирд╣реАрдВ рдХрд░ рд╕рдХрддрд╛ред рдореБрдЭреЗ рдпрд╣ рдмреЗрд╣рдж рдЙрдкрдпреЛрдЧреА рд▓рдЧрддрд╛ рд╣реИ, рдЗрд╕рд▓рд┐рдП рдЬрдм рддрдХ рдХреЛрдИ рдмрд╣реБрдд рдЕрдЪреНрдЫрд╛ рдкреНрд░рддрд┐рд╕реНрдерд╛рдкрди рдореМрдЬреВрдж рди рд╣реЛ, рдореБрдЭреЗ рдРрд╕рд╛ рдХрд░рдиреЗ рдХрд╛ рдХреЛрдИ рдХрд╛рд░рдг рдирд╣реАрдВ рджрд┐рдЦрддрд╛ред

рдЕрдВрдд рдореЗрдВ, рдореИрдВ рджреЛрд╣рд░рд╛рдирд╛ рдЪрд╛рд╣реВрдВрдЧрд╛ рдХрд┐ рдореИрдВ рд╕рд╣рдордд рд╣реВрдВ рдХрд┐ intrinsics::unreachable() рдореМрдЬреВрджрд╛ рд╣реИрдХреНрд╕ рд╕реЗ рдмреЗрд╣рддрд░ рд╣реИред рдХрд╣рд╛ рдЬрд╛ рд░рд╣рд╛ рд╣реИ, рдореИрдВ рдЙрди рд╣реИрдХреНрд╕ рдХреЛ рдордирд╛ рдХрд░рдиреЗ рдпрд╛ рдпрд╣рд╛рдВ рддрдХ тАЛтАЛтАЛтАЛрдХрд┐ рдмрд╣рд┐рд╖реНрдХреГрдд рдХрд░рдиреЗ рдХрд╛ рд╡рд┐рд░реЛрдз рдХрд░рддрд╛ рд╣реВрдВ рдЬрдм рддрдХ рдХрд┐ рдкрд░реНрдпрд╛рдкреНрдд рдкреНрд░рддрд┐рд╕реНрдерд╛рдкрди рди рд╣реЛред

рдЕрдкреНрд░рд╛рд░рдВрдн рдХреЗ рд▓рд┐рдП рдкреНрд░рддрд┐рд╕реНрдерд╛рдкрди рд╕рдВрдШ рд╣реИ { !, T }ред рдЖрдк рджреНрд╡рд╛рд░рд╛ рдЕрдЧрдореНрдп рд╣реЛ рд╕рдХрддреЗ рд╣реИрдВ
ptr::read::<*const !>()ing рдФрд░ рдЗрд╕реА рддрд░рд╣ рдХреЗ рдХрдИ рдЕрдиреНрдп рддрд░реАрдХреЗред

рдЕрдЧрд╕реНрдд 8, 2017 рдЕрдкрд░рд╛рд╣реНрди 3:58 рдкрд░, "рдорд╛рд░реНрдЯрд┐рди рд╣рдмреЛрд╡реЗрдЯрд┐рдпрд╛рдХ" рдиреЛрдЯрд┐рдлрд┐рдХреЗрд╢рди @github.com
рд▓рд┐рдЦрд╛ рдерд╛:

@eddyb https://github.com/eddyb рдЖрд╣, рд╣рд╛рдБ, рднреВрд▓ рдЧрдпрд╛ рдХрд┐ asm!() is
рдЕрд╕реНрдерд┐рд░, рдЗрд╕рд▓рд┐рдП std::intrinsics::unreachable() рдХрд╛ рднреА рдЙрдкрдпреЛрдЧ рдХрд┐рдпрд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИред

@tbu- https://github.com/tbu- рдирд┐рд╢реНрдЪрд┐рдд рд░реВрдк рд╕реЗ, рдореИрдВ рдЗрд╕рдХреЗ рдмрдЬрд╛рдп рдПрдХ рдХреЛ рдмрд╣реБрдд рдкрд╕рдВрдж рдХрд░рддрд╛ рд╣реВрдВ
рдирд┐рд░реНрдЬрди рдкреНрд░рдХрд╛рд░ рдХрд╛ рдирд┐рд░реНрдорд╛рдгред рдореБрджреНрджрд╛ рдпрд╣ рд╣реИ, рдпрд╣ рдЕрд╕реНрдерд┐рд░ рд╣реИ, рдЗрд╕рд▓рд┐рдП рдпрджрд┐ рдпрд╣ рдерд╛
рдХрд┐рд╕реА рднреА рддрд░рд╣ рд╕реЗ рдХреЛрдб рдХреА рд╢рд╛рдЦрд╛ рдХреЛ рдкрд╣реБрдВрдЪ рд╕реЗ рдмрд╛рд╣рд░ рдХреЗ рд░реВрдк рдореЗрдВ рдЪрд┐рд╣реНрдирд┐рдд рдХрд░рдирд╛ рдЕрд╕рдВрднрд╡ рд╣реИ, рдпрд╣ рдирд╣реАрдВ рд╣реЛрдЧрд╛
рдХреЗрд╡рд▓ рдореМрдЬреВрджрд╛ рдХреЛрдб рдХреЛ рддреЛрдбрд╝реЗрдВ, рд▓реЗрдХрд┐рди рдЗрд╕реЗ рдЕрдкрд░рд┐рд╡рд░реНрддрдиреАрдп рднреА рдмрдирд╛рдПрдВред рдореБрдЭреЗ рдРрд╕рд╛ рд▓рдЧрддрд╛ рд╣реИ
рдЬрдВрдЧ рдХреА рдкреНрд░рддрд┐рд╖реНрдард╛ рдХреЛ рдЧрдВрднреАрд░ рд░реВрдк рд╕реЗ рдиреБрдХрд╕рд╛рди рдкрд╣реБрдВрдЪрд╛рдПрдЧрд╛ (рд╡рд┐рд╢реЗрд╖рдХрд░ рдореБрдЦреНрдп рдбреЗрд╡рд▓рдкрд░реНрд╕ рдкрд░ рд╡рд┐рдЪрд╛рд░ рдХрд░рддреЗ рд╣реБрдП
рдЧрд░реНрд╡ рд╕реЗ рдЗрд╕реЗ рд╕реНрдерд┐рд░ рд╣реЛрдиреЗ рдХрд╛ рджрд╛рд╡рд╛ рдХрд░рддреЗ рд╣реИрдВ)ред рдореБрдЭреЗ рд░рд╕реНрдЯ рд╕реЗ рдЬрд┐рддрдирд╛ рдкреНрдпрд╛рд░ рд╣реИ, рдЙрддрдиреА рдмрд╛рдд рд╣реЛрдЧреА
рдореБрдЭреЗ рдпрд╣ рдЙрдкрдпреЛрдЧреА рднрд╛рд╖рд╛ рд╣реЛрдиреЗ рдкрд░ рдкреБрдирд░реНрд╡рд┐рдЪрд╛рд░ рдХрд░реЗрдВред

@Eroc33 https://github.com/eroc33 рдореЗрд░реА рд╕рдордЭ рдпрд╣ рд╣реИ рдХрд┐ рдХреБрдЫ рд▓реЛрдЧ
рдЗрд╕реЗ рдХрд░рдиреЗ рдХрд╛ рд╕реБрдЭрд╛рд╡ рджреЗрдВ, рд▓реЗрдХрд┐рди рдпрд╣ рдХреЗрд╡рд▓ рд╕реБрдЭрд╛рд╡ рд╣реИ, рдирд┐рд╢реНрдЪрд┐рдд рдирд┐рд░реНрдгрдп рдирд╣реАрдВред рдФрд░ рдореИрдВ
рдЗрд╕ рддрд░рд╣ рдХреЗ рд╕реБрдЭрд╛рд╡ рдХреЗ рдЦрд┐рд▓рд╛рдл рдЦрдбрд╝реЗ рд╣реЛ рдЬрд╛рдУ рдХреНрдпреЛрдВрдХрд┐ рдпрд╣ рдкрд┐рдЫрдбрд╝реА рд╕рдВрдЧрддрддрд╛ рдХреЛ рддреЛрдбрд╝ рджреЗрдЧрд╛,
рдЬрдВрдЧ рдХреЛ 2.0 рдмрдирдиреЗ рдХреЗ рд▓рд┐рдП рдордЬрдмреВрд░ рдХрд░рдирд╛ред рдореБрдЭреЗ рдирд╣реАрдВ рд▓рдЧрддрд╛ рдХрд┐ рдЗрд╕рдХрд╛ рд╕рдорд░реНрдерди рдХрд░рдиреЗ рдореЗрдВ рдХреЛрдИ рдмреБрд░рд╛рдИ рд╣реИред
рдпрджрд┐ рд▓реЛрдЧ рдмрдЧ рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рдЪрд┐рдВрддрд┐рдд рд╣реИрдВ, рддреЛ рдПрдХ рдкреНрд░рдХрд╛рд░ рдХрд╛ рд╡реГрдХреНрд╖ рдЕрдзрд┐рдХ рдЙрдкрдпреБрдХреНрдд рд╣реЛрдЧрд╛ред

@canndrew https://github.com/canndrew рдЖрдкрдХреЛ рдЕрдкреНрд░рд╛рд░рдВрднреАрдХреГрдд рдХреНрдпреЛрдВ рд▓рдЧрддрд╛ рд╣реИ?
рдкрджрд╛рд╡рдирдд рдХрд┐рдпрд╛ рдЬрд╛рдПрдЧрд╛? рдореИрдВ рдРрд╕реА рдмрд╛рдд рдкрд░ рд╡рд┐рд╢реНрд╡рд╛рд╕ рдирд╣реАрдВ рдХрд░ рд╕рдХрддрд╛ред рдореБрдЭреЗ рдпрд╣ рдмреЗрд╣рдж рдЙрдкрдпреЛрдЧреА рд▓рдЧрддрд╛ рд╣реИ,
рдЗрд╕рд▓рд┐рдП рдЬрдм рддрдХ рдХреЛрдИ рдмрд╣реБрдд рдЕрдЪреНрдЫрд╛ рдкреНрд░рддрд┐рд╕реНрдерд╛рдкрди рдореМрдЬреВрдж рди рд╣реЛ, рдореБрдЭреЗ рдЗрд╕рдХрд╛ рдХреЛрдИ рдХрд╛рд░рдг рдирд╣реАрдВ рджрд┐рдЦрддрд╛
рдРрд╕рд╛ рдХрд░рдиреЗ рд╕реЗред

рдЕрдВрдд рдореЗрдВ, рдореИрдВ рджреЛрд╣рд░рд╛рдирд╛ рдЪрд╛рд╣реВрдВрдЧрд╛ рдХрд┐ рдореИрдВ рд╕рд╣рдордд рд╣реВрдВ рдХрд┐ рдЗрдВрдЯреНрд░рд┐рдирд┐рдХреНрд╕ :: рдЕрдЧрдореНрдп ()
рд╡рд░реНрддрдорд╛рди рд╣реИрдХреНрд╕ рд╕реЗ рдмреЗрд╣рддрд░ рд╣реИред рдХрд╣рд╛ рдЬрд╛ рд░рд╣рд╛ рд╣реИ, рдореИрдВ рдордирд╛ рдХрд░рдиреЗ рдХрд╛ рд╡рд┐рд░реЛрдз рдХрд░рддрд╛ рд╣реВрдВ рдпрд╛ рдпрд╣рд╛рдВ рддрдХ тАЛтАЛрдХрд┐
рдкрд░реНрдпрд╛рдкреНрдд рдкреНрд░рддрд┐рд╕реНрдерд╛рдкрди рд╣реЛрдиреЗ рддрдХ рдЙрди рд╣реИрдХреНрд╕ рдХреЛ рдмрд╣рд┐рд╖реНрдХреГрдд рдХрд░рдирд╛ред

-
рдЖрдк рдЗрд╕реЗ рдкреНрд░рд╛рдкреНрдд рдХрд░ рд░рд╣реЗ рд╣реИрдВ рдХреНрдпреЛрдВрдХрд┐ рдЖрдкрдиреЗ рдЗрд╕ рдереНрд░реЗрдб рдХреА рд╕рджрд╕реНрдпрддрд╛ рд▓реА рд╣реИред
рдЗрд╕ рдИрдореЗрд▓ рдХрд╛ рд╕реАрдзреЗ рдЙрддреНрддрд░ рджреЗрдВ, рдЗрд╕реЗ GitHub рдкрд░ рджреЗрдЦреЗрдВ
https://github.com/rust-lang/rust/issues/35121#issuecomment-320948013 ,
рдпрд╛ рдереНрд░реЗрдб рдХреЛ рдореНрдпреВрдЯ рдХрд░реЗрдВ
https://github.com/notifications/unsubscribe-auth/AApc0iEK3vInreO03Bt6L3EAByBHQCv9ks5sWFt3gaJpZM4JYi9D
.

@ рдирдЧреАрд╕рд╛ рдзрдиреНрдпрд╡рд╛рдж! рдРрд╕рд╛ рд▓рдЧрддрд╛ рд╣реИ рдХрд┐ рдЗрд╕рд╕реЗ рддрдХрдиреАрдХреА рд╕реНрддрд░ рдкрд░ рд╕рдорд╕реНрдпрд╛ рдХрд╛ рд╕рдорд╛рдзрд╛рди рд╣реЛ рдЬрд╛рдПрдЧрд╛ред

рдХреНрдпрд╛ рдЗрд╕рдХрд╛ рдПрдХ рд╕рдмрд╕реЗрдЯ рдмрдирд╛рдирд╛ рд╕рдВрднрд╡ рд╣реЛрдЧрд╛ рддрд╛рдХрд┐ ! рдХреЛ рд░рд┐рдЯрд░реНрди рдкреНрд░рдХрд╛рд░реЛрдВ рдореЗрдВ рдЯрд╛рдЗрдк рдкреИрд░рд╛рдореАрдЯрд░ рдХреЗ рд░реВрдк рдореЗрдВ рдЗрд╕реНрддреЗрдорд╛рд▓ рдХрд┐рдпрд╛ рдЬрд╛ рд╕рдХреЗ? рдЕрднреА рдпрджрд┐ рдЖрдкрдХреЗ рдкрд╛рд╕ рдПрдХ рд╕реНрдерд┐рд░ рдХрд╛рд░реНрдп рд╣реИ

fn foo() -> ! { ┬╖┬╖┬╖ }

рдФрд░ ? рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдирд╛ рдЪрд╛рд╣рддреЗ рд╣реИрдВ, рдЖрдк рд╕рд╛рдорд╛рдиреНрдп рдкрд░рд┐рд╡рд░реНрддрди рдирд╣реАрдВ рдХрд░ рд╕рдХрддреЗ

fn foo() -> io::Result<!> { ┬╖┬╖┬╖ }

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

40801 рдкрд░ рдЯрд┐рдХ рдХрд┐рдпрд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИред

! рд╕реНрдерд┐рд░ рдХрд░рдиреЗ рд╕реЗ рдкрд╣рд▓реЗ рд╣рдореЗрдВ #43061 рдХреЛ рдареАрдХ рдХрд░рдиреЗ рдХрд╛ рдкреНрд░рдпрд╛рд╕ рдХрд░рдирд╛ рдЪрд╛рд╣рд┐рдПред

рдореБрдЭреЗ рдХреЛрдИ рднреА рдЦреБрд▓рд╛ I-unsound рд╕рдорд╕реНрдпрд╛ рджрд┐рдЦрд╛рдИ рдирд╣реАрдВ рджреЗ рд░рд╣реА рдереА, рдЬрд┐рд╕рдореЗрдВ рдХрднреА рдирд╣реАрдВ_рдЯрд╛рдЗрдк рдХрд╛ рдЙрд▓реНрд▓реЗрдЦ рдХрд┐рдпрд╛ рдЧрдпрд╛ рдерд╛, рдЗрд╕рд▓рд┐рдП рдореИрдВрдиреЗ рдЗрд╕рдХреЗ рд▓рд┐рдП рдПрдХ рдирдпрд╛ рджрд╛рдпрд░ рдХрд┐рдпрд╛: #47563ред рдЪреАрдЬреЗрдВ рдорд╛рдирддреА рд╣реИрдВ рдХрд┐ [!; 0] рдирд┐рд░реНрдЬрди рд╣реИ рд▓реЗрдХрд┐рди рдореИрдВ рдПрдХ рд╕рд╛рдзрд╛рд░рдг [] рд╕рд╛рде рдПрдХ рдмрдирд╛ рд╕рдХрддрд╛ рд╣реВрдВред

@dtolnay рдиреЗ рд╣реЗрдбрд░ рдЬрд╛рд░реА рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдЬреЛрдбрд╝рд╛

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

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

рдРрд╕рд╛ рд▓рдЧрддрд╛ рд╣реИ рдХрд┐ @varkor рдХреЗ рдкрд╛рд╕ рдкрд╣рд▓реЗ рд╕реЗ рд╣реА рд╢реЗрд╖ рдореБрджреНрджреЛрдВ рдХреЛ рдареАрдХ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП

рд╣рд╛рд▓рд╛рдВрдХрд┐ рдПрдХ рдФрд░ рдмрд╛рдд: рдХреНрдпрд╛ рд╣рдо рд░рди-рдЯрд╛рдЗрдо рдкрд░ mem::uninitialized::<!>() рдЖрддрдВрдХрд┐рдд рдХрд░рдирд╛ рдЪрд╛рд╣рддреЗ рд╣реИрдВ (рдпрд╣ рд╡рд░реНрддрдорд╛рди рдореЗрдВ рдпреВрдмреА рдХрд╛ рдХрд╛рд░рдг рдмрдирддрд╛ рд╣реИ)? рдпрд╛ рдХреНрдпрд╛ рд╣рдореЗрдВ рдЗрд╕ рддрд░рд╣ рдХреЗ рдмрджрд▓рд╛рд╡реЛрдВ рдХреЛ рдЕрднреА рдХреЗ рд▓рд┐рдП рдЫреЛрдбрд╝ рджреЗрдирд╛ рдЪрд╛рд╣рд┐рдП? рдЕрд╕реБрд░рдХреНрд╖рд┐рдд рдХреЛрдб рджрд┐рд╢рд╛рдирд┐рд░реНрджреЗрд╢ рд╕рд╛рдордЧреНрд░реА рдХреЗ рд╕рд╛рде рдХреНрдпрд╛ рд╣реЛ рд░рд╣рд╛ рд╣реИ, рдЗрд╕рдХреЗ рд╕рд╛рде рдореИрдВ рдЕрдк-рдЯреВ-рд╕реНрдкреАрдб рдирд╣реАрдВ рд╣реВрдВред

рдореБрдЭреЗ рд▓рдЧрддрд╛ рд╣реИ рдХрд┐ рдпреЛрдЬрдирд╛ рдЕрднреА рднреА https://github.com/rust-lang/rfcs/pull/1892 рд╣реИ , рдЬрд┐рд╕реЗ рдореИрдВрдиреЗ рдЕрднреА рджреЗрдЦрд╛ рд╣реИ рдХрд┐ рдЖрдкрдиреЗ рд▓рд┐рдЦрд╛ рд╣реИред :)

@ рд░рд╛рд▓реНрдлрдЬрдВрдЧ рдХреНрдпрд╛ рд╡рд┐рд╢реЗрд╖ рд░реВрдк рд╕реЗ рдЗрд╕реЗ рдЕрд╡рд░реБрджреНрдз рдХрд░рдиреЗ рдореЗрдВ рдХреБрдЫ рднреА рд╣реИ? рдореИрдВ рдЖрдЬ рдЬреЛ рдХрд╣рддреЗ рд╣реИрдВ рдПрдХ рдЬрдирд╕рдВрдкрд░реНрдХ рд▓рд┐рдЦ рд╕рдХрддрд╛ рд╣реИ MaybeUninit рдФрд░ deprecates uninitialized ред

@canndrew рдЪреВрдВрдХрд┐ рдХрдИ рдкрд░рд┐рдпреЛрдЬрдирд╛рдПрдВ рд╕рднреА рддреАрди рд░рд┐рд▓реАрдЬ рдЪреИрдирд▓реЛрдВ рдХрд╛ рд╕рдорд░реНрдерди рдХрд░рдирд╛ рдЪрд╛рд╣рддреА рд╣реИрдВ рдФрд░ uninitialized рд╕реНрдерд┐рд░ рдкрд░ рдЙрдкрд▓рдмреНрдз рд╣реИ, рд╕реНрдерд┐рд░ рдЪреИрдирд▓ рдкрд░ рдкреНрд░рддрд┐рд╕реНрдерд╛рдкрди рдЙрдкрд▓рдмреНрдз рд╣реЛрдиреЗ рдХреЗ рдмрд╛рдж рдХреЗрд╡рд▓ рдирд╛рдЗрдЯрд▓реА рдкрд░ рдмрд╣рд┐рд╖реНрдХрд░рдг рдЪреЗрддрд╛рд╡рдирд┐рдпрд╛рдВ рд╢реБрд░реВ рдХрд░рдирд╛ рдмреЗрд╣рддрд░ рд╣реЛрддрд╛ рд╣реИред рдбреЙрдХреНрдЯрд░-рдЯрд┐рдкреНрдкрдгрд┐рдпреЛрдВ рдХреЗ рдорд╛рдзреНрдпрдо рд╕реЗ рдирд░рдо рдмрд╣рд┐рд╖реНрдХрд░рдг рдареАрдХ рд╣реИред

рдореИрдВрдиреЗ ! рдХреЛ рд╕реНрдерд┐рд░ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдПрдХ рдкреАрдЖрд░ рдмрдирд╛рдпрд╛ рд╣реИ: https://github.com/rust-lang/rust/pull/47630ред рдореБрдЭреЗ рдирд╣реАрдВ рдкрддрд╛ рдХрд┐ рдХреНрдпрд╛ рд╣рдо рдЗрд╕реЗ рдЕрднреА рддрдХ рдорд░реНрдЬ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рддреИрдпрд╛рд░ рд╣реИрдВред рд╣рдореЗрдВ рдХрдо рд╕реЗ рдХрдо рдпрд╣ рджреЗрдЦрдиреЗ рдХреЗ рд▓рд┐рдП рдЗрдВрддрдЬрд╛рд░ рдХрд░рдирд╛ рдЪрд╛рд╣рд┐рдП рдХрд┐ рдХреНрдпрд╛ @varkor рдХреЗ рдкреАрдЖрд░ рд╢реЗрд╖ рдЦреБрд▓реЗ рдореБрджреНрджреЛрдВ рдХреЛ рдареАрдХ рдХрд░рддреЗ рд╣реИрдВред

рдореБрдЭреЗ рдпрд╣ рднреА рд▓рдЧрддрд╛ рд╣реИ рдХрд┐ рд╣рдореЗрдВ https://github.com/rust-lang/rfcs/pull/1699 рдкрд░ рдлрд┐рд░ рд╕реЗ рдЬрд╛рдирд╛ рдЪрд╛рд╣рд┐рдП рддрд╛рдХрд┐ рд▓реЛрдЧ ! рд▓рд┐рдП рд╕реБрд░реБрдЪрд┐рдкреВрд░реНрдг рд╡рд┐рд╢реЗрд╖рддрд╛ impls рд▓рд┐рдЦрдирд╛ рд╢реБрд░реВ рдХрд░ рд╕рдХреЗрдВред

@canndrew : рд╣рд╛рд▓рд╛рдВрдХрд┐ рдЙрд╕ рдЖрд░рдПрдлрд╕реА рдХреЛ рд╕реНрд╡реАрдХрд╛рд░ рдирд╣реАрдВ рдХрд┐рдпрд╛ рдЧрдпрд╛ рдерд╛, рдпрд╣ рдЙрд▓реНрд▓реЗрдЦрдиреАрдп рд░реВрдк рд╕реЗ https://github.com/rust-lang/rust/issues/20021 рдореЗрдВ рдкреНрд░рд╕реНрддрд╛рд╡ рдХреЗ рд╕рдорд╛рди рджрд┐рдЦрддрд╛ рд╣реИ

https://github.com/rust-lang/rust/issues/36479 рдХреЛ рд╢рд╛рдпрдж рдЗрд╢реНрдпреВ рд╣реЗрдбрд░ рдореЗрдВ рднреА рдЬреЛрдбрд╝рд╛ рдЬрд╛рдирд╛ рдЪрд╛рд╣рд┐рдПред

@varkor рдпрд╣ рдмрд╣реБрдд рд╕рдорд╛рди рд╣реИред рдЕрдкрдиреЗ рдЕрдЧрдореНрдп рдХреЛрдб рдХрд╛рд░реНрдп рдХреЗ рд╕рд╛рде рдХреНрдпрд╛ рдЖрдкрдиреЗ рдЗрд╕ рддрд░рд╣ рдХреЗ рдХреЛрдб рдХреЗ рд╕рд╛рде рдХреЛрдИ рд╕рдорд╕реНрдпрд╛ рджреЗрдЦреА рд╣реИ рдЬрд┐рд╕реЗ рдЕрдм рдЕрдЧрдореНрдп рдХреЗ рд░реВрдк рдореЗрдВ рдЪрд┐рд╣реНрдирд┐рдд рдХрд┐рдпрд╛ рдЬрд╛ рд░рд╣рд╛ рд╣реИ ?:

impl fmt::Debug for ! {
    fn fmt(&self, f: &mut fmt::Formatter) -> fmt::Result {
        *self    // unreachable!
    }
}

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

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

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

рдХреНрдпрд╛ рдЖрдкрдХреЛ рд▓рдЧрддрд╛ рд╣реИ рдХрд┐ рдЖрдк рдРрд╕рд╛ рдХреБрдЫ рдмрдирд╛рдиреЗ рдХреА рдХреЛрд╢рд┐рд╢ рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ? рдпрджрд┐ рдЖрдк рдХрд┐рд╕реА рдкреНрд░рдХрд╛рд░ рдХреА "рд░реВрдкрд░реЗрдЦрд╛" рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рдкрд╕рдВрдж рдХрд░рддреЗ рд╣реИрдВ, рддреЛ рд╣рдо рдПрдХ рд╕рд╛рде рдереЛрдбрд╝реА рдмрд╛рддрдЪреАрдд рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ -- рдпрд╛ рд╢рд╛рдпрдж рдореИрдВ рдЗрд╕реЗ рд╕реНрдХреЗрдЪ рдХрд░рдиреЗ рдХрд╛ рдкреНрд░рдпрд╛рд╕ рдХрд░ рд╕рдХрддрд╛ рд╣реВрдВред

рд╕рдВрдмрдВрдзрд┐рдд рдкреНрд░рд╢реНрди: рдХреНрдпрд╛ рд╣рдореЗрдВ рд╕реНрдерд┐рд░ рд╣реЛрдиреЗ рд╕реЗ рдкрд╣рд▓реЗ https://github.com/rust-lang/rust/issues/46325 рдХреЛ рд╣рд▓ рдХрд░рдиреЗ рдХрд╛ рдкреНрд░рдпрд╛рд╕ рдХрд░рдирд╛ рдЪрд╛рд╣рд┐рдП? рд╢рд╛рдпрдж рдХреЛрдИ рдлрд░реНрдХ рдирд╣реАрдВ рдкрдбрд╝рддрд╛ред

@nikomatsakis рдореИрдВ рдХрд┐рд╕реА рднреА рдЪреЗрддрд╛рд╡рдиреА рдХреА рдкреНрд░рддреАрдХреНрд╖рд╛ рди рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рд╡реЛрдЯ

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

@nikomatsakis

рдХреНрдпрд╛ рдЖрдкрдХреЛ рд▓рдЧрддрд╛ рд╣реИ рдХрд┐ рдЖрдк рдРрд╕рд╛ рдХреБрдЫ рдмрдирд╛рдиреЗ рдХреА рдХреЛрд╢рд┐рд╢ рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ? рдпрджрд┐ рдЖрдк рдХрд┐рд╕реА рдкреНрд░рдХрд╛рд░ рдХреА "рд░реВрдкрд░реЗрдЦрд╛" рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рдкрд╕рдВрдж рдХрд░рддреЗ рд╣реИрдВ, рддреЛ рд╣рдо рдПрдХ рд╕рд╛рде рдереЛрдбрд╝реА рдмрд╛рддрдЪреАрдд рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ -- рдпрд╛ рд╢рд╛рдпрдж рдореИрдВ рдЗрд╕реЗ рд╕реНрдХреЗрдЪ рдХрд░рдиреЗ рдХрд╛ рдкреНрд░рдпрд╛рд╕ рдХрд░ рд╕рдХрддрд╛ рд╣реВрдВред

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

@nikomatsakis рдРрд╕рд╛ рдХреБрдЫ?

рд╕рд╛рд░рд╛рдВрд╢ рдореБрджреНрджрд╛ - ! рд╕реНрдерд┐рд░реАрдХрд░рдг

рдХреНрдпрд╛ рд╕реНрдерд┐рд░ рдХрд┐рдпрд╛ рдЬрд╛ рд░рд╣рд╛ рд╣реИ

  • ! рдЕрдм рдПрдХ рдкреВрд░реНрдг рдкреНрд░рдХрд╛рд░ рд╣реИ рдФрд░ рдЕрдм рдЗрд╕реЗ рдХрд┐рд╕реА рднреА рдкреНрд░рдХрд╛рд░ рдХреА рд╕реНрдерд┐рддрд┐ (рдЬреИрд╕реЗ RFC 1216 ) рдореЗрдВ рдЙрдкрдпреЛрдЧ рдХрд┐рдпрд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИред ! рдкреНрд░рдХрд╛рд░ рдХрд┐рд╕реА рднреА рдЕрдиреНрдп рдкреНрд░рдХрд╛рд░ рдореЗрдВ рдЬрд╝рдмрд░рджрд╕реНрддреА рдХрд░ рд╕рдХрддрд╛ рд╣реИ, рдЙрджрд╛рд╣рд░рдг рдХреЗ рд▓рд┐рдП https://github.com/rust-lang/rust/tree/master/src/test/run-fail/adjust_never.rs рджреЗрдЦреЗрдВред
  • рдкреНрд░рдХрд╛рд░ рдирд┐рд╖реНрдХрд░реНрд╖ рдЕрдм рд╕реНрд╡реЗрдЪреНрдЫрд╛рдкреВрд░реНрдг рдкреНрд░рдХрд╛рд░ рдЪрд░ рд▓рд╛рдЧреВ рд╣реЛ рдЬрд╛рдПрдЧреА ! рдХреЗ рдмрдЬрд╛рдп () ред resolve_trait_on_defaulted_unit рд▓рд┐рдВрдЯ рдХреЛ рд╣рдЯрд╛ рджрд┐рдпрд╛ рдЧрдпрд╛ рд╣реИред рдпрд╣ рдХрд╣рд╛рдВ рдЖрддрд╛ рд╣реИ рдЗрд╕рдХрд╛ рдПрдХ рдЙрджрд╛рд╣рд░рдг рдпрд╣ рд╣реИ рдХрд┐ рдпрджрд┐ рдЖрдкрдХреЗ рдкрд╛рд╕ рдХреБрдЫ рдРрд╕рд╛ рд╣реИ:

    // We didn't specify the type of `x`. Under some circumstances, type inference
    // will pick a type for us rather than erroring
    let x = Deserialize::deserialize(data);
    

    рдкреБрд░рд╛рдиреЗ рдирд┐рдпрдореЛрдВ рдХреЗ рддрд╣рдд рдпрд╣ рдПрдХ () рдХреЛ рдбрд┐рд╕реЗрд░рд┐рдПрд▓рд╛рдЗрдЬрд╝ рдХрд░реЗрдЧрд╛, рдЬрдмрдХрд┐ рдирдП рдирд┐рдпрдореЛрдВ рдХреЗ рддрд╣рдд рдпрд╣ рдПрдХ ! рдХреЛ рдбрд┐рд╕реЗрд░рд┐рдПрд▓рд╛рдЗрдЬрд╝ рдХрд░реЗрдЧрд╛ред

  • never_type рдлреАрдЪрд░ рдЧреЗрдЯ рд╕реНрдерд┐рд░ рд╣реИ, рд╣рд╛рд▓рд╛рдВрдХрд┐ рдЗрд╕рдХреЗ рдХреБрдЫ рд╡реНрдпрд╡рд╣рд╛рд░ рдЕрдм рдирдП exhaustive_patterns рдлреАрдЪрд░ рдЧреЗрдЯ рдХреЗ рдкреАрдЫреЗ рд░рд╣рддреЗ рд╣реИрдВ (рдиреАрдЪреЗ рджреЗрдЦреЗрдВ)ред

рдХреНрдпрд╛ рд╕реНрдерд┐рд░ рдирд╣реАрдВ рд╣реЛ рд░рд╣рд╛ рд╣реИ

  • рдирд┐рд░реНрдЬрди рдкреНрд░рдХрд╛рд░реЛрдВ рдХреЗ рд▓рд┐рдП рд╕рдВрдкреВрд░реНрдг рдкреИрдЯрд░реНрди-рдорд┐рд▓рд╛рдиред рдЙрджрд╛рд╣рд░рдг рдХреЗ рд▓рд┐рдП

    let x: Result<u32, !> = ...;
    let Ok(y) = x;
    

    рдпрд╣ рдХреЛрдб рдЕрднреА рднреА рд╢рд┐рдХрд╛рдпрдд рдХрд░реЗрдЧрд╛ рдХрд┐ Ok(_) рдПрдХ рдЦрдВрдбрди рдпреЛрдЧреНрдп рдкреИрдЯрд░реНрди рд╣реИред рдЗрд╕реЗ exhaustive_patterns рдлреАрдЪрд░ рдЧреЗрдЯ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдХреЗ рдареАрдХ рдХрд┐рдпрд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИред рдЗрд╕ рдореБрджреНрджреЗ рдкрд░ рдкреНрд░рдЧрддрд┐ рдХреЗ рд▓рд┐рдП RFC 1872 рджреЗрдЦреЗрдВред рдЯреЗрд╕реНрдЯрдХреЗрд╕ рдХреЗ рд▓рд┐рдП https://github.com/rust-lang/rust/tree/master/src/test/ui/feature-gate-exhaustive-patterns.rs рджреЗрдЦреЗрдВ рдЬреЛ рдкреБрд╖реНрдЯрд┐ рдХрд░рддрд╛ рд╣реИ рдХрд┐ рдпрд╣ рд╡реНрдпрд╡рд╣рд╛рд░ рдЕрднреА рднреА рдЧреЗрдЯреЗрдб рд╣реИред

рдХреНрдпрд╛ рд╣рдореЗрдВ рд╕реНрдерд┐рд░ рд╣реЛрдиреЗ рд╕реЗ рдкрд╣рд▓реЗ #46325 рдХреЛ рд╣рд▓ рдХрд░рдиреЗ рдХрд╛ рдкреНрд░рдпрд╛рд╕ рдХрд░рдирд╛ рдЪрд╛рд╣рд┐рдП?

рдЗрд╕ рддрд░рд╣ рд╣рд░ рдвреАрд▓реЗ рд╕рд┐рд░реЗ рдХреЛ рд╕рд╛рдл рдХрд░рдирд╛ рдЬрд┐рддрдирд╛ рдЕрдЪреНрдЫрд╛ рд╣реЛрдЧрд╛, рдпрд╣ рд╡рд╛рд╕реНрддрд╡ рдореЗрдВ рдЕрд╡рд░реЛрдзрдХ рдЬреИрд╕рд╛ рдирд╣реАрдВ рд▓рдЧрддрд╛ред

@canndrew

рдХреБрдЫ рдЗрд╕ рддрд░рд╣?

рд╣рд╛рдБ, рдзрдиреНрдпрд╡рд╛рдж! рдПрдХ рджрдо рдмрдврд╝рд┐рдпрд╛ред

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

@canndrew

рдЗрд╕ рддрд░рд╣ рд╣рд░ рдвреАрд▓реЗ рд╕рд┐рд░реЗ рдХреЛ рд╕рд╛рдл рдХрд░рдирд╛ рдЬрд┐рддрдирд╛ рдЕрдЪреНрдЫрд╛ рд╣реЛрдЧрд╛, рдпрд╣ рд╡рд╛рд╕реНрддрд╡ рдореЗрдВ рдЕрд╡рд░реЛрдзрдХ рдЬреИрд╕рд╛ рдирд╣реАрдВ рд▓рдЧрддрд╛ред

рдареАрдХ рд╣реИ, рдЗрд╕рдХрд╛ рдорддрд▓рдм рд╣реИ рдХрд┐ рд╣рдо рдирдП рдХреЛрдб рдХреЛ рд╕рдХреНрд╖рдо рдХрд░реЗрдВрдЧреЗ рдЬреЛ рд╡реНрдпрд╡рд╣рд╛рд░ рдХреЛ рддреБрд░рдВрдд рдмрджрд▓рдиреЗ рд╡рд╛рд▓рд╛ рд╣реИ (рдЙрджрд╛рд╣рд░рдг рдХреЗ рд▓рд┐рдП, let x: ! = ... рдХреНрдпрд╛ рдореБрдЭреЗ рд▓рдЧрддрд╛ рд╣реИ рдХрд┐ рдХреБрдЫ рдЕрднрд┐рд╡реНрдпрдХреНрддрд┐рдпреЛрдВ рдХреЗ рд▓рд┐рдП рдЕрд▓рдЧ рд╡реНрдпрд╡рд╣рд╛рд░ рд╣реЛрдЧрд╛)ред рдЕрдЧрд░ рд╣рдо рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ рддреЛ рд╣рд▓ рдХрд░рдирд╛ рд╕рдмрд╕реЗ рдЕрдЪреНрдЫрд╛ рд▓рдЧрддрд╛ рд╣реИред рд╣реЛ рд╕рдХрддрд╛ рд╣реИ рдХрд┐ рдЖрдкрдХреЗ рджреНрд╡рд╛рд░рд╛ рдЦреЛрд▓реЗ рдЧрдП рдкреАрдЖрд░ рдкрд░ рдЖрдк рдЗрд╕реЗ рдПрдХ рдХрдард┐рди рддреНрд░реБрдЯрд┐ рдмрдирд╛ рд╕рдХрддреЗ рд╣реИрдВ рдФрд░ рд╣рдо рдЗрд╕реЗ рдкреАрдЖрд░ рдкрд░ рдЪрд▓рдиреЗ рд╡рд╛рд▓реЗ рдореМрдЬреВрджрд╛ рдХреНрд░реЗрдЯрд░ рдХреЗ рд╕рд╛рде рдЬреЛрдбрд╝ рд╕рдХрддреЗ рд╣реИрдВ?

@nikomatsakis рдореИрдВрдиреЗ рдХреБрдЫ рд▓рд┐рдВрдХ рдФрд░ рдЙрджрд╛рд╣рд░рдгреЛрдВ рдХреЗ рд╕рд╛рде рдЙрд╕ рд╕рд╛рд░рд╛рдВрд╢ рдореБрджреНрджреЗ рдХреЛ рдлрд┐рд░ рд╕реЗ рдЕрдкрдбреЗрдЯ рдХрд┐рдпрд╛ рд╣реИред рдЗрд╕рдХреЗ рдЕрд▓рд╛рд╡рд╛, рдЦреЗрдж рд╣реИ рдХрд┐ рдореБрдЭреЗ рдЗрд╕ рддрдХ рдкрд╣реБрдВрдЪрдиреЗ рдореЗрдВ рдереЛрдбрд╝рд╛ рд╕рдордп рд▓рдЧрд╛, рдореИрдВ рдкрд┐рдЫрд▓реЗ рд╕рдкреНрддрд╛рд╣ рдмрд╣реБрдд рд╡реНрдпрд╕реНрдд рд░рд╣рд╛ рд╣реВрдВред

рд╣реЛ рд╕рдХрддрд╛ рд╣реИ рдХрд┐ рдЖрдкрдХреЗ рджреНрд╡рд╛рд░рд╛ рдЦреЛрд▓реЗ рдЧрдП рдкреАрдЖрд░ рдкрд░ рдЖрдк рдЗрд╕реЗ рдПрдХ рдХрдард┐рди рддреНрд░реБрдЯрд┐ рдмрдирд╛ рд╕рдХрддреЗ рд╣реИрдВ рдФрд░ рд╣рдо рдЗрд╕реЗ рдкреАрдЖрд░ рдкрд░ рдЪрд▓рдиреЗ рд╡рд╛рд▓реЗ рдореМрдЬреВрджрд╛ рдХреНрд░реЗрдЯрд░ рдХреЗ рд╕рд╛рде рдЬреЛрдбрд╝ рд╕рдХрддреЗ рд╣реИрдВ?

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

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

рдореЗрд░рд╛ рдкреНрд░рд╕реНрддрд╛рд╡ рд╣реИ рдХрд┐ рд╣рдо ! рдкреНрд░рдХрд╛рд░ -- рдпрд╛ рдЙрд╕рдХреЗ рдХрдо рд╕реЗ рдХрдо рд╣рд┐рд╕реНрд╕реЗ рдХреЛ рд╕реНрдерд┐рд░ рдХрд░реЗрдВ, рдЬреИрд╕рд╛ рдХрд┐ рдпрд╣рд╛рдВ рдмрддрд╛рдпрд╛ рдЧрдпрд╛ рд╣реИ ред рдкреАрдЖрд░ рдпрд╣рд╛рдБ рд╣реИ ред

рдПрдХ рдмрд┐рдЯ рдбреЗрдЯрд╛ рдЬреЛ рдореИрдВ рдЪрд╛рд╣реВрдВрдЧрд╛ рд╡рд╣ рд╣реИ рдХреНрд░реЗрдЯрд░ рд░рдиред рдореИрдВ https://github.com/rust-lang/rust/pull/47630 рдХреЛ рдлрд┐рд░ рд╕реЗ рдмреЗрд╕ рдХрд░рдиреЗ рдХреА рдкреНрд░рдХреНрд░рд┐рдпрд╛ рдореЗрдВ рд╣реВрдВ (рдЪреВрдВрдХрд┐

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

  • [x] @рдХрд┐рдореБрдВрдбреА
  • [рдПрдХреНрд╕] @ рдПрд▓реЗрдХреНрд╕рдХреНрд░рд┐рдЪрдЯрди
  • [ ] @ рдЕрдЯреБрд░реЙрди
  • [рдПрдХреНрд╕] @ рдХреНрд░реИрдорд░реНрдЯрдЬ
  • [x] @dtolnay
  • [x] @eddyb
  • [x] @nikomatsakis
  • [рдПрдХреНрд╕] @ рдПрдирдЖрд░рд╕реА
  • [ ] @pkfelix
  • [x] @sfackler
  • [x] @ рдирд╛рд╡реЛрдВ рдХреЗ рдмрд┐рдирд╛

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

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

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

рдУрд╣, рдХреБрдЫ рдмрд╛рддреЗрдВ рдЬреЛ рдореБрдЭреЗ рдЕрднреА-рдЕрднреА рдпрд╛рдж рдЖрдИрдВ:

  • рд╣рдореЗрдВ рдЗрд╕реЗ рдирдП рдпреБрдЧ рдореЗрдВ рд╣реА рд╕реНрдерд┐рд░ рдХрд░рдиреЗ рдХреЗ рд╡рд┐рдЪрд╛рд░ рдкрд░ рд╡рд┐рдЪрд╛рд░ рдХрд░рдирд╛ рдЪрд╛рд╣рд┐рдПред рд╡рд┐рд╢реЗрд╖ рд░реВрдк рд╕реЗ, рдлрд╝реЙрд▓рдмреИрдХ рдирд┐рдпрдореЛрдВ рдореЗрдВ рдкрд░рд┐рд╡рд░реНрддрди рдмреИрдХрд╡рд░реНрдб рдЕрд╕рдВрдЧрдд рд╣реИрдВ - рдХреНрд░реЗрдЯрд░ рд░рди рд╣рдореЗрдВ рдлреЙрд▓рдЖрдЙрдЯ рдкрд░ рдХрд┐рд╕реА рдкреНрд░рдХрд╛рд░ рдХрд╛ рдирд┐рдЪрд▓рд╛ рдмрд╛рдЙрдВрдб рджреЗрдЧрд╛, рд▓реЗрдХрд┐рди рдпрд╣ рдХреЗрд╡рд▓ рдПрдХ рдирд┐рдЪрд▓рд╛ рдмрд╛рдЙрдВрдб рд╣реИред рд▓реЗрдХрд┐рди рд╣реЛ рд╕рдХрддрд╛ рд╣реИ рдХрд┐ рдЬрдм рддрдХ рдЖрдк рдирдП рдпреБрдЧ рдореЗрдВ рди рд╣реЛрдВ, рд╣рдо рдкреБрд░рд╛рдиреЗ рдлреЙрд▓рдмреИрдХ рдирд┐рдпрдореЛрдВ рдХреЛ рд╣реА рд░рдЦ рд╕рдХрддреЗ рд╣реИрдВред
  • рджреВрд╕рд░рд╛, рдореЗрд░рд╛ рдорд╛рдирдирд╛ тАЛтАЛтАЛтАЛрд╣реИ рдХрд┐ рдпрд╣рд╛рдВ рдпреЛрдЬрдирд╛ рдХрд╛ рдПрдХ рд╣рд┐рд╕реНрд╕рд╛ рдпрд╣ рднреА рдерд╛ рдХрд┐ ! рд▓рд┐рдП рдПрдХ рд╡рд┐рд╢реЗрд╖рддрд╛ рдХреЛ рд▓рд╛рдЧреВ рдХрд░рдирд╛ рдЙрдЪрд┐рдд рд╣реЛ, рдЗрд╕рдХреЗ рд▓рд┐рдП рдХреБрдЫ рджрд┐рд╢рд╛рдирд┐рд░реНрджреЗрд╢ рд╣реЛрдВред рдЯреАрдПрд▓; рдбреАрдЖрд░ рдпрд╣ рд╣реИ рдХрд┐ рдпрд╣ рдареАрдХ рд╣реИ рдпрджрд┐ рд╡рд┐рд╢реЗрд╖рддрд╛ рдореЗрдВ рд╡рд┐рдзрд┐рдпрд╛рдВ рдкрд╣рд▓реЗ ! рдореВрд▓реНрдп рдХреА рдЖрдкреВрд░реНрддрд┐ рдХреЗ рдмрд┐рдирд╛ рдЕрдиреБрдкрдпреЛрдЧреА рд╣реИрдВ - рдЗрд╕рд▓рд┐рдП Clone рдХреЛ ! рд▓рд┐рдП рд▓рд╛рдЧреВ рдХрд░рдирд╛ рдареАрдХ рд╣реИ, рдореБрдЭреЗ рд▓рдЧрддрд╛ рд╣реИ , рд▓реЗрдХрд┐рди Default рдХреЛ рд▓рд╛рдЧреВ рдХрд░рдирд╛ рдирд╣реАрдВ рд╣реИред рдПрдХ рдФрд░ рддрд░реАрдХрд╛ рд░рдЦреЛ, рдЕрдЧрд░ рдЗрдореНрдкреНрд▓рд╛рдВрдЯ рдХреЛ рд▓рд╛рдЧреВ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдЖрдкрдХреЛ рдЕрдВрдзрд╛рдзреБрдВрдз рд░реВрдк рд╕реЗ panic! рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реЛрдЧреА, рддреЛ рдпрд╣ рдПрдХ рдмреБрд░рд╛ рд╕рдВрдХреЗрдд рд╣реИред =)

@nikomatsakis рдХреНрдпрд╛ рд╣рдо рдПрдХ рдирдП рдпреБрдЧ рдореЗрдВ рдлрд╝реЙрд▓рдмреИрдХ рдирд┐рдпрдо рдмрджрд▓ рд╕рдХрддреЗ рд╣реИрдВ рд▓реЗрдХрд┐рди рдлрд┐рд░ рднреА 2015 рдХреЗ рдпреБрдЧ рдореЗрдВ рдЙрдкрд▓рдмреНрдз рдкреНрд░рдХрд╛рд░ рдХреЗ рд░реВрдк рдореЗрдВ ! ?

@nikomatsakis

рд╣рдореЗрдВ рдЗрд╕реЗ рдирдП рдпреБрдЧ рдореЗрдВ рд╣реА рд╕реНрдерд┐рд░ рдХрд░рдиреЗ рдХреЗ рд╡рд┐рдЪрд╛рд░ рдкрд░ рд╡рд┐рдЪрд╛рд░ рдХрд░рдирд╛ рдЪрд╛рд╣рд┐рдПред

рдкрд┐рдЫрд▓реА рдмрд╛рд░ рд╣рдордиреЗ рдПрдХ рдХреНрд░реЗрдЯрд░ рд░рди рдХрд┐рдпрд╛ рдерд╛ (рдЬреЛ рдмрд╣реБрдд рд╕рдордп рдкрд╣рд▓реЗ рдерд╛) рдлреЙрд▓рдмреИрдХ рдирд┐рдпрдореЛрдВ рдХреЛ рдмрджрд▓рдиреЗ рд╕реЗ рдирддреАрдЬрд╛ рдХрд╛рдлреА рдХрдо рдерд╛ред рд╣рдо рдЙрд╕ рдХреЛрдб рдХрд╛ рднреА рд╡рд┐рд░реЛрдз рдХрд░ рд░рд╣реЗ рд╣реИрдВ рдЬреЛ рдХреБрдЫ рд╕рдордп рдХреЗ рд▓рд┐рдП рдкрд░рд┐рд╡рд░реНрддрди рд╕реЗ рдкреНрд░рднрд╛рд╡рд┐рдд рд╣реЛ рд╕рдХрддрд╛ рд╣реИред

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

! рд▓рд┐рдП рдбреЙрдХреНрд╕ рдореЗрдВ рдЗрд╕рдХрд╛ рдЙрд▓реНрд▓реЗрдЦ рдХрд┐рдпрд╛

@SimonSapin

рдХреНрдпрд╛ рд╣рдо рдПрдХ рдирдП рдпреБрдЧ рдореЗрдВ рдлрд╝реЙрд▓рдмреИрдХ рдирд┐рдпрдо рдмрджрд▓ рд╕рдХрддреЗ рд╣реИрдВ рд▓реЗрдХрд┐рди рдлрд┐рд░ рднреА рдмрдирд╛ рд╕рдХрддреЗ рд╣реИрдВ ! 2015 рдХреЗ рдпреБрдЧ рдореЗрдВ рдЙрдкрд▓рдмреНрдз рдПрдХ рдкреНрд░рдХрд╛рд░ рдХреЗ рд░реВрдк рдореЗрдВ?

рд╣рд╛рдВ

@canndrew

рдкрд┐рдЫрд▓реА рдмрд╛рд░ рд╣рдордиреЗ рдПрдХ рдХреНрд░реЗрдЯрд░ рд░рди рдХрд┐рдпрд╛ рдерд╛ (рдЬреЛ рдмрд╣реБрдд рд╕рдордп рдкрд╣рд▓реЗ рдерд╛) рдлреЙрд▓рдмреИрдХ рдирд┐рдпрдореЛрдВ рдХреЛ рдмрджрд▓рдиреЗ рд╕реЗ рдирддреАрдЬрд╛ рдХрд╛рдлреА рдХрдо рдерд╛ред рд╣рдо рдЙрд╕ рдХреЛрдб рдХрд╛ рднреА рд╡рд┐рд░реЛрдз рдХрд░ рд░рд╣реЗ рд╣реИрдВ рдЬреЛ рдХреБрдЫ рд╕рдордп рдХреЗ рд▓рд┐рдП рдкрд░рд┐рд╡рд░реНрддрди рд╕реЗ рдкреНрд░рднрд╛рд╡рд┐рдд рд╣реЛ рд╕рдХрддрд╛ рд╣реИред

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

рдЯреАрдПрд▓; рдбреАрдЖрд░ рдпрд╣ рд╣реИ рдХрд┐ рдпрд╣ рдареАрдХ рд╣реИ рдпрджрд┐ рд╡рд┐рд╢реЗрд╖рддрд╛ рдореЗрдВ рд╡рд┐рдзрд┐рдпрд╛рдВ рдкрд╣рд▓реЗ ! рдореВрд▓реНрдп рдХреА рдЖрдкреВрд░реНрддрд┐ рдХрд┐рдП рдмрд┐рдирд╛ рдЕрдиреБрдкрдпреЛрдЧреА рд╣реИрдВ

рдпрд╣ рд╕рд┐рд░реНрдл рд╕рд╛рдорд╛рдиреНрдп рдирд┐рдпрдо рд╣реИ - рдЬрдм рдЖрдк рдЗрд╕реЗ рдПрдХ рд╕рдордЭрджрд╛рд░ рддрд░реАрдХреЗ рд╕реЗ рдХрд╛рд░реНрдпрд╛рдиреНрд╡рд┐рдд рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ, рддреЛ рдЖрдк рдПрдХ рдЗрдореНрдкреНрд▓рд╛рдВрдЯ рдЬреЛрдбрд╝рддреЗ рд╣реИрдВ, рдЬрд╣рд╛рдВ "рдЗрд╕реЗ рдПрдХ рд╕рдордЭрджрд╛рд░ рддрд░реАрдХреЗ рд╕реЗ рдХрд╛рд░реНрдпрд╛рдиреНрд╡рд┐рдд рдХрд░реЗрдВ" рдШрдмрд░рд╛рд╣рдЯ рдХреЛ рдЫреЛрдбрд╝рдХрд░, рд▓реЗрдХрд┐рди рдЕрдорд╛рдиреНрдп рдбреЗрдЯрд╛ рдХреА рдЙрдкрд╕реНрдерд┐рддрд┐ рдореЗрдВ "рдкреВрд░реНрд╡ рдЭреВрдард╛" рдпреВрдмреА рд╢рд╛рдорд┐рд▓ рд╣реИред

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

рд╣реЛ рд╕рдХрддрд╛ рд╣реИ рдХрд┐ рдпрд╣ рдПрдХ рд╕реБрд░рдХреНрд╖рд┐рдд рд╡рд┐рдзрд┐ fn absurd(x: !) -> ! рдЬреЛ рдХрд┐ рдкрд╣реБрдВрдЪрдиреЗ рдпреЛрдЧреНрдп рдХреЛрдб рдХреЛ рд╡реНрдпрдХреНрдд рдХрд░рдиреЗ рдХрд╛ рдПрдХ рд╕реБрд░рдХреНрд╖рд┐рдд рддрд░реАрдХрд╛ рд╣реЛрдиреЗ рдХреЗ рд▓рд┐рдП рдкреНрд░рд▓реЗрдЦрд┐рдд рд╣реИ рдпрд╛ рддреЛ рдХрд╣реАрдВ libstd рдореЗрдВ? рдореБрдЭреЗ рд▓рдЧрддрд╛ рд╣реИ рдХрд┐ рдЙрд╕рдХреЗ рд▓рд┐рдП рдПрдХ рдЖрд░рдПрдлрд╕реА рдерд╛ ... рдпрд╛ рдХрдо рд╕реЗ рдХрдо рдПрдХ рдЖрд░рдПрдлрд╕реА рдореБрджреНрджрд╛: https://github.com/rust-lang/rfcs/issues/1385

@RalfJung рдХреНрдпрд╛ рд╡рд╣ absurd рдлрд╝рдВрдХреНрд╢рди рдХреЗрд╡рд▓ identity ? рдпрд╣ рдЙрдкрдпреЛрдЧреА рдХреНрдпреЛрдВ рд╣реИ?

рдпрд╣ unsafe fn unreachable() -> ! рдЖрдВрддрд░рд┐рдХ рдЬреИрд╕рд╛ рдирд╣реАрдВ рд╣реИ рдЬреЛ рдХреЛрдИ рддрд░реНрдХ рдирд╣реАрдВ рд▓реЗрддрд╛ рд╣реИ рдФрд░ рдмрд╣реБрдд рдЕрдкрд░рд┐рднрд╛рд╖рд┐рдд-рд╡реНрдпрд╡рд╣рд╛рд░ рд╣реИред

рдЦреИрд░, рд╣рд╛рдБ, рдпрд╣ рдЬреНрдпрд╛рджрд╛рддрд░ рд╣реИред рдореИрдВ "рд╕рдорд╛рдкреНрдд рдирд╣реАрдВ рд╣реЛрддрд╛" рдХреЗ рдЕрд░реНрде рдореЗрдВ ! рд╡рд╛рдкрд╕реА рдкреНрд░рдХрд╛рд░ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░ рд░рд╣рд╛ рдерд╛ред (рд╕рд╛рдорд╛рдиреНрдп рдкреНрд░рдХрд╛рд░ рдХрд╛ absurd fn absurd<T>(x: !) -> T , рд▓реЗрдХрд┐рди рдпрд╣ рдЬрдВрдЧ рдореЗрдВ рднреА рдЙрдкрдпреЛрдЧреА рдирд╣реАрдВ рд▓рдЧрддрд╛ рд╣реИред)

рдореИрдВ рд╕реЛрдЪ рд░рд╣рд╛ рдерд╛ рдХрд┐ рд╢рд╛рдпрдж рдпрд╣ " ! рдХреА рдЙрдкрд╕реНрдерд┐рддрд┐ рдореЗрдВ рд▓реЛрдЧреЛрдВ рдХреЛ рдЗрд╕ рддрд░рд╣ рдХреА рдЪреАрдЬреЛрдВ рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рднреНрд░рдорд┐рдд рд╣реЛрдиреЗ рдореЗрдВ рдорджрдж рдХрд░реЗрдЧрд╛ - рдХрд╣реАрдВ рдХреБрдЫ рджрд╕реНрддрд╛рд╡реЗрдЬ рд╣реЛрдиреЗ рдкрд░ "рдкреВрд░реНрд╡ рдЭреВрдард╛" рддрд░реНрдХ рдПрдХ рдЪреАрдЬ рд╣реИред

рдРрд╕рд╛ рд▓рдЧрддрд╛ рд╣реИ рдХрд┐ рдореБрдЭреЗ рднреА рдЧрд▓рдд рдореБрджреНрджрд╛ рдорд┐рд▓рд╛ рд╣реИ ... рдореИрдВрдиреЗ рд╕реЛрдЪрд╛ рдерд╛ рдХрд┐ рдЗрд╕ рддрд░рд╣ рдХреЗ "рдПрдХреНрд╕ рдлрд╛рд▓реНрд╕реЛ" рд╕рдорд╛рд░реЛрд╣ рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рдХрд╣реАрдВ рдЪрд░реНрдЪрд╛ рд╣реБрдИ рдереАред рдРрд╕рд╛ рд▓рдЧрддрд╛ рд╣реИ рдХрд┐ рдореИрдВ рдЧрд▓рдд рд╣реВрдБред

fn absurd<T>(x: !) -> T рдХреЛ match x {} рднреА рд▓рд┐рдЦрд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИ, рд▓реЗрдХрд┐рди рдЕрдЧрд░ рдЖрдкрдиреЗ рдЗрд╕реЗ рдкрд╣рд▓реЗ рдирд╣реАрдВ рджреЗрдЦрд╛ рд╣реИ рддреЛ рдЗрд╕рдХрд╛ рдкрддрд╛ рд▓рдЧрд╛рдирд╛ рдореБрд╢реНрдХрд┐рд▓ рд╣реИред рдпрд╣ рдХрдо рд╕реЗ рдХрдо рд░рд╕реНрдЯрдбреЙрдХ рдФрд░ рдХрд┐рддрд╛рдм рдореЗрдВ рдЗрдВрдЧрд┐рдд рдХрд░рдиреЗ рд▓рд╛рдпрдХ рд╣реИред

рдПрдлрдПрди рдмреЗрддреБрдХрд╛(x: !) -> T рдХреЛ рдореИрдЪ x {} рднреА рд▓рд┐рдЦрд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИ, рд▓реЗрдХрд┐рди рдЕрдЧрд░ рдЖрдкрдиреЗ рдЗрд╕реЗ рдкрд╣рд▓реЗ рдирд╣реАрдВ рджреЗрдЦрд╛ рд╣реИ рддреЛ рдЗрд╕рдХрд╛ рдкрддрд╛ рд▓рдЧрд╛рдирд╛ рдореБрд╢реНрдХрд┐рд▓ рд╣реИред

рдареАрдХ рд╣реИ, рдЗрд╕рд▓рд┐рдП рдореИрдВрдиреЗ libstd рдореЗрдВ рдХрд╣реАрдВ рдПрдХ рд╡рд┐рдзрд┐ рд╕реБрдЭрд╛рдИ рд╣реИред рд╣рд╛рд▓рд╛рдВрдХрд┐ рд╕реБрдирд┐рд╢реНрдЪрд┐рдд рдирд╣реАрдВ рд╣реИ рдХрд┐ рд╕рдмрд╕реЗ рдЕрдЪреНрдЫреА рдЬрдЧрд╣ рдХрд╣рд╛рдВ рд╣реИред

absurd рдмрд╛рд░реЗ рдореЗрдВ рдЕрдЪреНрдЫреА рдмрд╛рдд рдпрд╣ рд╣реИ рдХрд┐ рдЖрдк рдЗрд╕реЗ рдЙрдЪреНрдЪ-рдХреНрд░рдо рдХреЗ рдХрд╛рд░реНрдпреЛрдВ рдореЗрдВ рдкрд╛рд╕ рдХрд░ рд╕рдХрддреЗ рд╣реИрдВред рдореБрдЭреЗ рдпрдХреАрди рдирд╣реАрдВ рд╣реИ рдХрд┐ рдпрд╣ рд╣рдореЗрд╢рд╛ рдЬрд░реВрд░реА рд╣реИ рдХрд┐ рдХреИрд╕реЗ! рд░рд┐рдЯ рд╡реНрдпрд╡рд╣рд╛рд░ рдХрд░рддрд╛ рд╣реИред рдПрдХреАрдХрд░рдг, рдпрджреНрдпрдкрд┐ред

fn absurd<T>(x: !) -> T рдХреЛ match x {} рднреА рд▓рд┐рдЦрд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИ

рдЗрд╕реЗ рдХреЗрд╡рд▓ x (AFAIK) рдХреЗ рд░реВрдк рдореЗрдВ рднреА рд▓рд┐рдЦрд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИ - рдпрджрд┐ рдЖрдкрдХреЗ рдкрд╛рд╕ рдЦрд╛рд▓реА enum рддреЛ рдЖрдкрдХреЛ рдХреЗрд╡рд▓ match enum ред

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

рдЗрд╕реА рддрд░рд╣, рдореБрдЭреЗ рд▓рдЧрддрд╛ рд╣реИ рдХрд┐ Result -рдЬреИрд╕реЗ рдкреНрд░рдХрд╛рд░реЛрдВ рдореЗрдВ .infallible() рд╡рд┐рдзрд┐ рд╣реЛрдиреА рдЪрд╛рд╣рд┐рдП рдЬреЛ Result<T, !> рдХреЛ Result<T, E> рдкрд░рд┐рд╡рд░реНрддрд┐рдд рдХрд░рддреА рд╣реИред

рдкрд░рд┐рдгрд╛рдо рдЬреИрд╕реЗ рдкреНрд░рдХрд╛рд░реЛрдВ рдореЗрдВ рдПрдХ .infallible() рд╡рд┐рдзрд┐ рд╣реЛрдиреА рдЪрд╛рд╣рд┐рдП рдЬреЛ рдкрд░рд┐рдгрд╛рдо рдХреЛ рдкрд░рд┐рд╡рд░реНрддрд┐рдд рдХрд░рддреА рд╣реИрдирддреАрдЬреЗ рдкрд░.

рдореБрдЭреЗ рдЙрдореНрдореАрдж рд╣реИ рдХрд┐ рдЗрд╕ рддрд░рд╣ рдХреА рд╡рд┐рдзрд┐ Result<T, !> -> T рдЯрд╛рдЗрдк рдХрд░реЗрдЧреАред

рдореБрдЭреЗ рдЗрд╕ рддрд░рд╣ рдХреА рд╡рд┐рдзрд┐ рд╕реЗ рдкрд░рд┐рдгрд╛рдо рдЯрд╛рдЗрдк рдХрд░рдиреЗ рдХреА рдЙрдореНрдореАрдж рд╣реЛрдЧреА-> рдЯреА.

рдХреНрдпрд╛ рдпрд╣ unwrap рдЬреИрд╕рд╛ рд╣реА рдирд╣реАрдВ рд╣реИ? Err рдорд╛рдорд▓рд╛ рдкрд╣реБрдВрдЪ рд╕реЗ рдмрд╛рд╣рд░ рд╣реЛрдиреЗ рдХреЗ рдмрд╛рдж рд╕реЗ рдШрдмрд░рд╛рд╣рдЯ рдХреЛ рджреВрд░ рдХрд┐рдпрд╛ рдЬрд╛рдПрдЧрд╛ред

@Amanieu рдореБрджреНрджрд╛ рдпрд╣ рд╣реИ рдХрд┐ рд╢реБрд░реВ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдХреЛрдИ рдШрдмрд░рд╛рд╣рдЯ рдирд╣реАрдВ рд╣реИред рдореБрдЭреЗ рдкреИрдирд┐рдХ рд▓рд┐рдВрдЯ рдкрд╕рдВрдж рд╣реИ, рдФрд░ рдЕрдЧрд░ рд╣рдо рдСрдкреНрдЯрд┐рдорд╛рдЗрдЬрд╝реЗрд╢рди рдкрд░ рднрд░реЛрд╕рд╛ рдХрд░рддреЗ рд╣реИрдВ рддреЛ рдпрд╣ рдЯреНрд░рд┐рдк рд╣реЛ рдЬрд╛рдПрдЧрд╛ред рдпрд╣рд╛рдВ рддрдХ тАЛтАЛтАЛтАЛрдХрд┐ рд▓рд┐рдВрдЯ рдХреЗ рдмрд┐рдирд╛, unwrap рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдХреЗ рд░рд┐рдлреИрдХреНрдЯрд░ рдХреЗ рджреМрд░рд╛рди рдПрдХ рдлрд╝реБрдЯрдЧрди рдЬреЛрдбрд╝рддрд╛ рд╣реИ, рдХрдо рдЖрддрдВрдХ рдПрдХ рдмрд╛рд░ рдлрд┐рд░ рд╕реЗ рд▓рд╛рдЗрд╡ рдХреЛрдб рдмрди рдЬрд╛рддрд╛ рд╣реИред

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

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

@rfcbot FCP рд░рджреНрдж рдХрд░реЗрдВ

@aturon рдФрд░ @pkfelix рдиреЗ рдЕрдкрдиреЗ рдмреЙрдХреНрд╕ рдЪреЗрдХ рдирд╣реАрдВ рдХрд┐рдП рд╣реИрдВ.

@cramertj рдкреНрд░рд╕реНрддрд╛рд╡ рд░рджреНрдж рдХрд░ рджрд┐рдпрд╛ рдЧрдпрд╛ред

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

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

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

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

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

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

рд╣рдордиреЗ рдЖрдЬ рдХреА рдмреИрдардХ рдореЗрдВ рдЗрд╕ рдкрд░ рдЪрд░реНрдЪрд╛ рдХреАред рдореИрдВ рдЗрд╕ рдмрд╛рдд рдХреЛ рд▓реЗрдХрд░ рдлрдЯрд╛ рд╣реБрдЖ рд░рд╣рддрд╛ рд╣реВрдВ рдХрд┐ рдлреЙрд▓рдмреИрдХ рдХреЛ рдЕрднреА рдмрджрд▓реВрдВ рдпрд╛ рдХреЗрд╡рд▓ рдирдП рдпреБрдЧ рдореЗрдВред рдпрд╣рд╛рдБ рд╡рд┐рднрд┐рдиреНрди рдмрд┐рдВрджреБ рд╣реИрдВред

рдкрд░рд┐рд╡рд░реНрддрди рдХрд╛ рдЕрдкреЗрдХреНрд╖рд┐рдд рдкреНрд░рднрд╛рд╡ рдЫреЛрдЯрд╛ рд╣реИред рддреЛ рд╡рд╛рд╕реНрддрд╡ рдореЗрдВ рдпрд╣ рдХрд┐рд╕реА рднреА рддрд░рд╣ рд╕реЗ рдЬреНрдпрд╛рджрд╛ рдлрд░реНрдХ рдирд╣реАрдВ рдкрдбрд╝рддрд╛ рд╣реИред рдЖрдк рдпрд╣рд╛рдВ рдкреВрд░рд╛ рд╡рд┐рд╢реНрд▓реЗрд╖рдг рджреЗрдЦ рд╕рдХрддреЗ рд╣реИрдВ , рд▓реЗрдХрд┐рди рд╕рд╛рд░рд╛рдВрд╢ рдпрд╣ рд╣реИ:

рдФрд░ рд╡рд╣ рд╕рд┐рд░реНрдл рджреЛ рд╡рд╛рд╕реНрддрд╡рд┐рдХ рдкреНрд░рддрд┐рдЧрдорди рдЫреЛрдбрд╝ рджреЗрддрд╛ рд╣реИ: oplog-0.2.0 (рд╡рд╛рд╕реНрддрд╡ рдореЗрдВ рдпрд╣ рдЗрд╕рдХреА рдирд┐рд░реНрднрд░рддрд╛ bson-0.3.2 рд╣реИ рдЬреЛ рдЯреВрдЯрд╛ рд╣реБрдЖ рд╣реИ) рдФрд░ rspec-1.0.0-beta.4ред рдпреЗ рджреЛрдиреЛрдВ рдкреБрд░рд╛рдиреЗ рдлреЙрд▓рдмреИрдХ рд╡реНрдпрд╡рд╣рд╛рд░ рдкрд░ рднрд░реЛрд╕рд╛ рдХрд░ рд░рд╣реЗ рд╣реИрдВ, рд╣рд╛рд▓рд╛рдВрдХрд┐ рд╕реМрднрд╛рдЧреНрдп рд╕реЗ рд╡реЗ рд╕рдВрдХрд▓рди рд╕рдордп рдкрд░ рдЯреВрдЯ рд░рд╣реЗ рд╣реИрдВ, рд░рди рдЯрд╛рдЗрдо рдирд╣реАрдВред рдореИрдВ рдЗрди рдХреНрд░реЗрдЯреЛрдВ рдХреЛ рдареАрдХ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдкреАрдЖрд░ рдЬрдорд╛ рдХрд░реВрдВрдЧрд╛ред

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

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

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

рдореБрдЭреЗ рдкрддрд╛ рд╣реИ рдХрд┐ рдореИрдВ рдкрдХреНрд╖рдкрд╛рддреА рд╣реВрдВ, рд▓реЗрдХрд┐рди рдореИрдВ dyn Trait рдФрд░ catch рдЬреИрд╕реЗ рд╕рд╛рдорд╛рди рдХреА рддреБрд▓рдирд╛ рдореЗрдВ рдлрд╝реЙрд▓рдмреИрдХ рд╡реНрдпрд╡рд╣рд╛рд░ рдХреЛ рдПрдХ рдмрдЧрдлрд┐рдХреНрд╕ рдХреЗ рд░реВрдк рдореЗрдВ рдмрджрд▓ рд░рд╣рд╛ рд╣реВрдВред

рдЗрд╕рдХреЗ рдЕрд▓рд╛рд╡рд╛, рдЕрдЧрд░ рдХреЛрдИ рдЗрд╕ рдкрд░ рдХреВрджрдирд╛ рдЪрд╛рд╣рддрд╛ рд╣реИ рдФрд░ рдХрд╣рддрд╛ рд╣реИ, "рдЖрд╣ рд╣рд╛! рдЬрдВрдЧ рдкреАрдЫреЗ рдХреА рд╕рдВрдЧрддрддрд╛ рдХреЛ рддреЛрдбрд╝ рджреЗрддреА рд╣реИ! 1.0 рд╣рд┐рдЯ рд╣реЛрдиреЗ рдкрд░ рд╕реНрдерд┐рд░рддрд╛ рдХрд╛ рдЙрдирдХрд╛ рд╡рд╛рджрд╛ рдЭреВрда рдерд╛!" рддреЛ рдЗрд╕ рдореБрджреНрджреЗ рдкрд░ рдмрд╣реБрдд рд╣реА рд╡рд┐рдЪрд╛рд░рд╢реАрд▓ рдЪрд░реНрдЪрд╛ рд╕реЗ рдкрддрд╛ рдЪрд▓рддрд╛ рд╣реИ рдХрд┐ рдирд┐рд░реНрдгрдп рд╣рд▓реНрдХреЗ рдврдВрдЧ рд╕реЗ рдирд╣реАрдВ рдХрд┐рдпрд╛ рдЧрдпрд╛ рдерд╛, рдпрд╣рд╛рдВ рддрдХ тАЛтАЛтАЛтАЛрдХрд┐ рдирдЧрдгреНрдп рд╡реНрдпрд╛рд╡рд╣рд╛рд░рд┐рдХ рдкреНрд░рднрд╛рд╡ рднреА рдерд╛ред

рдареАрдХ рд╣реИ, рдореИрдВ рдХрд╣рддрд╛ рд╣реВрдБ рдЪрд▓реЛ рдЗрд╕реЗ рдмрджрд▓ рджреЗрддреЗ рд╣реИрдВред

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

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

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

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

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

рдореВрд▓ рд░реВрдк рд╕реЗ рдПрдХ рдмрд╣реБрдд рд╣реА рдиреНрдпреВрдирддрдо рд╕реЗрдЯ рд╣реЛрдирд╛ред

@nikomatsakis рдореИрдВрдиреЗ рдЕрднреА рдпрд╣рд╛рдВ рд╕рд╛рд░рд╛рдВрд╢ рдореБрджреНрджрд╛ рдмрдирд╛рдпрд╛ рд╣реИ: https://github.com/rust-lang/rust/issues/48950

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

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

рдПрдХ рдЙрджрд╛рд╣рд░рдг рдХреЗ рд░реВрдк рдореЗрдВ рджрд┐рдпрд╛ рдЧрдпрд╛

let foo: Result<String, (!, String)> = Ok("hello".to_owned());

рдпрд╣ рдЕрдзрд┐рдХ рд╕реНрдкрд╖реНрдЯ рд▓рд┐рдЦрдиреЗ рдХреА рдЕрдиреБрдорддрд┐ рджреЗрдЧрд╛

let bar: Result<String, String> = foo.map_err(|(!, _)| unreachable!());

рд╕рдВрднрд╛рд╡рд┐рдд рддреНрд░реБрдЯрд┐-рдкреНрд░рд╡рдг рдХреЗ рдмрдЬрд╛рдп

let bar: Result<String, String> = foo.map_err(|_| unreachable!());

рдпрд╛ рдереЛрдбрд╝рд╛ рдХрдо рддреНрд░реБрдЯрд┐-рдкреНрд░рд╡рдг

let bar: Result<String, String> = foo.map_err(|(e, _)| e);

рд╕рдВрдкрд╛рджрд┐рдд рдХрд░реЗрдВ: https://github.com/rust-lang/rfcs/pull/1872 рдХреЛ рдлрд┐рд░ рд╕реЗ рдкрдврд╝рдирд╛ рдЯрд┐рдкреНрдкрдгрд┐рдпреЛрдВ рдореЗрдВ ! рдкреИрдЯрд░реНрди рдХреЛ рдкреЗрд╢ рдХрд░рдиреЗ рдХрд╛ рдЙрд▓реНрд▓реЗрдЦ рд╣реИред рдпрд╣ рдкреВрд░реА рддрд░рд╣ рд╕реЗ match рдЕрднрд┐рд╡реНрдпрдХреНрддрд┐рдпреЛрдВ рдХреЗ рд╕рдВрджрд░реНрдн рдореЗрдВ рд╣реИ, рдореБрдЭреЗ рдпрдХреАрди рдирд╣реАрдВ рд╣реИ рдХрд┐ рдпрд╣ рдмрдВрдж/рдХрд╛рд░реНрдп рддрд░реНрдХреЛрдВ рдХреЛ рд╕рд╛рдорд╛рдиреНрдпреАрдХреГрдд рдХрд░рддрд╛ рд╣реИ рдпрд╛ рдирд╣реАрдВред

@ рдирд┐рдореЛ157

рдмрдирд╛рдиреЗ рдХрд╛ рдХреЛрдИ рд╡рд┐рдЪрд╛рд░ рдХрд┐рдпрд╛ рдЧрдпрд╛ рд╣реИ ! рдПрдХ рдкреИрдЯрд░реНрди рдЬреЛ рдХреЗ рдореВрд▓реНрдпреЛрдВ рд╕реЗ рдореЗрд▓ рдЦрд╛рддрд╛ рд╣реИ! рдкреНрд░рдХрд╛рд░?

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

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

fn foo() -> Result<String, String> {
    let bar: Result<String, (!, String)> = Ok("hello".to_owned());
    Ok(bar?)
}

рдпрд╣ рдЖрдЬ рднреА рд╡рд┐рд╕реНрддрд╛рд░рд┐рдд рд╣реЛрдЧрд╛ (_рдореИрдВ 100% рдирд┐рд╢реНрдЪрд┐рдд рдирд╣реАрдВ рд╣реВрдВ рдХрд┐ рдпрд╣ рд╕рд╣реА рд╡рд┐рд╕реНрддрд╛рд░ рд╣реИ, рд▓реЗрдХрд┐рди рдХрд╛рдлреА рдХрд░реАрдм рд▓рдЧрддрд╛ рд╣реИ_)

fn foo() -> Result<String, String> {
    let bar: Result<String, (!, String)> = Ok("hello".to_owned());
    Ok(match Try::into_result(bar) {
        Result::Ok(e) => e,
        Result::Err(e) => return Try::from_err(From::from(e)),
    })
}

рд▓реЗрдХрд┐рди Result::Err рд╢рд╛рдЦрд╛ рдХреЛ рдЪреЗрдХ рдирд╣реАрдВ рдХрд┐рдпрд╛ рдЬрд╛рдПрдЧрд╛ рдФрд░ рдЖрдкрдХреЛ рдЖрдЬ рдорд┐рд▓рдиреЗ рд╡рд╛рд▓реА the trait bound `std::string::String: std::convert::From<(!, std::string::String)>` is not satisfied рддреНрд░реБрдЯрд┐ рдирд╣реАрдВ рдорд┐рд▓реЗрдЧреАред

рдореБрдЭреЗ рдирд╣реАрдВ рд▓рдЧрддрд╛ рдХрд┐ рдпрд╣ рдЖрд░рдПрдлрд╕реА 1872 рдХреЗ рдкреНрд░рд╕реНрддрд╛рд╡ рдХреЗ рд╕рд╛рде рд╕рдВрдЧрдд рд╣реИ, рдХреНрдпреЛрдВрдХрд┐ рдПрдХ рд╕реНрдкрд╖реНрдЯ рд╣рд╛рде рд╣реИ рдЬреЛ рдЙрдерд▓рд╛ рдореИрдЪ рдХрд░ рд░рд╣рд╛ рд╣реИ, рдпрд╣ рдЬрд░реВрд░реА рдирд╣реАрдВ рдХрд┐ ! рдореВрд▓реНрдп рдХреА рд╡реИрдзрддрд╛ рдкрд░ рдирд┐рд░реНрднрд░ рд╣реЛ, рдФрд░ рд╕рдВрднрд╛рд╡рд┐рдд рд░реВрдк рд╕реЗ рд╣реЛ рд╕рдХрддрд╛ рд╣реИ рд╕рдВрдмрджреНрдз рд╢рд╛рдЦрд╛ рдХреЛ "рд╕реБрд░рдХреНрд╖рд┐рдд рд░реВрдк рд╕реЗ" рддрдм рддрдХ рдЪрд▓рд╛рдПрдВ рдЬрдм рддрдХ рдХрд┐ рд╡рд╣ рд╢рд╛рдЦрд╛ e.0 рдмрд┐рд▓реНрдХреБрд▓ рднреА рдЙрдкрдпреЛрдЧ рди рдХрд░реЗред

! рдПрдХ рд╕рдХрд╛рд░рд╛рддреНрдордХ рдкреНрд░рдХрд╛рд░ рд╣реИ, рдЬреИрд╕реЗ bool , рдЗрд╕рд▓рд┐рдП рдХрдИ рд╢рд╛рдЦрд╛рдУрдВ рдХреЛ рдЕрдиреБрдорддрд┐ рджреЗрдиреЗ рдХреЗ рд▓рд┐рдП рдХреНрд▓реЛрдЬрд░ рд╕рд┐рдВрдЯреИрдХреНрд╕ рдХреЛ рд╡рд┐рд╕реНрддрд╛рд░рд┐рдд рдХрд┐рдП рдмрд┐рдирд╛ рдХреНрд▓реЛрдЬрд░ рддрд░реНрдХ рд╕реВрдЪреА рдореЗрдВ рдЙрд╕ рдкрд░ рдкреИрдЯрд░реНрди-рдорд┐рд▓рд╛рди рдХрд░рдирд╛ рдЕрд╕рдВрднрд╡ рд╣реИред рдЙрджрд╛рд╣рд░рдг рдХреЗ рд▓рд┐рдП рд╣реЛ рд╕рдХрддрд╛ рд╣реИ рдХрд┐ рд╣рдо рдХреНрд▓реЛрдЬрд░ bool -> u32 рдХреЛ (рдмрджрд╕реВрд░рдд рдХрд╛рд▓реНрдкрдирд┐рдХ рд╕рд┐рдВрдЯреИрдХреНрд╕) [~ |false| 23, |true| 45 ~] -> u32 рдЬреИрд╕рд╛ рдХреБрдЫ рд▓рд┐рдЦрдиреЗ рдХреА рдЕрдиреБрдорддрд┐ рджреЗ рд╕рдХреЗрдВ, рдлрд┐рд░ рдХрд┐рд╕реА рднреА рдЦрд╛рд▓реА рдкреНрд░рдХрд╛рд░ рд╕реЗ u32 рдХреЛ рдмрдВрдж рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдмрд╕ [~ ~] -> u32 рд▓рд┐рдЦрд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИ

рдЕрдкрдиреЗ рдореВрд▓ рдЙрджрд╛рд╣рд░рдг рд▓рд┐рдЦреЗрдВ, рдЖрдк foo.map_err(|_: (!, _)| unreachable!()) рд▓рд┐рдЦ рд╕рдХрддреЗ рд╣реИрдВ, рд╣рд╛рд▓рд╛рдВрдХрд┐ рдореИрдВ foo.map_err(|(e, _)| e) рдкрд╕рдВрдж рдХрд░рддрд╛ рд╣реВрдВ рдХреНрдпреЛрдВрдХрд┐ рдпрд╣ unreachable! рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдиреЗ рд╕реЗ рдмрдЪрддрд╛ рд╣реИред

! рдПрдХ рд╕рдХрд╛рд░рд╛рддреНрдордХ рдкреНрд░рдХрд╛рд░ рд╣реИ

рд╕рдХрд╛рд░рд╛рддреНрдордХ рдкреНрд░рдХрд╛рд░ рд╕реЗ рдЖрдк рдХреНрдпрд╛ рд╕рдордЭрддреЗ рд╣реИрдВ ?

рдХрдИ рд╢рд╛рдЦрд╛рдУрдВ рдХреЛ рдЕрдиреБрдорддрд┐ рджреЗрдиреЗ рдХреЗ рд▓рд┐рдП рдХреНрд▓реЛрдЬрд░ рд╕рд┐рдВрдЯреИрдХреНрд╕ рдХреЛ рд╡рд┐рд╕реНрддрд╛рд░рд┐рдд рдХрд┐рдП рдмрд┐рдирд╛ рдХреНрд▓реЛрдЬрд░ рддрд░реНрдХ рд╕реВрдЪреА рдореЗрдВ рдкреИрдЯрд░реНрди-рдорд┐рд▓рд╛рди рдХрд░рдирд╛ рдЕрд╕рдВрднрд╡ рд╣реИ

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

let foo: Result<String, ((), String)> = Ok("hello".to_owned());
let bar: Result<String, String> = foo.map_err(|((), s)| s);

рдореИрдВ рдХреЗрд╡рд▓ ! рдкреИрдЯрд░реНрди рдХреЛ рдПрдХ рдЕрдХрд╛рдЯреНрдп рдкреИрдЯрд░реНрди рдХреЗ рд░реВрдк рдореЗрдВ рдорд╛рдиреВрдВрдЧрд╛ рдЬреЛ ! рдкреНрд░рдХрд╛рд░ рдХреЗ рд╕рднреА 0 рдорд╛рдиреЛрдВ рд╕реЗ рдореЗрд▓ рдЦрд╛рддрд╛ рд╣реИ, рдЬреИрд╕рд╛ рдХрд┐ () рдПрдХ рдЕрдХрд╛рдЯреНрдп рдкреИрдЯрд░реНрди рд╣реИ рдЬреЛ рд╕рднреА 1 рдорд╛рдиреЛрдВ рд╕реЗ рдореЗрд▓ рдЦрд╛рддрд╛ рд╣реИ () рдкреНрд░рдХрд╛рд░ред

рдореИрдВ рд╕рд┐рд░реНрдл рд╡рд┐рдЪрд╛рд░ рдХрд░реЗрдВрдЧреЗ! рдкреИрдЯрд░реНрди рдПрдХ рдЕрдХрд╛рдЯреНрдп рдкреИрдЯрд░реНрди рдХреЗ рд░реВрдк рдореЗрдВ рд╣реИ рдЬреЛ рд╕рднреА 0 рдорд╛рдиреЛрдВ рд╕реЗ рдореЗрд▓ рдЦрд╛рддрд╛ рд╣реИ! рдкреНрд░рдХрд╛рд░, рдЬреИрд╕рд╛ рдХрд┐ () рдПрдХ рдЕрдХрд╛рдЯреНрдп рдкреИрдЯрд░реНрди рд╣реИ рдЬреЛ () рдкреНрд░рдХрд╛рд░ рдХреЗ рд╕рднреА 1 рдорд╛рдиреЛрдВ рд╕реЗ рдореЗрд▓ рдЦрд╛рддрд╛ рд╣реИред

рдареАрдХ рд╣реИ, рд▓реЗрдХрд┐рди 0 != 1.;) ! рдкрд░ рдорд┐рд▓рд╛рди рдХрд░рдиреЗ рдХреЗ рдмрд╛рдж рднреА рдХреЛрдИ рдХреЛрдб рд▓рд┐рдЦрдирд╛ рд╡реНрдпрд░реНрде рд╣реИ - рдЙрджрд╛рд╣рд░рдг рдХреЗ рд▓рд┐рдП рдпрджрд┐ рддрд░реНрдХ рдкреНрд░рдХрд╛рд░ (!, i32) , рддреЛ |(!, x)| code_goes_here рдореВрд░реНрдЦрддрд╛рдкреВрд░реНрдг рд╣реИ рдХреНрдпреЛрдВрдХрд┐ рд╡рд╣ рдХреЛрдб рд╡реИрд╕реЗ рднреА рдорд░ рдЪреБрдХрд╛ рд╣реИред рдореИрдВ рд╢рд╛рдпрдж рд▓рд┐рдЦрддреЗ рдереЗ |(x, _)| match x {} рдпрд╣ рдмрд╣реБрдд рд╕реНрдкрд╖реНрдЯ рд╣реИ рдХрд┐ рдмрдирд╛рдиреЗ рдХреЗ рд▓рд┐рдП x рдХрд╛ рдПрдХ рддрддреНрд╡ рд╣реИ ! ред рдпрд╛, рдКрдкрд░ рдкреНрд░рд╕реНрддрд╛рд╡рд┐рдд absurd рдлрд╝рдВрдХреНрд╢рди рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдХреЗ, |(x, _)| absurd(x) ред рдпрд╛ рд╢рд╛рдпрдж |(x, _)| x.absurd() ?

рдХреЛрдИ рдПрдХ рдЕрд▓рдЧ рд╕рд┐рдВрдЯреИрдХреНрд╕ рдХреА рдХрд▓реНрдкрдирд╛ рдХрд░ рд╕рдХрддрд╛ рд╣реИ рдЬреЛ рдХрд┐рд╕реА рдХреЛ рдХреЛрдИ рдХреЛрдб @canndrew рдиреЗ рдКрдкрд░ рд▓рд┐рдЦрд╛ рдерд╛ред match рдореЗрдВ рдХрд┐рддрдиреА рднреА рд╢рд╛рдЦрд╛рдПрдВ рд╣реИрдВ, рдЗрд╕рд▓рд┐рдП рд╡рд┐рд╢реЗрд╖ рд░реВрдк рд╕реЗ рдХреЛрдИ рд╢рд╛рдЦрд╛

рдмрд╣реБрдд рдмреБрд░рд╛ рд╣рдо рдЕрднреА impl<T> From<!> for T рдирд╣реАрдВ рдЬреЛрдбрд╝ рд╕рдХрддреЗред (рдпрд╣ From<T> for T рд╕рд╛рде рдУрд╡рд░рд▓реИрдк рд╣реЛрддрд╛ рд╣реИ, рдЬрдм рддрдХ рдХрд┐ рдХреБрдЫ рд╡рд┐рд╢реЗрд╖рдЬреНрдЮрддрд╛ рди рд╣реЛ?) рд╣рдо рд╢рд╛рдпрдж рдЗрд╕реЗ рдмрд╛рдж рдореЗрдВ рдирд╣реАрдВ рдЬреЛрдбрд╝ рд╕рдХрддреЗред ( ! рд╕реНрдерд┐рд░ рд╣реЛрдиреЗ рдХреЗ рдмрд╛рдж рд░рд┐рд▓реАрдЬ рдЪрдХреНрд░ рдореЗрдВ, рдХреБрдЫ рдЯреЛрдХрд░рд╛ From<!> for SomeConcreteType рд▓рд╛рдЧреВ рдХрд░ рд╕рдХрддрд╛ рд╣реИред)

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

рдореИрдВ рдЧрдВрднреАрд░рддрд╛ рд╕реЗ рдПрдХрдмрд╛рд░рдЧреА рд╣реИрдХ рдкрд░ рд╡рд┐рдЪрд╛рд░ рдХрд░реВрдВрдЧрд╛

рдлрд┐рд░ рдЙрд╕ рд╣реИрдХ рдХреЛ рдЕрдЧрд▓реЗ рдХреБрдЫ рджрд┐рдиреЛрдВ рдореЗрдВ рдЙрддрд░рдирд╛ рд╣реЛрдЧрд╛ред (рдпрд╛ рдмреАрдЯрд╛ рдХреЗ рджреМрд░рд╛рди рдмреИрдХрдкреЛрд░реНрдЯ рдХрд┐рдпрд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИред)

@SimonSapin рдРрд╕реА рд╣реИрдХ рдХрд┐рддрдиреА рдЬрд▓реНрджреА/рдЖрд╕рд╛рдиреА рд╕реЗ рдЬреЛрдбрд╝реА рдЬрд╛ рд╕рдХрддреА рд╣реИ? рдпрд╣ рд╡рд╛рд╕реНрддрд╡ рдореЗрдВ рдХрднреА рднреА From<!> for T рдкреНрд░рд╛рдкреНрдд рдХрд░рдиреЗ рдореЗрдВ рд╕рдХреНрд╖рдо рдирд╣реАрдВ рд╣реЛрдЧрд╛ред

рд╡реИрдХрд▓реНрдкрд┐рдХ рд░реВрдк рд╕реЗ, рд╣рдо From<!> for SomeConcreteType рдХреЛ рд▓рд╛рдЧреВ рдХрд░рдиреЗ рдХреЗ рдЦрд┐рд▓рд╛рдл рддреБрд░рдВрдд рдЪреЗрддрд╛рд╡рдиреА рджреЗ рд╕рдХрддреЗ рд╣реИрдВред

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

рджреБрд░реНрднрд╛рдЧреНрдп рд╕реЗ, рд╡рд┐рд╢реЗрд╖рдЬреНрдЮрддрд╛:

  • From::from рдХреЛ default fn рдмрджрд▓рдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реЛрдЧреА, рдЬреЛ рдХрд┐ рдПрд╕рдЯреАрдбреА рдХреЗ рдмрд╛рд╣рд░ "рджреГрд╢реНрдпрдорд╛рди" рд╣реЛрдЧрд╛ред рдореБрдЭреЗ рдирд╣реАрдВ рдкрддрд╛ рдХрд┐ рдХреНрдпрд╛ рд╣рдо рдЗрд╕реЗ рдПрд╕рдЯреАрдбреА рд▓рдХреНрд╖рдгреЛрдВ рдореЗрдВ рдХрд░рдирд╛ рдЪрд╛рд╣рддреЗ рд╣реИрдВ, рдЬрдм рддрдХ рдХрд┐ рд╡рд┐рд╢реЗрд╖рдЬреНрдЮрддрд╛ рдЕрд╕реНрдерд┐рд░ рд╣реИред
  • рдЬреИрд╕рд╛ рдХрд┐ рдЖрд░рдПрдлрд╕реА 1210 рдореЗрдВ рд╕реНрд╡реАрдХрд╛рд░ рдХрд┐рдпрд╛ рдЧрдпрд╛ рд╣реИ, рд╡рд┐рд╢реЗрд╖ рд░реВрдк рд╕реЗ рдЙрд╕ рднрд╛рд╖рд╛ рд╕реБрд╡рд┐рдзрд╛ рдХрд╛ рд╕рдорд░реНрдерди рдирд╣реАрдВ рдХрд░рддрд╛ рд╣реИ рдЬрд┐рд╕рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рдореИрдВ рд╕реЛрдЪ рд░рд╣рд╛ рдерд╛ (рджреЛ рдЕрддрд┐рд╡реНрдпрд╛рдкреА рдЕрд░реНрдереЛрдВ рдХреЛ рдЕрд▓рдЧ рдХрд░рдирд╛ рдЬрд╣рд╛рдВ рди рддреЛ рдЪреМрд░рд╛рд╣реЗ рдХреЗ рд▓рд┐рдП рддреАрд╕рд░рд╛ рдЗрдореНрдкреНрд▓рд╛рдВрдЯ рд▓рд┐рдЦрдХрд░ рджреВрд╕рд░реЗ рдХреА рддреБрд▓рдирд╛ рдореЗрдВ рдЕрдзрд┐рдХ рд╡рд┐рд╢рд┐рд╖реНрдЯ рд╣реИ)ред

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

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

рдХреНрдпрд╛ рдЗрд╕реЗ рдФрдкрдЪрд╛рд░рд┐рдХ рд░реВрдк рджреЗрдиреЗ рдХреЗ рд▓рд┐рдП рдХреЛрдИ рдореМрдЬреВрджрд╛ RFC рд╣реИ "рдпрджрд┐ рдЗрд╕рдореЗрдВ рд╢рд╛рдорд┐рд▓ рд╕рднреА рдирд┐рд╣рд┐рддрд╛рд░реНрде рдЕрдкреНрд░рд╛рдкреНрдп рд╣реИрдВ рддреЛ рдордирдорд╛рдиреЗ рдврдВрдЧ рд╕реЗ рдУрд╡рд░рд▓реИрдк рдХреА рдЕрдиреБрдорддрд┐ рджреЗрдВ" рд╡рд┐рдЪрд╛рд░? рд╡рд┐рдЪрд╛рд░ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдПрдХ рджрд┐рд▓рдЪрд╕реНрдк рджреГрд╖реНрдЯрд┐рдХреЛрдг рдХреА рддрд░рд╣ рд▓рдЧрддрд╛ рд╣реИред

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

рдХреЗрд╡рд▓ рд╕рдорд╕реНрдпрд╛ #49593 рдХрд╛ рдЙрд▓реНрд▓реЗрдЦ рдХрд░рдирд╛ рдЬреЛ рдЗрд╕рдХрд╛ рдХрд╛рд░рдг рд╣реЛ рд╕рдХрддрд╛ рд╣реИ ! рдмреЗрд╣рддрд░ рдЦреЛрдЬ рдпреЛрдЧреНрдпрддрд╛ рдХреЗ рд▓рд┐рдП рдлрд┐рд░ рд╕реЗ рдЕрд╕реНрдерд┐рд░ рд╣реЛрдиреЗ рдХреЗ рд▓рд┐рдПред

рдореБрдЭреЗ рдЖрд╢реНрдЪрд░реНрдп рд╣реИ рдХрд┐ T: From<!> рдЕрд▓рд╛рд╡рд╛ рдФрд░ рдХреМрди рд╕реЗ рдирд┐рд╣рд┐рддрд╛рд░реНрде ! рдХреЗ рд╕реНрдерд┐рд░ рд╣реЛрдиреЗ рдХреЗ рдмрд╛рдж рдирд╣реАрдВ рдЬреЛрдбрд╝реЗ рдЬрд╛ рд╕рдХрддреЗ ! рд▓рд┐рдП рдЗрдореНрдкреНрд▓рд╛рдВрдЯ рд╕реЗ рдЕрд▓рдЧ рд╣реИ, рдЬрд╣рд╛рдВ рдРрд╕реА рдХреЛрдИ рдЬрд▓реНрджреА рдирд╣реАрдВ рд╣реИред

рдЗрд╕ рдЯрд┐рдкреНрдкрдгреА рд╕реЗ рдХреНрд░реЙрд╕-рдкреЛрд╕реНрдЯрд┐рдВрдЧ:

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

рдЙрд╕ рдкрд░рд┐рд╡рд░реНрддрди рдХреЗ рдкрд░рд┐рдгрд╛рдорд╕реНрд╡рд░реВрдк рдХрдИ рдкреНрд░рддрд┐рдЧрдорди рд╣реБрдП рд╣реИрдВ рдФрд░ рдореБрдЭреЗ рдХрд╣рдирд╛ рд╣реЛрдЧрд╛ рдХрд┐ рдореИрдВ рдЗрд╕рдХреЗ рд╕рд╛рде рдкреВрд░реА рддрд░рд╣ рд╕реЗ рд╕рд╣рдЬ рдирд╣реАрдВ рд╣реВрдВ:

(рдЗрд╕ рдмрд┐рдВрджреБ рдкрд░ рд▓реИрдВрдЧ-рдЯреАрдо рдЪрд░реНрдЪрд╛ рдХреЗ рд▓рд┐рдП рдирд╛рдорд╛рдВрдХрдиред)

рдмреИрдардХ рдХреЗ рджреМрд░рд╛рди, рд╣рдордиреЗ рдпрд╣рд╛рдВ рдХреБрдЫ рд╡рд┐рдХрд▓реНрдкреЛрдВ рдХреЛ рдкреАрдЫреЗ рдЫреЛрдбрд╝ рджрд┐рдпрд╛ - рдореИрдВ рдмрджрд▓рд╛рд╡ рдХрд░рдиреЗ рдореЗрдВ рдЕрдирд┐рдЪреНрдЫреБрдХ рдорд╣рд╕реВрд╕ рдХрд░ рд░рд╣рд╛ рд╣реВрдВ, рдЬреНрдпрд╛рджрд╛рддрд░ рдЗрд╕рд▓рд┐рдП рдХрд┐ рдпрд╣ рдХреБрдЫ рдХреЛрдиреЗ рдХреЗ рдорд╛рдорд▓реЛрдВ рдореЗрдВ рдореМрдЬреВрджрд╛ рдХреЛрдб рдХреЗ рд╢рдмреНрджрд╛рд░реНрде рдХреЛ рдмрджрд▓ рджреЗрддрд╛ рд╣реИ, рдФрд░ рдпрд╣ рд╕реНрдкрд╖реНрдЯ рдирд╣реАрдВ рд╣реИ рдХрд┐ рдирдП рдирд┐рдпрдо рдмреЗрд╣рддрд░ рд╣реИрдВ ред рд▓реЗрдХрд┐рди рдЬреНрдпрд╛рджрд╛рддрд░ рдореБрдЭреЗ рд▓рдЧрддрд╛ рд╣реИ рдХрд┐ рд╣рдордиреЗ рдлреИрд╕рд▓рд╛ рдХрд┐рдпрд╛ рдХрд┐ рдкреНрд░рддреНрдпреЗрдХ рдбрд┐рдЬрд╛рдЗрди рдХреЗ рдкреЗрд╢реЗрд╡рд░реЛрдВ/рд╡рд┐рдкрдХреНрд╖реЛрдВ рдХреЛ рдлрд┐рд░ рд╕реЗ рдЗрдХрдЯреНрдард╛ рдХрд░рдирд╛ рдФрд░ рдЗрдХрдЯреНрдард╛ рдХрд░рдирд╛ рдмрд╣реБрдд рдЕрдЪреНрдЫрд╛ рд╣реЛрдЧрд╛ рддрд╛рдХрд┐ рд╣рдо рдПрдХ рдФрд░ рдкреВрд░реА рдЪрд░реНрдЪрд╛ рдХрд░ рд╕рдХреЗрдВред рдореИрдВ рдЙрдкрдпреЛрдЧ рдХреЗ рдорд╛рдорд▓реЛрдВ рдХреЗ рд╕рд╛рде-рд╕рд╛рде рдиреБрдХрд╕рд╛рди рдХреА рдПрдХ рд╕реВрдЪреА рджреЗрдЦрдирд╛ рдЪрд╛рд╣рддрд╛ рд╣реВрдВред @рдХреНрд░реИрдорд░реНрдЯрдЬ рдиреЗ Ok(33) рдореЗрдВ рдПрдХ рдкреНрд░рдХрд╛рд░ рд╣реИ рдЬреЛ Result<i32, !> рд╡рд╛рдкрд╕ рдЖ рдЬрд╛рддрд╛ рд╣реИ, рддреНрд░реБрдЯрд┐ рдХреЗ рдмрдЬрд╛рдп рдпрд╣ рдЖрдЬ рдХрд░реЗрдЧрд╛; рдореБрдЭреЗ рд▓рдЧрддрд╛ рд╣реИ рдХрд┐ рд╡реЗ рддреЛ рдХрд╣ рд░рд╣реЗ рдереЗ рдХрд┐ рд╕реЗ рд╡рд╛рдкрд╕ рдЖрдиреЗ рд░рдЦрдиреЗ return рдХреЗ рд░реВрдк рдореЗрдВ () рддрд░рд╣ рдХреЗ рдПрдХ рдкрд░рд┐рд╡рд░реНрддрди рдХреЗ рд╕рд╛рде рдЕрд╕рдВрдЧрдд рд╣реЛрдЧрд╛ (рд╣рд╛рд▓рд╛рдВрдХрд┐ рд╡реЗ рдУрд░реНрдереЛрдЧреЛрдирд▓), рдФрд░ рд╕рдбрд╝рдХ рдХреЗ рдиреАрдЪреЗ рд╕рдВрдШрд░реНрд╖ рдмрдирд╛ рд╕рдХрддрд╛ рд╣реИред рдпрд╣ рдиреНрдпрд╛рдпрд╕рдВрдЧрдд рд╣реИред

Err рдлреАрдбрдмреИрдХ (#40801) рдХреЗ рд╕рд╛рде рдЪреБрдиреМрддреА рдпрд╣ рд╣реИ рдХрд┐ рд╡рд╣рд╛рдВ рднреА рдХрд┐рдирд╛рд░реЗ рдХреЗ рдорд╛рдорд▓реЗ рд╣реИрдВ, рдЬреИрд╕реЗ:

let mut x = Ok(22);
x = Err(Default::default());

рдЬрд╣рд╛рдВ x рдХрд╛ рдкреНрд░рдХрд╛рд░ рдЕрдВрддрддрдГ рдЕрдиреБрдорд╛рди рд▓рдЧрд╛рдпрд╛ рдЬрд╛рддрд╛ рд╣реИ Result<T, !> ред

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

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

FYI рдХрд░реЗрдВ, рдЗрд╕ рд╕реБрд╡рд┐рдзрд╛ рдХреЗ рдХрд╛рд░рдг 1.26: #49932 . рдореЗрдВ рдкреНрд░рддрд┐рдЧрдорди рд╣реБрдЖ

(https://github.com/rust-lang/rust/issues/35121#issuecomment-368669041 рдкреНрд░рддрд┐ рд▓реЗрдмрд▓ рд╕реЗрдЯ рдХрд░рдирд╛ред)

рдХреНрдпрд╛ ! рдореЗрдВ рдЬрдмрд░рджрд╕реНрддреА рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рдЪреЗрдХрд▓рд┐рд╕реНрдЯ рдЖрдЗрдЯрдо рдЗрд╕ рдореБрджреНрджреЗ рдХреЛ рд╕рдВрджрд░реНрднрд┐рдд рдХрд░рдиреЗ рдХреЗ рдмрдЬрд╛рдп https://github.com/rust-lang/rust/issues/50350 рдкрд░ рдЗрдВрдЧрд┐рдд рдХрд┐рдпрд╛ рдЬрд╛рдирд╛ рдЪрд╛рд╣рд┐рдП?

рдЕрдЧрд░ рдореИрдВ рдЗрд╕реЗ рдЬрд▓реНрдж рд╕реЗ рдЬрд▓реНрдж рд╕реНрдерд┐рд░ рдХрд░рдирд╛ рдЪрд╛рд╣рддрд╛ рд╣реВрдВ, рддреЛ рдореЗрд░реА рдКрд░реНрдЬрд╛ рдХреЛ рдирд┐рд░реНрджреЗрд╢рд┐рдд рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рд╕рдмрд╕реЗ рдЕрдЪреНрдЫреА рдЬрдЧрд╣ рдХрд╣рд╛рдВ рд╣реИ?

@remexre рдореБрдЭреЗ рд▓рдЧрддрд╛ рд╣реИ рдХрд┐ рд╕рдорд╕реНрдпрд╛ рдХрд╛ рд╕рдмрд╕реЗ рдЕрдЪреНрдЫрд╛ рд╡рд┐рд╡рд░рдг рдЬреЛ рд╕реНрдерд┐рд░реАрдХрд░рдг рдХреЛ рд╡рд╛рдкрд╕ https://github.com/rust-lang/rust/issues/49593 рдкрд░ рд╣реИ

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

рд╕реВрд░реНрдп рдкрд░, рдЬреБрд▓рд╛рдИ 8, 2018, 8:12 рдкреВрд░реНрд╡рд╛рд╣реНрди рд░рд╛рд▓реНрдл рдЬрдВрдЧ рдиреЛрдЯрд┐рдлрд┐рдХреЗрд╢рди @github.com рдиреЗ рд▓рд┐рдЦрд╛:

@remexre https://github.com/remexre рдореБрдЭреЗ рд▓рдЧрддрд╛ рд╣реИ рдХрд┐ рдЗрд╕рдХрд╛ рд╕рдмрд╕реЗ рдЕрдЪреНрдЫрд╛ рд╡рд┐рд╡рд░рдг рд╣реИ
рд╕рдорд╕реНрдпрд╛ рдЬреЛ рдкреВрд░реНрд╡рд╡рдд рд╕реНрдерд┐рд░реАрдХрд░рдг рдХреА рдУрд░ рд▓реЗ рдЬрд╛рддреА рд╣реИ рд╡рд╣ #49593 . рдкрд░ рд╣реИ
https://github.com/rust-lang/rust/issues/49593

-
рдЖрдк рдЗрд╕реЗ рдкреНрд░рд╛рдкреНрдд рдХрд░ рд░рд╣реЗ рд╣реИрдВ рдХреНрдпреЛрдВрдХрд┐ рдЖрдкрдХрд╛ рдЙрд▓реНрд▓реЗрдЦ рдХрд┐рдпрд╛ рдЧрдпрд╛ рдерд╛ред

рдЗрд╕ рдИрдореЗрд▓ рдХрд╛ рд╕реАрдзреЗ рдЙрддреНрддрд░ рджреЗрдВ, рдЗрд╕реЗ GitHub рдкрд░ рджреЗрдЦреЗрдВ
https://github.com/rust-lang/rust/issues/35121#issuecomment-403286892 ,
рдпрд╛ рдереНрд░реЗрдб рдХреЛ рдореНрдпреВрдЯ рдХрд░реЗрдВ
https://github.com/notifications/unsubscribe-auth/AEAJtcnsEaFmHrrlHhuQeVOkR8Djzt50ks5uEgVLgaJpZM4JYi9D
.

>

рдзрдиреНрдпрд╡рд╛рдж,
рдирд╛рдерди

рдЙрд╕ рдЪрд░реНрдЪрд╛ рдХреЛ рд╡рд╛рд╕реНрддрд╡ рдореЗрдВ https://github.com/rust-lang/rust/issues/49593 рдореЗрдВ рдЬрд╛рдирд╛ рдЪрд╛рд╣рд┐рдП, рд▓реЗрдХрд┐рди рдЗрд╕рдХрд╛ рдПрдХ рдорд╣рддреНрд╡рдкреВрд░реНрдг рд╣рд┐рд╕реНрд╕рд╛ рдпрд╣ рд╣реИ рдХрд┐ Box::<T>::new рд▓рд┐рдП T: Sized , рд▓реЗрдХрд┐рди рд╡рд╣ new рдХрд╣рд╛ рдЬрд╛рддрд╛ рд╣реИ рдХрд┐ рд╡рд╛рдкрд╕реА рдкреНрд░рдХрд╛рд░ рдХреЗ рдЖрдзрд╛рд░ рдкрд░ T = Error (рдПрдХ рд╡рд┐рд╢реЗрд╖рддрд╛ рдбреАрдПрд╕рдЯреА) рд╣реЛрдиреЗ рдХрд╛ рдЕрдиреБрдорд╛рди рд╣реИред

рдПрдХ рд╡рд┐рд╢реЗрд╖ рдорд╛рдорд▓реЗ рдХреА рд╕реБрдВрджрд░рддрд╛ рдХреЗ рдЕрд▓рд╛рд╡рд╛, рдХреНрдпрд╛ рд╡рд┐рд╢реЗрд╖-рдЖрд╡рд░рдг Box::new рд▓рд┐рдП рдХреЛрдИ рд╕рдорд╕реНрдпрд╛ рд╣реИ:

Box::new : T -> Box<U>
where T <: U,
      T: Sized

рдпрд╛

Box::new : T -> Box<U>
where Box<T> <: Box<U>,
      T: Sized

рд╕рдмрд╕реЗ рдкрд╣рд▓реЗ рд╣рдореЗрдВ рдпрд╣ рд╕реЛрдЪрдирд╛ рдЪрд╛рд╣рд┐рдП рдХрд┐ ! рдХрд╛ рдЖрдХрд╛рд░ рдХреНрдпрд╛ рд╣реЛрдирд╛ рдЪрд╛рд╣рд┐рдПред рдЧрдгрд┐рддрдЬреНрдЮ Inf рдЬреИрд╕рд╛ рдХреБрдЫ рдкреНрд░рд╕реНрддрд╛рд╡рд┐рдд рдХрд░реЗрдВрдЧреЗ, рд▓реЗрдХрд┐рди рд╡рд╛рд╕реНрддрд╡ рдореЗрдВ рдпрд╣ usize::MAX , рдЗрд╕рд▓рд┐рдП рд╣рдо рдпрд╣ рд╕реБрдирд┐рд╢реНрдЪрд┐рдд рдХрд░ рд░рд╣реЗ рд╣реИрдВ рдХрд┐ рдЗрд╕ рдкреНрд░рдХрд╛рд░ рдХреЗ рд▓рд┐рдП рд╕реНрдерд╛рди рдЖрд╡рдВрдЯрд┐рдд рдХрд░рдиреЗ рдХрд╛ рдХреЛрдИ рднреА рдкреНрд░рдпрд╛рд╕ рд╡рд┐рдлрд▓ рд╣реЛ рдЬрд╛рдПрдЧрд╛ рдпрд╛ рдХрдо рд╕реЗ рдХрдо panic ред

рдпрджрд┐ ! Sized рддреЛ, рд╣рдореЗрдВ Box::new(x as !) рдХреЛ рд╕рдВрдХрд▓рд┐рдд рдХрд░рдиреЗ рд╕реЗ рдХреЛрдИ рд░реЛрдХ рдирд╣реАрдВ рд╕рдХрддрд╛ рд╣реИ, рд▓реЗрдХрд┐рди рдпрд╣ рдореВрд▓ рд░реВрдк рд╕реЗ panic! рдПрдХ рдФрд░ рддрд░реАрдХрд╛ рд╣реИ, рдХреНрдпреЛрдВрдХрд┐ рдХреЛрдИ рдореЗрдореЛрд░реА рдореЙрдбрд▓ рд╡рд╛рд╕реНрддрд╡ рдореЗрдВ рдирд╣реАрдВ рд╣реЛ рд╕рдХрддрд╛ рд╣реИ usize::MAX рдмрд╛рдЗрдЯреНрд╕ рдЖрд╡рдВрдЯрд┐рдд рдХрд░реЗрдВред

рдпрд╣ рдореБрдЭреЗ рд╕реНрдкрд╖реНрдЯ рдирд╣реАрдВ рд▓рдЧрддрд╛ рд╣реИ рдХрд┐ ! рдореЗрдВ рдЕрдирдВрдд/ usize::MAX рдЖрдХрд╛рд░ рдмрдирд╛рдо ZST рд╣реЛрдирд╛ рдЪрд╛рд╣рд┐рдП?

use std::mem::size_of;
enum Void {}
fn main() { println!("{}", size_of::<Void>()); }

рд╡рд░реНрддрдорд╛рди рдореЗрдВ 0 рд╣реИред

рдкреНрд░рд╕реНрддреБрдд рдкрд╛рда рдореЗрдВ рддрд░реНрдХ рд╕рдордЭрд╛рдпрд╛ рдЧрдпрд╛ рдерд╛ред

bool : рджреЛ рдорд╛рдиреНрдп рдорд╛рди => рд▓реЙрдЧ(2)/рд▓реЙрдЧ(2) = 1 рдмрд┐рдЯ
() : 1 рдорд╛рдиреНрдп рдорд╛рди => рд▓реЙрдЧ (1)/рд▓реЙрдЧ (2) = 0 рдмрд┐рдЯ
! : 0 рдорд╛рдиреНрдп рдорд╛рди => рд▓реЙрдЧ(0)/рд▓реЙрдЧ(2) = рдЗрдВрдл рдмрд┐рдЯреНрд╕

рдЬреИрд╕рд╛ рдХрд┐ рдХреЛрдИ рдкреНрд░рд╛рд╕рдВрдЧрд┐рдХ рд╕рд┐рджреНрдзрд╛рдВрдд рдореЗрдВ рдкрд╛рд░рдВрдЧрдд рдирд╣реАрдВ рд╣реИ, рдореИрдВ log(x)/log(y) рдлреЙрд░реНрдореВрд▓реЗ рдХрд╛ рдкрд╛рд▓рди рдХрд░рддрд╛ рд╣реБрдЖ рджреЗрдЦрддрд╛ рд╣реВрдВ, рдЬрд╣рд╛рдВ рддрдХ тАЛтАЛтАЛтАЛрд╡реНрдпрд╛рд╡рд╣рд╛рд░рд┐рдХ рдЙрдкрдпреЛрдЧ рдХреА рд╣рд╛рдирд┐ рдХреЗ рд▓рд┐рдП рдПрдХ рд╕реИрджреНрдзрд╛рдВрддрд┐рдХ рдореЙрдбрд▓ рдХреА рд╢рд╛рди рдХрд╛ рдкреАрдЫрд╛ рдХрд░рдирд╛ рд╣реИред (рдПрдХреЗрдП рдЕрдкрдиреЗ рд╕реНрд╡рдпрдВ рдХреЗ рднрд▓реЗ рдХреЗ рд▓рд┐рдП рдмрд╣реБрдд рдЪрд╛рд▓рд╛рдХ рд╣реИ)

рд╕рд╣рдЬ рд░реВрдк рд╕реЗ, рдРрд╕рд╛ рд▓рдЧрддрд╛ рд╣реИ рдХрд┐ ! рднреА рд╢реВрдиреНрдп-рдЖрдХрд╛рд░ рдХрд╛ рд╣реЛрдирд╛ рдЪрд╛рд╣рд┐рдП рдХреНрдпреЛрдВрдХрд┐:

  • bool : рдЯрд╛рдЗрдк рд╕рд┐рд╕реНрдЯрдо рдХреЗ рдЕрд▓рд╛рд╡рд╛ рджреЛ рдорд╛рдиреНрдп рдорд╛рдиреЛрдВ => рд▓реЙрдЧ (2)/рд▓реЙрдЧ (2) = 1 рдмрд┐рдЯ рдХреЗ рдмреАрдЪ рдЕрдВрддрд░ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рд╕реНрдерд╛рди рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реИ
  • () : рдПрдХ рд╡реИрдз рдорд╛рди рдореЗрдВ рдЕрдВрддрд░ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рд╕реНрдерд╛рди рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реИ => рдкреНрд░рдХрд╛рд░ рдкреНрд░рдгрд╛рд▓реА рд╕реЗ рдкрд░реЗ рдХрд┐рд╕реА рд╕реНрдерд╛рди рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рдирд╣реАрдВ рд╣реИ
  • ! : рдХреЛрдИ рдорд╛рдиреНрдп рдорд╛рди рднреЗрдж рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рд╕реНрдерд╛рди рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рдирд╣реАрдВ => рдкреНрд░рдХрд╛рд░ рдкреНрд░рдгрд╛рд▓реА рд╕реЗ рдкрд░реЗ рдХрд┐рд╕реА рд╕реНрдерд╛рди рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рдирд╣реАрдВ рд╣реИ

рд╡реИрд╕реЗ рдпрд╣ -рдЗрдирдлрд┐рдирд┐рдЯреА рд╡рд╛рд╕реНрддрд╡ рдореЗрдВ рд╣реИ, рдЬреЛ рд╕рдордЭ рдореЗрдВ рдЖрддрд╛ рд╣реИ, рдЬреИрд╕реЗ ! рдПрдХ рдХреНрд╖реЗрддреНрд░ рдХреЗ рд░реВрдк рдореЗрдВ рдПрдХ рд╕рдВрд░рдЪрдирд╛ рдореЗрдВ рдЕрдирд┐рд╡рд╛рд░реНрдп рд░реВрдк рд╕реЗ рд╕рдВрд░рдЪрдирд╛ рдХреЛ ! рд╕рд╛рде рд╣реА (c + -inf = -inf)ред рдЗрд╕рд▓рд┐рдП рдЪреВрдВрдХрд┐ рд╣рдо рдЙрдкрдпреЛрдЧ рдХреЗ рд╕рд╛рде рдХрд╛рдо рдХрд░ рд░рд╣реЗ рд╣реИрдВ, 0 рдЗрд╕рдХрд╛ рдкреНрд░рддрд┐рдирд┐рдзрд┐рддреНрд╡ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдирд┐рдХрдЯрддрдо рдореВрд▓реНрдп рд╣реИред (рдореБрдЭреЗ рд▓рдЧрддрд╛ рд╣реИ рдХрд┐ rustc рдореЗрдВ рд╡рд╛рд╕реНрддрд╡рд┐рдХ рдХрд╛рд░реНрдпрд╛рдиреНрд╡рдпрди -inf рдХрд╛ рднреА рдЙрдкрдпреЛрдЧ рдХрд░рддрд╛ рд╣реИ)ред

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

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

0 рдорд╛рдиреНрдп рдорд╛рди => рд▓реЙрдЧ(0)/рд▓реЙрдЧ(2) = рдЗрдВрдл рдмрд┐рдЯреНрд╕

рд▓реЙрдЧ (0) рдЕрдкрд░рд┐рднрд╛рд╖рд┐рдд рд╣реИ; рдпрд╣ рдЕрдирдВрдд рдирд╣реАрдВ рд╣реИред

рджреВрд╕рд░реА рдУрд░, usize::MAX рдЖрдХрд╛рд░ рдХрд╛ рд╣реЛрдирд╛ рдирд┐рд░реНрд╡рд╛рд╕рди рдХреЛ рд▓рд╛рдЧреВ рдХрд░рдиреЗ рдХрд╛ рдПрдХ рдХрдард┐рди рддрд░реАрдХрд╛ рд╣реИред рдЗрд╕ рдмрд╛рдд рд╕реЗ рд╕рд╣рдордд?

@CryZe @varkor

рдпрд╣ рдЙрд╕ рдЕрд╡рдзрд╛рд░рдгрд╛ рдХреЗ рд╕рд╛рде рднреА рдлрд┐рдЯ рдмреИрдарддрд╛ рд╣реИ рдЬрд┐рд╕рдХреА рдореИрдВ рд╡реИрдзрддрд╛ рдХрд╛ рдХрд╛рд░рдг рдЬрд╛рдирдиреЗ рдХреА рдХреЛрд╢рд┐рд╢ рдХрд░ рд░рд╣рд╛ рдерд╛, рдЬрд╣рд╛рдВ рдореЗрд░рд╛ рдЕрдВрддрд░реНрдЬреНрдЮрд╛рди ! рдХреЛ "рдкреВрд░реЗ рд╕реНрддрд░ рдкрд░ ZST" рдХреЗ рд░реВрдк рдореЗрдВ рджреЗрдЦрдирд╛ рдЪрд╛рд╣рддрд╛ рд╣реИред (рдпрд╛рдиреА ! рдЯрд╛рдЗрдк рд╕рд┐рд╕реНрдЯрдо рдХреЗ рд▓рд┐рдП рд╣реИ рдХреНрдпреЛрдВрдХрд┐ () рдореЗрдореЛрд░реА рдЖрд╡рдВрдЯрди рдХреЗ рд▓рд┐рдП рд╣реИред)

@CryZe
рдЖрдкрдХрд╛ рд╕реВрддреНрд░ -Inf + c == -Inf рд╕рдордЭ рдореЗрдВ рдЖрддрд╛ рд╣реИ, рд▓реЗрдХрд┐рди рдЬрдм -Inf рдХреЛ 0usize рдкреНрд░рддрд┐рд╕реНрдерд╛рдкрд┐рдд рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИ рддреЛ рдпрд╣ рдФрд░ рдЕрдзрд┐рдХ рдирд╣реАрдВ рд░рд╣рддрд╛ рд╣реИред

рджреВрд╕рд░реА рдУрд░, рдпрджрд┐ рдЕрдВрдХрдЧрдгрд┐рдд "рдХреИрдкреНрдб" рд╣реИ: рдХреЛрдИ рднреА рдЕрддрд┐рдкреНрд░рд╡рд╛рд╣ usize::MAX рдЧрдгрдирд╛ рдХрд░рддрд╛ рд╣реИ рддреЛ usize::MAX рд╕реВрддреНрд░ рдХреЛ рдкреВрд░реА рддрд░рд╣ рд╕реЗ рдлрд┐рдЯ рдХрд░рддрд╛ рд╣реИред

рдорд╕реНрддрд┐рд╖реНрдХ рдореЙрдбрд▓: рдпрджрд┐ рдЖрдкрдХреЗ рдкрд╛рд╕ ! рдкреНрд░рдХрд╛рд░ рдХреА рд╡рд╕реНрддреБ рд╣реИ, рддреЛ рдЙрд╕ рд╕рдВрд░рдЪрдирд╛ рдХреЛ рдЖрд╡рдВрдЯрд┐рдд рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдЬрд┐рд╕рдореЗрдВ рдпрд╣ рд╢рд╛рдорд┐рд▓ рд╣реИ, рдЖрдкрдХреЛ ! рд╕реЗ рднреА рдмрдбрд╝реА рд╕рдВрд░рдЪрдирд╛ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реИ, рд▓реЗрдХрд┐рди рдЖрдкрдХреЗ рджреНрд╡рд╛рд░рд╛ рдЫрд╡рд┐ рдХреА рдЬрд╛ рд╕рдХрдиреЗ рд╡рд╛рд▓реА рд╕рдмрд╕реЗ рдмрдбрд╝реА рд╕рдВрд░рдЪрдирд╛ рдЖрдХрд╛рд░ usize::MAX . рддреЛ рдЖрдкрдХреЛ рдЬрд┐рд╕ рд╕реНрдерд╛рди рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реИ рд╡рд╣ рдЕрднреА рднреА usize::MAX ред

рдХреНрдпреЛрдВ рди рдХреЗрд╡рд▓ рдХрд┐рд╕реА рднреА рдкреНрд░рдХрд╛рд░ рдХреЗ рдЖрдХрд╛рд░ рдХреЛ "рдХреНрд▓реИрдВрдк" рдХрд░реЗрдВ рдЬрд┐рд╕рдореЗрдВ рдПрдХ рд╢реВрдиреНрдп рдкреНрд░рдХрд╛рд░ ( ! , рдпрд╛ рдЙрдкрдпреЛрдЧрдХрд░реНрддрд╛ рджреНрд╡рд╛рд░рд╛ рдкрд░рд┐рднрд╛рд╖рд┐рдд enum Void {} ) рд╕реЗ size=0,alignment=0 ? рдпрд╣ рдореЗрд░реЗ рд▓рд┐рдП рдмрд╣реБрдд рдЕрдзрд┐рдХ рдЕрд░реНрдердкреВрд░реНрдг рд░реВрдк рд╕реЗ рд╕рдордЭрджрд╛рд░ рд▓рдЧрддрд╛ рд╣реИ ...

@remexre
рдХреНрдпреЛрдВрдХрд┐ рдпрд╣ рдХрд╛рдо рдирд╣реАрдВ рдХрд░рддрд╛ рд╣реИред рдЙрджрд╛рд╣рд░рдг: sizeof(Result<usize,!>) == sizeof(usize) ред

рдЦреИрд░, Result<usize, !> ! рд╕реАрдзреЗ sizeof(Result::Ok(usize)) == 8 , sizeof(Result::Err(!)) == 0

рдирд╣реАрдВ, рдореЗрд░реЗ рдкреНрд░рд╕реНрддрд╛рд╡ рдореЗрдВ sizeof(Result::Err(!)) == usize::MAX , рдХреНрдпреЛрдВрдХрд┐ Result::Err(!) :: Result<!,!> ред

рдирд┐рдпрдо рдпрд╣ рд╣реЛрдирд╛ рдЪрд╛рд╣рд┐рдП: enum s рдореЗрдВ, ! рдЖрдХрд╛рд░ рдХреЛ рдЕрдиреНрдп рд╕рднреА рдЖрдХрд╛рд░ рдорд╛рдиреЛрдВ рд╕реЗ рдХрдо рдорд╛рдирд╛ рдЬрд╛рддрд╛ рд╣реИ, рд▓реЗрдХрд┐рди structs , рдпрд╣ рдЕрдм рддрдХ рдХреА рдЫрд╡рд┐ рдХрд╛ рдЕрдзрд┐рдХрддрдо рдЖрдХрд╛рд░ рд╣реИред

рдирд┐рд╖реНрдХрд░реНрд╖:

  • ! рдбреАрдПрд╕рдЯреА рдирд╣реАрдВ рд╣реИред рдбреАрдПрд╕рдЯреА Sized рдирд╣реАрдВ рд╣реИрдВ рдХреНрдпреЛрдВрдХрд┐ рдЙрдирдХрд╛ рдЖрдХрд╛рд░ рдирд╣реАрдВ рд╣реИ, рдмрд▓реНрдХрд┐ рдЗрд╕рд▓рд┐рдП рдХрд┐ рдЖрдХрд╛рд░ рдХреА рдЬрд╛рдирдХрд╛рд░реА рдЫрд┐рдкреА рд╣реБрдИ рд╣реИред рд▓реЗрдХрд┐рди ! рд╣рдо рдЗрд╕рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рд╕рдм рдХреБрдЫ рдЬрд╛рдирддреЗ рд╣реИрдВред
  • ! рдХрд╛ рдЖрдХрд╛рд░ рд╣реЛрдирд╛ рдЪрд╛рд╣рд┐рдП рдФрд░ рдЗрд╕рд▓рд┐рдП Box::new(x as !) рдХреЛ рдХрдо рд╕реЗ рдХрдо рд╕рдВрдХрд▓рд┐рдд рдХрд░рдиреЗ рдХреА рдЕрдиреБрдорддрд┐ рджреА рдЬрд╛рдиреА рдЪрд╛рд╣рд┐рдПред
  • struct s рдореЗрдВ рд╢рд╛рдорд┐рд▓ рд╣реИ ! рдХрд╛ рдЖрдХрд╛рд░ рдЗрд╕ рддрд░рд╣ рд╣реЛрдирд╛ рдЪрд╛рд╣рд┐рдП рдЬреИрд╕реЗ рдХрд┐ рдпрд╣ ! , enum s рдореЗрдВ ! рд╕реАрдзреЗ рдПрдХ рдкреНрд░рдХрд╛рд░ рдХреЗ рд░реВрдк рдореЗрдВ рд╣реЛрдирд╛ рдЪрд╛рд╣рд┐рдП рдпрджрд┐ рд╡рд╣ рд╕рдВрд╕реНрдХрд░рдг рдореМрдЬреВрдж рдирд╣реАрдВ рд╣реИред

рдпрд╛ рддреЛ рд╣рдо sizeof(!)==0 рдпрд╛ sizeof(!)==usize::MAX , рд╣рдореЗрдВ рдЙрдкрд░реЛрдХреНрдд рдХреА рдЕрдиреБрдорддрд┐ рджреЗрдиреЗ рдХреЗ рд▓рд┐рдП рдХреБрдЫ рд╡рд┐рд╢реЗрд╖ рдЕрдВрдХрдЧрдгрд┐рдд рдкреЗрд╢ рдХрд░рдиреЗ рд╣реЛрдВрдЧреЗ:

sizeof(!)==0 : рд╕реНрдЯреНрд░рдХреНрдЪрд░реНрд╕ рдореЗрдВ, 0 + n = 0 : рдЪрд┐рдВрддрд┐рдд:, рдПрдирдо рдореЗрдВ, max(0,n) = n : рдмреНрд▓рд╢:ред
sizeof(!)==usize::MAX : рд╕реНрдЯреНрд░рдХреНрдЪрд░реНрд╕ рдореЗрдВ, usize::MAX + n =usize::MAX :neutral_face:, enums рдореЗрдВ, max(usize::MAX,n) = n : flushed:.

рд╣рд╛рд▓рд╛рдВрдХрд┐ usize::MAX рд▓рд┐рдП рдПрдХ рд▓рд╛рдн рд╣реИ: рдпрд╣ рддрдХрдиреАрдХреА рд░реВрдк рд╕реЗ рдХрд┐рд╕реА рднреА рдкреНрд░рдпрд╛рд╕ рдХреЛ рд░реЛрдХрддрд╛ рд╣реИ, рдпрд╣рд╛рдВ рддрдХ тАЛтАЛрдХрд┐ unsafe рд╡рд╛рд▓реЗ рднреА, рдРрд╕реА рд╡рд╕реНрддреБ рдХрд╛ рдирд┐рд░реНрдорд╛рдг рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП, рдХреНрдпреЛрдВрдХрд┐ рдпрд╣ рдХрд┐рд╕реА рднреА рд╡рд╛рд╕реНрддрд╡рд┐рдХ рдкреНрд░рдгрд╛рд▓реА рдореЗрдВ рд╕рдВрднрд╡ рдирд╣реАрдВ рд╣реИред

рд╣рд╛рд▓рд╛рдВрдХрд┐, рдЙрдкрдпреЛрдЧ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдПрдХ рд▓рд╛рдн рд╣реИ :: рдореИрдХреНрд╕ рд╣рд╛рд▓рд╛рдВрдХрд┐: рдпрд╣ рддрдХрдиреАрдХреА рд░реВрдк рд╕реЗ рдХрд┐рд╕реА рднреА рдкреНрд░рдпрд╛рд╕ рдХреЛ рд░реЛрдХрддрд╛ рд╣реИ, рдпрд╣рд╛рдВ рддрдХ тАЛтАЛтАЛтАЛрдХрд┐ рдЕрд╕реБрд░рдХреНрд╖рд┐рдд рд▓реЛрдЧреЛрдВ рдХреЛ рднреА, рдРрд╕реА рд╡рд╕реНрддреБ рдХрд╛ рдирд┐рд░реНрдорд╛рдг рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП, рдХреНрдпреЛрдВрдХрд┐ рдпрд╣ рдХрд┐рд╕реА рднреА рд╡рд╛рд╕реНрддрд╡рд┐рдХ рдкреНрд░рдгрд╛рд▓реА рдореЗрдВ рд╕рдВрднрд╡ рдирд╣реАрдВ рд╣реИред

рдореЗрд░рд╛ рдорддрд▓рдм рд╣реИ, рдЕрдЧрд░ unsafe рд╢реЗрдВрдЧреЗрдирд┐рдпреЛрдВ рдХреА рдЕрдиреБрдорддрд┐ рд╣реИ: *transmute::<Box<usize>, Box<!>>(Box::new(0)) рдореБрдЭреЗ рдЗрд╕рдХреЗ рдЖрдХрд╛рд░ рдХреА рдкрд░рд╡рд╛рд╣ рдХрд┐рдП рдмрд┐рдирд╛ ! ред usize::MAX рдпрд╣ рдЕрдзрд┐рдХ рд╕рдВрднрд╛рд╡рдирд╛ рдмрдирд╛рддрд╛ рд╣реИ рдХрд┐ рдЕрдЧрд░ рдХреЛрдИ std::mem::zeroed<!>() рдХрд░рдиреЗ рдХрд╛ рдкреНрд░рдпрд╛рд╕ рдХрд░рддрд╛ рд╣реИ рддреЛ рд╕рдВрдХрд▓рдХ рддреНрд░реБрдЯрд┐ рдХрд░реЗрдЧрд╛, рдореБрдЭреЗ рд▓рдЧрддрд╛ рд╣реИ, рд▓реЗрдХрд┐рди рдореИрдВ рдЙрд╕ рд╡реНрдпрдХреНрддрд┐ рдкрд░ рдбрд╛рд▓ рджреВрдВрдЧрд╛ рдЬреЛ рдЧрдгрд┐рдд рдХреЗ рдмрдЬрд╛рдп рдЕрд╕реБрд░рдХреНрд╖рд┐рдд рдХреЛрдб рд▓рд┐рдЦ рд░рд╣рд╛ рд╣реИ рдКрдкрд░ рд╡рд┐рдЪрд┐рддреНрд░рддрд╛ред

рдзреНрдпрд╛рди рджреЗрдВ рдХрд┐ ! рдХрд╛ рдЖрдХрд╛рд░ _actually_ 0 -- рди рддреЛ MAX рдФрд░ рди рд╣реА -INF -рд╕реЗрдЪреБрд░реЗрдЯреЗрдб-рдЯреВ-0 - рдХреЛ рдЖрдВрд╢рд┐рдХ рдЖрд░рдВрднреАрдХрд░рдг рдХреЛ рд╕рдВрднрд╛рд▓рдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реИ, рдЬреИрд╕рд╛ рдХрд┐ рдерд╛ https://github.com/rust-lang/rust/issues/49298#issuecomment -380844923 (рдФрд░ https://github.com/rust-lang/rust/pull/50622 рдореЗрдВ рдХрд╛рд░реНрдпрд╛рдиреНрд╡рд┐рдд) рдореЗрдВ рдкрд╛рдпрд╛ рдЧрдпрд╛ред

рдпрджрд┐ рдЖрдк рдпрд╣ рдмрджрд▓рдирд╛ рдЪрд╛рд╣рддреЗ рд╣реИрдВ рдХрд┐ рдпрд╣ рдХреИрд╕реЗ рдХрд╛рдо рдХрд░рддрд╛ рд╣реИ, рддреЛ рдХреГрдкрдпрд╛ рдЙрд╕рдХреЗ рд▓рд┐рдП рдПрдХ рдирдпрд╛ рдореБрджреНрджрд╛ рдпрд╛ рдкреАрдЖрд░ рдмрдирд╛рдПрдВ; рдпрд╣ рдЬрдЧрд╣ рдирд╣реАрдВ рд╣реИред

@remexre

Box::new : T -> Box<U>
where T <: U,
      T: Sized

Box (рдЬреНрдпрд╛рджрд╛рддрд░) рдПрдХ рдкреБрд╕реНрддрдХрд╛рд▓рдп рдкреНрд░рдХрд╛рд░ рд╣реИ рдФрд░ рдЗрд╕рдХреА new рд╡рд┐рдзрд┐ рдХреЛ src/liballoc/boxed.rs рдореЗрдВ рд░рд╕реНрдЯ рд╕рд┐рдВрдЯреИрдХреНрд╕ рдореЗрдВ рдкрд░рд┐рднрд╛рд╖рд┐рдд рдХрд┐рдпрд╛ рдЧрдпрд╛ рд╣реИред рдЖрдкрдХрд╛ рд╡рд┐рд╡рд░рдг рдПрдХ <: рдСрдкрд░реЗрдЯрд░ рдорд╛рдирддрд╛ рд╣реИ рдЬреЛ рдЬрдВрдЧ рдореЗрдВ рдореМрдЬреВрдж рдирд╣реАрдВ рд╣реИред рдРрд╕рд╛ рдЗрд╕рд▓рд┐рдП рд╣реИ рдХреНрдпреЛрдВрдХрд┐ рд░рд╕реНрдЯ рдореЗрдВ рд╕рдмрдЯрд╛рдЗрдкрд┐рдВрдЧ рдХреЗрд╡рд▓ рдЖрдЬреАрд╡рди рдорд╛рдкрджрдВрдбреЛрдВ рдХреЗ рдорд╛рдзреНрдпрдо рд╕реЗ рдореМрдЬреВрдж рд╣реИред рдпрджрд┐ рдЖрдк рдЕрдзрд┐рдХ рдкрдврд╝рдирд╛ рдпрд╛ рджреЗрдЦрдирд╛ рдЪрд╛рд╣рддреЗ рд╣реИрдВ:

! рдХреЛ рдХрд┐рд╕реА рднреА рдкреНрд░рдХрд╛рд░ рдХреЗ рд▓рд┐рдП рдЬрд╝рдмрд░рджрд╕реНрддреА рдХрд┐рдпрд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИ, рд▓реЗрдХрд┐рди рдпрд╣ рдХрд┐рд╕реА рднреА рдкреНрд░рдХрд╛рд░ рдХреЗ рд╣реЛрдиреЗ рдХреА рддреБрд▓рдирд╛ рдореЗрдВ рдХрдордЬреЛрд░ рд╣реИред (рдЙрджрд╛рд╣рд░рдг рдХреЗ рд▓рд┐рдП, рдХрд┐рд╕реА рднреА 'a рдХреЗ рд▓рд┐рдП Vec<&'static Foo> рднреА Vec<&'a Foo> , рд▓реЗрдХрд┐рди Vec<!> рд╕реЗ Vec<Foo> рдХреЛрдИ рдЕрдВрддрд░реНрдирд┐рд╣рд┐рдд рд░реВрдкрд╛рдВрддрд░рдг рдирд╣реАрдВ рд╣реИ: http:/ /play.rust-lang.org/?gist=82d1c1e1fc707d804a57c483a3e0198f&version=nightly&mode=debug&edition=2015)

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

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

@рд╕реНрдХреЙрдЯрдПрдмреА
рдореИрдВ рдпрд╣ рд╕реБрдирд┐рд╢реНрдЪрд┐рдд рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдЗрд╕ рдореБрджреНрджреЗ рдкрд░ рдзреНрдпрд╛рди рдХреЗрдВрджреНрд░рд┐рдд рдХрд░ рд░рд╣рд╛ рд╣реВрдВ рдХрд┐ Box::new(x as !) рдореЗрдВ рдкрд░реЗрд╢рд╛рдиреА рди рд╣реЛ, рдЗрд╕рд▓рд┐рдП рд╣рдо рдЗрд╕реЗ рд╕реНрдерд┐рд░ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдЖрдЧреЗ рдмрдврд╝ рд╕рдХрддреЗ рд╣реИрдВред рдкреНрд░рд╕реНрддрд╛рд╡рд┐рдд рддрд░реАрдХрд╛ ! рдХрд╛ рдЖрдХрд╛рд░ рдмрдирд╛рдирд╛ рд╣реИред рдпрджрд┐ ZST рдорд╛рдирдХ рд╣реИ рддреЛ рдпрд╣ рдареАрдХ рд╣реЛрдирд╛ рдЪрд╛рд╣рд┐рдПред рдореИрдВ рдЕрдм рдФрд░ рдмрд╣рд╕ рдирд╣реАрдВ рдХрд░ рд░рд╣рд╛ рд╣реВрдВред рдмрд╕ рдЗрд╕ рддрд░рд╣ рд▓рд╛рдЧреВ рдХрд░реЗрдВ рдХрд┐ sizeof(!)==0 рдХрд░реЗрдЧрд╛ред

рдЗрд╕рдХреЗ рд╕рдВрд░реЗрдЦрдг рдХреЛ рднреА рдЙрдкрдпреЛрдЧ рдХрд░рдирд╛ рд╕реНрд╡рд╛рднрд╛рд╡рд┐рдХ рд╣реИ::MAX

usize::MAX рджреЛ рдХреА рд╢рдХреНрддрд┐ рдирд╣реАрдВ рд╣реИ, рдЗрд╕рд▓рд┐рдП рдПрдХ рд╡реИрдз рд╕рдВрд░реЗрдЦрдг рдирд╣реАрдВ рд╣реИред рд╕рд╛рде рд╣реА, LLVM 1 << 29 рд╕реЗ рдЕрдзрд┐рдХ рдХреЗ рд╕рдВрд░реЗрдЦрдг рдХрд╛ рд╕рдорд░реНрдерди рдирд╣реАрдВ рдХрд░рддрд╛ рд╣реИред рдФрд░ ! рд╡реИрд╕реЗ рднреА рдмрдбрд╝рд╛ рд╕рдВрд░реЗрдЦрдг рдирд╣реАрдВ рд╣реЛрдирд╛ рдЪрд╛рд╣рд┐рдП, рдХреНрдпреЛрдВрдХрд┐ let x: (!, i32); x.1 = 4; рдХреЛ рдХреЗрд╡рд▓ 4 рдмрд╛рдЗрдЯреНрд╕ рд╕реНрдЯреИрдХ рд▓реЗрдирд╛ рдЪрд╛рд╣рд┐рдП, рдЧреАрдЧрд╛рдмрд╛рдЗрдЯреНрд╕-рдпрд╛-рдЕрдзрд┐рдХ рдирд╣реАрдВред

рдпрджрд┐ рдЖрдк рдЗрд╕реЗ рдЬрд╛рд░реА рд░рдЦрдирд╛ рдЪрд╛рд╣рддреЗ рд╣реИрдВ, рддреЛ рдХреГрдкрдпрд╛ рдЗрд╕ рдЪрд░реНрдЪрд╛ рдХреЗ рд▓рд┐рдП рдПрдХ рдирдпрд╛ рд╕реВрддреНрд░ @earthengine рдмрдирд╛рдПрдВ ред

рдпрд╣рд╛рдВ рдЬреЛ рд╕рдорд╕реНрдпрд╛ рд╣реЛрддреА рд╣реИ рд╡рд╣ рдпрд╣ рд╣реИ рдХрд┐ Box::new(!) рдПрдХ Box<$0> рдЬрд╣рд╛рдВ рд╣рдо Box<Error> рдЕрдкреЗрдХреНрд╖рд╛ рдХрд░рддреЗ рд╣реИрдВред рдкрд░реНрдпрд╛рдкреНрдд рдкреНрд░рдХрд╛рд░ рдХреЗ рдПрдиреЛрдЯреЗрд╢рди рдХреЗ рд╕рд╛рде, рд╣рдореЗрдВ Box<$0> рдХреЛ Box<Error> рд▓рд┐рдП рдордЬрдмреВрд░ рдХрд░рдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реЛрдЧреА, рдЬреЛ рдмрд╛рдж рдореЗрдВ рд╣рдореЗрдВ $0 рдбрд┐рдлрд╝реЙрд▓реНрдЯ рд░реВрдк рд╕реЗ ! рд╕рд╛рде рдЫреЛрдбрд╝ рджреЗрдЧрд╛ред

рд╣рд╛рд▓рд╛рдВрдХрд┐, $0 рдПрдХ рдкреНрд░рдХрд╛рд░ рдХрд╛ рдЪрд░ рд╣реИ, рдЗрд╕рд▓рд┐рдП рдЬрдмрд░рджрд╕реНрддреА рдирд╣реАрдВ рдХреА рдЬрд╛рддреА рд╣реИ рдФрд░ рдлрд┐рд░ рд╣рдореЗрдВ $0 = Error ред

рдЪреАрдЬреЗрдВ рдареАрдХ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдПрдХ hacky рд╡рд┐рдХрд▓реНрдк рдЦреЛрдЬрдиреЗ рдХреА рдЬрд╛рдПрдЧреА рд╣реИ рдХрд┐ рд╣рдо рдПрдХ рдмрд╛рдзрд╛ $0: Sized (рдЙрдкрдкреНрд░рдХрд╛рд░ рдирд┐рдореНрдирд▓рд┐рдЦрд┐рдд?) рдФрд░ рдПрдХ рдмрд▓рд╛рддреНрдХрд╛рд░ рдЙрд╕ рдкрд░ keyed рдбрд╛рд▓рдиреЗ, рддрд╛рдХрд┐ Box рдЕрднреА рднреА рдкреНрд░рдХрд╛рд░ рдкрд░ рдХрд╣рд╛ рдЬрд╛рддрд╛ рд╣реИред

рд╣рдо рдкрд╣рд▓реЗ рд╕реЗ рд╣реА рдкрддрд╛ рд▓рдЧрд╛рдиреЗ рдХреЗ рд▓рд┐рдП рдХреБрдЫ рдЗрд╕ рддрд░рд╣ рдХрд░рддреЗ рд╣реИрдВ Fn рдмрдВрдж рдореЗрдВ рд╣реИ, рдЗрд╕рд▓рд┐рдП рдЗрд╕ рддрд░рд╣ рдХреЗ рдПрдХ рдЦрд┐рдВрдЪрд╛рд╡ рдирд╣реАрдВ рд╣реЛрдЧрд╛ред рдЕрднреА рднреА рдмрджрд╕реВрд░рддред

рдпрд╣реА рд╣реИ, рдЕрдЧрд░ рдЬрдмрд░рджрд╕реНрддреА рдХреЗ рджреМрд░рд╛рди рд╣рдо рдлреЙрд░реНрдо рдХреЗ рджрд╛рдпрд┐рддреНрд╡ рдХрд╛ рд╕рд╛рдордирд╛ рдХрд░рддреЗ рд╣реИрдВ $0: Unsize<Y> рдЬрд╣рд╛рдВ Y рдирд┐рд╢реНрдЪрд┐рдд рд░реВрдк рд╕реЗ рдЖрдХрд╛рд░ рдореЗрдВ рдирд╣реАрдВ рд╣реИ рдФрд░ $0 рдирд┐рд╢реНрдЪрд┐рдд рд░реВрдк рд╕реЗ рдЖрдХрд╛рд░ рдореЗрдВ рд╣реИ, рддреЛ рдЗрд╕реЗ рдПрдХ рдЕрд╕реНрдкрд╖реНрдЯрддрд╛ рдХреЗ рд░реВрдк рдореЗрдВ рди рдорд╛рдиреЗрдВ, рдмрд▓реНрдХрд┐ рдЗрд╕реЗ "рдареАрдХ" рдХреЗ рд░реВрдк рдореЗрдВ рдорд╛рдиреЗрдВ рдФрд░ рдмрд┐рдирд╛ рдЖрдХрд╛рд░ рдХреЗ рдЬрдмрд░рджрд╕реНрддреА рдХреЗ рд╕рд╛рде рдЖрдЧреЗ рдмрдврд╝реЗрдВред

@ рдПрд░рд┐рдпрд▓рдм1

рддреЛ рдпрд╣ рдХреИрд╕реЗ Box::new(()) рд╕реЗ Box<Debug> рдЬрдмрд░рджрд╕реНрддреА рд╕реЗ рдЕрд▓рдЧ рд╣реИ? std::error::Error рдПрдХ рд╡рд┐рд╢реЗрд╖рддрд╛ рд╣реИ рдЬреИрд╕реЗ Debug , рди рдХрд┐ [u8] рдЬреИрд╕реЗ рдкреНрд░рдХрд╛рд░ред рджреВрд╕рд░реА рдУрд░ std::io::Error рдПрдХ рдкреНрд░рдХрд╛рд░ рд╣реИ, рд▓реЗрдХрд┐рди рдпрд╣ Sized ред

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

use std::fmt::Debug;

fn f(x:()) -> Box<Debug> {
    Box::new(x)
}

fn main() {
}

@earthengine рдЗрд╕ рдореБрджреНрджреЗ рдФрд░ рдЖрдкрдХреЗ рдХреЛрдб рдХреЗ рдмреАрдЪ рдХрд╛ рдЕрдВрддрд░ рд╣реИ:

| рд▓рд┐рдЦрд┐рдд | Box::new(!): Box<Debug> | Box::new(()): Box<Debug> |
| ------ | ------ | ------- |
| рдкреНрд░рджрд░реНрд╢рди рдХрд┐рдпрд╛ | Box::new(! as Debug): Debug | (Box::new(()) as Box<Debug>): Debug |

рдЕрдирд┐рд╡рд╛рд░реНрдп рд░реВрдк рд╕реЗ, рдХреНрдпреЛрдВрдХрд┐ ! рдХреБрдЫ рднреА рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдордЬрдмреВрд░ рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ, рдпрд╣ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдордЬрдмреВрд░ рдХрд░ рд░рд╣рд╛ рд╣реИ Debug рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдХреЙрд▓ рдХрд░рдиреЗ рд╕реЗ рдкрд╣рд▓реЗ Box::new ред рдпрд╣ () рд╕рд╛рде рдХреЛрдИ рд╡рд┐рдХрд▓реНрдк рдирд╣реАрдВ рд╣реИ, рдЗрд╕рд▓рд┐рдП рджреВрд╕рд░реЗ рдорд╛рдорд▓реЗ рдореЗрдВ рдХреЛрдИ рд╕рдорд╕реНрдпрд╛ рдирд╣реАрдВ рд╣реИ - Box::new рдмрд╛рдж рд╡рд╣рд╛рдВ рдЬрдмрд░рджрд╕реНрддреА рд╣реЛрддреА рд╣реИред

@ рд░рд╛рд▓реНрдлрдЬрдВрдЧ

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

рдЙрджрд╛рд╣рд░рдг рдХреЗ рд▓рд┐рдП рдирд┐рдореНрдирд▓рд┐рдЦрд┐рдд рдХреЛ рд╕рдВрдХрд▓рд┐рдд рдирд╣реАрдВ рдХрд░рдирд╛ рдЪрд╛рд╣рд┐рдП:

let v: str = !;
let v: [u8] = !;
let v: dyn Debug = !;

рд╕рд┐рд░реНрдл рдЗрд╕рд▓рд┐рдП рдХрд┐ рдЖрдк ! рдХреЛ рдХрд┐рд╕реА рднреА рдореМрдЬреВрджрд╛ рд░рд╕реНрдЯ рдПрдХреНрд╕рдкреНрд░реЗрд╢рди рдХреЗ рд╕рд╛рде рдХрдВрдкрд╛рдЗрд▓ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдкреНрд░рддрд┐рд╕реНрдерд╛рдкрд┐рдд рдирд╣реАрдВ рдХрд░ рд╕рдХрддреЗред

рд╕рдВрдкрд╛рджрд┐рдд рдХрд░реЗрдВ

рдпрд╣ () рдХреЗ рд╕рд╛рде рдПрдХ рд╡рд┐рдХрд▓реНрдк рдирд╣реАрдВ рд╣реИ

рддреЛ рдХреНрдпрд╛ рдХреЛрдИ рд╕рдордЭрд╛ рд╕рдХрддрд╛ рд╣реИ рдХреНрдпреЛрдВ? рдпрджрд┐ () as dyn Debug рд╕рдВрдХрд▓рд┐рдд рдирд╣реАрдВ рд╣реЛрддрд╛ рд╣реИ, рддреЛ ! as dyn Debug рдирд╣реАрдВ рд╣реЛрдЧрд╛ рдФрд░ рдЗрд╕рдХреЗ рд╡рд┐рдкрд░реАрддред &() as &Debug рд╕рдВрдХрд▓рд┐рдд рдХрд░рддрд╛ рд╣реИ, рдЗрд╕рд▓рд┐рдП &! as &Debug , рдХреЛрдИ рд╕рдорд╕реНрдпрд╛ рдирд╣реАрдВ рд╣реИред рдпрджрд┐ () as dyn Debug рдХрд┐рд╕реА рджрд┐рди рд╕рдВрдХрд▓рд┐рдд рд╣реЛ рдЬрд╛рддрд╛ рд╣реИ, рддреЛ рдЖрдЬ рд╣рдорд╛рд░реЗ рдкрд╛рд╕ рдЬреЛ рд╕рдорд╕реНрдпрд╛ рд╣реИ, рд╡рд╣ () рд▓рд┐рдП рджреЛрд╣рд░рд╛рдИ рдЬрд╛рдПрдЧреА, рдЗрд╕рд▓рд┐рдП DST RFC рдХрд╛рд░реНрдпрд╛рдиреНрд╡рдпрдирдХрд░реНрддрд╛рдУрдВ рдХреЛ рдЗрд╕рдХреЗ рдХрд╛рд░рдг рднреБрдЧрддрд╛рди рдХрд░рдирд╛ рд╣реЛрдЧрд╛, рдФрд░ рдЗрд╕рд▓рд┐рдП рдпрд╣ рдЙрд╕реА рд╕рдорд╕реНрдпрд╛ рдХрд╛ рд╕рдорд╛рдзрд╛рди рдХрд░реЗрдЧрд╛ рдЬреЛ рд╣рдорд╛рд░реЗ рдкрд╛рд╕ рд╣реИ ! ред

! рдХрд┐рд╕реА рднреА рдЪреАрдЬрд╝ рдХреЗ рд▓рд┐рдП рдЬрд╝рдмрд░рджрд╕реНрддреА рдХрд░рддрд╛ рд╣реИ рдХреНрдпреЛрдВрдХрд┐ рдЙрд╕рдХрд╛ рдЕрд╕реНрддрд┐рддреНрд╡ рдЕрд╕рдВрднрд╡ рд╣реИред "рдкреВрд░реНрд╡ рдлрд╛рд▓реЛ рдХреНрд╡реЛрдбрд▓рд┐рдмреЗрдЯ"ред рддреЛ рдЖрдкрдХреЗ рд╕рднреА рдЙрджрд╛рд╣рд░рдгреЛрдВ рдХреЛ рд╕рдВрдХрд▓рд┐рдд

рдпрд╣ "рдбреАрдЯреАрдПрд╕ рдореМрдЬреВрдж рдирд╣реАрдВ рд╣реЛ рд╕рдХрддрд╛" рдХрд╛ рднреА рдЙрд▓реНрд▓рдВрдШрди рдирд╣реАрдВ рдХрд░рддрд╛ рд╣реИ рдХреНрдпреЛрдВрдХрд┐ ! рдореМрдЬреВрдж рдирд╣реАрдВ рд╣реЛ рд╕рдХрддрд╛ рд╣реИред :)

() as dyn Debug рд╕рдВрдХрд▓рд┐рдд рдирд╣реАрдВ рдХрд░рддрд╛ рд╣реИ

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

рд╣рд╛рд▓рд╛рдВрдХрд┐, рд╣реЛ рд╕рдХрддрд╛ рд╣реИ рдХрд┐ рдЖрдк рдпрд╣рд╛рдВ рдПрдХ рд╕рдВрднрд╛рд╡рд┐рдд рд╕рдорд╛рдзрд╛рди рдХреА рдУрд░ рдЗрд╢рд╛рд░рд╛ рдХрд░ рд░рд╣реЗ рд╣реЛрдВ (рдФрд░ рд╣реЛ рд╕рдХрддрд╛ рд╣реИ рдХрд┐ @ arielb1 рдиреЗ рдКрдкрд░ рднреА рдпрд╣реА рд╕реБрдЭрд╛рд╡ рджрд┐рдпрд╛ рд╣реЛ): рдХреНрдпрд╛ ! рдЬрдмрд░рджрд╕реНрддреА рдХреЛ рдХреЗрд╡рд▓ рддрднреА рд▓рд╛рдЧреВ рдХрд░рдирд╛ рд╕рдВрднрд╡ рд╣реИ рдЬрдм рд▓рдХреНрд╖реНрдп рдкреНрд░рдХрд╛рд░ (рдЬреНрдЮрд╛рдд рд╣реЛрдиреЗ рдХреЗ рд▓рд┐рдП рдЬрд╛рдирд╛ рдЬрд╛рддрд╛ рд╣реИ) рдЖрдХрд╛рд░ рдХрд╛ рд╣реЛ ? рдРрд╕рд╛ рдХрд░рдиреЗ рдХрд╛ рдХреЛрдИ рдЕрдЪреНрдЫрд╛ рд╕реИрджреНрдзрд╛рдВрддрд┐рдХ рдХрд╛рд░рдг рдирд╣реАрдВ рд╣реИ, рд▓реЗрдХрд┐рди рдПрдХ рд╡реНрдпрд╛рд╡рд╣рд╛рд░рд┐рдХ рд╣реИред :D рдЕрд░реНрдерд╛рддреН, рдпрд╣ рдЗрд╕ рд╕рдорд╕реНрдпрд╛ рдХреЛ рд╣рд▓ рдХрд░рдиреЗ рдореЗрдВ рдорджрдж рдХрд░ рд╕рдХрддрд╛ рд╣реИред

рдЬрдм рдореИрдВрдиреЗ рдХрд╣рд╛ "рдбреАрдЯреАрдПрд╕ рдореМрдЬреВрдж рдирд╣реАрдВ рд╣реЛ рд╕рдХрддрд╛" рдореЗрд░рд╛ рдорддрд▓рдм рд╡рд╛рдХреНрдп рд░рдЪрдирд╛рддреНрдордХ рдореЗрдВ рд╣реИред рдЙрджрд╛рд╣рд░рдг рдХреЗ рд▓рд┐рдП, str рдЯрд╛рдЗрдк рдХрд┐рдпрд╛ рдЧрдпрд╛ рд╕реНрдерд╛рдиреАрдп рдЪрд░ рд╣реЛрдирд╛ рд╕рдВрднрд╡ рдирд╣реАрдВ рд╣реИред

рджреВрд╕рд░реА рдУрд░, ! рдореМрдЬреВрдж рдирд╣реАрдВ рд╣реЛ рд╕рдХрддрд╛ рд╢рдмреНрджрд╛рд░реНрде рд╣реИред рддреБрдо рд▓рд┐рдЦ рд╕рдХрддреЗ рд╣реЛ

let v = exit(0);

рд╕рдВрджрд░реНрдн рдореЗрдВ v рд╡рд╛рдХреНрдп рд░рдЪрдирд╛рддреНрдордХ рд░реВрдк рд╕реЗ ! рдЯрд╛рдЗрдк рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП, рд▓реЗрдХрд┐рди рдмрд╛рдзреНрдпрдХрд╛рд░реА рднреА рдирд╣реАрдВ рдЪрд▓реЗрдЧрд╛ рдФрд░ рдЗрд╕рд▓рд┐рдП рдпрд╣ рд╡рд╛рд╕реНрддрд╡рд┐рдХ рджреБрдирд┐рдпрд╛ рдореЗрдВ рдмрд╛рд╣рд░ рдирд╣реАрдВ рдирд┐рдХрд▓рддрд╛ рд╣реИред

рддреЛ рдпрд╣рд╛рдВ рдХрд╛рд░рдг рд╣реИ: рд╣рдо рдХрд┐рд╕реА рднреА рдкреНрд░рдХрд╛рд░ рдХреЗ рд▓рд┐рдП ! рдЬрдмрд░рджрд╕реНрддреА рдХреА рдЕрдиреБрдорддрд┐ рджреЗрддреЗ рд╣реИрдВ, рдХреЗрд╡рд▓ рдЬрдм рдЖрдк рдПрдХ рд╣реА рдкреНрд░рдХрд╛рд░ рдХреА рдЕрднрд┐рд╡реНрдпрдХреНрддрд┐ рд▓рд┐рдЦ рд╕рдХрддреЗ рд╣реИрдВред рдпрджрд┐ рдХреЛрдИ рдкреНрд░рдХрд╛рд░ рд╡рд╛рдХреНрдпрд╛рддреНрдордХ рд░реВрдк рд╕реЗ рднреА рдореМрдЬреВрдж рдирд╣реАрдВ рд╣реЛ рд╕рдХрддрд╛ рд╣реИ, рддреЛ рдЗрд╕рдХреА рдЕрдиреБрдорддрд┐ рдирд╣реАрдВ рджреА рдЬрд╛рдиреА рдЪрд╛рд╣рд┐рдПред

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

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

рдпрд╣ рд╡рд░реНрддрдорд╛рди рдХрд╛рд░реНрдпрд╛рдиреНрд╡рдпрди рдХреА рдПрдХ рд╕реАрдорд╛ рд╣реИ: https://github.com/rust-lang/rust/issues/48055

@ рд░рд╛рд▓реНрдлрдЬрдВрдЧ

рдпрд╣ рдпрд╣рд╛рдБ рд╕рдорд╕реНрдпрд╛ рдирд╣реАрдВ рд╣реИред

рджреЛрдмрд╛рд░рд╛, рдорд╛рди рд▓реАрдЬрд┐рдП рдХрд┐ рд╣рдо рдЙрд╕ рд╕реНрдерд┐рддрд┐ рдореЗрдВ рд╣реИрдВ рдЬрд╣рд╛рдВ Box::new(!: $0): Box<dyn fmt::Debug> рдЬрд╣рд╛рдВ $0 рдПрдХ рдкреНрд░рдХрд╛рд░ рдЪрд░ рд╣реИред

рддрдм рд╕рдВрдХрд▓рдХ рдХрд╛рдлреА рдЖрд╕рд╛рдиреА рд╕реЗ рдпрд╣ рдЕрдиреБрдорд╛рди рд▓рдЧрд╛ рд╕рдХрддрд╛ рд╣реИ рдХрд┐ $0: Sized (рдХреНрдпреЛрдВрдХрд┐ $0 Box::new рдХреЗ рдкреНрд░рдХрд╛рд░ рдкреИрд░рд╛рдореАрдЯрд░ рдХреЗ рдмрд░рд╛рдмрд░ рд╣реИ, рдЬрд┐рд╕рдореЗрдВ T: Sized рдмрд╛рдзреНрдп рд╣реИ)ред

рд╕рдорд╕реНрдпрд╛ рддрдм рдЖрддреА рд╣реИ рдЬрдм рд╕рдВрдХрд▓рдХ рдХреЛ рдпрд╣ рдкрддрд╛ рд▓рдЧрд╛рдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реЛрддреА рд╣реИ рдХрд┐ Box<$0> рдХреЛ Box<dyn fmt::Debug> рдмрджрд▓рдиреЗ рдХреЗ рд▓рд┐рдП рдХрд┐рд╕ рдкреНрд░рдХрд╛рд░ рдХреЗ рдЬрдмрд░рджрд╕реНрддреА рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдирд╛ рд╣реИред "рд╕реНрдерд╛рдиреАрдп" рдкреАрдУрд╡реА рд╕реЗ, 2 рд╕рдорд╛рдзрд╛рди рд╣реИрдВ:

  1. CoerceUnsized рдЬрдмрд░рджрд╕реНрддреА рдХрд░реЗрдВ, рдЬрд┐рд╕рдХреЗ рд▓рд┐рдП Box<$0>: CoerceUnsized<Box<dyn fmt::Debug>> рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реЛрддреА рд╣реИред рдпрд╣ $0 = ! рд▓рд┐рдП рдПрдХ рд╡реИрдз рдкреНрд░реЛрдЧреНрд░рд╛рдо рд╣реИ рдФрд░ рдбрд┐рдлреЙрд▓реНрдЯ рдХрд░рдиреЗ рд╕реЗ рдпрд╣ рдЙрд╕реА рдХреЗ рд▓рд┐рдП рд╕рдВрдХрд▓рд┐рдд рд╣реЛ рдЬрд╛рдПрдЧрд╛ред
  2. $0 = dyn fmt::Debug рд╕рд╛рде рдПрдХ рдкрд╣рдЪрд╛рди рдЬрд╝рдмрд░рджрд╕реНрддреА рдХрд░реЗрдВред рдпрд╣ $0: Sized рдЖрд╡рд╢реНрдпрдХрддрд╛ рдХреЗ рд╕рд╛рде рдЕрд╕рдВрдЧрдд рд╣реИред

рдЕрд╕реНрдкрд╖реНрдЯрддрд╛рдУрдВ рдкрд░ рд╡рд┐рдЪрд╛рд░ рдХрд░рддреЗ рд╕рдордп рд╕рдВрдХрд▓рдХ рдмрд╣реБрдд рдЕрдзрд┐рдХ рд╕рд╛рдорд╛рди рдЦреЛрд▓рдирд╛ рдирд╣реАрдВ рдЪрд╛рд╣рддрд╛ рд╣реИ, рдХреНрдпреЛрдВрдХрд┐ рдЗрд╕рд╕реЗ рдкреНрд░рджрд░реНрд╢рди рдХреЗ рдореБрджреНрджреЛрдВ рдФрд░ рд╣рд╛рд░реНрдб-рдЯреВ-рдбреАрдмрдЧ рд╕рдорд╕реНрдпрд╛рдУрдВ рджреЛрдиреЛрдВ рдХрд╛ рдХрд╛рд░рдг рдмрди рд╕рдХрддрд╛ рд╣реИ, рдЗрд╕рд▓рд┐рдП рдпрд╣ рдЪреБрдирддрд╛ рд╣реИ рдХрд┐ рдХреМрди рд╕рд╛ рдЬрдмрд░рджрд╕реНрддреА рдХрд╛рдлреА рдмреЗрд╡рдХреВрдл рддрд░реАрдХреЗ рд╕реЗ рдЙрдкрдпреЛрдЧ рдХрд░рдирд╛ рд╣реИ (рд╡рд┐рд╢реЗрд╖ рд░реВрдк рд╕реЗ, рд╣рдо рдбреЙрди T: CoerceUnsized<T> , рдЗрд╕рд▓рд┐рдП рдпрджрд┐ рд╕рдВрдХрд▓рдХ рд╡рд┐рдХрд▓реНрдк 1 рдЪреБрдирддрд╛ рд╣реИ рддреЛ рдпрд╣ рдмрд╣реБрдд рдЖрд╕рд╛рдиреА рд╕реЗ "рдЕрдЯрдХ" рд╕рдХрддрд╛ рд╣реИ), рдФрд░ рдпрд╣ рд╡рд┐рдХрд▓реНрдк 2 рдЪреБрдирдирд╛ рд╕рдорд╛рдкреНрдд рдХрд░ рджреЗрддрд╛ рд╣реИ, рдЬреЛ рд╡рд┐рдлрд▓ рд╣реЛ рдЬрд╛рддрд╛ рд╣реИред рдореЗрд░реЗ рдкрд╛рд╕ рдЗрд╕реЗ рдереЛрдбрд╝рд╛ рд╕реНрдорд╛рд░реНрдЯ рдмрдирд╛рдиреЗ рдФрд░ рд╡рд┐рдХрд▓реНрдк 1 рдЪреБрдирдиреЗ рдХрд╛ рд╡рд┐рдЪрд╛рд░ рдерд╛ред

рддреЛ рдЗрд╕ рдкреАрдУрд╡реА рд╕реЗ рдЗрд╕ рдкрд░ рд╡рд┐рдЪрд╛рд░ рдХрд░рддреЗ рд╣реБрдП, рд╕рд╣реА рд╡рд┐рдЪрд╛рд░ рдпрд╣ рд╣реЛ рд╕рдХрддрд╛ рд╣реИ рдХрд┐ рдПрдХ рдЕрдирд╕рд╛рдЗрдЬрд╝реНрдб рдЬрд╝рдмрд░рджрд╕реНрддреА рдХреЛ рдЯреНрд░рд┐рдЧрд░ рдХрд┐рдпрд╛ рдЬрд╛рдП рдпрджрд┐

  1. рдЕрдирд╕рд╛рдЗрдЬрд╝реНрдб рдЬрд╝рдмрд░рджрд╕реНрддреА рд╕реНрд╡-рд╕рдВрдЧрдд рд╣реИ (рдпрд╣ рд╡рд░реНрддрдорд╛рди рдирд┐рдпрдо рд╣реЛрдВрдЧреЗ, рд╕рд┐рд╡рд╛рдп рдЗрд╕рдХреЗ рдХрд┐ рдЕрд╕реНрдкрд╖реНрдЯрддрд╛ рдареАрдХ рд╣реИ)ред
  2. рдЕрдирд╕рд╛рдЗрдЬрд╝реНрдб рдЬрд╝рдмрд░рджрд╕реНрддреА рдХреЛ рдЯреНрд░рд┐рдЧрд░ рдирд╣реАрдВ рдХрд░рдирд╛ рдЕрд╕рдВрдЧрдд рд╣реИред рд╣рдореЗрдВ рдпрд╣ рджреЗрдЦрдирд╛ рд╣реЛрдЧрд╛ рдХрд┐ рдмрдбрд╝реЗ рдХрд╛рд░реНрдпреЛрдВ рдкрд░ рдкреНрд░рджрд░реНрд╢рди рдХреЛ рдмрд░реНрдмрд╛рдж рдХрд┐рдП рдмрд┐рдирд╛ рдЗрд╕рдХреА рдЧрдгрдирд╛ рдХреА рдЬрд╛ рд╕рдХрддреА рд╣реИред

$0 = dyn fmt::Debug рдХреЗ рд╕рд╛рде рдПрдХ рдкрд╣рдЪрд╛рди рдЬрд╝рдмрд░рджрд╕реНрддреА рдХрд░реЗрдВред рдпрд╣ $0: рдЖрдХрд╛рд░ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рдХреЗ рд╕рд╛рде рдЕрд╕рдВрдЧрдд рд╣реИред

рдореИрдВ рд╢рд╛рдпрдж рд╣реА рдпрд╣ рджреЗрдЦ рд╕рдХреВрдВ рдХрд┐ рд╣рдореЗрдВ let v: str=! рдЕрдиреБрдорддрд┐ рдХреНрдпреЛрдВ рджреЗрдиреА рдЪрд╛рд╣рд┐рдП рд▓реЗрдХрд┐рди let v: str; ред рдпрджрд┐ рдЖрдк рдПрдХ рд╡рд┐рд╢рд┐рд╖реНрдЯ рдкреНрд░рдХрд╛рд░ рдХреЗ рд╕рд╛рде рдПрдХ рдЪрд░ рдШреЛрд╖рд┐рдд рднреА рдирд╣реАрдВ рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ, рддреЛ рдЖрдк рдЗрд╕рдХреЗ рд▓рд┐рдП рдПрдХ (рд╢рд╛рдпрдж рдЕрд╕рдВрднрд╡) рдорд╛рди рдХреНрдпреЛрдВ рдмрд╛рдВрдз рд╕рдХрддреЗ рд╣реИрдВ?

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

рддреЛ рдореЗрд░рд╛ рдирд┐рд╖реНрдХрд░реНрд╖ рдпрд╣ рд╣реИ рдХрд┐ Box::new(!) as Box<Error> рд╕рдорд╕реНрдпрд╛ рдЖрдХрд╛рд░рд╣реАрди рдкреНрд░рддрд┐рджреНрд╡рдВрджреНрд╡рд┐рддрд╛ рдХреЗ рд▓рд┐рдП рдПрдХ рдЕрд╡рд░реБрджреНрдз рдореБрджреНрджрд╛ рд╣реИ, рди рдХрд┐ ! рдкреНрд░рдХрд╛рд░ рдХреЗ рд▓рд┐рдПред ! рдЬрдмрд░рджрд╕реНрддреА рдХреЗ рдирд┐рдпрдо рд╣реЛрдиреЗ рдЪрд╛рд╣рд┐рдП:

рдЖрдк let v: T рд▓рд┐рдЦ рд╕рдХрддреЗ рд╣реИрдВ, рдпрджрд┐ рдФрд░ рдХреЗрд╡рд▓ рдпрджрд┐ рдЖрдк let v: T = ! рд▓рд┐рдЦ рд╕рдХрддреЗ рд╣реИрдВред

рдерд┐рдпрд╛ рд╡рд╛рд╕реНрддрд╡рд┐рдХ рдЕрд░реНрде рддрдм рднрд╛рд╖рд╛ рдХреЗ рд╕рд╛рде рдореВрд▓реНрдпрд╛рдВрдХрди рдХрд░реЗрдЧрд╛ред рд╡рд┐рд╢реЗрд╖ рд░реВрдк рд╕реЗ, рд╣рдорд╛рд░реЗ рдкрд╛рд╕ рдЕрдирд╕рд╛рдЗрдЬрд╝реНрдб рдкреНрд░рддрд┐рджреНрд╡рдВрджреНрд╡рд┐рддрд╛ рд╣реЛрдиреЗ рдХреЗ рдмрд╛рдж, рд╣рдорд╛рд░реЗ рдкрд╛рд╕ Box::new(! as dyn Debug) рд▓реЗрдХрд┐рди рдЗрд╕рд╕реЗ рдкрд╣рд▓реЗ, рдореИрдВ рдХрд╣реВрдВрдЧрд╛ рдХрд┐ рдирд╣реАрдВред

рддреЛ рд╣рдо рдЖрдЧреЗ рдмрдврд╝рдиреЗ рдХреЗ рд▓рд┐рдП рдХреНрдпрд╛ рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ?

рдХреЛрдб рдкрд░ рдПрдХ рдлреАрдЪрд░ рдЧреЗрдЯ рдЬреЛрдбрд╝реЗрдВ рдЬреЛ рдЕрдирд╕рд╛рдЗрдЬрд╝реНрдб рдЬрд╝рдмрд░рджрд╕реНрддреА рдХреЛ рдЯреНрд░рд┐рдЧрд░ рдХрд░рддрд╛ рд╣реИ, рдЕрдЧрд░ рдЕрдирд╕рд╛рдЗрдЬрд╝реНрдб рд░реИрд╡реЗрд▓реНрдпреВ рдЪрд╛рд▓реВ рд╣реИ, рддреЛ рдЗрд╕ рдЬрд╝рдмрд░рджрд╕реНрддреА рдХрд╛ рдкреНрд░рдпрд╛рд╕ рдХрд░реЗрдВ, рдЕрдиреНрдпрдерд╛, рдЗрд╕реЗ рдЫреЛрдбрд╝ рджреЗрдВред рдпрджрд┐ рдпрд╣ рдПрдХрдорд╛рддреНрд░ рдЙрдкрд▓рдмреНрдз рдЬрдмрд░рджрд╕реНрддреА рд╣реИ, рддреЛ рддреНрд░реБрдЯрд┐ рд╕рдВрджреЗрд╢ "рд╡рд┐рд╢реЗрд╖рддрд╛ рдмрд╛рдзреНрдп str: std::marker::Sized рд╕рдВрддреБрд╖реНрдЯ рдирд╣реАрдВ рд╣реИ" рд╣реЛрдирд╛ рдЪрд╛рд╣рд┐рдП, рдЬреИрд╕реЗ рдХрд┐ рдЗрд╕реА рддрд░рд╣ рдХреЗ рдорд╛рдорд▓реЛрдВ рдореЗрдВред рдЗрд╕рд▓рд┐рдП

рд╣рдореЗрдВ рдпрд╣ рджреЗрдЦрдирд╛ рд╣реЛрдЧрд╛ рдХрд┐ рдмрдбрд╝реЗ рдХрд╛рд░реНрдпреЛрдВ рдкрд░ рдкреНрд░рджрд░реНрд╢рди рдХреЛ рдмрд░реНрдмрд╛рдж рдХрд┐рдП рдмрд┐рдирд╛ рдЗрд╕рдХреА рдЧрдгрдирд╛ рдХреА рдЬрд╛ рд╕рдХрддреА рд╣реИред

рд╕рдВрдмреЛрдзрд┐рдд рдХрд┐рдпрд╛ рдЧрдпрд╛ рд╣реИ: рдмрд╕ рдПрдХ рд╕рд╛рдзрд╛рд░рдг рд╕реБрд╡рд┐рдзрд╛ рдЬрд╛рдБрдЪред

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

рджрд┐рд▓рдЪрд╕реНрдкред

рдЗрд╕

fn main() {
    let _:str = *"";
}

рд╕рдВрдХрд▓рд┐рдд рдХрд░рддрд╛ рд╣реИ, рд▓реЗрдХрд┐рди

fn main() {
    let v:str = *"";
}

рдирд╣реАрдВред рдпрд╣ ! рдкреНрд░рдХрд╛рд░ рд╕реЗ рднреА рд╕рдВрдмрдВрдзрд┐рдд рдирд╣реАрдВ рд╣реИред рдХреНрдпрд╛ рдореИрдВ рдЗрд╕рдХреЗ рд▓рд┐рдП рдХреЛрдИ рдореБрджреНрджрд╛ рдмрдирд╛рдКрдВ?

рдореБрдЭреЗ рдирд╣реАрдВ рдкрддрд╛ рдХрд┐ рд╡рд╣ рдЖрдЦрд┐рд░реА рд╡рд╛рд▓рд╛ рд╡рд╛рд╕реНрддрд╡ рдореЗрдВ рдПрдХ рдмрдЧ рд╣реИ рдпрд╛ рдирд╣реАрдВред рджреВрд╕рд░рд╛ рдЙрджрд╛рд╣рд░рдг рд╕рдВрдХрд▓рд┐рдд рдирд╣реАрдВ рдХрд░рддрд╛ рд╣реИ, рдХреНрдпреЛрдВрдХрд┐ рдмрд┐рдирд╛ рдЖрдХрд╛рд░ рдХреЗ рд░реИрд╡рд▓реНрдпреВ рд╕рдорд░реНрдерди рдХреЗ, рд╕рдВрдХрд▓рдХ рд╕рд╛рдВрдЦреНрдпрд┐рдХреАрдп рд░реВрдк рд╕реЗ рдЬрд╛рдирдирд╛ рдЪрд╛рд╣рддрд╛ рд╣реИ рдХрд┐ рд╕реНрдерд╛рдиреАрдп рдЪрд░ v рд▓рд┐рдП рдХрд┐рддрдирд╛ рд╕реНрдЯреИрдХ рд╕реНрдерд╛рди рдЖрд╡рдВрдЯрд┐рдд рдХрд░рдирд╛ рд╣реИ, рд▓реЗрдХрд┐рди рдРрд╕рд╛ рдирд╣реАрдВ рдХрд░ рд╕рдХрддрд╛ рдХреНрдпреЛрдВрдХрд┐ рдпрд╣ рдПрдХ рдбреАрдПрд╕рдЯреА рд╣реИред

рдкрд╣рд▓реЗ рдЙрджрд╛рд╣рд░рдг рдореЗрдВ, _ рдкреИрдЯрд░реНрди рдЗрд╕ рдорд╛рдпрдиреЗ рдореЗрдВ рд╡рд┐рд╢реЗрд╖ рд╣реИ рдХрд┐ рдпрд╣ рди рдХреЗрд╡рд▓ рдХрд┐рд╕реА рднреА рдЪреАрдЬрд╝ рд╕реЗ рдореЗрд▓ рдЦрд╛рддрд╛ рд╣реИ (рдЬреИрд╕реЗ рд╕реНрдерд╛рдиреАрдп рдЪрд░ рдмрд╛рдЗрдВрдбрд┐рдВрдЧ), рд▓реЗрдХрд┐рди рдпрд╣ рдПрдХ рдЪрд░ рднреА рдирд╣реАрдВ рдмрдирд╛рддрд╛ рд╣реИред рддреЛ рд╡рд╣ рдХреЛрдб рд╕рдорд╛рди рд╣реИ fn main() { *""; } рдмрд┐рдирд╛ let ред рдПрдХ рд╕рдВрджрд░реНрдн (рдпрд╣рд╛рдВ рддрдХ тАЛтАЛтАЛтАЛрдХрд┐ рдбреАрдПрд╕рдЯреА) рдХреЛ рд╕рдВрджрд░реНрднрд┐рдд рдХрд░рдирд╛ рдФрд░ рдлрд┐рд░ рдкрд░рд┐рдгрд╛рдо рдХреЗ рд╕рд╛рде рдХреБрдЫ рднреА рдирд╣реАрдВ рдХрд░рдирд╛ рдЙрдкрдпреЛрдЧреА рдирд╣реАрдВ рд╣реИ, рд▓реЗрдХрд┐рди рдРрд╕рд╛ рд▓рдЧрддрд╛ рд╣реИ рдХрд┐ рдпрд╣ рдорд╛рдиреНрдп рд╣реИ рдФрд░ рдореБрдЭреЗ рд╡рд┐рд╢реНрд╡рд╛рд╕ рдирд╣реАрдВ рд╣реИ рдХрд┐ рдпрд╣ рдЕрдорд╛рдиреНрдп рд╣реЛрдирд╛ рдЪрд╛рд╣рд┐рдПред

рд╕рд╣реАред рд▓реЗрдХрд┐рди рдпрд╣ рд╡рд╛рд╕реНрддрд╡ рдореЗрдВ рднреНрд░рдорд┐рдд рдХрд░рдиреЗ рд╡рд╛рд▓рд╛ рд╣реИ, рд╡рд┐рд╢реЗрд╖ рд░реВрдк рд╕реЗ рдирд┐рдореНрдирд▓рд┐рдЦрд┐рдд

fn main() {
    let _v:str = *"";
}

рд╕рдВрдХрд▓рд┐рдд рднреА рдирд╣реАрдВ рдХрд░рддрд╛ рд╣реИред рдЖрдкрдХреЗ рд╕рд┐рджреНрдзрд╛рдВрдд рдХреЗ рд╕рд╛рде _ рдпрд╣ рд╡рд╣реА рд╣реЛрдирд╛ рдЪрд╛рд╣рд┐рдП рд╕рд┐рд╡рд╛рдп рдЗрд╕рдХреЗ рдХрд┐ рд╣рдо рдЕрдкреНрд░рдпреБрдХреНрдд рдЪреАрдЬрд╝ рдХреЛ _v рдмрдЬрд╛рдп _ ред

рдореБрдЭреЗ рдЬреЛ рдпрд╛рдж рд╣реИ, рдЙрд╕рд╕реЗ _v рдФрд░ v рдмреАрдЪ рдПрдХрдорд╛рддреНрд░ рдЕрдВрддрд░ рдпрд╣ рд╣реИ рдХрд┐ рдкреНрд░рдореБрдЦ рдЕрдВрдбрд░рд╕реНрдХреЛрд░ рдЕрдкреНрд░рдпреБрдХреНрдд рдореВрд▓реНрдпреЛрдВ рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рдЪреЗрддрд╛рд╡рдирд┐рдпреЛрдВ рдХреЛ рджрдмрд╛ рджреЗрддрд╛ рд╣реИред

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

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

рд╕рд╣реАред рдЖрдкрдиреЗ рдЬреЛ рдХрд╣рд╛ рдЙрд╕рдХреЗ рдКрдкрд░, let _ = foo() рдУрд░ рдЬрд╛рддрд╛ рд╣реИ drop рдХреЛ рддреБрд░рдВрдд рдмреБрд▓рд╛рдпрд╛ рдЬрд╛ рд░рд╣рд╛ рд╣реИ, рдЬрдмрдХрд┐ _v рдХреЗрд╡рд▓ рддрднреА рдЧрд┐рд░рд╛рдпрд╛ рдЬрд╛рддрд╛ рд╣реИ рдЬрдм рдпрд╣ рджрд╛рдпрд░реЗ рд╕реЗ рдмрд╛рд╣рд░ рд╣реЛ рдЬрд╛рддрд╛ рд╣реИ (рдЬреИрд╕реЗ v )

рд╡рд╛рд╕реНрддрд╡ рдореЗрдВ, " _ рд╡рд┐рд╢реЗрд╖ рд╣реИ" рд╕реЗ рдореЗрд░рд╛ рдпрд╣реА рдорддрд▓рдм рд╣реИред

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

рдореИрдВ рддрдм рднреА рд╕реБрдЭрд╛рд╡ рджреЗрддрд╛ рд╣реВрдВ рдХрд┐ ! рд▓реЗрдХрд░ рдЕрдирд╕рд╛рдЗрдЬреНрдб рд░реИрд▓реНрдпреВрдЬ рддрдХ рдЬрдмрд░рджрд╕реНрддреА рдХреЛ рд░реЛрдХрдиреЗ рдХреЗ рд▓рд┐рдП рдПрдХ рдлреАрдЪрд░ рдЧреЗрдЯ рд╣реЛрдирд╛ рдЪрд╛рд╣рд┐рдПред рдпрд╣ let _:str = return; рдЬреИрд╕реЗ рдХреЛрдб рдХреЛ рдЕрд╕реНрд╡реАрдХрд╛рд░ рдХрд░ рджреЗрдЧрд╛, рд▓реЗрдХрд┐рди рдореБрдЭреЗ рдирд╣реАрдВ рд▓рдЧрддрд╛ рдХрд┐ рдХреЛрдИ рднреА рдЗрд╕реЗ рдХреЛрдб рдореЗрдВ рдЙрдкрдпреЛрдЧ рдХрд░реЗрдЧрд╛ред

рдЬрдм рддрдХ ! рдкреНрд░рдХрд╛рд░ рдЕрд╕реНрдерд┐рд░ рд╣реИ, рд╣рдо рдЙрд╕ рд╕реНрдерд╛рди рдкрд░ рдмреНрд░реЗрдХрд┐рдВрдЧ рдкрд░рд┐рд╡рд░реНрддрди рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ рдЬрд╣рд╛рдВ рдЗрд╕реЗ рдЬрд╝рдмрд░рджрд╕реНрддреА рдХрд┐рдпрд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИ рдпрд╛ рдирд╣реАрдВред

рд╕рд╡рд╛рд▓ рдпрд╣ рд╣реИ рдХрд┐ рдЕрдЧрд░ рд╣рдо https://github.com/rust-lang/rust/issues/49593 рдХреЛ рдареАрдХ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдбреАрдПрд╕рдЯреА рдХреЗ рд╕рд╛рде рдЬрдмрд░рджрд╕реНрддреА рдХреЗ рдмрд┐рдирд╛ рдЗрд╕реЗ рд╕реНрдерд┐рд░ рдХрд░рддреЗ рд╣реИрдВ, рддреЛ рдХреНрдпрд╛ рд╣рдо рдмрд╛рдж рдореЗрдВ рдЗрд╕ рддрд░рд╣ рдХреЗ рдЬрдмрд░рджрд╕реНрддреА рдХреЛ рдмрд╣рд╛рд▓ рдХрд░рдирд╛ рдЪрд╛рд╣реЗрдВрдЧреЗ рдЬрдм рд╣рдо рдЕрдирд╕рд╛рдЗрдЬрд╝реНрдб рд░реИрд▓реНрдпреВрдЬрд╝ рдЬреЛрдбрд╝рддреЗ рд╣реИрдВ рдФрд░ рдХреНрдпрд╛ рд╣рдо https://github.com/rust-lang/rust/issues/49593 рдлрд┐рд░ рд╕реЗ рддреЛрдбрд╝реЗ рдмрд┐рдирд╛ рдРрд╕рд╛ рдХрд░рдиреЗ рдореЗрдВ рд╕рдХреНрд╖рдо рд╣реЛ?

рдореЗрд░реЗ рдкрд┐рдЫрд▓реЗ рдкреНрд░рд╕реНрддрд╛рд╡ рдореЗрдВ рдпрд╣ рд╢рд╛рдорд┐рд▓ рд╣реИред # 49593 рдЕрдирд╕рд╛рдЗрдЬрд╝реНрдб рдкреНрд░рддрд┐рджреНрд╡рдВрджреНрд╡рд┐рддрд╛ рдХреЗ рд▓рд┐рдП рдПрдХ рдЕрд╡рд░реБрджреНрдз рдореБрджреНрджрд╛ рд╣реЛрдирд╛ рдЪрд╛рд╣рд┐рдПред

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

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

// The type `str` is the type of the place being matched. `x` has type `&str`.
let ref x: str = *"foo";
// Fully equivalent to this:
let x: &str = &*"foo";

@eddyb

рдЖрдкрдХреЛ рдореЗрд░реА рдмрд╛рдд рд╕рдордЭ рдореЗрдВ рдирд╣реАрдВ рдЖрдИред рдореЗрд░реА рдзрд╛рд░рдгрд╛ рдпрд╣ рд╣реИ рдХрд┐ рд░рд╕реНрдЯ рдореЗрдВ рд╡рд░реНрддрдорд╛рди рдореЗрдВ рдХреЛрдИ рднреА рдЕрдирд╕рд╛рдЗрдЬрд╝реНрдб рд░реИрд▓реНрдпреВрдЬрд╝ рдХреЛрдб рдореЗрдВ рдмрд┐рд▓реНрдХреБрд▓ рднреА рджрд┐рдЦрд╛рдИ рдирд╣реАрдВ рджреЗ рд╕рдХрддрд╛ рд╣реИред рд╣рд╛рд▓рд╛рдВрдХрд┐ рдпрд╣ рдкрддрд╛ рдЪрд▓рд╛ рд╣реИ рдХрд┐ рд╡реЗ let _:str = *"" рдореЗрдВ рджрд┐рдЦрд╛рдИ рджреЗрддреЗ рд╣реИрдВред рд╣рд╛рд▓рд╛рдВрдХрд┐ рдРрд╕рд╛ рдореВрд▓реНрдп рдХреБрдЫ рд╕рдордп рдХреЗ рд▓рд┐рдП рдирд╣реАрдВ рд░рд╣ рд╕рдХрддрд╛ рд╣реИ, рд╡рд╛рдХреНрдпрд╛рддреНрдордХ рд╕реНрддрд░ рдореЗрдВ рдпрд╣ рд░рд╣рддрд╛ рд╣реИред рднреВрдд рдЬреИрд╕рд╛ рдХреБрдЫ...

рдЗрд╕рдХреЗ рдмрдЬрд╛рдп рдЖрдкрдХреЗ рдЙрджрд╛рд╣рд░рдг рддрдХрдиреАрдХреА рд░реВрдк рд╕реЗ рдкреВрд░реА рддрд░рд╣ рдХрд╛рдиреВрдиреА рд╣реИрдВ рдФрд░ рдпрд╣ рдмрд╛рдд рдирд╣реАрдВ рд╣реИред str рд╣реИ, рд▓реЗрдХрд┐рди &str рдЖрдХрд╛рд░ рдореЗрдВ рд╣реИред

рд╣рд╛рд▓рд╛рдВрдХрд┐ рдпрд╣ рдкрддрд╛ рдЪрд▓рд╛ рд╣реИ рдХрд┐ рд╡реЗ let _:str = *"" рдореЗрдВ рджрд┐рдЦрд╛рдИ рджреЗрддреЗ рд╣реИрдВред рд╣рд╛рд▓рд╛рдВрдХрд┐ рдРрд╕рд╛ рдореВрд▓реНрдп рдХреБрдЫ рд╕рдордп рдХреЗ рд▓рд┐рдП рдирд╣реАрдВ рд░рд╣ рд╕рдХрддрд╛ рд╣реИ, рд╡рд╛рдХреНрдпрд╛рддреНрдордХ рд╕реНрддрд░ рдореЗрдВ рдпрд╣ рд░рд╣рддрд╛ рд╣реИред рднреВрдд рдЬреИрд╕рд╛ рдХреБрдЫ...

&*foo рдЬреИрд╕реА рдЕрднрд┐рд╡реНрдпрдХреНрддрд┐ рдореЗрдВ рдПрдХ рд╕рдорд╛рди "рднреВрдд" рд╣реЛрддрд╛ рд╣реИред рдкрд╣рд▓реЗ рдЖрдк foo рдбреАрд░реЗрдлрд░реЗрдВрд╕ рдХрд░реЗрдВ рдФрд░ рдлрд┐рд░ рдкрд░рд┐рдгрд╛рдо рдХреЛ рдмрд┐рдирд╛ рд╣рд┐рд▓рд╛рдП рдЙрд╕рдХрд╛ рдкрддрд╛ рд▓реЗрдВ ред рддреЛ рдпрд╣ & { *foo } рдЬреИрд╕рд╛ рдирд╣реАрдВ рд╣реИ, рдЙрджрд╛рд╣рд░рдг рдХреЗ рд▓рд┐рдПред

@earthengine @SimonSapin рд╡рд╣рд╛рдВ рдХреЛрдИ рдЕрдирд╕рд╛рдЗрдЬрд╝реНрдб рд░реИрд▓реНрдпреВрдЬрд╝ ("рд╡реИрд▓реНрдпреВ рдПрдХреНрд╕рдкреНрд░реЗрд╢рди") рдореМрдЬреВрдж рдирд╣реАрдВ рд╣реИред рдХреЗрд╡рд▓ рдЕрдВрддрд░рд╛рд▓ ("рд╕реНрдерд╛рди рдЕрднрд┐рд╡реНрдпрдХреНрддрд┐") рдХрд░рддреЗ рд╣реИрдВред *"foo" рдПрдХ рдЬрдЧрд╣ рд╣реИ , рдФрд░ рдкреИрдЯрд░реНрди-рдорд┐рд▓рд╛рди рдХреЗ рд▓рд┐рдП рдХрд┐рд╕реА рдорд╛рди рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рдирд╣реАрдВ рд╣реИ, рдХреЗрд╡рд▓ рдПрдХ рдЬрдЧрд╣ рд╣реИред

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

рдЖрдкрдХреЗ рдЙрджрд╛рд╣рд░рдгреЛрдВ рдореЗрдВ, let x = *"foo"; , рдЗрд╕реЗ x рд╕реЗ рдмрд╛рдБрдзрдиреЗ рдХреЗ рд▓рд┐рдП рдорд╛рди рдЖрд╡рд╢реНрдпрдХ рд╣реИред
рдЗрд╕реА рддрд░рд╣, &*"foo" рдПрдХ рдЬрдЧрд╣ рдЕрднрд┐рд╡реНрдпрдХреНрддрд┐ рдмрдирд╛рддрд╛ рд╣реИ рдФрд░ рдлрд┐рд░ рдЙрд╕реЗ рдЙрдзрд╛рд░ рд▓реЗрддрд╛ рд╣реИ, рдмрд┐рдирд╛ рдХрд┐рд╕реА рдЖрдХрд╛рд░ рдХреЗ рдореВрд▓реНрдп рдмрдирд╛рдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рдХреЗ, рдЬрдмрдХрд┐ {*"foo"} рд╣рдореЗрд╢рд╛ рдПрдХ рдореВрд▓реНрдп рдЕрднрд┐рд╡реНрдпрдХреНрддрд┐ рд╣реИ рдФрд░ рдЗрд╕ рдкреНрд░рдХрд╛рд░ рдЕрд╕реАрдорд┐рдд рдкреНрд░рдХрд╛рд░реЛрдВ рдХреА рдЕрдиреБрдорддрд┐ рдирд╣реАрдВ рджреЗрддрд╛ рд╣реИред

https://github.com/rust-lang/rust/pull/52420 рдореЗрдВ рдореИрдВрдиреЗ рд╡рд╣ рдорд╛рд░рд╛

let Ok(b): Result<B, !> = ...;
b

рдЕрдм рдХрд╛рдо рдирд╣реАрдВ рдХрд░рддрд╛ рд╣реИред рдХреНрдпрд╛ рдпрд╣ рдЬрд╛рдирдмреВрдЭрдХрд░ рд╣реИ?

AFAIK рд╣рд╛рдБ - рдЕрдЪреВрдХ рдкреИрдЯрд░реНрди рдХрд╣рд╛рдиреА рдЬрдЯрд┐рд▓ рд╣реИ рдФрд░ рдЗрд╕рдореЗрдВ ! рд╕реЗ рдЕрд▓рдЧ рдлреАрдЪрд░ рдЧреЗрдЯ рд╣реИред https://github.com/rust-lang/rfcs/pull/1872 рдФрд░ https://github.com/rust-lang/rust/issues/48950 рднреА рджреЗрдЦреЗрдВ

@ Ericson2314 рд╡рд┐рд╢реЗрд╖ рд░реВрдк рд╕реЗ рд╡рд╣ рд╕реБрд╡рд┐рдзрд╛ рдЬрд┐рд╕реЗ рдЖрдкрдХреЛ liballoc рдореЗрдВ рдЬреЛрдбрд╝рдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реЛрдЧреА рд╡рд╣ рд╣реИ exhaustive_patterns ред

рдзрдиреНрдпрд╡рд╛рдж!!

рдЗрдВрдЯрд░реНрдирд▓ рдкрд░ рдПрдХ рджрд┐рд▓рдЪрд╕реНрдк рдмрд╛рддрдЪреАрдд:

рдпрджрд┐ рдЖрдк рдРрд╕рд╛ рдХрд░рдиреЗ рдЬрд╛ рд░рд╣реЗ рд╣реИрдВ, рддреЛ рдЗрд▓рд╛рдЬ рдХреНрдпреЛрдВ рдирд╣реАрдВ! рдЦреБрдж рдХреЛ рдПрдХ рдЕрдиреБрдорд╛рди рдЪрд░ рдХреЗ рд░реВрдк рдореЗрдВ?

рдЖрдЗрдЯрдо рдкреНрд░рдХрд╛рд░ рдХреЛ рд╕реНрдкрд╖реНрдЯ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдмрд╕ ! рд╕рд╛рде PhandomData рд╕рд╛рде рдПрдХ рд░реИрдкрд░ рдмрдирд╛рдПрдВред

https://github.com/rust-lang/rust/issues/49593 рдЕрдм рдареАрдХ рдХрд░ рджрд┐рдпрд╛ рдЧрдпрд╛ рд╣реИред рдкрд┐рдЫрд▓реЗ рд╕реНрдерд┐рд░реАрдХрд░рдг рдХреА рд╡рд╛рдкрд╕реА рдХрд╛ рдпрд╣реА рдХрд╛рд░рдг рдерд╛ред рдкрд┐рдЫрд▓реА рд╕реНрдерд┐рд░реАрдХрд░рдг рд░рд┐рдкреЛрд░реНрдЯ рдпрд╣рд╛рдБ рд╣реИ ред рдЖрдЗрдП рдЗрд╕реЗ рдлрд┐рд░ рд╕реЗ рдЖрдЬрдорд╛рдПрдВ!

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

рдореБрдЭреЗ рд▓рдЧрддрд╛ рд╣реИ рдХрд┐ rfcbot рдПрдХ рд╕реЗ рдЕрдзрд┐рдХ рдХрд╛ рд╕рдорд░реНрдерди рдХрд░ рд╕рдХрддрд╛ рд╣реИ FCP рдПрдХ рд╣реА рдореБрджреНрджреЗ рдореЗрдВ. рдЖрдЗрдП рд╕реНрдерд┐рд░реАрдХрд░рдг рдХреЗ рдЗрд╕ рджреМрд░ рдХреЗ рд▓рд┐рдП рдПрдХ рдирдпрд╛ рдореБрджреНрджрд╛ рдЦреЛрд▓реЗрдВ?

https://github.com/rust-lang/rust/pull/50121 рди рдХреЗрд╡рд▓ рд╡рд╛рдкрд╕ рд╕реНрдерд┐рд░реАрдХрд░рдг рдмрд▓реНрдХрд┐ рдлреЙрд▓рдмреИрдХ рд╢рдмреНрджрд╛рд░реНрде рднреАред рдХреНрдпрд╛ рдпрд╣ рдРрд╕реА рдЪреАрдЬ рд╣реИ рдЬрд┐рд╕ рдкрд░ рд╣рдо рдлрд┐рд░ рд╕реЗ рд╡рд┐рдЪрд╛рд░ рдХрд░рдирд╛ рдЪрд╛рд╣рддреЗ рд╣реИрдВ?

рд╕рдорд╕реНрдпрд╛ рд╡рд┐рд╡рд░рдг рдореЗрдВ рд╢реЗрд╖ рдЕрдирд┐рдпрдВрддреНрд░рд┐рдд рдЪреЗрдХрдмреЙрдХреНрд╕ рд╣реИ:

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

рд╣рдо рдмрд╛рдж рдореЗрдВ рдЗрдореНрдкреНрд▓рд╛рдВрдЯреНрд╕ рдЬреЛрдбрд╝ рд╕рдХрддреЗ рд╣реИрдВ, рд╣реИ рдирд╛? рдпрд╛ рдпрд╣ рдЕрд╡рд░реЛрдзрдХ рд╣реИ?

@SimonSapin рдиреЗ https://github.com/rust-lang/rust/issues/57012 рдЦреЛрд▓рд╛ ! рдлреЙрд▓рдмреИрдХ рдлрд┐рд░ рд╕реЗ рд╕рдХреНрд╖рдо рдХрд┐рдпрд╛ рдЬрд╛рдПрдЧрд╛, рд╣рд╛рдВ (рд╣рд╛рд▓рд╛рдВрдХрд┐ рдЖрдЗрдП рд╕реНрдерд┐рд░реАрдХрд░рдг рдореБрджреНрджреЗ рдкрд░ рдЪрд░реНрдЪрд╛ рдХрд░реЗрдВ)ред

рдХреНрд░реЙрд╕-рд░реЗрдлрд╝рд░реЗрдВрд╕рд┐рдВрдЧ: https://github.com/rust-lang/rust/issues/58184

рдЬрд╛рд╣рд┐рд░рд╛ рддреМрд░ рдкрд░ рдлреАрдЪрд░ рдЧреЗрдЯ рдХреЗ рдкреАрдЫреЗ рдХрднреА рднреА рдЯрд╛рдЗрдк рдирд╣реАрдВ рд╣реЛрдиреЗ рдореЗрдВ рдмрдЧ/рдЫреЗрдж рд╣реИ, рдФрд░ рдЗрд╕реЗ рд╕реНрдерд┐рд░ рдкрд░ рд╕рдВрджрд░реНрднрд┐рдд рдХрд░рдирд╛ рд╕рдВрднрд╡ рд╣реИ: https://github.com/rust-lang/rust/issues/33417#issuecomment -467053097

рд╕рдВрдкрд╛рджрд┐рдд рдХрд░реЗрдВ: https://github.com/rust-lang/rust/issues/58733 рджрд╛рдпрд░ рдХрд┐рдпрд╛

рдКрдкрд░ рд▓рд┐рдВрдХ рдХрд┐рдП рдЧрдП рдХреЛрдб рдЙрджрд╛рд╣рд░рдг рдореЗрдВ рдкреНрд░рдХрд╛рд░ рдХрд╛ рдЙрдкрдпреЛрдЧ рдЬреЛрдбрд╝рдирд╛:

trait MyTrait {
    type Output;
}

impl<T> MyTrait for fn() -> T {
    type Output = T;
}

type Void = <fn() -> ! as MyTrait>::Output;

fn main() {
    let _a: Void;
}

рдпрд╣ рдЬрдВрдЧ 1.12.0 рдореЗрдВ рд╕рдВрдХрд▓рд┐рдд рд╣реИ рдЬреЛ рдореБрдЭреЗ рд▓рдЧрддрд╛ рд╣реИ рдХрд┐ https://github.com/rust-lang/rust/pull/35162 рдХреЗ рд╕рд╛рде рдкрд╣рд▓рд╛ рд╣реИ

error: the trait bound `fn() -> !: MyTrait` is not satisfied [--explain E0277]
  --> a.rs:12:13
   |>
12 |>     let _a: Void;
   |>             ^^^^
help: the following implementations were found:
help:   <fn() -> T as MyTrait>

error: aborting due to previous error

рдЗрд╕ рдХреА рдХреНрдпрд╛ рд╕реНрдерд┐рддрд┐ рд╣реИ?

рдЬрд╣рд╛рдВ рддрдХ тАЛтАЛрдореБрдЭреЗ рдкрддрд╛ рд╣реИ рдХрд┐ https://github.com/rust-lang/rust/issues/57012#issuecomment -467889706 рдореЗрдВ рдореЗрд░реЗ рд╕рд╛рд░рд╛рдВрд╢ рдХреЗ рдмрд╛рдж рд╕реЗ рд╕реНрдерд┐рддрд┐ рдореЗрдВ рдХреЛрдИ рдЦрд╛рд╕ рдмрджрд▓рд╛рд╡ рдирд╣реАрдВ рдЖрдпрд╛ рд╣реИред

рдЗрд╕ рдХреА рдХреНрдпрд╛ рд╕реНрдерд┐рддрд┐ рд╣реИ?

@hosunrise : рд╡рд░реНрддрдорд╛рди рдореЗрдВ https://github.com/rust-lang/rust/issues/67225 рдкрд░ рдЕрд╡рд░реБрджреНрдз рд╣реИ

рдореИрдВ рдпрд╣рд╛рдВ рд╕реЗ рджреВрд░ рд╣реЛ рд╕рдХрддрд╛ рд╣реВрдВ, рд▓реЗрдХрд┐рди рд╡рд┐рд╢рд┐рд╖реНрдЯ рдореБрджреНрджреЗ рдЬреЛ рд▓рд┐рдВрдЯ рдЪрд░реНрдЪрд╛ (https://github.com/rust-lang/rust/issues/66173) рдХрд╛ рдЙрд▓реНрд▓реЗрдЦ рдХрд░рддреЗ рд╣реИрдВ, рджреЛрдиреЛрдВ рд╣реА рд╣рд▓ рдХрд░рдиреЗ рдпреЛрдЧреНрдп рд▓рдЧрддреЗ рд╣реИрдВ рдпрджрд┐ рдкреНрд░рддреНрдпреЗрдХ рдПрдирдо рдореЗрдВ ! рд╢рд╛рдЦрд╛ рд╣реИ рдкреНрд░рдХрд╛рд░ рдкреНрд░рдгрд╛рд▓реА?

рдореИрдВ рдзреНрдпрд╛рди рджреВрдВрдЧрд╛ рдХрд┐ https://github.com/rust-lang/rust/issues/67225 рдХреЗ рдУрдкреА рдореЗрдВ рдЙрд▓реНрд▓рд┐рдЦрд┐рдд рдореБрджреНрджреЗ рдкрд░ рд▓рд╛рдЧреВ рдирд╣реАрдВ рд╣реЛрддрд╛ рд╣реИ, рдЬреЛ рдЕрднреА рднреА рдПрдХ рдореБрджреНрджрд╛ рд╣реЛрдЧрд╛ред

рдореИрдВ рдпрд╣рд╛рдВ рд╕реЗ рджреВрд░ рд╣реЛ рд╕рдХрддрд╛ рд╣реВрдВ, рд▓реЗрдХрд┐рди рд╡рд┐рд╢рд┐рд╖реНрдЯ рдореБрджреНрджреЗ рдЬреЛ рдХрд┐ рд▓рд┐рдВрдЯ рдЪрд░реНрдЪрд╛ (# 66173) рдХрд╛ рдЙрд▓реНрд▓реЗрдЦ рдХрд░рддреЗ рд╣реИрдВ, рджреЛрдиреЛрдВ рд╣реА рд╣рд▓ рдХрд░рдиреЗ рдпреЛрдЧреНрдп рд▓рдЧрддреЗ рд╣реИрдВ рдпрджрд┐ рдкреНрд░рддреНрдпреЗрдХ рдПрдирдо рдХреА рдЯрд╛рдЗрдк рд╕рд┐рд╕реНрдЯрдо рдореЗрдВ ! рд╢рд╛рдЦрд╛ рд╣реИ?

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

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

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

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

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

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

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

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