为什么参数“借用”该值?

时间:2017-05-18 19:33:52

标签: rust borrow-checker

以下是一个示例:

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);
}

Rust playground

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);

作品。

1 个答案:

答案 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以解决此问题。