Rust: рдЙрдзрд╛рд░ рд▓реЗрдиреЗ рдХрд╛ рджрд╛рдпрд░рд╛ рд╣рдореЗрд╢рд╛ рд╢рд╛рдмреНрджрд┐рдХ рдирд╣реАрдВ рд╣реЛрдирд╛ рдЪрд╛рд╣рд┐рдП

рдХреЛ рдирд┐рд░реНрдорд┐рдд 10 рдордИ 2013  ┬╖  44рдЯрд┐рдкреНрдкрдгрд┐рдпрд╛рдБ  ┬╖  рд╕реНрд░реЛрдд: rust-lang/rust

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

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

рдПрдХ рдЙрджрд╛рд╣рд░рдг рдХреЗ рд▓рд┐рдП рдпрд╣рд╛рдВ рджреЗрдЦреЗрдВ рдЬрд╣рд╛рдВ рдЕрдЧрд░ рдЙрдзрд╛рд░ рдмрдХреНрд╕реЗ, рдЬреЛ рдирд┐рдХрдЯрддрдо рдКрдкрд░ рдХреА рдУрд░ @mut рдЬрдордиреЗ рдХрд╛ рдХрд╛рд░рдг рдмрдирддрд╛ рд╣реИред рдлрд┐рд░ remove_child() рдЬрд┐рд╕реЗ рдкрд╛рд░рд╕реНрдкрд░рд┐рдХ рд░реВрдк рд╕реЗ рд╕рдВрдШрд░реНрд╖реЛрдВ рдХреЛ рдЙрдзрд╛рд░ рд▓реЗрдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реИред

https://github.com/mozilla/servo/blob/master/src/servo/layout/box_builder.rs#L387 -L411

@Wyverald . рд╕реЗ рдЕрдкрдбреЗрдЯ рдХрд┐рдпрд╛ рдЧрдпрд╛ рдЙрджрд╛рд╣рд░рдг

fn main() {
    let mut vec = vec!();

    match vec.first() {
        None => vec.push(5),
        Some(v) => unreachable!(),
    }
}
A-borrow-checker NLL-fixed-by-NLL

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

рдпрд╣ рдЕрднреА рддрдХ рд░рд╛рдд рдореЗрдВ рдирд╣реАрдВ рдорд╛рд░рд╛ рдЧрдпрд╛ рд╣реИ, рд▓реЗрдХрд┐рди рдореИрдВ рд╕рд┐рд░реНрдл рдЗрддрдирд╛ рдХрд╣рдирд╛ рдЪрд╛рд╣рддрд╛ рд╣реВрдВ рдХрд┐ рдпрд╣ рдЕрдм рд╕рдВрдХрд▓рд┐рдд рд╣реИ:

#![feature(nll)]

fn main() {
    let mut vec = vec!();

    match vec.first() {
        None => vec.push(5),
        Some(v) => unreachable!(),
    }
}

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

рддреИрдпрд╛рд░ рдЙрддреНрдкрд╛рджрди рдХреЗ рд▓рд┐рдП рдирд╛рдорд╛рдВрдХрди

рдореИрдВ рдЗрд╕реЗ рдпрд╛ рддреЛ рдЕрдЪреНрдЫреА рддрд░рд╣ рд╕реЗ рдкрд░рд┐рднрд╛рд╖рд┐рдд рдпрд╛ рдкрд┐рдЫрдбрд╝рд╛-рд╕рдВрдЧрдд рдХрд╣реВрдВрдЧрд╛ред

рдЬреИрдХреЛ рдХреЗ рдЙрджрд╛рд╣рд░рдг

[09:57:06]https://github.com/mozilla/servo/blob/master/src/components/servo/layout/box_builder.rs#L387 -L411
[резреж:режреи:режрем]https://github.com/mozilla/servo/pull/435

рдХреЛрдб рдХреЛ рдкреБрдирд░реНрдЧрдард┐рдд рдХрд┐рдпрд╛ рдЧрдпрд╛ рдерд╛, рд▓реЗрдХрд┐рди рдпрд╣рд╛рдБ рдЙрдзрд╛рд░ рдЪреЗрдХрд░ рдХрд╛ рд╡рд┐рд╢рд┐рд╖реНрдЯ рддреБрд╖реНрдЯреАрдХрд░рдг рд╣реИ рдЬреЛ рдореБрдЭреЗ рдХрд░рдирд╛ рдерд╛:

https://github.com/metajack/servo/commit/5324cabbf8757fa68b1aa36548b992041be94ef9

https://github.com/metajack/servo/commit/7234635aa580c8a821003882e77d8e043d247687

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

рдореБрдЭреЗ рдЖрд╢реНрдЪрд░реНрдп рд╣реИ рдХрд┐ рдХреНрдпрд╛ рд╣рдо рдпрд╣ рд╕реНрдкрд╖реНрдЯ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рддреНрд░реБрдЯрд┐ рд╕рдВрджреЗрд╢реЛрдВ рдореЗрдВ рд╕реБрдзрд╛рд░ рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ рдХрд┐ рдХреНрдпрд╛ рд╣реЛ рд░рд╣рд╛ рд╣реИ? рд▓реЗрдХреНрд╕рд┐рдХрд▓ рд╕реНрдХреЛрдк рдХреЛ рд╕рдордЭрдирд╛ рдЕрдкреЗрдХреНрд╖рд╛рдХреГрдд рдЖрд╕рд╛рди рд╣реИ, рд▓реЗрдХрд┐рди рдЗрд╕ рдореБрджреНрджреЗ рдХреЗ рдЙрджрд╛рд╣рд░рдгреЛрдВ рдореЗрдВ рдЬреЛ рдореИрдВрдиреЗ рдЗрд╕реЗ рдкрд╛рд░ рдХрд░ рд▓рд┐рдпрд╛ рд╣реИ, рдХрд┐рд╕реА рднреА рддрд░рд╣ рд╕реЗ рд╕реНрдкрд╖реНрдЯ рдирд╣реАрдВ рдерд╛ рдХрд┐ рдХреНрдпрд╛ рд╣реЛ рд░рд╣рд╛ рдерд╛ред

рдмрд╕ рдПрдХ рдмрдЧ, рдореАрд▓ рдХрд╛ рдкрддреНрдерд░/рдирд╛рдорд╛рдВрдХрди рд╣рдЯрд╛ рд░рд╣рд╛ рд╣реИред

рджреВрд░ рднрд╡рд┐рд╖реНрдп рдХреЗ рдореАрд▓ рдХреЗ рдкрддреНрдерд░ рдХреЗ рд▓рд┐рдП рд╕реНрд╡реАрдХрд╛рд░ рдХрд┐рдпрд╛ рдЧрдпрд╛

рдЯреНрд░рд╛рдЗрдПрдЬ рдмрдВрдк

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

