Точно так, как вы сделали; здесь не проблема. Полное сообщение об ошибке показывает более подробно:
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 для получения дополнительной информации об ошибке.
Это решает мой SSCCE, но не проблема в моем фактическом коде. Придется заглянуть в нее дальше. Спасибо. – Michael
@ Майкл, мы с нетерпением ждем следующего вопроса!^_ ^ – Shepmaster