Rust: & mut ΡΠ°ΠΌΠΎΡΡ‚ΠΎΡΡ‚Π΅Π»ΡŒΠ½ΠΎ Π·Π°ΠΈΠΌΡΡ‚Π²ΠΎΠ²Π°Ρ‚ΡŒ ΠΏΡ€ΠΎΡ‚ΠΈΠ²ΠΎΡ€Π΅Ρ‡Π°Ρ‰Π΅Π΅ самому сСбС.

Π‘ΠΎΠ·Π΄Π°Π½Π½Ρ‹ΠΉ Π½Π° 3 Ρ„Π΅Π²Ρ€. 2015  Β·  20ΠšΠΎΠΌΠΌΠ΅Π½Ρ‚Π°Ρ€ΠΈΠΈ  Β·  Π˜ΡΡ‚ΠΎΡ‡Π½ΠΈΠΊ: rust-lang/rust

Π― Π½Π΅ знаю, ΠΏΠΎΡ‡Π΅ΠΌΡƒ это происходит, Π½ΠΎ rovar ΠΈ XMPPwocky Π² IRC ΡΡ‡ΠΈΡ‚Π°ΡŽΡ‚, Ρ‡Ρ‚ΠΎ это ошибка компилятора.

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;
        }
    }

Π­Ρ‚ΠΎ ΠΎΡ‚Π»ΠΈΡ‡Π½ΠΎ скомпилируСтся.

ΠΌΠ°Π½Π΅ΠΆ: http://is.gd/mTkfw5

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

Π‘Π°ΠΌΡ‹ΠΉ ΠΏΠΎΠ»Π΅Π·Π½Ρ‹ΠΉ ΠΊΠΎΠΌΠΌΠ΅Π½Ρ‚Π°Ρ€ΠΈΠΉ

Π― Π΄ΡƒΠΌΠ°ΡŽ, Ρ‡Ρ‚ΠΎ столкнулся с Π°Π½Π°Π»ΠΎΠ³ΠΈΡ‡Π½ΠΎΠΉ ΠΏΡ€ΠΎΠ±Π»Π΅ΠΌΠΎΠΉ Π² производствСнной срСдС, ΠΊΠΎΠ³Π΄Π° нСизмСняСмый Π·Π°Π΅ΠΌ, каТСтся, ΠΆΠΈΠ²Π΅Ρ‚ слишком Π΄ΠΎΠ»Π³ΠΎ ( Π²Ρ€Π΅ΠΌΠ΅Π½Π½ΠΎΠ΅ Ρ€Π΅ΡˆΠ΅Π½ΠΈΠ΅ ).

Π― Ρ‚Π°ΠΊΠΆΠ΅ Π΄ΠΎΠ»ΠΆΠ΅Π½ ΡƒΠΏΠΎΠΌΡΠ½ΡƒΡ‚ΡŒ, Ρ‡Ρ‚ΠΎ ΠΊΠΎΠ΄ starwed большС Π½Π΅ компилируСтся Π² послСднюю Π½ΠΎΡ‡ΡŒ. @oberien ΠΏΡ€Π΅Π΄Π»ΠΎΠΆΠΈΠ» 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 . Π­Ρ‚ΠΎ ΠΎΠ·Π½Π°Ρ‡Π°Π΅Ρ‚, Ρ‡Ρ‚ΠΎ Rust Π²Ρ‹Π½ΡƒΠΆΠ΄Π΅Π½ Π½Π΅ Β«ΠΏΠΎΠ²Ρ‚ΠΎΡ€Π½ΠΎ Π·Π°ΠΈΠΌΡΡ‚Π²ΠΎΠ²Π°Ρ‚ΡŒΒ» self ΠΈ ΠΏΠ΅Ρ€Π΅ΠΌΠ΅Ρ‰Π°Ρ‚ΡŒ Π΅Π³ΠΎ Π² one . ΠŸΠΎΡΠΊΠΎΠ»ΡŒΠΊΡƒ измСняСмыС ссылки ΡΠ²Π»ΡΡŽΡ‚ΡΡ Π»ΠΈΠ½Π΅ΠΉΠ½Ρ‹ΠΌΠΈ, ΠΈΡ… ΠΌΠΎΠΆΠ½ΠΎ ΠΏΠ΅Ρ€Π΅ΠΌΠ΅Ρ‰Π°Ρ‚ΡŒ Ρ‚ΠΎΠ»ΡŒΠΊΠΎ ΠΎΠ΄ΠΈΠ½ Ρ€Π°Π·, Π½ΠΎ loop ΠΎΠ·Π½Π°Ρ‡Π°Π΅Ρ‚, Ρ‡Ρ‚ΠΎ one ΠΌΠΎΠΆΠ΅Ρ‚ ΠΏΠΎΡ‚Ρ€Π΅Π±ΠΎΠ²Π°Ρ‚ΡŒΡΡ ΠΏΠΎΠ²Ρ‚ΠΎΡ€Π½ΠΎ Π²Ρ‹Π·Ρ‹Π²Π°Ρ‚ΡŒ ΠΎΠ΄Π½Ρƒ ΠΈ Ρ‚Ρƒ ΠΆΠ΅ ΠΈΠ·ΠΌΠ΅Π½ΡΠ΅ΠΌΡƒΡŽ ссылку.