рдЗрди рд╕рдмрдХрд╛ рд╕рдмрд╕реЗ рджрд┐рд▓рдЪрд╕реНрдк рд╣рд┐рд╕реНрд╕рд╛ рд╣реИ рднрд╛рдЧрдиреЗ рдХреЗ рдирд┐рдпрдо, рдмрд┐рд▓реНрдХреБрд▓ред рдореБрдЭреЗ рд▓рдЧрддрд╛ рд╣реИ рдХрд┐ рдирд┐рдпрдореЛрдВ рдХреЛ рд╕рдорд╛рд░реЛрд╣ рдХреА рдФрдкрдЪрд╛рд░рд┐рдХ рдкрд░рд┐рднрд╛рд╖рд╛ рдХреЛ рдзреНрдпрд╛рди рдореЗрдВ рд░рдЦрдирд╛ рд╣реЛрдЧрд╛, рдФрд░ рд╡рд┐рд╢реЗрд╖ рд░реВрдк рд╕реЗ рдЬреНрдЮрд╛рди рдХрд╛ рд▓рд╛рдн рдЙрдард╛рдиреЗ рдХреЗ рд▓рд┐рдП рд╣рдореЗрдВ рдЬреАрд╡рди рднрд░ рджреЗрдирд╛ рд╣реЛрдЧрд╛ред рдЙрджрд╛рд╣рд░рдг рдХреЗ рд▓рд┐рдП, рд╕рдмрд╕реЗ рднрд╛рдЧрдиреЗ рд╡рд┐рд╢реНрд▓реЗрд╖рдг рдХрд░рдиреЗ рдкрд░ рд╡рд┐рдЪрд╛рд░ рдХрд░реЗрдВрдЧреЗ рдПрдХ рд╕реВрдЪрдХ p рд╕реЗ рдмрдЪрдиреЗ рдХреЗ рд▓рд┐рдП рдЕрдЧрд░ рд╡реЗ рдХреА рддрд░рд╣ рдПрдХ рдлреЛрди рджреЗрдЦрдиреЗ foo(p) ред рд▓реЗрдХрд┐рди рдЬрд░реВрд░реА рдирд╣реАрдВ рдХрд┐ рд╣рдореЗрдВ рдРрд╕рд╛ рдХрд░рдирд╛ рд╣реА рдкрдбрд╝реЗред рдпрджрд┐ рд╕рдорд╛рд░реЛрд╣ рдХреЗ рд░реВрдк рдореЗрдВ рдШреЛрд╖рд┐рдд рдХрд┐рдпрд╛ рдЧрдпрд╛ рдерд╛:

fn foo<'a>(x: &'a T) { ... }

рддреЛ рд╡рд╛рд╕реНрддрд╡ рдореЗрдВ рд╣рдо рдЬрд╛рдирддреЗ рд╣реИрдВ рдХрд┐ foo рдкрд░ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдирд╣реАрдВ рд░рдЦрддрд╛ рд╣реИ p рдХреЗ рд▓рд┐рдП рдХрд┐рд╕реА рднреА рдЕрдм рдЬреАрд╡рди рднрд░ рдХреА рддреБрд▓рдирд╛ рдореЗрдВ a ред рд╣рд╛рд▓рд╛рдВрдХрд┐, bar рдЬреИрд╕реЗ рдлрд╝рдВрдХреНрд╢рди рдХреЛ рднрд╛рдЧрдиреЗ рдХреЗ рд░реВрдк рдореЗрдВ рдорд╛рдирд╛ рдЬрд╛рдирд╛ рдЪрд╛рд╣рд┐рдП:

fn bar<'a>(x: &'a T, y: &mut &'a T)

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

fn find<'a>(&'a self, k: &K) -> Option<&'a V>

