如何在Rust中修改可变引用的* full *内容?

时间:2019-05-17 09:06:10

标签: rust

这是我能想到的最简单的例子,它说明了我所面临的问题。我是Rust的新手,所以对不起,我很抱歉。

#[derive(Debug)]
enum TestType {
    First,
    Second(i32),
}

fn main() {
    let mut test_var = TestType::First;
    println!("Original {:?}", test_var);

    let mut test_vec: Vec<&mut TestType> = vec![&mut test_var];

    println!("--------------");
    {
        let test_ref = test_vec.pop().unwrap();
        test_ref = TestType::Second(49);
    }
    println!("Original {:?}", test_var);
}

Playground

我有一个枚举类型。我创建了一个变量,并为其分配了该枚举类型的值,我希望该变量成为值“永远”的所有者。有一个Vec,其中包含 mutable 对该类型的引用。然后,我想检索那些引用,并可能修改它们指向的值,以便更改原始变量。有办法吗?

编译上面的代码将导致:

error[E0308]: mismatched types
  --> src/main.rs:16:20
   |
16 |         test_ref = TestType::Second(49);
   |                    ^^^^^^^^^^^^^^^^^^^^
   |                    |
   |                    expected mutable reference, found enum `TestType`
   |                    help: consider mutably borrowing here: `&mut TestType::Second(49)`
   |
   = note: expected type `&mut TestType`
              found type `TestType`

1 个答案:

答案 0 :(得分:0)

您有一个引用向量,因此从中获取元素时,变量必须是可变的,然后您取消引用它以分配值:

#[derive(Debug)]
enum TestType {
    First,
    Second(i32),
}

fn main() {
    let mut test_var = TestType::First;
    println!("Original {:?}", test_var);

    let mut test_vec: Vec<&mut TestType> = vec![&mut test_var];

    println!("--------------");
    {
        let mut test_ref = test_vec.pop().unwrap();
        *test_ref = TestType::Second(49);
    }
    println!("Original {:?}", test_var);
}

结果:

Original First
--------------
Original Second(49)