Π’Ρ‚ΠΎΡ€ΠΎΠΉ ΠΏΡ€ΠΈΠΌΠ΅Ρ€ Ρ€Π°Π±ΠΎΡ‚Π°Π΅Ρ‚ Ρ‚ΠΎΠ»ΡŒΠΊΠΎ ΠΏΠΎΡ‚ΠΎΠΌΡƒ, Ρ‡Ρ‚ΠΎ Rust Π²ΠΈΠ΄ΠΈΡ‚, Ρ‡Ρ‚ΠΎ Ρ†ΠΈΠΊΠ» запускаСтся Ρ‚ΠΎΠ»ΡŒΠΊΠΎ ΠΎΠ΄ΠΈΠ½ Ρ€Π°Π·, поэтому 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 Π½Π΅ ΠΌΠΎΠΆΠ΅Ρ‚ Β«ΡΠΏΡ€Π°Π²ΠΈΡ‚ΡŒΡΡΒ» с Π΄ΠΎΡ…ΠΎΠ΄Π½ΠΎΡΡ‚ΡŒΡŽ условных Π·Π°ΠΉΠΌΠΎΠ².

CC @pcwalton

Π― Π΄ΡƒΠΌΠ°ΡŽ, Ρ‡Ρ‚ΠΎ ΠΏΡ€ΠΎΠ±Π»Π΅ΠΌΠ° Π² Ρ‚ΠΎΠΌ, Ρ‡Ρ‚ΠΎ ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΠ΅Ρ‚ΡΡ Π½Π΅ ΠΈΠ·ΠΌΠ΅Π½Ρ‡ΠΈΠ²ΠΎΡΡ‚ΡŒ Π²ΠΎΠ·Π²Ρ€Π°Ρ‰Π°Π΅ΠΌΠΎΠ³ΠΎ значСния, Π° ΠΈΠ·ΠΌΠ΅Π½Ρ‡ΠΈΠ²ΠΎΡΡ‚ΡŒ Π°Ρ€Π³ΡƒΠΌΠ΅Π½Ρ‚Π° Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΈ.

Π‘Π»Π΅Π΄ΡƒΡŽΡ‰ΠΈΠΉ ΠΊΠΎΠ΄ Π²Ρ‹Π·Ρ‹Π²Π°Π΅Ρ‚ Ρ„ΡƒΠ½ΠΊΡ†ΠΈΡŽ измСнСния, которая Π²ΠΎΠ·Π²Ρ€Π°Ρ‰Π°Π΅Ρ‚ Π½Π΅ΠΈΠ·ΠΌΠ΅Π½ΡΠ΅ΠΌΡƒΡŽ ссылку. ПослС этого я Π½Π΅ ΠΌΠΎΠ³Ρƒ Π±Ρ€Π°Ρ‚ΡŒ нСизмСняСмыС ссылки.

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 , ΠΎΠ½ ΠΏΡ€ΠΎΠΉΠ΄Π΅Ρ‚ ΠΏΡ€ΠΎΠ²Π΅Ρ€ΠΊΡƒ заимствования, Ссли Π²Ρ‹ ΡƒΠ΄Π°Π»ΠΈΡ‚Π΅ ΠΊΠ»ΡŽΡ‡Π΅Π²ΠΎΠ΅ слово return, Π΄Π°ΠΆΠ΅ Ссли получСнная функция Π½Π΅ Π±ΡƒΠ΄Π΅Ρ‚ Ρ€Π°Π±ΠΎΡ‚Π°Ρ‚ΡŒ Π΄ΠΎΠ»ΠΆΠ½Ρ‹ΠΌ ΠΎΠ±Ρ€Π°Π·ΠΎΠΌ.

Π­Ρ‚ΠΎ Π·Π°Π±Π»ΠΎΠΊΠΈΡ€ΠΎΠ²Π°Π½ΠΎ Π½Π° нСлСксичСском Π²Ρ€Π΅ΠΌΠ΅Π½ΠΈ ΠΆΠΈΠ·Π½ΠΈ, ΠΊΠΎΡ‚ΠΎΡ€ΠΎΠ΅, Π² свою ΠΎΡ‡Π΅Ρ€Π΅Π΄ΡŒ, Π·Π°Π±Π»ΠΎΠΊΠΈΡ€ΠΎΠ²Π°Π½ΠΎ Π½Π° MIR. Π’ ΠΈΠ΄Π΅Π°Π»Π΅ это Π±ΡƒΠ΄Π΅Ρ‚ исправлСно ΠΊ ΠΊΠΎΠ½Ρ†Ρƒ 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