рдЗрд╕рдХрд╛ рдХрд╛рд░рдг рдпрд╣ рд╣реИ рдХрд┐ рдХреНрдпреЛрдВрдХрд┐ 'a find рдкрд░ рдмрд╛рдзреНрдп рд╣реИ, рдпрд╣ Self рдпрд╛ K рдкреНрд░рдХрд╛рд░ рдХреЗ рдорд╛рдкрджрдВрдбреЛрдВ рдореЗрдВ рдкреНрд░рдХрдЯ рдирд╣реАрдВ рд╣реЛ рд╕рдХрддрд╛ рд╣реИ, рдФрд░ рдЗрд╕рд▓рд┐рдП рд╣рдо рдЬрд╛рдирддреЗ рд╣реИрдВ рдХрд┐ рдпрд╣ рдХрд░ рд╕рдХрддрд╛ рд╣реИ' t рдЙрди рдореЗрдВ рд╕рдВрдЧреНрд░рд╣реАрдд рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИ, рдФрд░ рдпрд╣ рдХрд┐рд╕реА рднреА рдкрд░рд┐рд╡рд░реНрддрдирд╢реАрд▓ рд╕реНрдерд╛рдиреЛрдВ рдореЗрдВ рдкреНрд░рдХрдЯ рдирд╣реАрдВ рд╣реЛрддрд╛ рд╣реИред (рдзреНрдпрд╛рди рджреЗрдВ рдХрд┐ рд╣рдо рдЙрд╕реА рдирд┐рд╖реНрдХрд░реНрд╖ рдПрд▓реНрдЧреЛрд░рд┐рджрдо рдХреЛ рд▓рд╛рдЧреВ рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ рдЬреИрд╕рд╛ рдЖрдЬ рдЙрдкрдпреЛрдЧ рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИ рдФрд░ рдЬрд┐рд╕рдХрд╛ рдЙрдкрдпреЛрдЧ # 3598 рдХреЗ рд▓рд┐рдП рдлрд┐рдХреНрд╕ рдХреЗ рд╣рд┐рд╕реНрд╕реЗ рдХреЗ рд░реВрдк рдореЗрдВ рдХрд┐рдпрд╛ рдЬрд╛рдПрдЧрд╛ рддрд╛рдХрд┐ рд╣рдореЗрдВ рдпрд╣ рдкрддрд╛ рдЪрд▓ рд╕рдХреЗ рдХрд┐ рдЬреАрд╡рдирдХрд╛рд▓ рдПрдХ рдкрд░рд┐рд╡рд░реНрддрдиреАрдп рд╕реНрдерд╛рди рдореЗрдВ рджрд┐рдЦрд╛рдИ рджреЗрддрд╛ рд╣реИ рдпрд╛ рдирд╣реАрдВ)

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

рдкреБрдирд░реНрдЙрдзрд╛рд░ рдПрдХ рдорд╛рдореВрд▓реА рдЬрдЯрд┐рд▓рддрд╛ рд╣реИ, рд▓реЗрдХрд┐рди рдЙрдиреНрд╣реЗрдВ рд╡рд┐рднрд┐рдиреНрди рддрд░реАрдХреЛрдВ рд╕реЗ рдирд┐рдпрдВрддреНрд░рд┐рдд рдХрд┐рдпрд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИред рд░рд┐рдмреЛрд░реЛ рддрдм рд╣реЛрддрд╛ рд╣реИ рдЬрдм рдЖрдк рдХрд┐рд╕реА рдЙрдзрд╛рд░ рдкреЙрдЗрдВрдЯрд░ рдХреА рд╕рд╛рдордЧреНрд░реА рдХреЛ рдЙрдзрд╛рд░ рд▓реЗрддреЗ рд╣реИрдВ - рд╡реЗ рд╣рд░ рд╕рдордп _рд╣реЛрддреЗ рд╣реИрдВ рдХреНрдпреЛрдВрдХрд┐ рдХрдВрдкрд╛рдЗрд▓рд░ рдЙрдиреНрд╣реЗрдВ рд▓рдЧрднрдЧ рд╣рд░ рдореЗрдердб рдХреЙрд▓ рдореЗрдВ рд╕реНрд╡рдЪрд╛рд▓рд┐рдд рд░реВрдк рд╕реЗ рд╕рдореНрдорд┐рд▓рд┐рдд рдХрд░рддрд╛ рд╣реИред рдПрдХ рдЙрдзрд╛рд░ рд╕реВрдЪрдХ let p = &v рдФрд░ let q = &*p рдЬреИрд╕реЗ рдкреБрдирд░реНрдЙрдзрд╛рд░ рдкрд░ рд╡рд┐рдЪрд╛рд░ рдХрд░реЗрдВред рдпрд╣ рдЕрдЪреНрдЫрд╛ рд╣реЛрдЧрд╛ рдпрджрд┐ q рдорд░ рдЧрдпрд╛ рдерд╛, рддреЛ рдЖрдк p рдлрд┐рд░ рд╕реЗ рдЙрдкрдпреЛрдЧ рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ - рдФрд░ рдпрджрд┐ p рдФрд░ q рджреЛрдиреЛрдВ рдорд░ рдЧрдП рдереЗ, рддреЛ рдЖрдк рдЙрдкрдпреЛрдЧ рдХрд░ рд╕рдХрддреЗ рдереЗ v рдлрд┐рд░ рд╕реЗ (рдпрд╣ рдорд╛рдирддреЗ рд╣реБрдП рдХрд┐ рди рддреЛ p рдФрд░ рди рд╣реА q рдмрдЪ рдирд┐рдХрд▓рддрд╛ рд╣реИ)ред рдпрд╣рд╛рдВ рдЬрдЯрд┐рд▓рддрд╛ рдпрд╣ рд╣реИ рдХрд┐ рдпрджрд┐ q рдмрдЪ рдЬрд╛рддрд╛ рд╣реИ, рддреЛ p рдХреЛ q рдХреЗ рдЬреАрд╡рдирдХрд╛рд▓ рдХреЗ рд╕рдорд╛рдкреНрдд рд╣реЛрдиреЗ рддрдХ рдПрд╕реНрдХреЗрдкреНрдб рдЕрдк рдорд╛рдирд╛ рдЬрд╛рдирд╛ рдЪрд╛рд╣рд┐рдПред рд▓реЗрдХрд┐рди рдореБрдЭреЗ рд▓рдЧрддрд╛ рд╣реИ рдХрд┐ рдпрд╣ рд╕реНрд╡рд╛рднрд╛рд╡рд┐рдХ рд░реВрдк рд╕реЗ _рдХреБрдЫ рд╣рдж рддрдХ рдЧрд┐рд░ рдЬрд╛рддрд╛ рд╣реИ рдХрд┐ рд╣рдо рдЗрд╕реЗ рдЖрдЬ рдХреИрд╕реЗ рд╕рдВрднрд╛рд▓рддреЗ рд╣реИрдВ: рдпрд╛рдиреА, рдХрдВрдкрд╛рдЗрд▓рд░ рдиреЛрдЯ рдХрд░рддрд╛ рд╣реИ рдХрд┐ q рдиреЗ p рдЙрдзрд╛рд░ рд▓рд┐рдпрд╛ рд╣реИ (рд╢реБрд░реБрдЖрдд рдореЗрдВ) рдЖрдЬреАрд╡рди "q" (рдЕрд░реНрдерд╛рдд, рдЪрд░ рдХрд╛ рд╣реА) рдФрд░ рдпрджрд┐ q рдмрдЪ рдЬрд╛рдирд╛ рдЪрд╛рд╣рд┐рдП, рддреЛ рдЙрд╕реЗ рдкреВрд░реНрдг рд╢рд╛рдмреНрджрд┐рдХ рдЬреАрд╡рдирдХрд╛рд▓ рдореЗрдВ рдмрдврд╝рд╛рд╡рд╛ рджрд┐рдпрд╛ рдЬрд╛рдПрдЧрд╛ред рдореБрдЭреЗ рд▓рдЧрддрд╛ рд╣реИ рдХрд┐ рдореБрд╢реНрдХрд┐рд▓ рд╣рд┐рд╕реНрд╕рд╛ рдбреЗрдЯрд╛рдлреНрд▓реЛ рдореЗрдВ рд╣реИ, рдпрд╣ рдЬрд╛рдирддреЗ рд╣реБрдП рдХрд┐ рдХрд┐рд▓реНрд╕ рдХреЛ рдХрд╣рд╛рдВ рдбрд╛рд▓рдирд╛ рд╣реИ - рд╣рдо p рд▓рд┐рдП рдХрд┐рд▓ рдХреЛ рддреБрд░рдВрдд рд╕рдореНрдорд┐рд▓рд┐рдд рдирд╣реАрдВ рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ рдЬрдм p рдореГрдд рд╣реЛ рдЬрд╛рддрд╛ рд╣реИ рдпрджрд┐ рдЗрд╕реЗ рдкреБрдирд░реНрдЙрдзрд╛рд░ рд▓рд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИред рдУрд╣ рдареАрдХ рд╣реИ, рдореИрдВ рдЗрд╕ рдкрд░ рдЕрдзрд┐рдХ рд╕рдордп рдмрд░реНрдмрд╛рдж рдирд╣реАрдВ рдХрд░реВрдВрдЧрд╛, рдРрд╕рд╛ рд▓рдЧрддрд╛ рд╣реИ рдХрд┐ рдпрд╣ рдХрд░рдиреЗ рдпреЛрдЧреНрдп рд╣реИ, рдФрд░ рдХрдо рд╕реЗ рдХрдо рд╕рд░рд▓ рд╕рдорд╛рдзрд╛рди рд╣реИрдВ рдЬреЛ рд╕рд╛рдорд╛рдиреНрдп рдкрд░рд┐рд╕реНрдерд┐рддрд┐рдпреЛрдВ рдХреЗ рд▓рд┐рдП рдкрд░реНрдпрд╛рдкреНрдд рд╣реЛрдВрдЧреЗ (рдЙрджрд╛рд╣рд░рдг рдХреЗ рд▓рд┐рдП, p рдХреЛ рдкреВрд░реЗ рдЬреАрд╡рдирдХрд╛рд▓ рдХреЗ рд▓рд┐рдП рдмрдЪрдиреЗ рдХреЗ рд▓рд┐рдП рд╡рд┐рдЪрд╛рд░ рдХрд░реЗрдВ q , рднрд▓реЗ рд╣реА q рдЛрдг рдмрдЪ рдЬрд╛рдП рдпрд╛ рдирд╣реАрдВ)ред

рд╡реИрд╕реЗ рднреА, рдЕрдзрд┐рдХ рд╡рд┐рдЪрд╛рд░ рдЬрд░реВрд░реА рд╣реИ, рд▓реЗрдХрд┐рди рдореИрдВ рдпрд╣ рджреЗрдЦрдирд╛ рд╢реБрд░реВ рдХрд░ рд░рд╣рд╛ рд╣реВрдВ рдХрд┐ рдпрд╣ рдХреИрд╕реЗ рдХрд╛рдо рдХрд░ рд╕рдХрддрд╛ рд╣реИред рдореИрдВ рдЕрднреА рднреА рдЗрд╕ рддрд░рд╣ рдХреЗ рдХрд┐рд╕реА рднреА рдПрдХреНрд╕рдЯреЗрдВрд╢рди рдХреЛ рд╢реБрд░реВ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдЕрдирд┐рдЪреНрдЫреБрдХ рд╣реВрдВ рдЬрдм рддрдХ рдХрд┐ # 2202 рдФрд░ # 8624 рддрдп рдирд╣реАрдВ рд╣реЛ рдЬрд╛рддреЗ, рдЬреЛ рдХрд┐ рдЙрдзрд╛рд░ рдХреЗ рд╕рд╛рде рджреЛ рдЬреНрдЮрд╛рдд рд╕рдорд╕реНрдпрд╛рдПрдВ рд╣реИрдВред рд╕рд┐рд╕реНрдЯрдо рдХрд╛ рд╡рд┐рд╕реНрддрд╛рд░ рдХрд░рдиреЗ рд╕реЗ рдкрд╣рд▓реЗ рдореИрдВ рдПрдХ рд╕реБрджреГрдврд╝рддрд╛ рдкреНрд░рдорд╛рдг рдкрд░ рдФрд░ рдкреНрд░рдЧрддрд┐ рдХрд░рдирд╛ рдЪрд╛рд╣рддрд╛ рд╣реВрдВред рдЯрд╛рдЗрдорд▓рд╛рдЗрди рдкрд░ рдореМрдЬреВрдж рджреВрд╕рд░рд╛ рдПрдХреНрд╕рдЯреЗрдВрд╢рди #6268 рд╣реИред

рдореБрдЭреЗ рд╡рд┐рд╢реНрд╡рд╛рд╕ рд╣реИ рдХрд┐ рдореИрдВрдиреЗ рдЗрд╕ рдмрдЧ рдореЗрдВ рднрд╛рдЧ рд▓рд┐рдпрд╛ рд╣реИред рдореЗрд░рд╛ рдЙрдкрдпреЛрдЧ-рдорд╛рдорд▓рд╛ рдФрд░ рдХрд╛рд░реНрдп-рдЖрд╕рдкрд╛рд╕ рдХреЗ рдкреНрд░рдпрд╛рд╕:

https://gist.github.com/toffaletti/6770126

рдЗрд╕ рдмрдЧ рдХрд╛ рдПрдХ рдФрд░ рдЙрджрд╛рд╣рд░рдг рдпрд╣рд╛рдВ рджрд┐рдпрд╛ рдЧрдпрд╛ рд╣реИ (рдореБрдЭреЗ рд▓рдЧрддрд╛ рд╣реИ):

use std::util;

enum List<T> {
    Cons(T, ~List<T>),
    Nil
}

fn find_mut<'a,T>(prev: &'a mut ~List<T>, pred: |&T| -> bool) -> Option<&'a mut ~List<T>> {
    match prev {
        &~Cons(ref x, _) if pred(x) => {}, // NB: can't return Some(prev) here
        &~Cons(_, ref mut rs) => return find_mut(rs, pred),
        &~Nil => return None
    };
    return Some(prev)
}

