Rust: рдФрд░ рд╕реНрд╡рдпрдВ рдХреЗ рд╕рд╛рде рдкрд░рд╕реНрдкрд░ рдЖрддреНрдо-рдЙрдзрд╛рд░ рд╕рдВрдШрд░реНрд╖ред

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

рдореБрдЭреЗ рдирд╣реАрдВ рдкрддрд╛ рдХрд┐ рдРрд╕рд╛ рдХреНрдпреЛрдВ рд╣реЛрддрд╛ рд╣реИ рд▓реЗрдХрд┐рди IRC рдкрд░ рд░реЛрд╡рд░ рдФрд░ XMPPwocky рдХрд╛ рдорд╛рдирдирд╛ тАЛтАЛрдерд╛ рдХрд┐ рдпрд╣ рдХрдВрдкрд╛рдЗрд▓рд░ рдмрдЧ рд╣реИред

struct A {
    a: i32
}

impl A {
    fn one(&mut self) -> &i32{
        self.a = 10;
        &self.a
    }
    fn two(&mut self) -> &i32 {
        loop {
            let k = self.one();
            if *k > 10i32 {
                return k;
            }
        }
    }
}

... рдирд┐рдореНрдирд▓рд┐рдЦрд┐рдд рддреНрд░реБрдЯрд┐ рджреЗрддрд╛ рд╣реИ ...

<anon>:12:21: 12:25 error: cannot borrow `*self` as mutable more than once at a time
<anon>:12             let k = self.one();
                              ^~~~
<anon>:12:21: 12:25 note: previous borrow of `*self` occurs here; the mutable borrow prevents subsequent moves, borrows, or modification of `*self` until the borrow ends
<anon>:12             let k = self.one();
                              ^~~~
<anon>:17:6: 17:6 note: previous borrow ends here
<anon>:10     fn two(&mut self) -> &i32 {
...
<anon>:17     }
              ^
error: aborting due to previous error
playpen: application terminated with error code 101

рджрд┐рд▓рдЪрд╕реНрдк рд╣реИ, рдЕрдЧрд░ рджреВрд╕рд░реА рд╡рд┐рдзрд┐ рдХреЛ рдмрджрд▓ рджрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИ ...

    fn two(&mut self) -> &i32 {
        loop {
            let k = self.one();
            return k;
        }
    }

рдпрд╣ рдареАрдХ рд╕рдВрдХрд▓рди рдХрд░реЗрдЧрд╛ред

playpen: http://is.gd/mTkfw5

A-NLL A-borrow-checker A-typesystem C-bug NLL-polonius T-compiler

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

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

рдореБрдЭреЗ рдпрд╣ рднреА рдЙрд▓реНрд▓реЗрдЦ рдХрд░рдирд╛ рдЪрд╛рд╣рд┐рдП рдХрд┐ рдЕрднрд┐рдиреАрдд рдХреЛрдб рдЕрдм рдирд╡реАрдирддрдо рд░рд╛рддреНрд░рд┐рдХрд╛рд▓реАрди рд╕рдВрдХрд▓рди рдирд╣реАрдВ рд╣реИред @ рд░реЙрдмрд░реНрдЯрд┐рдпрди рдиреЗ " regression-from-nightly-to-nightly " рдЯреИрдЧ рдХрд╛ рд╕реБрдЭрд╛рд╡ рджрд┐рдпрд╛, рдФрд░ рдпрд╣ рднреА рд╕реБрдЭрд╛рд╡ рджрд┐рдпрд╛ рдЧрдпрд╛ рдерд╛ рдХрд┐ рдореБрдЭреЗ @nikomatsakis рдХреЛ рдЯреИрдЧ рдХрд░рдирд╛ рдЪрд╛рд╣рд┐рдП рдЕрдЧрд░ рдпрд╣ рдПрдХ рдЬрд░реВрд░реА рд╕рдорд╕реНрдпрд╛ рдереА :)

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

рдореЗрд░рд╛ рдорд╛рдирдирд╛ тАЛтАЛрд╣реИ рдХрд┐ рдпрд╣ рд╕рд╣реА рд╡реНрдпрд╡рд╣рд╛рд░ рд╣реИред рдпрд╣ рджреЗрдЦрдиреЗ рдХреЗ рд▓рд┐рдП рдХрд┐, рд╕реНрдкрд╖реНрдЯ рдЬреАрд╡рдирдХрд╛рд▓ рдПрдиреЛрдЯреЗрд╢рди рд╡рд╛рд▓реЗ рдХреЛрдб рдкрд░ рд╡рд┐рдЪрд╛рд░ рдХрд░реЗрдВ:

