2017-04-20 4 views
2

Ich versuche Rust und habe ein paar Probleme mit dem Verständnis von "Borrowing".Ausleihe in Rust freigeben

fn main() { 
    let mut x = 10; 
    let mut a = 6; 
    let mut y = &mut x; 

    *y = 6; 
    y = &mut a; 

    x = 15; 
    println!("{}", x); 
} 

Und ich habe einen Fehler bekam:

error[E0506]: cannot assign to `x` because it is borrowed 
--> <anon>:9:5 
    | 
4 |  let mut y = &mut x; 
    |      - borrow of `x` occurs here 
... 
9 |  x = 15; 
    |  ^^^^^^ assignment to borrowed `x` occurs here 

error[E0502]: cannot borrow `x` as immutable because it is also borrowed as mutable 
    --> <anon>:10:20 
    | 
4 |  let mut y = &mut x; 
    |      - mutable borrow occurs here 
... 
10 |  println!("{}", x); 
    |     ^immutable borrow occurs here 
11 | } 
    | - mutable borrow ends here 

Wie kann ich loslassen x von "y -borrowing"?

+1

Sie müssen nur beginnen [in Bereichen denken] (https://doc.rust-lang.org/stable/book/references-and-borrowing.html#thinking-in-scopes). –

Antwort

3

Dies ist derzeit eine Einschränkung der Rust-Border-Checker, oft als "non lexical lifetimes" (NLL) bezeichnet. Das Problem hierbei ist, dass die Referenz, wenn Sie einen Verweis auf eine Variable zuweisen (let mut y = &mut x;), für den gesamten Gültigkeitsbereich der Variablen gelten muss. Dies bedeutet, dass "x ist ausgeliehen" für den gesamten Umfang von y gilt. Der Compiler kümmert sich also nicht um die Zeile y = &mut a;!

Sie können viel mehr (technische) Diskussion über diese here at the tracking issue lesen.