рдореИрдВ рд▓рд┐рдЦрдирд╛ рдЪрд╛рд╣реВрдВрдЧрд╛:

fn find_mut<'a,T>(prev: &'a mut ~List<T>, pred: |&T| -> bool) -> Option<&'a mut ~List<T>> {
    match prev {
        &~Cons(ref x, _) if pred(x) => return Some(prev),
        &~Cons(_, ref mut rs) => return find_mut(rs, pred),
        &~Nil => return None
    }
}

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

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

рд╕реАрд╕реА @flaper87

рдХреНрдпрд╛ рдпрд╣ рдореБрджреНрджрд╛ рдЗрд╕реЗ рдХрд╡рд░ рдХрд░рддрд╛ рд╣реИ?

use std::io::{MemReader, EndOfFile, IoResult};

fn read_block<'a>(r: &mut Reader, buf: &'a mut [u8]) -> IoResult<&'a [u8]> {
    match r.read(buf) {
        Ok(len) => Ok(buf.slice_to(len)),
        Err(err) => {
            if err.kind == EndOfFile {
                Ok(buf.slice_to(0))
            } else {
                Err(err)
            }
        }
    }
}

fn main() {
    let mut buf = [0u8, ..2];
    let mut reader = MemReader::new(~[67u8, ..10]);
    let mut block = read_block(&mut reader, buf);
    loop {
        //process block
        block = read_block(&mut reader, buf); //error here
}

рдореБрдЭреЗ рд╕реАрд╕реА

#9113 . рдореЗрдВ рдЕрдЪреНрдЫреЗ рдЙрджрд╛рд╣рд░рдг

рдореБрдЭреЗ рд╕реАрд╕реА

рдореБрдЭрд╕реЗ рдЧрд▓рддреА рд╣реЛ рд╕рдХрддреА рд╣реИ, рд▓реЗрдХрд┐рди рдРрд╕рд╛ рд▓рдЧрддрд╛ рд╣реИ рдХрд┐ рдирд┐рдореНрди рдХреЛрдб рдЗрд╕ рдмрдЧ рдХреЛ рднреА рдорд╛рд░ рд░рд╣рд╛ рд╣реИ:

struct MyThing<'r> {
  int_ref: &'r int,
  val: int
}

impl<'r> MyThing<'r> {
  fn new(int_ref: &'r int, val: int) -> MyThing<'r> {
    MyThing {
      int_ref: int_ref,
      val: val
    }
  }

  fn set_val(&'r mut self, val: int) {
    self.val = val;
  }
}


fn main() {
  let to_ref = 10;
  let mut thing = MyThing::new(&to_ref, 30);
  thing.set_val(50);

  println!("{}", thing.val);
}

рдЖрджрд░реНрд╢ рд░реВрдк рд╕реЗ, рдЬреИрд╕реЗ рд╣реА рдлрд╝рдВрдХреНрд╢рди рд╡рд╛рдкрд╕ рдЖрддрд╛ рд╣реИ, set_val рдХреЛ рдХреЙрд▓ рдХрд░рдиреЗ рдХреЗ рдХрд╛рд░рдг рд╣реЛрдиреЗ рд╡рд╛рд▓рд╛ рдкрд░рд┐рд╡рд░реНрддрдирд╢реАрд▓ рдЙрдзрд╛рд░ рд╕рдорд╛рдкреНрдд рд╣реЛ рдЬрд╛рдПрдЧрд╛ред рдзреНрдпрд╛рди рджреЗрдВ рдХрд┐ рд╕рдВрд░рдЪрдирд╛ (рдФрд░ рд╕рдВрдмрдВрдзрд┐рдд рдХреЛрдб) рд╕реЗ 'int_ref' рдлрд╝реАрд▓реНрдб рдХреЛ рд╣рдЯрд╛рдиреЗ рд╕реЗ рд╕рдорд╕реНрдпрд╛ рджреВрд░ рд╣реЛ рдЬрд╛рддреА рд╣реИред рд╡реНрдпрд╡рд╣рд╛рд░ рдЕрд╕рдВрдЧрдд рд╣реИред

@SergioBenitez рдореБрдЭреЗ рдирд╣реАрдВ рд▓рдЧрддрд╛ рдХрд┐ рдпрд╣ рд╡рд╣реА рдореБрджреНрджрд╛ рд╣реИред рдЖрдк рд╕реНрдкрд╖реНрдЯ рд░реВрдк рд╕реЗ рдЕрдиреБрд░реЛрдз рдХрд░ рд░рд╣реЗ рд╣реИрдВ рдХрд┐ &mut self рд╕рдВрджрд░реНрдн рдХрд╛ рдЬреАрд╡рдирдХрд╛рд▓ рд╕рдВрд░рдЪрдирд╛ рдХреЗ рдЬреАрд╡рдирдХрд╛рд▓ рдХреЗ рд╕рдорд╛рди рд╣реЛред

рд▓реЗрдХрд┐рди рдЖрдкрдХреЛ рдРрд╕рд╛ рдХрд░рдиреЗ рдХреА рдЬрд░реВрд░рдд рдирд╣реАрдВ рд╣реИред рдЖрдкрдХреЛ set_val() рдореЗрдВ рдЬреАрд╡рди рднрд░ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рдирд╣реАрдВ рд╣реИред

fn set_val(&mut self, val: int) {
    self.val = val;
}

рдореБрдЭреЗ рдПрдХ рдФрд░ рдорд╛рдорд▓рд╛ рдорд┐рд▓рд╛ рдЬрд┐рд╕реЗ рдареАрдХ рдХрд░рдирд╛ рдмрд╣реБрдд рдореБрд╢реНрдХрд┐рд▓ рд╣реИ:

/// A buffer which breaks chunks only after the specified boundary
/// sequence, or at the end of a file, but nowhere else.
pub struct ChunkBuffer<'a, T: Buffer+'a> {
    input:  &'a mut T,
    boundary: Vec<u8>,
    buffer: Vec<u8>
}

impl<'a, T: Buffer+'a> ChunkBuffer<'a,T> {
    // Called internally to make `buffer` valid.  This is where all our
    // evil magic lives.
    fn top_up<'b>(&'b mut self) -> IoResult<&'b [u8]> {
        // ...
    }
}