struct A {
    a: i32
}

impl A {
    fn one<'a>(&'a mut self) -> &'a i32{
        self.a = 10;
        &self.a
    }
    fn two<'a>(&'a mut self) -> &'a i32 {
        loop {
            let k = self.one();
            if *k > 10i32 {
                return k;
            }
        }
    }
}

two рдХреЛ рдПрдХ рд╣реА рдЬреАрд╡рдирдХрд╛рд▓ рдХреЗ рд╕рд╛рде рдПрдХ рд╕рдВрджрд░реНрдн рдХреЛ рд╡рд╛рдкрд╕ рдХрд░рдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реИ, рдЬреИрд╕рд╛ рдХрд┐ рдЗрд╕реЗ рджрд┐рдП рдЧрдП рдЙрддреНрдкрд░рд┐рд╡рд░реНрддрд┐рдд рдЙрдзрд╛рд░ рдХреЗ рд░реВрдк рдореЗрдВ рд╣реИред рд╣рд╛рд▓рд╛рдБрдХрд┐, рдЬрдм рд╕реЗ рдпрд╣ рд╣реЛ рдЬрд╛рддрд╛ рд╣реИред рдЗрд╕рдХрд╛ рдорддрд▓рдм рд╣реИ рдХрд┐ k рдХрд╛ рдЬреАрд╡рдирдХрд╛рд▓ 'a рд╣реЛрдирд╛ рдЪрд╛рд╣рд┐рдПред рд╣рд╛рд▓рд╛рдБрдХрд┐, one рдХреЗ рд▓реМрдЯрд╛рдП рдЧрдП рдореВрд▓реНрдп рдХреЗ рд▓рд┐рдП, рдЬреАрд╡рдирдХрд╛рд▓ 'a , one рдХреЗ рдЗрдирдкреБрдЯ рдХрд╛ рднреА рдЬреАрд╡рдирдХрд╛рд▓ 'a рд╣реЛрдирд╛ рдЪрд╛рд╣рд┐рдПред рдЗрд╕рдХрд╛ рдорддрд▓рдм рдпрд╣ рд╣реИ рдХрд┐ рд░рд╕реНрдЯ рдХреЛ self "рд░реАрдмреЛрд░" рдирд╣реАрдВ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдордЬрдмреВрд░ рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИ рдФрд░ рдЗрд╕реЗ one рдореЗрдВ рд╕реНрдерд╛рдирд╛рдВрддрд░рд┐рдд рдХрд░ рджрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИред рдЪреВрдВрдХрд┐ рдЙрддреНрдкрд░рд┐рд╡рд░реНрддрдиреАрдп рд╕рдВрджрд░реНрдн рд░реИрдЦрд┐рдХ рд╣реЛрддреЗ рд╣реИрдВ, рдЙрдиреНрд╣реЗрдВ рдХреЗрд╡рд▓ рдПрдХ рдмрд╛рд░ рд╕реНрдерд╛рдирд╛рдВрддрд░рд┐рдд рдХрд┐рдпрд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИ, рд▓реЗрдХрд┐рди loop рдЕрд░реНрде рд╣реИ рдХрд┐ one рдХреЛ рдПрдХ рд╣реА рдкрд░рд╕реНрдкрд░ рд╕рдВрджрд░реНрдн рдХреЗ рд╕рд╛рде рдмрд╛рд░-рдмрд╛рд░ рдХреЙрд▓ рдХрд░рдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реЛ рд╕рдХрддреА рд╣реИред

рджреВрд╕рд░рд╛ рдЙрджрд╛рд╣рд░рдг рдХреЗрд╡рд▓ рдЗрд╕рд▓рд┐рдП рдХрд╛рдо рдХрд░рддрд╛ рд╣реИ рдХреНрдпреЛрдВрдХрд┐ рд░рд╕реНрдЯ рджреЗрдЦ рд╕рдХрддрд╛ рд╣реИ рдХрд┐ рд▓реВрдк рдХреЗрд╡рд▓ рдПрдХ рдмрд╛рд░ рдЪрд▓реЗрдЧрд╛, рдЗрд╕рд▓рд┐рдП self рдХреЗрд╡рд▓ рдПрдХ рдмрд╛рд░ рдЪрд▓реЗ рдЬрд╛рдПрдВрдЧреЗред