Π’Π°ΠΊ Ρ‡Ρ‚ΠΎ Ρ‡Ρ‚Π΅Π½ΠΈΠ΅ [Π²Π½ΡƒΡ‚Ρ€Π΅Π½Π½Π΅ΠΉ Ρ‚Π΅ΠΌΡ‹] заставляСт мСня Ρ‡ΡƒΠ²ΡΡ‚Π²ΠΎΠ²Π°Ρ‚ΡŒ, Ρ‡Ρ‚ΠΎ это Π½Π΅ ΠΏΠΎΠΏΡ€Π°Π²ΠΈΠΌΠΎ (Π΄Π°ΠΆΠ΅ с NLL). ΠœΠΎΠΆΠ΅Ρ‚ ΠΊΡ‚ΠΎ-Π½ΠΈΠ±ΡƒΠ΄ΡŒ ΠΏΠΎΠ΄Ρ‚Π²Π΅Ρ€Π΄ΠΈΡ‚ΡŒ? (@eddyb?)

cc @ rest-long / long

Π­Ρ‚ΠΎ Π΄Π΅ΠΉΡΡ‚Π²ΠΈΡ‚Π΅Π»ΡŒΠ½ΠΎ NLL, ΠΈ, Ссли я Π½Π΅ ошибаюсь, это Π±Ρ‹Π»ΠΎ Π±Ρ‹ исправлСно Ρ€Π°Π·Π»ΠΈΡ‡Π½Ρ‹ΠΌΠΈ прСдлоТСниями, ΠΊΠΎΡ‚ΠΎΡ€Ρ‹Π΅ я сдСлал. Π­Ρ‚ΠΎ ΠΏΡ€ΠΈΠΌΠ΅Ρ€Π½ΠΎ соотвСтствуСт Β«ΠΏΡ€ΠΎΠ±Π»Π΅ΠΌΠ½ΠΎΠΌΡƒ ΡΠ»ΡƒΡ‡Π°ΡŽ β„–3Β» ΠΈΠ· ΠΌΠΎΠ΅Π³ΠΎ ΠΏΠ΅Ρ€Π²ΠΎΠ³ΠΎ сообщСния Π² Π±Π»ΠΎΠ³Π΅ . Основная идСя (с Ρ‚ΠΎΡ‡ΠΊΠΈ зрСния Ρ„ΠΎΡ€ΠΌΡƒΠ»ΠΈΡ€ΠΎΠ²ΠΊΠΈ ΠΈΠ· послСднСго сообщСния Π² Π±Π»ΠΎΠ³Π΅ ) Ρ‚ΠΎΠ³ΠΎ, ΠΏΠΎΡ‡Π΅ΠΌΡƒ это Π±ΡƒΠ΄Π΅Ρ‚ Ρ€Π°Π±ΠΎΡ‚Π°Ρ‚ΡŒ, Π·Π°ΠΊΠ»ΡŽΡ‡Π°Π΅Ρ‚ΡΡ Π² Ρ‚ΠΎΠΌ, Ρ‡Ρ‚ΠΎ ΠΏΠΎΠ΄Ρ‚ΠΈΠΏ заимствования Π½Π΅ΠΎΠ±Ρ…ΠΎΠ΄ΠΈΠΌΠΎ Π±ΡƒΠ΄Π΅Ρ‚ ΠΏΡ€ΠΎΠ΄Π»ΠΈΡ‚ΡŒ Ρ‚ΠΎΠ»ΡŒΠΊΠΎ Π΄ΠΎ ΠΊΠΎΠ½Ρ†Π° 'a Π² Π²Π΅Ρ‚Π²ΠΈ if , Π²Ρ‹Π·Ρ‹Π²Π°ΡŽΡ‰ΠΈΠΉ return .

