在Rust中,当我borrow 一个值时,编译器会注意到它,但当我替换它时,编译器不会注意到它,并发出E0597错误.
给定一个包含引用x
的可变变量.
当我用对局部变量的引用替换其内容时,在局部变量之前
如果超出范围,我就把它换回原来的位置.
下面的代码显示了这一点:
struct X {payload : i32}
fn main() {
let pl = X{payload : 44};
{
let mut x = &pl;
{
let inner = X{payload : 30};
let tmp = std::mem::replace(&mut x, &inner);
println! ("data ={:?}", x.payload);
let _f = std::mem::replace(&mut x, &tmp);
}
println! ("data ={:?}", x.payload);
}
}
错误是:
error[E0597]: `inner` does not live long enough
--> src/main.rs:9:49
|
9 | let tmp = std::mem::replace(&mut x, &inner);
| ^^^^^^ borrowed value does not live long enough
...
12 | }
| - `inner` dropped here while still borrowed
13 | println! ("data ={:?}", x.payload);
| --------- borrow later used here
For more information about this error, try `rustc --explain E0597`.
当我将引用inner
赋给x
时,编译器会注意到,但忽略了这样一个事实,即当inner
仍然有效时,我再次将这个引用替换为对pl
的原始引用.
预期输出应为:
data =30
data =44
我做错了什么?