impl<'a,T: Buffer+'a> Buffer for ChunkBuffer<'a,T> {
    fn fill_buf<'a>(&'a mut self) -> IoResult<&'a [u8]> {
        if self.buffer.as_slice().contains_slice(self.boundary.as_slice()) {
            // Exit 1: Valid data in our local buffer.
            Ok(self.buffer.as_slice())
        } else if self.buffer.len() > 0 {
            // Exit 2: Add some more data to our local buffer so that it's
            // valid (see invariants for top_up).
            self.top_up()
        } else {
            {
                // Exit 3: Exit on error.
                let read = try!(self.input.fill_buf());
                if read.contains_slice(self.boundary.as_slice()) {
                    // Exit 4: Valid input from self.input. Yay!
                    return Ok(read)
                }
            }
            // Exit 5: Accumulate sufficient data in our local buffer (see
            // invariants for top_up).
            self.top_up()
        }
    }

тАжрдЬреЛ рджреЗрддрд╛ рд╣реИ:

/path/to/mylib/src/buffer.rs:168:13: 168:17 error: cannot borrow `*self` as mutable more than once at a time
/path/to/mylib/src/buffer.rs:168             self.top_up()
                                                        ^~~~
/path/to/mylib/src/buffer.rs:160:33: 160:43 note: previous borrow of `*self.input` occurs here; the mutable borrow prevents subsequent moves, borrows, or modification of `*self.input` until the borrow ends
/path/to/mylib/src/buffer.rs:160                 let read = try!(self.input.fill_buf());
                                                                            ^~~~~~~~~~
<std macros>:1:1: 3:2 note: in expansion of try!
/path/to/mylib/src/buffer.rs:160:28: 160:56 note: expansion site
/path/to/mylib/src/buffer.rs:170:6: 170:6 note: previous borrow ends here
/path/to/mylib/src/buffer.rs:149     fn fill_buf<'a>(&'a mut self) -> IoResult<&'a [u8]> {
...
/path/to/mylib/src/buffer.rs:170     }

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

  1. рдореИрдВ input.fill_buf рджреЛ рдмрд╛рд░ рдХреЙрд▓ рдирд╣реАрдВ рдХрд░ рд╕рдХрддрд╛, рдХреНрдпреЛрдВрдХрд┐ Buffer рдЗрдВрдЯрд░рдлрд╝реЗрд╕ рдЗрд╕ рдмрд╛рдд рдХреА рдЧрд╛рд░рдВрдЯреА рдирд╣реАрдВ рджреЗрддрд╛ рдХрд┐ рдпрд╣ рд╡рд╣ рдбреЗрдЯрд╛ рд▓реМрдЯрд╛рддрд╛ рд╣реИ рдЬрд┐рд╕реЗ рдореИрдВрдиреЗ рдЕрднреА-рдЕрднреА рджреВрд╕рд░реА рдмрд╛рд░ рд╕рддреНрдпрд╛рдкрд┐рдд рдХрд┐рдпрд╛ рд╣реИред рдЕрдЧрд░ рдореИрдВ _do_ рдпрд╣ рдХреЛрд╢рд┐рд╢ рдХрд░рддрд╛ рд╣реВрдВ, рддреЛ рдХреЛрдб рддрдХрдиреАрдХреА рд░реВрдк рд╕реЗ рдЧрд▓рдд рд╣реИ рд▓реЗрдХрд┐рди рдЯрд╛рдЗрдк рдЪреЗрдХрд░ рдЗрд╕реЗ рдЦреБрд╢реА рд╕реЗ рдкрд╛рд╕ рдХрд░рддрд╛ рд╣реИред
  2. рдореИрдВ top_up рдмрд╛рд░реЗ рдореЗрдВ рдмрд╣реБрдд рдХреБрдЫ рдирд╣реАрдВ рдХрд░ рд╕рдХрддрд╛, рдХреНрдпреЛрдВрдХрд┐ рдпрд╣ рдХреЛрдб рдХрд╛ рдПрдХ рдмреБрд░рд╛ рдЯреБрдХрдбрд╝рд╛ рд╣реИ рдЬрд┐рд╕реЗ рдЬрдЯрд┐рд▓ рддрд░реАрдХреЛрдВ рд╕реЗ рд╕рдмрдХреБрдЫ рдмрджрд▓рдиреЗ рдХреА рдЬрд░реВрд░рдд рд╣реИред
  3. рдореИрдВ рдЖрдкрддреНрддрд┐рдЬрдирдХ рдмрд╛рдЗрдВрдб+рдЯреЗрд╕реНрдЯ+рд░рд┐рдЯрд░реНрди рдХреЛ рдХрд┐рд╕реА рдЕрдиреНрдп рдлрд╝рдВрдХреНрд╢рди рдореЗрдВ рдирд╣реАрдВ рд▓реЗ рдЬрд╛ рд╕рдХрддрд╛, рдХреНрдпреЛрдВрдХрд┐ рдирдП рдПрдкреАрдЖрдИ рдореЗрдВ рдЕрднреА рднреА рд╕рднреА рд╕рдорд╛рди рдореБрджреНрджреЗ рд╣реЛрдВрдЧреЗ (рдЬрдм рддрдХ рдХрд┐ if let рдореБрдЭреЗ _then_ рдмрд╛рдЗрдВрдб рдХрд╛ рдкрд░реАрдХреНрд╖рдг рдХрд░рдиреЗ рдХреА рдЕрдиреБрдорддрд┐ рдирд╣реАрдВ рджреЗрддрд╛ рд╣реИ?)