@nikomatsakis НС ΠΌΠΎΠ³Π»ΠΈ Π±Ρ‹ Π²Ρ‹ ΠΏΠΎΠ΄Ρ€ΠΎΠ±Π½Π΅Π΅ Ρ€Π°ΡΡΠΊΠ°Π·Π°Ρ‚ΡŒ ΠΎ Ρ‚ΠΎΠΌ, ΠΊΠ°ΠΊ NLL взаимодСйствуСт с этой ΠΏΡ€ΠΎΠ±Π»Π΅ΠΌΠΎΠΉ? Π’ ΠΌΠΎΠ΅ΠΉ ΠΌΠ΅Π½Ρ‚Π°Π»ΡŒΠ½ΠΎΠΉ ΠΌΠΎΠ΄Π΅Π»ΠΈ ссылок &mut ΠΈΡ… ΠΌΠΎΠΆΠ½ΠΎ ΠΏΠ΅Ρ€Π΅Π΄Π°Ρ‚ΡŒ Π»ΠΈΠ±ΠΎ ΠΏΠ΅Ρ€Π΅ΠΌΠ΅Ρ‰Π΅Π½ΠΈΠ΅ΠΌ, Π»ΠΈΠ±ΠΎ ΠΏΠΎΠ²Ρ‚ΠΎΡ€Π½Ρ‹ΠΌ заимствованиСм , ΠΈ ΠΏΡ€ΠΎΠ±Π»Π΅ΠΌΠ° Π² этой ΠΏΡ€ΠΎΠ±Π»Π΅ΠΌΠ΅ Π·Π°ΠΊΠ»ΡŽΡ‡Π°Π΅Ρ‚ΡΡ Π² Ρ‚ΠΎΠΌ, Ρ‡Ρ‚ΠΎ для Π²ΠΎΠ·Π²Ρ€Π°Ρ‚Π° трСбуСтся Ρ€Π΅ΠΆΠΈΠΌ пСрСмСщСния ΠΈ ΠΏΠΎΠ²Ρ‚ΠΎΡ€Π½ΠΎΠ΅ использованиС self впослСдствии Ρ‚Ρ€Π΅Π±ΡƒΠ΅Ρ‚ ΠΏΠΎΠ²Ρ‚ΠΎΡ€Π½ΠΎΠ³ΠΎ заимствования . Насколько я понимаю, врСмя ΠΆΠΈΠ·Π½ΠΈ Π½ΠΎΠ²ΠΎΠΉ &mut ΠΎΠ³Ρ€Π°Π½ΠΈΡ‡Π΅Π½ΠΎ Π²Ρ€Π΅ΠΌΠ΅Π½Π΅ΠΌ ΠΆΠΈΠ·Π½ΠΈ ΠΏΠ΅Ρ€Π΅ΠΌΠ΅Π½Π½ΠΎΠΉ, содСрТащСй &mut -reference - Π² Π΄Π°Π½Π½ΠΎΠΌ случаС ΠΏΠ΅Ρ€Π΅ΠΌΠ΅Π½Π½ΠΎΠΉ self , поэтому ΠΎΠ½Π° ΠΎΠ³Ρ€Π°Π½ΠΈΡ‡Π΅Π½Π° Ρ‚Π΅Π»ΠΎ Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΈ, поэтому ΠΎΠ½ΠΎ Π½Π΅ ΠΌΠΎΠΆΠ΅Ρ‚ Π²Ρ‹Ρ…ΠΎΠ΄ΠΈΡ‚ΡŒ Π·Π° ΠΏΡ€Π΅Π΄Π΅Π»Ρ‹ Π²Ρ‹Π·ΠΎΠ²Π° Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΈ. БобираСтся Π»ΠΈ NLL ΠΈΠ·ΠΌΠ΅Π½ΠΈΡ‚ΡŒ это ΠΎΠ³Ρ€Π°Π½ΠΈΡ‡Π΅Π½ΠΈΠ΅ Π½Π° ΠΏΠΎΠ²Ρ‚ΠΎΡ€Π½Ρ‹Π΅ заимствования (ΠΈΠ»ΠΈ, ΠΌΠΎΠΆΠ΅Ρ‚ Π±Ρ‹Ρ‚ΡŒ, Ρ‚Π°ΠΊΠΎΠ³ΠΎ ограничСния Π½Π΅Ρ‚)?

Π’Π°ΠΊΠΆΠ΅ ΠΌΠ½Π΅ интСрСсно, являСтся Π»ΠΈ устранСниС этой ΠΏΡ€ΠΎΠ±Π»Π΅ΠΌΡ‹ Ρ‡Π΅ΠΌ-Ρ‚ΠΎ ΠΏΠΎ своСй сути связанным с NLL ΠΈΠ»ΠΈ это ΠΌΠΎΠΆΠ΅Ρ‚ Π±Ρ‹Ρ‚ΡŒ ΠΎΡ€Ρ‚ΠΎΠ³ΠΎΠ½Π°Π»ΡŒΠ½ΠΎ? Если послСднСС, ΠΌΠΎΠΆΠ΅Ρ‚ стоит ΠΏΠΎΡΠ°Π΄ΠΈΡ‚ΡŒ фикс ΠΏΠ΅Ρ€Π΅Π΄ NLL?

ΠšΡ€ΠΎΠΌΠ΅ Ρ‚ΠΎΠ³ΠΎ, Ссли NLL Ρ€Π΅ΡˆΠΈΡ‚ эту ΠΏΡ€ΠΎΠ±Π»Π΅ΠΌΡƒ, ΠΎΠ·Π½Π°Ρ‡Π°Π΅Ρ‚ Π»ΠΈ это, Ρ‡Ρ‚ΠΎ Π² NLL Π²Π°ΠΌ Π½ΠΈΠΊΠΎΠ³Π΄Π° Π½Π΅ придСтся Π²Ρ€ΡƒΡ‡Π½ΡƒΡŽ Π²Ρ‹Π±ΠΈΡ€Π°Ρ‚ΡŒ ΠΌΠ΅ΠΆΠ΄Ρƒ ΠΏΠ΅Ρ€Π΅ΠΌΠ΅Ρ‰Π΅Π½ΠΈΠ΅ΠΌ ΠΈ ΠΏΠΎΠ²Ρ‚ΠΎΡ€Π½Ρ‹ΠΌ заимствованиСм?