рдпрд╣ рдПрдХ рдЧреИрд░-рд╢рд╛рдмреНрджрд┐рдХ рдЙрдзрд╛рд░ рдореБрджреНрджреЗ рдХреА рддрд░рд╣ рджрд┐рдЦрддрд╛ рд╣реИред рдЖрдк рдмрд┐рдирд╛ рдХрд┐рд╕реА рдЫреЛрд░реЛрдВ рдХреЗ рд╕рдорд╛рди рд╡реНрдпрд╡рд╣рд╛рд░ рдкреНрд░рд╛рдкреНрдд рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ:

struct Foo { data: Option<i32> }

fn main() {
    let mut x = Foo{data: Some(1)};

    foo(&mut x);
}

fn foo(x: &mut Foo) -> Option<&mut i32> {
    if let Some(y) = x.data.as_mut() {
        return Some(y);
    }

    println!("{:?}", x.data); 
    None
}
<anon>:14:22: 14:28 error: cannot borrow `x.data` as immutable because it is also borrowed as mutable
<anon>:14     println!("{:?}", x.data); 
                               ^~~~~~
note: in expansion of format_args!
<std macros>:2:43: 2:76 note: expansion site
<std macros>:1:1: 2:78 note: in expansion of println!
<anon>:14:5: 14:30 note: expansion site
<anon>:10:22: 10:28 note: previous borrow of `x.data` occurs here; the mutable borrow prevents subsequent moves, borrows, or modification of `x.data` until the borrow ends
<anon>:10     if let Some(y) = x.data.as_mut() {
                               ^~~~~~
<anon>:16:2: 16:2 note: previous borrow ends here
<anon>:9 fn foo(x: &mut Foo) -> Option<&mut i32> {
...
<anon>:16 }
          ^
error: aborting due to previous error

Rustc рд╕рд╢рд░реНрдд рдЙрдзрд╛рд░ рд░рд┐рдЯрд░реНрди рдХреЗ рд╕рд╛рде "рд╕реМрджрд╛" рдирд╣реАрдВ рдХрд░ рд╕рдХрддрд╛ рд╣реИред

рд╕реАрд╕реА @ рдкреАрд╕реАрд╡рд▓реНрдЯрди

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

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

struct Foo (u8);

impl Foo {
    fn bar(&mut self) -> &u8 {
        self.0 += 1;
        &self.0
    }
}

fn main() {
    let mut x = Foo(42);
    let a = x.bar(); // note: borrow of `x` occurs here
    let b = x.0; // error: cannot use `x.0` because it was mutably borrowed
}

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

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

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

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

рдЗрдВрдЯрд░реНрдирд▓ рдкрд░ рдХреБрдЫ рдЪрд░реНрдЪрд╛: https://internals.rust-lang.org/t/relaxing-the-borrow-checker-for-fn-mut-self-t/3256

рдЧреИрд░-рд╢рд╛рдмреНрджрд┐рдХ рдЙрдзрд╛рд░ рд╕реБрд╡рд┐рдзрд╛ рдЪрд░реНрдЪрд╛: https://github.com/rust-lang/rfcs/issues/811

рдЗрд╕рд▓рд┐рдП [рдЗрдВрдЯрд░реНрдирд▓ рдереНрд░реЗрдб] рдХреЛ рдкрдврд╝рдиреЗ рд╕реЗ рдореБрдЭреЗ рд▓рдЧрддрд╛ рд╣реИ рдХрд┐ рдпрд╣ рдареАрдХ рдирд╣реАрдВ рд╣реИ (рдПрдирдПрд▓рдПрд▓ рдХреЗ рд╕рд╛рде рднреА)ред рдХреНрдпрд╛ рдХреЛрдИ рдкреБрд╖реНрдЯрд┐ рдХрд░ рд╕рдХрддрд╛ рд╣реИ? (@ рдИрдбрдмреАрдмреА?)

cc @ рд░реЗрд╕реНрдЯ-рд▓реЙрдиреНрдЧ / рд▓реЙрдиреНрдЧ

рдпрд╣ рд╡рд╛рд╕реНрддрд╡ рдореЗрдВ рдПрдирдПрд▓рдПрд▓ рд╣реИ рдФрд░, рдЕрдЧрд░ рдореБрдЭрд╕реЗ рдЧрд▓рддреА рдирд╣реАрдВ рд╣реЛрддреА рд╣реИ, рддреЛ рдпрд╣ рдореЗрд░реЗ рджреНрд╡рд╛рд░рд╛ рдХрд┐рдП рдЧрдП рд╡рд┐рднрд┐рдиреНрди рдкреНрд░рд╕реНрддрд╛рд╡реЛрдВ рджреНрд╡рд╛рд░рд╛ рддрдп рдХрд┐рдпрд╛ рдЬрд╛рдПрдЧрд╛ред рдпрд╣ рдореЛрдЯреЗ рддреМрд░ рдкрд░ рдореЗрд░реЗ рдкрд╣рд▓реЗ рдмреНрд▓реЙрдЧ рдкреЛрд╕реНрдЯ рд╕реЗ "рд╕рдорд╕реНрдпрд╛ рдХреЗрд╕ # 3" рд╕реЗ рдореЗрд▓ рдЦрд╛рддрд╛ рд╣реИред рдореВрд▓ рд╡рд┐рдЪрд╛рд░ (рдХреЗ рдорд╛рдорд▓реЗ рдореЗрдВ рдирд╡реАрдирддрдо рдмреНрд▓реЙрдЧ рдкреЛрд╕реНрдЯ рд╕реЗ рддреИрдпрд╛рд░ рдХреНрдпреЛрдВ рдпрд╣ рдХрд╛рдо рдХрд░реЗрдЧрд╛ рдХреА) рд╣реИ рдХрд┐ subtyping рдЙрдзрд╛рд░ рдХреЗрд╡рд▓ рдХреЗ рдЕрдВрдд рддрдХ рд╡рд┐рд╕реНрддрд╛рд░ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реЛрдЧреА 'a рдХреА рд╢рд╛рдЦрд╛ рдореЗрдВ if рдЬреЛ return рдХрд╛рд░рдг рдмрдирддрд╛ рд╣реИред

@nikomatsakis рдХреНрдпрд╛ рдЖрдк рдЗрд╕ рдмрд╛рд░реЗ рдореЗрдВ рдЕрдзрд┐рдХ рд╡рд┐рд╕реНрддрд╛рд░ рд╕реЗ &mut рд╕рдВрджрд░реНрднреЛрдВ рдХреЗ рдореЗрд░реЗ рдорд╛рдирд╕рд┐рдХ рдореЙрдбрд▓ рдореЗрдВ, рдЙрдиреНрд╣реЗрдВ рдпрд╛ рддреЛ рдореВрд╡ рдпрд╛ рд░реАрдмреЛрд░ рдХрд░рдХреЗ рдкрд╛рд╕ рдХрд┐рдпрд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИ, рдФрд░ рдЗрд╕ рд╕рдорд╕реНрдпрд╛ рдореЗрдВ рд╕рдорд╕реНрдпрд╛ рдпрд╣ рд╣реИ рдХрд┐ рд╡рд╛рдкрд╕реА рдХреЗ рд▓рд┐рдП рдореВрд╡ рдореЛрдб рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реЛрддреА рд╣реИ, рдФрд░ self рдХрд╛ рдкреБрдирдГ рдЙрдкрдпреЛрдЧ рд╣реЛрддрд╛ рд╣реИред рдмрд╛рдж рдореЗрдВ рдкреБрдирд░реНрдЬрдиреНрдо рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ reborrowed &mut рд╕рдВрджрд░реНрдн рдХреЗ рдЬреАрд╡рдирдХрд╛рд▓ рдЪрд░ рдзрд╛рд░рдг рдХреЗ рдЬреАрд╡рдирдХрд╛рд▓ рдХреЗ рджреНрд╡рд╛рд░рд╛ рд╕реАрдорд┐рдд рд╣реИ &mut -reference - рдЗрд╕ рдорд╛рдорд▓реЗ рдореЗрдВ, self рдЪрд░, рдЗрд╕ рдкреНрд░рдХрд╛рд░ рдпрд╣ рджреНрд╡рд╛рд░рд╛ рд╕реАрдорд┐рдд рд╣реИ рдлрд╝рдВрдХреНрд╢рди рдХрд╛ рд╢рд░реАрд░, рдЗрд╕ рдкреНрд░рдХрд╛рд░ рдпрд╣ рдлрд╝рдВрдХреНрд╢рди рдХреЙрд▓ рдХреЗ рдмрд╛рд╣рд░ рдХрд╛ рд╡рд┐рд╕реНрддрд╛рд░ рдирд╣реАрдВ рдХрд░ рд╕рдХрддрд╛ рд╣реИред рдХреНрдпрд╛ рдПрдирдПрд▓рдПрд▓ рдЙрд╕ рд╕реАрдорд╛ рдХреЛ рдмрджрд▓рдиреЗ рдЬрд╛ рд░рд╣реА рд╣реИ (рдпрд╛ рд╢рд╛рдпрдж рдРрд╕реА рдХреЛрдИ рд╕реАрдорд╛ рдирд╣реАрдВ рд╣реИ)?

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

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

рдХреНрдпрд╛ рдпрд╣ рдЬрд▓реНрдж рд╣реА рддрдп рд╣реЛрдиреЗ рд╡рд╛рд▓рд╛ рд╣реИ?

@krdln

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

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

рдЕрдзрд┐рдХ рд╡рд┐рд╕реНрддрд╛рд░ рд╕реЗ, рдпрджрд┐ рдЖрдк рдпрд╣рд╛рдБ рд╡рд┐рд╕реНрддреГрдд рд╣рд╕реНрддрд╛рдХреНрд╖рд░ рд▓реЗрддреЗ рд╣реИрдВ, рддреЛ рдЖрдк рджреЗрдЦ рд╕рдХрддреЗ рд╣реИрдВ рдХрд┐ рд╣рдореЗрдВ рдЬреАрд╡рди рднрд░ рдХреЗ рд╕рд╛рде 'a рдПрдХ рд╕рдВрджрд░реНрдн рд╡рд╛рдкрд╕ рдХрд░рдирд╛ рд╣реЛрдЧрд╛:

fn two<'a>(&'a mut self) -> &'a i32 { .. }