рдпрд╣ рд▓рдЧрднрдЧ рдРрд╕рд╛ рд▓рдЧрддрд╛ рд╣реИ рдЬреИрд╕реЗ 'a рдмрд╛рдзрд╛ рдЖрджрд░реНрд╢ рд░реВрдк рд╕реЗ read рдкреВрд░реА рддрд░рд╣ рд╕реЗ рдкреНрд░рдЪрд╛рд░рд┐рдд рдирд╣реАрдВ рд╣реЛрдиреА рдЪрд╛рд╣рд┐рдПред рд▓реЗрдХрд┐рди рдореИрдВ рдпрд╣рд╛рдБ рдЕрдкрдиреЗ рд╕рд┐рд░ рдХреЗ рдКрдкрд░ рд╣реВрдБред рдореИрдВ рдЖрдЧреЗ if let рдХреЛрд╢рд┐рд╢ рдХрд░рдиреЗ рдЬрд╛ рд░рд╣рд╛ рд╣реВрдВред

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

рдореБрдЭреЗ рдпрдХреАрди рдирд╣реАрдВ рд╣реИ рдХрд┐ рдХреИрд╕реЗ рдЖрдЧреЗ рдмрдврд╝рдирд╛ рд╣реИ, unsafe рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдиреЗ рд╕реЗ рдХрдоред

рдореЗрд░рд╛ рд╡рд░реНрддрдорд╛рди рд╣реИрдХ рдпрд╣рд╛рдБ рдЗрд╕ рддрд░рд╣ рджрд┐рдЦрддрд╛ рд╣реИ:

impl<'a,T: Buffer+'a> Buffer for ChunkBuffer<'a,T> {
    fn fill_buf<'a>(&'a mut self) -> IoResult<&'a [u8]> {
        // ...

            { // Block A.
                let read_or_err = self.input.fill_buf();
                match read_or_err {
                    Err(err) => { return Err(err); }
                    Ok(read) => {
                        if read.contains_slice(self.boundary.as_slice()) {
                               return Ok(unsafe { transmute(read) });
                        }
                    }
                }
            }
            self.top_up()

рдпрд╣рд╛рдВ рд╕рд┐рджреНрдзрд╛рдВрдд рдпрд╣ рд╣реИ рдХрд┐ рдореИрдВ read (рдЬреЛ self.input рд▓рд┐рдП рдмрд╛рдзреНрдп рдерд╛) рдХреЗ рдЬреАрд╡рдирдХрд╛рд▓ рдХреЛ рдЫреЛрдбрд╝ рд░рд╣рд╛ рд╣реВрдВ, рдФрд░ рддреБрд░рдВрдд self рдЖрдзрд╛рд░ рдкрд░ рдПрдХ рдирдпрд╛ рдЬреАрд╡рдирдХрд╛рд▓ рд▓рд╛рдЧреВ рдХрд░ рд░рд╣рд╛ рд╣реВрдВ, рдЬреЛ self.input рдХрд╛ рдорд╛рд▓рд┐рдХ рд╣реИ read рдХрд╛ рд╢рд╛рдмреНрджрд┐рдХ рдЬреАрд╡рдирдХрд╛рд▓ рдмреНрд▓реЙрдХ рдП рдХреЗ рдмрд░рд╛рдмрд░ рд╣реЛ, рдФрд░ рдореИрдВ рдирд╣реАрдВ рдЪрд╛рд╣рддрд╛ рдХрд┐ рдЗрд╕реЗ _lexical_ рдмреНрд▓реЙрдХ рд╕реНрддрд░ рддрдХ рдлрд╣рд░рд╛рдпрд╛ рдЬрд╛рдП рдХреНрдпреЛрдВрдХрд┐ рдореИрдВрдиреЗ рдЗрд╕реЗ return ред рд╕реНрдкрд╖реНрдЯ рд░реВрдк рд╕реЗ рдЖрдЬреАрд╡рди рдЪреЗрдХрд░ рдХреЛ рдЕрднреА рднреА рдпрд╣ рд╕рд╛рдмрд┐рдд рдХрд░рдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реИ рдХрд┐ рдкрд░рд┐рдгрд╛рдо 'a рдХреЗ рд╕рд╛рде рдЬреАрд╡рди рднрд░ рд╕рдВрдЧрдд рд╣реИ, рд▓реЗрдХрд┐рди рдореБрдЭреЗ рд╕рдордЭ рдореЗрдВ рдирд╣реАрдВ рдЖрддрд╛ рдХрд┐ рдЗрд╕рдХрд╛ рдорддрд▓рдм LIFETIME( read ) рдХреЛ LIFETIME( 'a рд╕рд╛рде рдПрдХреАрдХреГрдд рдХрд░рдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рдХреНрдпреЛрдВ рд╣реИ)

рдпрд╣ рдкреВрд░реА рддрд░рд╣ рд╕реЗ рд╕рдВрднрд╡ рд╣реИ рдХрд┐ рдореИрдВ рд╡реНрдпрд╛рдкрдХ рд░реВрдк рд╕реЗ рднреНрд░рдорд┐рдд рд╣реВрдВ, рдпрд╛ рдореЗрд░рд╛ рдХреЛрдб рдмреЗрд╣рдж рдЕрд╕реБрд░рдХреНрд╖рд┐рдд рд╣реИред :-) рд▓реЗрдХрд┐рди рдРрд╕рд╛ рд▓рдЧрддрд╛ рд╣реИ рдХрд┐ рдпрд╣ рдХрд╛рдо рдХрд░рдирд╛ рдЪрд╛рд╣рд┐рдП, рдЕрдЧрд░ рдХреЗрд╡рд▓ рдЗрд╕рд▓рд┐рдП рдХрд┐ рдореИрдВ рдмрд┐рдирд╛ рдХрд┐рд╕реА рд╕рдорд╕реНрдпрд╛ рдХреЗ return self.input.fill_buf() рдХреЙрд▓ рдХрд░ рд╕рдХрддрд╛ рд╣реВрдВред рдХреНрдпрд╛ рдЙрд╕ рдЕрдВрддрд░реНрдЬреНрдЮрд╛рди рдХреЛ рдФрдкрдЪрд╛рд░рд┐рдХ рд░реВрдк рджреЗрдиреЗ рдХрд╛ рдХреЛрдИ рддрд░реАрдХрд╛ рд╣реИ?

@emk рддреЛ рдпрд╣ "рд╣рд╛рд░реНрдб рдХреЛрдб" рд╣реИ рдХрд┐ SEME рдХреНрд╖реЗрддреНрд░ (рдЕрд░реНрдерд╛рдд, рдЧреИрд░-рд╡реНрдпрд╛рдЦреНрдпрд╛рддреНрдордХ рдХреНрд╖реЗрддреНрд░) рдареАрдХ рдирд╣реАрдВ рд╣реЛрддреЗ рд╣реИрдВ, рдХрдо рд╕реЗ рдХрдо рдЕрдкрдиреЗ рдЖрдк рд╕реЗ рдирд╣реАрдВред рдореЗрд░реЗ рдкрд╛рд╕ рдХрдВрдкрд╛рдЗрд▓рд░ рдореЗрдВ рдЗрд╕реЗ рдЕрдЪреНрдЫреА рддрд░рд╣ рд╕реЗ рдареАрдХ рдХрд░рдиреЗ рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рдХреБрдЫ рд╡рд┐рдЪрд╛рд░ рд╣реИрдВ, рд▓реЗрдХрд┐рди рдпрд╣ SEME рдХреНрд╖реЗрддреНрд░реЛрдВ рдХреЗ рд▓рд┐рдП рдПрдХ рдЧреИрд░-рддреБрдЪреНрдЫ рд╡рд┐рд╕реНрддрд╛рд░ рд╣реИред рдЖрдорддреМрд░ рдкрд░ рдХреЛрдб рдХрд╛ рдкреБрдирд░реНрдЧрдарди рдХрд░рдХреЗ рдЗрд╕реЗ рд╣рд▓ рдХрд░рдиреЗ рдХрд╛ рдПрдХ рддрд░реАрдХрд╛ рд╣реИред рдореБрдЭреЗ рджреЗрдЦрдиреЗ рджреЛ рдХрд┐ рдХреНрдпрд╛ рдореИрдВ рдЗрд╕рдХреЗ рд╕рд╛рде рдЦреЗрд▓ рд╕рдХрддрд╛ рд╣реВрдВ рдФрд░ рдПрдХ рдЕрдЪреНрдЫрд╛ рдЙрджрд╛рд╣рд░рдг рдкреЗрд╢ рдХрд░ рд╕рдХрддрд╛ рд╣реВрдВред

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