Π­Ρ‚ΠΎ Π±ΡƒΠ΄Π΅Ρ‚ исправлСно Π² блиТайшСС врСмя?

@krdln

НС ΠΌΠΎΠ³Π»ΠΈ Π±Ρ‹ Π²Ρ‹ ΠΏΠΎΠ΄Ρ€ΠΎΠ±Π½Π΅Π΅ Ρ€Π°ΡΡΠΊΠ°Π·Π°Ρ‚ΡŒ ΠΎ Ρ‚ΠΎΠΌ, ΠΊΠ°ΠΊ NLL взаимодСйствуСт с этой ΠΏΡ€ΠΎΠ±Π»Π΅ΠΌΠΎΠΉ?

Подводя ΠΈΡ‚ΠΎΠ³, ΠΌΠΎΠΆΠ½ΠΎ ΡΠΊΠ°Π·Π°Ρ‚ΡŒ, Ρ‡Ρ‚ΠΎ сСгодня, Ссли Π·Π½Π°Ρ‡Π΅Π½ΠΈΠ΅ возвращаСтся ΠΈΠ· Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΈ Π½Π° любом ΠΏΡƒΡ‚ΠΈ, ссуда Π΄ΠΎΠ»ΠΆΠ½Π° Π±Ρ‹Ρ‚ΡŒ Π΄Π΅ΠΉΡΡ‚Π²ΠΈΡ‚Π΅Π»ΡŒΠ½Π° для ΠΎΡΡ‚Π°Π»ΡŒΠ½ΠΎΠΉ Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΈ Π½Π° всСх путях. По написанному ΠΌΠ½ΠΎΠΉ ΠΏΡ€Π΅Π΄Π»ΠΎΠΆΠ΅Π½ΠΈΡŽ NLL это ΠΎΠ³Ρ€Π°Π½ΠΈΡ‡Π΅Π½ΠΈΠ΅ снято.

Π‘ΠΎΠ»Π΅Π΅ ΠΏΠΎΠ΄Ρ€ΠΎΠ±Π½ΠΎ, Ссли Π²Ρ‹ Π²ΠΎΠ·ΡŒΠΌΠ΅Ρ‚Π΅ здСсь Ρ€Π°Π·Ρ€Π°Π±ΠΎΡ‚Π°Π½Π½ΡƒΡŽ подпись, Π²Ρ‹ ΡƒΠ²ΠΈΠ΄ΠΈΡ‚Π΅, Ρ‡Ρ‚ΠΎ ΠΌΡ‹ Π΄ΠΎΠ»ΠΆΠ½Ρ‹ Π²Π΅Ρ€Π½ΡƒΡ‚ΡŒ ссылку с Π²Ρ€Π΅ΠΌΠ΅Π½Π΅ΠΌ ΠΆΠΈΠ·Π½ΠΈ '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() ΠΌΡ‹ Π²Ρ‹Π΄Π°Π΅ΠΌ ссуду Π² self с ΠΏΠΎΠΆΠΈΠ·Π½Π΅Π½Π½Ρ‹ΠΌ сроком слуТбы 'a . Π­Ρ‚ΠΎ врСмя ΠΆΠΈΠ·Π½ΠΈ большС, Ρ‡Π΅ΠΌ Ρ†ΠΈΠΊΠ» (ΠΈ, Π΄Π΅ΠΉΡΡ‚Π²ΠΈΡ‚Π΅Π»ΡŒΠ½ΠΎ, всСй Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΈ), поэтому ΠΎΠ½ΠΎ сохраняСтся, ΠΊΠΎΠ³Π΄Π° ΠΌΡ‹ ΠΈΠ΄Π΅ΠΌ ΠΏΠΎ Ρ†ΠΈΠΊΠ»Ρƒ, Ρ‡Ρ‚ΠΎ ΠΏΡ€ΠΈΠ²ΠΎΠ΄ΠΈΡ‚ ΠΊ ΠΎΡ‚Ρ‡Π΅Ρ‚Ρƒ ΠΎΠ± ошибкС. Богласно ΠΏΡ€Π΅Π΄Π»ΠΎΠΆΠ΅Π½Π½Ρ‹ΠΌ мною ΠΏΡ€Π°Π²ΠΈΠ»Π°ΠΌ NLL, врСмя ΠΆΠΈΠ·Π½ΠΈ k трСбуСтся Ρ‚ΠΎΠ»ΡŒΠΊΠΎ для увСличСния Π΄ΠΎ 'a Ссли ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΠ΅Ρ‚ΡΡ if . Π‘Π»Π΅Π΄ΠΎΠ²Π°Ρ‚Π΅Π»ΡŒΠ½ΠΎ, Ссли Π½Π΅ Π²Π·ΡΡ‚ΡŒ if , ΠΊΡ€Π΅Π΄ΠΈΡ‚ ΠΌΠΎΠΆΠ΅Ρ‚ Π·Π°ΠΊΠΎΠ½Ρ‡ΠΈΡ‚ΡŒΡΡ Ρ€Π°Π½ΡŒΡˆΠ΅.