рдЕрдм рдирд┐рд░реАрдХреНрд╖рдг рдХрд░реЗрдВ рдХрд┐ рд╣рдо let k = self.one() рдФрд░ рдлрд┐рд░ рдЗрд╕ k ред рдЗрд╕рдХрд╛ рдорддрд▓рдм рд╣реИ рдХрд┐ рдХреЗ рдкреНрд░рдХрд╛рд░ k рд╣реЛрдирд╛ рдЪрд╛рд╣рд┐рдП &'a i32 ред рдмрджрд▓реЗ рдореЗрдВ рдЗрд╕рдХрд╛ рдорддрд▓рдм рд╣реИ рдХрд┐ рдЬрдм рд╣рдо self.one() рдХреЙрд▓ рдХрд░рддреЗ рд╣реИрдВ, рддреЛ рд╣рдореЗрдВ рдЗрд╕реЗ self рдкреНрд░рдХрд╛рд░ рдХреЗ &'a mut Self рд╕рд╛рде рдЙрдзрд╛рд░ рджреЗрдирд╛ рд╣реЛрдЧрд╛ред рдЗрд╕рд▓рд┐рдП, let k = self.one() рд╣рдо рдЬреАрд╡рди рднрд░ 'a рд╕рд╛рде self рдХрд╛ рдЛрдг рдЬрд╛рд░реА рдХрд░рддреЗ рд╣реИрдВред рдпрд╣ рдЬреАрд╡рдирдХрд╛рд▓ рд▓реВрдк (рдФрд░, рд╡рд╛рд╕реНрддрд╡ рдореЗрдВ, рд╕рдВрдкреВрд░реНрдг рдлрд╝рдВрдХреНрд╢рди) рд╕реЗ рдмрдбрд╝рд╛ рд╣реИ, рдЗрд╕рд▓рд┐рдП рдпрд╣ рддрдм рддрдХ рдмрдирд╛ рд░рд╣рддрд╛ рд╣реИ рдЬрдм рд╣рдо рд▓реВрдк рдХреЗ рдЪрд╛рд░реЛрдВ рдУрд░ рдЬрд╛рддреЗ рд╣реИрдВ, рддреНрд░реБрдЯрд┐ рд░рд┐рдкреЛрд░реНрдЯ рдХреЗ рд▓рд┐рдП рдЕрдЧреНрд░рдгреАред рдореЗрд░реЗ рджреНрд╡рд╛рд░рд╛ рдкреНрд░рд╕реНрддрд╛рд╡рд┐рдд NLL рдирд┐рдпрдореЛрдВ рдХреЗ рддрд╣рдд, k рдХрд╛ рдЬреАрд╡рдирдХрд╛рд▓ рдХреЗрд╡рд▓ 'a рдХрд╛ рд╡рд┐рд╕реНрддрд╛рд░ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдЖрд╡рд╢реНрдпрдХ рд╣реИ рдпрджрд┐ if рд▓рд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИред рдЗрд╕рд▓рд┐рдП, рдпрджрд┐ if рдирд╣реАрдВ рд▓рд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИ, рддреЛ рдЛрдг рдкрд╣рд▓реЗ рд╕рдорд╛рдкреНрдд рд╣реЛ рд╕рдХрддрд╛ рд╣реИред

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


