删除移动的值后删除部分移动的值

时间:2018-03-26 19:28:05

标签: compiler-errors rust lifetime

我希望以下代码能够编译并打印Foo(6),因为b的值会在匹配块之后删除对a的引用。

似乎与此编译器错误有关:

error[E0502]: cannot borrow `a` as immutable because it is also borrowed as mutable
  --> src/main.rs:26:22
   |
13 |     let b = get_foo(&mut a);
   |                          - mutable borrow occurs here
...
26 |     println!("{:?}", a);
   |                      ^ immutable borrow occurs here
27 | }
   | - mutable borrow ends here

删除b的值也不起作用,因为它已被部分移动:

error[E0382]: use of partially moved value: `b`
  --> src/main.rs:24:10
   |
18 |         Some(value) => *value = y,
   |              ----- value moved here
...
24 |     drop(b);
   |          ^ value used here after move
   |
   = note: move occurs because `(b:std::prelude::v1::Some).0` has type `&mut u32`, which does not implement the `Copy` trait

有没有更好的方法来解决这个问题,而不是将行let bmatch b放入内部块?这看起来很奇怪和丑陋。

编译器是否应该理解该引用已被删除,并且能够编译该代码?

#[derive(Debug)]
struct Foo(u32);

fn get_foo(bar: &mut Foo) -> Option<&mut u32> {
    Some(&mut bar.0)
}

pub fn test() {
    let mut x = 5;
    let mut y = 6;
    let mut a = Foo(x);

    // {

    let b = get_foo(&mut a);

    match b {
        Some(value) => *value = y,
        _ => (),
    }

    // }

    //    drop(b);

    println!("{:?}", a);
}

1 个答案:

答案 0 :(得分:3)

  

有没有更好的方法来解决这个问题

是的,但不是稳定的Rust。你需要非词汇生命周期

#![feature(nll)]

#[derive(Debug)]
struct Foo(u32);

fn get_foo(bar: &mut Foo) -> Option<&mut u32> {
    Some(&mut bar.0)
}

pub fn test() {
    let x = 5;
    let y = 6;
    let mut a = Foo(x);

    let b = get_foo(&mut a);

    if let Some(value) = b {
        *value = y;
    }

    println!("{:?}", a);
}

fn main() {}

在此之前,只需使用额外的块。

  

删除b的值不起作用

drop与借用无关。

另见: