以下是一个示例:
struct X(u32);
impl X {
fn f(&mut self, v: u32) {}
}
fn main() {
let mut x = X(42);
// works
let v = x.0;
x.f(v);
// cannot use `x.0` because it was mutably borrowed
x.f(x.0);
}
error[E0503]: cannot use `x.0` because it was mutably borrowed
--> src/main.rs:16:9
|
16 | x.f(x.0);
| - ^^^ use of borrowed `x`
| |
| borrow of `x` occurs here
x.f(x.0)
不起作用的原因是什么? x.0
作为参数传递,绑定到类型v
的{{1}}参数:函数体绝对不可能通过参数访问u32
。
此外,我觉得非常奇怪:
x.0
不起作用,而:
f(something);
作品。
答案 0 :(得分:2)
执行x.f(x.0)
时,您已借用x
向&mut self
提供f
,然后再尝试借用x
以获取x.0
{1}}。无法同时引用x.0
两次。也就是说,方法f
不能同时通过x
&mut self
(包括x.0
)和x.0
的{{1}}看似不可变的引用来同时访问refer to that int in X
同时。
使用临时变量时,实际上会获得该值的副本;这意味着您不再是42
而是f
。这是允许的。
关于“非词汇生命周期”评论:由于x.f(x.0)
采用了旧的u32而不是对它的引用,x.f(42)
基本上应该等同于x
,因为编译器在从x.0
中获取值之后可以放弃x
,然后再次突然借用&mut self
以向f
提供rustc
。但是,编译器在编译期间很早就确定了生命周期及其要求;因此,生命周期目前比它们必须更广泛。在x
借用x.0
之前,x
目前无法确定由于&mut self
参数导致的Start: denver
ListOfStops: houston, austin, tucson
Final: denver
借款已经结束。正在进行work以解决此问题。