Π­Ρ‚ΠΎ ΠΏΠΎΠΌΠΎΠ³Π°Π΅Ρ‚?


@ osa1

Π­Ρ‚ΠΎ Π±ΡƒΠ΄Π΅Ρ‚ исправлСно Π² блиТайшСС врСмя?

Нам Π΅Ρ‰Π΅ прСдстоит ΡΠ΄Π΅Π»Π°Ρ‚ΡŒ нСсколько шагов, ΠΏΡ€Π΅ΠΆΠ΄Π΅ Ρ‡Π΅ΠΌ ΠΌΡ‹ смоТСм это ΡΠ΄Π΅Π»Π°Ρ‚ΡŒ, Π½ΠΎ вСдСтся активная Ρ€Π°Π±ΠΎΡ‚Π° ΠΏΠΎ Π²Ρ‹ΠΏΠΎΠ»Π½Π΅Π½ΠΈΡŽ Π½Π΅ΠΎΠ±Ρ…ΠΎΠ΄ΠΈΠΌΡ‹Ρ… Ρ€Π΅Ρ„Π°ΠΊΡ‚ΠΎΡ€ΠΈΠ½Π³ΠΎΠ².

@nikomatsakis
Бпасибо, Π½Π΅ΠΌΠ½ΠΎΠ³ΠΎ ΠΏΠΎΠΌΠΎΠ³Π»ΠΎ. Но Π΅ΡΡ‚ΡŒ ΠΎΠ΄Π½Π° ΠΌΠ΅Π»ΠΎΡ‡ΡŒ, ΠΊΠΎΡ‚ΠΎΡ€ΡƒΡŽ я Π½Π΅ понимаю - Ρ‡Ρ‚ΠΎ ΠΈΠΌΠ΅Π½Π½ΠΎ происходит, ΠΊΠΎΠ³Π΄Π° Π²Ρ‹ ΠΏΠΈΡˆΠ΅Ρ‚Π΅ self Π² своСм ΠΊΠΎΠ΄Π΅ - ΠΊΠ°ΠΊ Ρ€Π°Π±ΠΎΡ‚Π°Π΅Ρ‚ ΠΏΠΎΠ²Ρ‚ΠΎΡ€Π½Ρ‹ΠΉ заимствованиС self . Π― Ρ‡ΠΈΡ‚Π°Π» вашС объяснСниС Β«ΠŸΡ€ΠΎΠ±Π»Π΅ΠΌΠ½ΠΎΠ³ΠΎ случая 3Β» ( get_default ), Π³Π΄Π΅ Π²Ρ‹ встраиваСтС ΠΊΠΎΠ΄ Π²Π½ΡƒΡ‚Ρ€ΠΈ Π²Ρ‹Π·Ρ‹Π²Π°ΡŽΡ‰Π΅Π³ΠΎ, Π½ΠΎ Ρ‚Π°ΠΌ Π²Ρ‹ ΠΈΠ·ΠΌΠ΅Π½ΠΈΠ»ΠΈ ΠΊΠ°ΠΆΠ΄ΠΎΠ΅ использованиС self Π½Π° заимствованиС map пСрСмСнная Π½Π°ΠΏΡ€ΡΠΌΡƒΡŽ, Ρ‚Π°ΠΊ Ρ‡Ρ‚ΠΎ ΡƒΠ΄Π°Π»Π΅Π½ΠΈΠ΅ сахара Π½Π΅ ΠΏΠΎΠΌΠΎΠ³Π»ΠΎ ΠΌΠ½Π΅.

