2016-07-17 8 views
1

Как изменить переменную, определенную за пределами закрытия изнутри закрытия?Как изменить переменную, определенную за пределами закрытия изнутри закрытия?

Код:

fn main() { 
    let mut t = "foo".to_string(); 
    println!("{}", t); 

    let mut closure = | | { 
     t.clear(); 
    }; 
    closure(); 

    println!("{}", t); 
} 

Ошибка компиляции:

cannot borrow `t` as immutable because it is also borrowed as mutable [--explain E0502] 

ответ

2

Точно так, как вы сделали; здесь не проблема. Полное сообщение об ошибке показывает более подробно:

error: cannot borrow `t` as immutable because it is also borrowed as mutable [--explain E0502] 
    |>   let mut closure = || { 
    |>       -- mutable borrow occurs here 
    |>    t.clear(); 
    |>    - previous borrow occurs due to use of `t` in closure 
... 
    |>  println!("{}", t); 
    |>     ^immutable borrow occurs here 
    |> } 
    |> - mutable borrow ends here 

Вы дали изменяемую ссылку переменной для закрытия и закрытия все еще находится в области видимости. Это означает, что он сохраняет ссылку, и вы не можете иметь никаких других ссылок на переменную. Это показывает ту же проблему:

fn main() { 
    let mut t = "foo".to_string(); 
    println!("> {}", t); 
    let not_a_closure = &mut t; 
    println!("> {}", t); 
} 

Создание закрытия в меньшем объеме заставляет закрытие выходить за рамки и освободить ссылку перед вызовом println!:

fn main() { 
    let mut t = "foo".to_string(); 
    println!("> {}", t); 

    { 
     let mut closure = || { 
      t.clear(); 
     }; 
     closure(); 
    } 

    println!("> {}", t); 
} 

Я хотел бы предложить, глядя на 60+ other questions with the same error message для получения дополнительной информации об ошибке.

+0

Это решает мой SSCCE, но не проблема в моем фактическом коде. Придется заглянуть в нее дальше. Спасибо. – Michael

+0

@ Майкл, мы с нетерпением ждем следующего вопроса!^_ ^ – Shepmaster

Смежные вопросы