【问题标题】:How do I move an Option from one structure field to another, keeping both structures? [duplicate]如何将选项从一个结构字段移动到另一个结构字段,同时保留两个结构? [复制]
【发布时间】:2018-02-25 11:28:50
【问题描述】:

我想将一个结构的字段的值移动到另一个结构,如下所示:

struct MyStruct {
    value1: Option<Vec<usize>>,
    value2: i32,
    // ...,
}

impl MyStruct {
    pub fn child(&mut self, value2: i32) -> MyStruct {
        let mut value1 = self.value1.unwrap();

        // Do some stuff..

        MyStruct {
            value1: Some(value1),
            value2: value2,
        }
    }
}

fn main() {
    let mut first = MyStruct {
        // Building the first structure
        value1: Some((0..10).map(|_| 0).collect()),
        value2: 0,
    };

    // Using it

    let second = first.child(1);
}

我收到一个错误:

error[E0507]: cannot move out of borrowed content
 --> src/main.rs:9:26
  |
9 |         let mut value1 = self.value1.unwrap();
  |                          ^^^^ cannot move out of borrowed content

我如何告诉 Rust 将 value1 从第一个实例移动到第二个实例,让第一个实例的 value1 等于 None

稍后在我的代码中,我可能需要返回到我使用的所有实例,读取其他值但不读取向量。

我曾经做过一个字段的副本,但由于我正在探索一个非常巨大的图表,内存无法承受它并且效率不高。

【问题讨论】:

标签: rust


【解决方案1】:

感谢E_net4 我找到了一个简单的方法:

pub fn child(&mut self, value2: i32) -> MyStruct {
    MyStruct {
        value1: self.value1.take(),
        value2: value2,
    }
}

这里,value1: self.value1.take() 将 value1 内容从 self 移动到新结构中,将 None 留在 self.value1 中。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-07-06
    • 1970-01-01
    • 2021-03-27
    • 1970-01-01
    相关资源
    最近更新 更多