Π’ΠΎΡ‚ Π³Π΄Π΅ я застрял: ΠΊΠΎΠ³Π΄Π° ΠΌΡ‹ Π²Ρ‹Π·Ρ‹Π²Π°Π΅ΠΌ let k = self.one() , self нСльзя ΠΏΠ΅Ρ€Π΅ΠΌΠ΅ΡΡ‚ΠΈΡ‚ΡŒ (ΠΏΠΎΡ‚ΠΎΠΌΡƒ Ρ‡Ρ‚ΠΎ ΠΎΠ½ понадобится ΠΏΠΎΠ·ΠΆΠ΅), поэтому ΠΎΠ½ считаСтся заимствованным. ПозТС ΠΌΡ‹ условно Π²ΠΎΠ·Π²Ρ€Π°Ρ‰Π°Π΅ΠΌ этот k , Ρ‚Π°ΠΊ Ρ‡Ρ‚ΠΎ заимствованиС Π΄ΠΎΠ»ΠΆΠ½ΠΎ ΠΈΠΌΠ΅Ρ‚ΡŒ врСмя ΠΆΠΈΠ·Π½ΠΈ 'a , ΠΊΠΎΡ‚ΠΎΡ€ΠΎΠ΅ ΠΏΠ΅Ρ€Π΅ΠΆΠΈΠ²Π΅Ρ‚ Π²Ρ‹Π·ΠΎΠ² Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΈ. Но! ΠœΡ‹ позаимствовали Ρƒ self , ΠΊΠΎΡ‚ΠΎΡ€Ρ‹ΠΉ ΠΆΠΈΠ²Π΅Ρ‚ Ρ‚ΠΎΠ»ΡŒΠΊΠΎ Π΄ΠΎ ΠΊΠΎΠ½Ρ†Π° Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΈ. Π­Ρ‚ΠΎ ΠΎΠ³Ρ€Π°Π½ΠΈΡ‡Π΅Π½ΠΈΠ΅ сокращаСт 'a , поэтому Π² ΠΌΠΎΠ΅ΠΉ ΠΌΠ΅Π½Ρ‚Π°Π»ΡŒΠ½ΠΎΠΉ ΠΌΠΎΠ΄Π΅Π»ΠΈ Π΄Π°ΠΆΠ΅ ΠΏΡ€ΠΈ NLL ΠΌΡ‹ Π΄ΠΎΠ»ΠΆΠ½Ρ‹ ΠΏΠΎΠ»ΡƒΡ‡ΠΈΡ‚ΡŒ ΠΎΡˆΠΈΠ±ΠΊΡƒ Β«Π½Π΅ ΠΆΠΈΠ²Π΅Ρ‚ достаточно Π΄ΠΎΠ»Π³ΠΎΒ».

@krdln ΠΌΡ‹ фактичСски позаимствовали Ρƒ *self - Ρ‚ΠΎ Π΅ΡΡ‚ΡŒ ΠΌΡ‹ ΠΏΠΎΠ²Ρ‚ΠΎΡ€Π½ΠΎ заимствовали Ρ‚ΠΎ, Ρ‡Ρ‚ΠΎ относится ΠΊ self. ΠœΡ‹ Ρ€Π°Π·Ρ€Π΅ΡˆΠ°Π΅ΠΌ Π²Π°ΠΌ ΠΎΠ΄Π°Π»ΠΆΠΈΠ²Π°Ρ‚ΡŒ *self Π½Π° всю Тизнь, ΠΏΠ΅Ρ€Π΅ΠΆΠΈΠ² сам self , ΠΏΠΎΡ‚ΠΎΠΌΡƒ Ρ‡Ρ‚ΠΎ Ρ‚ΠΈΠΏ self ΠΏΠΎΠ΄Ρ€Π°Π·ΡƒΠΌΠ΅Π²Π°Π΅Ρ‚ Β«Π±Π»ΠΎΠΊΠΈΡ€ΠΎΠ²ΠΊΡƒΒ» Π½Π° всю Тизнь 'a . Π‘Π»Π΅Π΄ΠΎΠ²Π°Ρ‚Π΅Π»ΡŒΠ½ΠΎ, Ссли ΠΌΡ‹ ΠΌΠΎΠΆΠ΅ΠΌ Π³Π°Ρ€Π°Π½Ρ‚ΠΈΡ€ΠΎΠ²Π°Ρ‚ΡŒ, Ρ‡Ρ‚ΠΎ Π²ΠΎ врСмя 'a self большС Π½Π΅ ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΠ΅Ρ‚ΡΡ, Ρ€Π΅Π·ΡƒΠ»ΡŒΡ‚Π°Ρ‚ΠΎΠΌ Π΄ΠΎΠ»ΠΆΠ½Π° Π±Ρ‹Ρ‚ΡŒ эксклюзивная ссылка - Π² этом случаС послС Π²ΠΎΠ·Π²Ρ€Π°Ρ‚Π° fn self Π±Ρ‹Π» вытянут, ΠΈ, ΡΠ»Π΅Π΄ΠΎΠ²Π°Ρ‚Π΅Π»ΡŒΠ½ΠΎ, ΠΎΠ½ ΠΌΠΎΠ³ Π½Π΅ ΠΌΠΎΠΆΠ΅Ρ‚ ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚ΡŒΡΡ, поэтому достаточно просто Π³Π°Ρ€Π°Π½Ρ‚ΠΈΡ€ΠΎΠ²Π°Ρ‚ΡŒ, Ρ‡Ρ‚ΠΎ self Π½Π΅ Π±ΡƒΠ΄Π΅Ρ‚ ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚ΡŒΡΡ Π΄ΠΎ ΠΊΠΎΠ½Ρ†Π° fn. (По ΠΊΡ€Π°ΠΉΠ½Π΅ΠΉ ΠΌΠ΅Ρ€Π΅, я надСюсь, Ρ‡Ρ‚ΠΎ это ΠΏΡ€Π°Π²Π΄Π°. =)