рдХреНрдпрд╛ рдЗрд╕рдХреЗ рд▓рд┐рдП RFC рдХреА рдХреЛрдИ рд╕рдордп рд╕реАрдорд╛ рд╣реИ?

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

use std::collections::SmallIntMap;

enum Foo<'a>{ A(&'a mut SmallIntMap<uint>), B(&'a mut uint) }

fn main() {
    let mut map = SmallIntMap::<uint>::new();
    do_stuff(&mut map);
}

fn do_stuff(map: &mut SmallIntMap<uint>) -> Foo {
    match map.find_mut(&1) {
        None => {},  // Definitely can't return A here because of lexical scopes
        Some(val) => return B(val),
    }
    return A(map); // ERROR: borrowed at find_mut???
}

рдкреНрд▓реЗрдкреЗрди

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

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

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

@mtanski рд╣рд╛рдБ, рд▓реЗрдХрд┐рди рдЧрд▓рддреА _does_ рдЙрдзрд╛рд░ рдЪреЗрдХрд░ AFAIK рдореЗрдВ рд╣реИ, рдЗрд╕реЗ рджреЛрд╖ рджреЗрдирд╛ рдЧрд▓рдд рдирд╣реАрдВ рд╣реИред рдореИрдВ рдЬрд┐рд╕ рдмрд╛рдд рдХрд╛ рдЬрд┐рдХреНрд░ рдХрд░ рд░рд╣рд╛ рд╣реВрдВ рд╡рд╣ рдпрд╣ рд╣реИ рдХрд┐ рдпрд╣ рдирдП рд▓реЛрдЧреЛрдВ рдХреЛ рдпрд╣ рд╡рд┐рд╢реНрд╡рд╛рд╕ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдкреНрд░реЗрд░рд┐рдд рдХрд░ рд╕рдХрддрд╛ рд╣реИ рдХрд┐ рдпрд╣ рдЙрдзрд╛рд░ рдЬрд╛рдВрдЪ _approach_ рдХреЗ рд╕рд╛рде рдПрдХ рдЕрдВрддрд░реНрдирд┐рд╣рд┐рдд, рдореМрд▓рд┐рдХ, рдЕрд╕рдлрд▓ рд╕рдорд╕реНрдпрд╛ рд╣реИ, рдЬреЛ рдПрдХ рдмрд╣реБрдд рд╣реА рдХрдкрдЯреА рд╣реИ, рдФрд░ AFAIK, рдЧрд▓рдд, рд╡рд┐рд╢реНрд╡рд╛рд╕ рд╣реИред

рдорд╛рдорд▓реЗ рдХреЗ рд▓рд┐рдП: "рдЪрд▓реЛ p = &...; рдЙрдкрдпреЛрдЧ-рдкрд╛-рдмрд┐рдЯ-рд▓реЗрдХрд┐рди-рдлрд┐рд░ рдХрднреА рдирд╣реАрдВ; рдЙрдореНрдореАрдж-рдЛрдг-рд╕реЗ-рд╕рдорд╛рдкреНрддрд┐-рдпрд╣рд╛рдБ;" рдореБрдЭреЗ рдЕрдм рдЙрд╕ рдЙрдзрд╛рд░ рдХреЗ рд▓рд┐рдП рджрд╛рдпрд░реЗ рдХреЗ рдЕрдВрдд рдХреЛ рдореИрдиреНрдпреБрдЕрд▓ рд░реВрдк рд╕реЗ рдШреЛрд╖рд┐рдд рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдПрдХ рдХрд┐рд▓ (рдкреА) рдирд┐рд░реНрджреЗрд╢ рдХреЗ рд▓рд┐рдП рд╕реНрд╡реАрдХрд╛рд░реНрдп рд╣реЛрдЧрд╛ред рдмрд╛рдж рдХреЗ рд╕рдВрд╕реНрдХрд░рдг рдХреЗрд╡рд▓ рдЗрд╕ рдирд┐рд░реНрджреЗрд╢ рдХреЛ рдЕрдирджреЗрдЦрд╛ рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ рдпрджрд┐ рдЗрд╕рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рдирд╣реАрдВ рд╣реИ рдпрд╛ рдЗрд╕рдХреЗ рдмрд╛рдж p рдХреЗ рдкреБрди: рдЙрдкрдпреЛрдЧ рдХрд╛ рдкрддрд╛ рдЪрд▓рдиреЗ рдкрд░ рдЗрд╕реЗ рдПрдХ рддреНрд░реБрдЯрд┐ рдХреЗ рд░реВрдк рдореЗрдВ рдЪрд┐рд╣реНрдирд┐рдд рдХрд┐рдпрд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИред

/* (wanted) */
/*
fn main() {

    let mut x = 10;

    let y = &mut x;

    println!("x={}, y={}", x, *y);

    *y = 11;

    println!("x={}, y={}", x, *y);
}
*/

/* had to */
fn main() {

    let mut x = 10;
    {
        let y = &x;

        println!("x={}, y={}", x, *y);
    }

    {
        let y = &mut x;

        *y = 11;
    }

    let y = &x;

    println!("x={}, y={}", x, *y);
}

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

рд╕реВрд░реНрдп, рдЕрдкреНрд░реИрд▓ 5, 2015 рдХреЛ 01:41 axeoth [email protected] рд▓рд┐рдЦрд╛ рд╣реИ:

/* (рд╡рд╛рдВрдЫрд┐рдд) _/_fn рдореБрдЦреНрдп () { mut x = 10; рдЪрд▓реЛ y = рдФрд░ рдореНрдпреВрдЯ рдПрдХреНрд╕; println!("x={}, y={}", x, _y); *рд╡рд╛рдИ = 11; println!("x={}, y={}", x, *y);}_/
/* рдХреЛ */fn рдореБрдЦреНрдп () { рдХрд░рдирд╛ рдерд╛

let mut x = 10;
{
    let y = &x;

    println!("x={}, y={}", x, *y);
}

{
    let y = &mut x;

    *y = 11;
}

let y = &x;

println!("x={}, y={}", x, *y);

}

-
рдЗрд╕ рдИрдореЗрд▓ рдХрд╛ рд╕реАрдзреЗ рдЙрддреНрддрд░ рджреЗрдВ рдпрд╛ рдЗрд╕реЗ GitHub рдкрд░ рджреЗрдЦреЗрдВ
https://github.com/rust-lang/rust/issues/6393#issuecomment -89848449ред

https://github.com/rust-lang/rfcs/issues/811 рдХреЗ рдкрдХреНрд╖ рдореЗрдВ рд╕рдорд╛рдкрди

@metajack рдЖрдкрдХреЗ рдореВрд▓ рдХреЛрдб рдХрд╛ рд▓рд┐рдВрдХ 404 рд╣реИред рдХреНрдпрд╛ рдЖрдк рдЗрд╕реЗ рдЗрд╕ рдмрдЧ рдХреЛ рдкрдврд╝рдиреЗ рд╡рд╛рд▓реЗ рд▓реЛрдЧреЛрдВ рдХреЗ рд▓рд┐рдП рдЗрдирд▓рд╛рдЗрди рд╢рд╛рдорд┐рд▓ рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ?

рдХреБрдЫ рдЦреБрджрд╛рдИ рдХреЗ рдмрд╛рдж, рдореЗрд░рд╛ рдорд╛рдирдирд╛ тАЛтАЛтАЛтАЛрд╣реИ рдХрд┐ рдпрд╣ рдореВрд▓ рдХреЛрдб рдХреЗ рдмрд░рд╛рдмрд░ рд╣реИ:
https://github.com/servo/servo/blob/5e406fab7ee60d9d8077d52d296f52500d72a2f6/src/servo/layout/box_builder.rs#L374

рдпрд╛ рдпреЛрдВ рдХрд╣реЗрдВ рдХрд┐ рдЬрдм рдореИрдВрдиреЗ рдЗрд╕ рдмрдЧ рдХреЛ рджрд░реНрдЬ рдХрд┐рдпрд╛ рдерд╛, рддрдм рдореИрдВрдиреЗ рдЗрд╕рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд┐рдпрд╛ рдерд╛ред рдЙрд╕ рдкрд░рд┐рд╡рд░реНрддрди рд╕реЗ рдкрд╣рд▓реЗ рдХрд╛ рдореВрд▓ рдХреЛрдб рдпрд╣ рдкреНрд░рддреАрдд рд╣реЛрддрд╛ рд╣реИ:
https://github.com/servo/servo/blob/7267f806a7817e48b0ac0c9c4aa23a8a0d288b03/src/servo/layout/box_builder.rs#L387 -L399

рдореБрдЭреЗ рдпрдХреАрди рдирд╣реАрдВ рд╣реИ рдХрд┐ рдпреЗ рд╡рд┐рд╢рд┐рд╖реНрдЯ рдЙрджрд╛рд╣рд░рдг рдЕрдм рдХрд┐рддрдиреЗ рдкреНрд░рд╛рд╕рдВрдЧрд┐рдХ рд╣реИрдВ рдХреНрдпреЛрдВрдХрд┐ рд╡реЗ рдкреВрд░реНрд╡-рдЬрдВрдЧ 1.0 рдереЗред

@metajack рдЗрд╕ рдореБрджреНрджреЗ рдХреЗ рд╢реАрд░реНрд╖ рдореЗрдВ рдПрдХ рдЕрддрд┐ рд╕рд░рд▓ (рдкреЛрд╕реНрдЯ 1.0) рдЙрджрд╛рд╣рд░рдг рд╣реЛрдирд╛ рдмрд╣реБрдд рдЕрдЪреНрдЫрд╛ рд╣реЛрдЧрд╛ред рдпрд╣ рд╕рдорд╕реНрдпрд╛ рдЕрдм https://github.com/rust-lang/rfcs/issues/811 . рдХрд╛ рд╣рд┐рд╕реНрд╕рд╛ рд╣реИ

fn main() {
    let mut nums=vec![10i,11,12,13];
    *nums.get_mut(nums.len()-2)=2;
}

рдореБрдЭреЗ рд▓рдЧрддрд╛ рд╣реИ рдХрд┐ рдореИрдВ рдЬрд┐рд╕ рдмрд╛рд░реЗ рдореЗрдВ рд╢рд┐рдХрд╛рдпрдд рдХрд░ рд░рд╣рд╛ рдерд╛ рд╡рд╣ рдХреБрдЫ рдРрд╕рд╛ рдерд╛:
https://is.gd/yfxUfw

рд╡рд╣ рд╡рд┐рд╢реЗрд╖ рдорд╛рдорд▓рд╛ рдЕрдм рдХрд╛рдо рдХрд░рддрд╛ рдкреНрд░рддреАрдд рд╣реЛрддрд╛ рд╣реИред

@vitral рдЖрдЬ рдХреЗ рдЬрдВрдЧ рдореЗрдВ рдПрдХ рдЙрджрд╛рд╣рд░рдг рдЬреЛ рдореБрдЭреЗ рд▓рдЧрддрд╛ рд╣реИ рдХрд┐ рд▓рд╛рдЧреВ рд╣реЛрддрд╛ рд╣реИ:

fn main() {
    let mut vec = vec!();

    match vec.first() {
        None => vec.push(5),
        Some(v) => unreachable!(),
    }
}

None рд╣рд╛рде рдЙрдзрд╛рд░ рд▓реЗрдиреЗ рдореЗрдВ рд╡рд┐рдлрд▓ рд░рд╣рддрд╛ рд╣реИред

рдордЬреЗ рдХреА рдмрд╛рдд рд╣реИ, рдпрджрд┐ рдЖрдк int рдХреЛ Some рдмрд╛рдВрд╣ рдореЗрдВ рдкрдХрдбрд╝рдиреЗ рдХреА рдХреЛрд╢рд┐рд╢ рдирд╣реАрдВ рдХрд░рддреЗ рд╣реИрдВ (рдпрд╛рдиреА Some(_) ), рддреЛ рдпрд╣ рд╕рдВрдХрд▓рд┐рдд рд╣реЛ рдЬрд╛рддрд╛ рд╣реИред

@wyverland рдУрд╣ рд╣рд╛рдВ, рдореИрдВрдиреЗ рдХрд▓ рд╣реА рдЙрд╕реЗ рдорд╛рд░рд╛, рдмрд╣реБрдд рдХрд╖реНрдЯрдкреНрд░рджред

@metajack рдХреНрдпрд╛ рдЖрдк рдЙрд╕ рдЙрджрд╛рд╣рд░рдг рдХреЛ рд╢рд╛рдорд┐рд▓ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдкрд╣рд▓реА рдкреЛрд╕реНрдЯ рд╕рдВрдкрд╛рджрд┐рдд рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ?

рдпрд╣ рдЕрднреА рддрдХ рд░рд╛рдд рдореЗрдВ рдирд╣реАрдВ рдорд╛рд░рд╛ рдЧрдпрд╛ рд╣реИ, рд▓реЗрдХрд┐рди рдореИрдВ рд╕рд┐рд░реНрдл рдЗрддрдирд╛ рдХрд╣рдирд╛ рдЪрд╛рд╣рддрд╛ рд╣реВрдВ рдХрд┐ рдпрд╣ рдЕрдм рд╕рдВрдХрд▓рд┐рдд рд╣реИ:

#![feature(nll)]

fn main() {
    let mut vec = vec!();

    match vec.first() {
        None => vec.push(5),
        Some(v) => unreachable!(),
    }
}
рдХреНрдпрд╛ рдпрд╣ рдкреГрд╖реНрда рдЙрдкрдпреЛрдЧреА рдерд╛?
0 / 5 - 0 рд░реЗрдЯрд┐рдВрдЧреНрд╕

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

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

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

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

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

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