@ рдУрд╕рд╛ 1

рдХреНрдпрд╛ рдпрд╣ рдЬрд▓реНрдж рд╣реА рддрдп рд╣реЛрдиреЗ рд╡рд╛рд▓рд╛ рд╣реИ?

рдЗрд╕рд╕реЗ рдкрд╣рд▓реЗ рдХрд┐ рд╣рдо рдРрд╕рд╛ рдХрд░ рд╕рдХреЗрдВ, рдЕрднреА рднреА рдХреБрдЫ рдХрджрдо рд╣реИрдВ, рд▓реЗрдХрд┐рди рдЖрд╡рд╢реНрдпрдХ рд░рд┐рдлреНрд▓реЗрдХреНрдЯрд░рд┐рдВрдЧ рдХрд░рдиреЗ рдкрд░ рд╕рдХреНрд░рд┐рдп рдХрд╛рдо рдХрд░рдирд╛ рд╣реИред

@ рдореБрд┐рдирдХреЛрдорд╛рддрд╕рдХрд┐рд╕
рдзрдиреНрдпрд╡рд╛рдж, рдпрд╣ рдХреБрдЫ рд╣рдж рддрдХ рдорджрдж рдХреАред рд╡рд╛рд╕реНрддрд╡ рдореЗрдВ рд╣реЛрддрд╛ рдХреНрдпрд╛ рд╣реИ рдЬрдм рдЖрдк рд▓рд┐рдЦрддреЗ рд╣реИрдВ - рд▓реЗрдХрд┐рди рдПрдХ рдЫреЛрдЯреА рд╕реА рдмрд╛рдд рдпрд╣ рд╣реИ рдХрд┐ рдореБрдЭреЗ рд╕рдордЭ рдирд╣реАрдВ рдЖрддрд╛ рд╣реИ self рдЕрдкрдиреЗ рдХреЛрдб рдореЗрдВ - рдХреИрд╕реЗ рдХреА reborrow self рдХрд╛рдо рдХрд░рддрд╛ рд╣реИред рдореИрдВрдиреЗ "рд╕рдорд╕реНрдпрд╛ рдХрд╛ рдорд╛рдорд▓рд╛ 3" ( get_default ) рдХрд╛ рдЖрдкрдХрд╛ рдПрдХреНрд╕рдкреНрд▓реЗрдиреЗрд╢рди рдкрдврд╝рд╛ рд╣реИ, рдЬрд╣рд╛рдБ рдЖрдк рдХреЙрд▓рд░ рдХреЗ рдЕрдВрджрд░ рдХреЛрдб рдХреЛ рдЗрдирд▓рд╛рдЗрди рдХрд░рддреЗ рд╣реИрдВ, рд▓реЗрдХрд┐рди рд╡рд╣рд╛рдБ, рдЖрдкрдиреЗ self рд╣рд░ рдЙрдкрдпреЛрдЧ рдХреЛ рдЙрдзрд╛рд░ рд▓реЗрдиреЗ рдореЗрдВ рдмрджрд▓ рджрд┐рдпрд╛ рд╣реИред map рдЪрд░ рд╕реАрдзреЗ, рддрд╛рдХрд┐ desugaring рдореЗрд░реЗ рд▓рд┐рдП рдпрд╣ рд╕реНрдкрд╖реНрдЯ рдирд╣реАрдВ рдХрд┐рдпрд╛ред