Π­Ρ‚ΠΎ Π·Π°Π±Π»ΠΎΠΊΠΈΡ€ΠΎΠ²Π°Π½ΠΎ Π½Π° нСлСксичСском Π²Ρ€Π΅ΠΌΠ΅Π½ΠΈ ΠΆΠΈΠ·Π½ΠΈ, ΠΊΠΎΡ‚ΠΎΡ€ΠΎΠ΅, Π² свою ΠΎΡ‡Π΅Ρ€Π΅Π΄ΡŒ, Π·Π°Π±Π»ΠΎΠΊΠΈΡ€ΠΎΠ²Π°Π½ΠΎ Π½Π° MIR. Π’ ΠΈΠ΄Π΅Π°Π»Π΅ это Π±ΡƒΠ΄Π΅Ρ‚ исправлСно ΠΊ ΠΊΠΎΠ½Ρ†Ρƒ 2016 Π³ΠΎΠ΄Π°, Π½ΠΎ исправлСниС появится Π½Π΅ скоро.

НС ΠΎΡ‡Π΅Π½ΡŒ ΡƒΠ΄ΠΈΠ²ΠΈΡ‚Π΅Π»ΡŒΠ½ΠΎ, Π½ΠΎ я ΠΏΠΎΠ΄Ρ‚Π²Π΅Ρ€Π΄ΠΈΠ», Ρ‡Ρ‚ΠΎ Π½Π°Ρ‡Π°Π»ΡŒΠ½Ρ‹ΠΉ ΠΏΡ€ΠΈΠΌΠ΅Ρ€ Π΄Π΅ΠΉΡΡ‚Π²ΠΈΡ‚Π΅Π»ΡŒΠ½ΠΎ компилируСтся ΠΊΠ°ΠΆΠ΄ΡƒΡŽ Π½ΠΎΡ‡ΡŒ, Ссли Π²Ρ‹ Π²ΠΊΠ»ΡŽΡ‡ΠΈΡ‚Π΅ Π½Π΅Π»Π΅ΠΊΡΠΈΡ‡Π΅ΡΠΊΡƒΡŽ Ρ„ΡƒΠ½ΠΊΡ†ΠΈΡŽ Π²Ρ€Π΅ΠΌΠ΅Π½ΠΈ ΠΆΠΈΠ·Π½ΠΈ.

Π― Π΄ΡƒΠΌΠ°ΡŽ, Ρ‡Ρ‚ΠΎ столкнулся с Π°Π½Π°Π»ΠΎΠ³ΠΈΡ‡Π½ΠΎΠΉ ΠΏΡ€ΠΎΠ±Π»Π΅ΠΌΠΎΠΉ Π² производствСнной срСдС, ΠΊΠΎΠ³Π΄Π° нСизмСняСмый Π·Π°Π΅ΠΌ, каТСтся, ΠΆΠΈΠ²Π΅Ρ‚ слишком Π΄ΠΎΠ»Π³ΠΎ ( Π²Ρ€Π΅ΠΌΠ΅Π½Π½ΠΎΠ΅ Ρ€Π΅ΡˆΠ΅Π½ΠΈΠ΅ ).

Π― Ρ‚Π°ΠΊΠΆΠ΅ Π΄ΠΎΠ»ΠΆΠ΅Π½ ΡƒΠΏΠΎΠΌΡΠ½ΡƒΡ‚ΡŒ, Ρ‡Ρ‚ΠΎ ΠΊΠΎΠ΄ starwed большС Π½Π΅ компилируСтся Π² послСднюю Π½ΠΎΡ‡ΡŒ. @oberien ΠΏΡ€Π΅Π΄Π»ΠΎΠΆΠΈΠ» 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

(ΠΌΡ‹ Π΄ΠΎΠ»ΠΆΠ½Ρ‹ Π±Ρ‹Π»ΠΈ ΡƒΠ΄Π°Π»ΠΈΡ‚ΡŒ E-needtest, ΠΊΠΎΠ³Π΄Π° ΠΌΡ‹ ΡƒΠ΄Π°Π»ΠΈΠ»ΠΈ NLL-fixed-by-NLL)

Π‘Ρ‹Π»Π° Π»ΠΈ эта страница ΠΏΠΎΠ»Π΅Π·Π½ΠΎΠΉ?
0 / 5 - 0 Ρ€Π΅ΠΉΡ‚ΠΈΠ½Π³ΠΈ

Π‘ΠΌΠ΅ΠΆΠ½Ρ‹Π΅ вопросы

overvenus picture overvenus  Β·  3ΠšΠΎΠΌΠΌΠ΅Π½Ρ‚Π°Ρ€ΠΈΠΈ

drewcrawford picture drewcrawford  Β·  3ΠšΠΎΠΌΠΌΠ΅Π½Ρ‚Π°Ρ€ΠΈΠΈ

dwrensha picture dwrensha  Β·  3ΠšΠΎΠΌΠΌΠ΅Π½Ρ‚Π°Ρ€ΠΈΠΈ

cuviper picture cuviper  Β·  3ΠšΠΎΠΌΠΌΠ΅Π½Ρ‚Π°Ρ€ΠΈΠΈ

wthrowe picture wthrowe  Β·  3ΠšΠΎΠΌΠΌΠ΅Π½Ρ‚Π°Ρ€ΠΈΠΈ