рдпрд╣рд╛рдВ рдмрддрд╛рдпрд╛ рдЧрдпрд╛ рд╣реИ рдХрд┐ рдореИрдВ рдХрд╣рд╛рдВ рдлрдВрд╕ рдЧрдпрд╛ рд╣реВрдВ: рдЬрдм рд╣рдо let k = self.one() рдХреЙрд▓ рдХрд░рддреЗ рд╣реИрдВ, рддреЛ self рдХреЛ рд╕реНрдерд╛рдирд╛рдВрддрд░рд┐рдд рдирд╣реАрдВ рдХрд┐рдпрд╛ рдЬрд╛ рд╕рдХрддрд╛ (рдХреНрдпреЛрдВрдХрд┐ рдмрд╛рдж рдореЗрдВ рдЗрд╕рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реЛрддреА рд╣реИ), рдЗрд╕рд▓рд┐рдП рдЗрд╕реЗ рдЙрдзрд╛рд░ рдорд╛рдирд╛ рдЬрд╛рддрд╛ рд╣реИред рдмрд╛рдж рдореЗрдВ, рд╣рдо рд╕рд╢рд░реНрдд рд░реВрдк рд╕реЗ рдЙрд╕ k рд╡рд╛рдкрд╕ рдХрд░ рджреЗрддреЗ рд╣реИрдВ, рддрд╛рдХрд┐ рдЙрдзрд╛рд░ рдХреЗ рд▓рд┐рдП рдЬреАрд╡рди рднрд░ 'a рд▓рдЧреЗрдВ, рдЬреЛ рдлрд╝рдВрдХреНрд╢рди рдХреЙрд▓ рдХреА рд░реВрдкрд░реЗрдЦрд╛ рддреИрдпрд╛рд░ рдХрд░рддрд╛ рд╣реИред рдкрд░рдВрддреБ! рд╣рдордиреЗ self рд╕реЗ рдЙрдзрд╛рд░ рд▓рд┐рдпрд╛ рд╣реИ, рдЬреЛ рдХреЗрд╡рд▓ рдлрд╝рдВрдХреНрд╢рди рдХреЗ рдЕрдВрдд рддрдХ рд░рд╣рддрд╛ рд╣реИред рдпрд╣ рд╕реАрдорд╛ 'a рдХрдо рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рд▓рдЧрддреА рд╣реИ, рдЗрд╕рд▓рд┐рдП рдореЗрд░реЗ рдорд╛рдирд╕рд┐рдХ рдореЙрдбрд▓ рдореЗрдВ, рдпрд╣рд╛рдВ рддрдХ тАЛтАЛрдХрд┐ рдПрдирдПрд▓рдПрд▓ рдХреЗ рддрд╣рдд, рд╣рдореЗрдВ "рд▓рдВрдмреЗ рд╕рдордп рддрдХ рдЬреАрд╡рд┐рдд рдирд╣реАрдВ рд░рд╣рдирд╛ рдЪрд╛рд╣рд┐рдП" рддреНрд░реБрдЯрд┐ред

@krdln рд╣рдордиреЗ рд╡рд╛рд╕реНрддрд╡ рдореЗрдВ *self рд╕реЗ рдЙрдзрд╛рд░ рд▓рд┐рдпрд╛ рд╣реИ - рдЕрд░реНрдерд╛рдд, рд╣рдордиреЗ рдпрд╣ рд╕реНрд╡реАрдХрд╛рд░ рдХрд░ рд▓рд┐рдпрд╛ рд╣реИ рдХрд┐ рдЖрддреНрдо рдХреНрдпрд╛ рд╕рдВрджрд░реНрднрд┐рдд рдХрд░рддрд╛ рд╣реИред рд╣рдо рдЖрдкрдХреЛ рдЬреАрд╡рди рднрд░ self рджреЗрдиреЗ рдХреЗ рд▓рд┐рдП *self рдЙрдзрд╛рд░ рд▓реЗрдиреЗ рдХреА рдЕрдиреБрдорддрд┐ рджреЗрддреЗ рд╣реИрдВ рдХреНрдпреЛрдВрдХрд┐ self рдХрд╛ рдкреНрд░рдХрд╛рд░ рдкреВрд░реЗ рдЬреАрд╡рдирдХрд╛рд▓ 'a рд▓рд┐рдП 'рд▓реЙрдХ' рдХрд╛ рдЕрд░реНрде рд╣реИред рдЗрд╕рд▓рд┐рдП, рдЬрдм рддрдХ рд╣рдо рдпрд╣ рдЧрд╛рд░рдВрдЯреА рджреЗ рд╕рдХрддреЗ рд╣реИрдВ рдХрд┐ 'a , рд╕реНрд╡рдпрдВ рдХрд╛ рдЙрдкрдпреЛрдЧ рдирд╣реАрдВ рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИ, рдкрд░рд┐рдгрд╛рдо рдПрдХ рд╡рд┐рд╢реЗрд╖ рд╕рдВрджрд░реНрдн рд╣реЛрдирд╛ рдЪрд╛рд╣рд┐рдП - рдЗрд╕ рдорд╛рдорд▓реЗ рдореЗрдВ, fn рд░рд┐рдЯрд░реНрди рдХреЗ рдмрд╛рдж, рд╕реНрд╡рдпрдВ рдХреЛ рдкреЙрдк рдХрд┐рдпрд╛ рдЧрдпрд╛ рд╣реИ, рдФрд░ рдЗрд╕рд▓рд┐рдП рдпрд╣ рд╣реЛ рд╕рдХрддрд╛ рд╣реИ рдЙрдкрдпреЛрдЧ рдирд╣реАрдВ рдХрд┐рдпрд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИ, рдЗрд╕рд▓рд┐рдП рдХреЗрд╡рд▓ рдЗрд╕ рдмрд╛рдд рдХреА рдЧрд╛рд░рдВрдЯреА рд╣реИ рдХрд┐ fn рдХреЗ рдЕрдВрдд рддрдХ рд╕реНрд╡рдпрдВ рдХрд╛ рдЙрдкрдпреЛрдЧ рдирд╣реАрдВ рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИред (рдХрдо рд╕реЗ рдХрдо рдореБрдЭреЗ рдЖрд╢рд╛ рд╣реИ рдХрд┐ рдпрд╣ рд╕рдЪ рд╣реИред =)

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

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

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

рдореБрдЭреЗ рдпрд╣ рднреА рдЙрд▓реНрд▓реЗрдЦ рдХрд░рдирд╛ рдЪрд╛рд╣рд┐рдП рдХрд┐ рдЕрднрд┐рдиреАрдд рдХреЛрдб рдЕрдм рдирд╡реАрдирддрдо рд░рд╛рддреНрд░рд┐рдХрд╛рд▓реАрди рд╕рдВрдХрд▓рди рдирд╣реАрдВ рд╣реИред @ рд░реЙрдмрд░реНрдЯрд┐рдпрди рдиреЗ " regression-from-nightly-to-nightly " рдЯреИрдЧ рдХрд╛ рд╕реБрдЭрд╛рд╡ рджрд┐рдпрд╛, рдФрд░ рдпрд╣ рднреА рд╕реБрдЭрд╛рд╡ рджрд┐рдпрд╛ рдЧрдпрд╛ рдерд╛ рдХрд┐ рдореБрдЭреЗ @nikomatsakis рдХреЛ рдЯреИрдЧ рдХрд░рдирд╛ рдЪрд╛рд╣рд┐рдП рдЕрдЧрд░ рдпрд╣ рдПрдХ рдЬрд░реВрд░реА рд╕рдорд╕реНрдпрд╛ рдереА :)

рдЗрд╕ рдореБрджреНрджреЗ рдкрд░ рдмрд╣реБрдд рдХреБрдЫ рдХрд░рдиреЗ рдХреА рдХреЛрд╢рд┐рд╢ рдХрд░ рд░рд╣рд╛ рд╣реИ (рдЬреЛ рд╡рд░реНрддрдорд╛рди nll рджреНрд╡рд╛рд░рд╛ рдЕрдиреБрдорддрд┐ рдирд╣реАрдВ рд╣реИ) рдареЛрдХрд░ рдЦрд╛рдИ:

fn f(vec: &mut Vec<u8>) -> &u8 {
    if let Some(n) = vec.iter_mut().find(|n| **n == 1) {
        *n = 10;
        n
    } else {
        vec.push(10);
        vec.last().unwrap()
    }
}

fn main() {
    let mut vec = vec![1, 2, 3];
    f(&mut vec);
}
error[E0499]: cannot borrow `*vec` as mutable more than once at a time
 --> src/main.rs:6:9
  |
1 | fn f(vec: &mut Vec<u8>) -> &u8 {
  |           - let's call the lifetime of this reference `'1`
2 |     if let Some(n) = vec.iter_mut().find(|n| **n == 1) {
  |                      --- first mutable borrow occurs here
3 |         *n = 10;
4 |         n
  |         - returning this value requires that `*vec` is borrowed for `'1`
5 |     } else {
6 |         vec.push(10);
  |         ^^^ second mutable borrow occurs here

error[E0502]: cannot borrow `*vec` as immutable because it is also borrowed as mutable
 --> src/main.rs:7:9
  |
1 | fn f(vec: &mut Vec<u8>) -> &u8 {
  |           - let's call the lifetime of this reference `'1`
2 |     if let Some(n) = vec.iter_mut().find(|n| **n == 1) {
  |                      --- mutable borrow occurs here
3 |         *n = 10;
4 |         n
  |         - returning this value requires that `*vec` is borrowed for `'1`
...
7 |         vec.last().unwrap()
  |         ^^^ immutable borrow occurs here

(рд╣рдореЗрдВ рдПрдирдПрд▓рдПрд▓-рдлрд┐рдХреНрд╕реНрдб-рдПрдирдПрд▓рдПрд▓ рдХреЛ рд╣рдЯрд╛рддреЗ рд╕рдордп рдИ-рдЬрд░реВрд░рддрдордВрдж рдХреЛ рд╣рдЯрд╛ рджреЗрдирд╛ рдЪрд╛рд╣рд┐рдП рдерд╛)

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

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

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

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

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

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

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