往返于可变借入的结构

时间:2015-02-14 08:30:17

标签: rust

有人可以解释为什么将值移动到借来的结构中是有效的,而不是将它们移出去?例如:

struct S {
    v: Vec<u8>
}

fn move_v_out(s: &mut S) {
    let old_vecotr = s.v; // If removed, program compiles fine
    s.v = vec![];
}

fn main() {
    let mut v = S {
        v: vec![]
    };
    move_v_out(&mut v);
}

在任何一种情况下,都会修改一个可变借入结构的成员。但是,会导致编译错误。

1 个答案:

答案 0 :(得分:9)

主要的区别在于,当你从一个借来的结构中移动一个值时,你将它留在一个“部分移动的状态”,这样就禁止它在之后被用作整个结构。

这个状态被禁止使用借来的值,因为它们需要在函数结束时仍然有效,并且编译器没有(但是)理解你之后正确设置了值。

但是,如果你想要做的是提取旧的Vec并用新的替换它,标准库包含你需要的功能:std::mem::replace

fn move_v_out(s: &mut S) {
    let old_vector = std::mem::replace(&mut s.v, vec![]);
    // do something with old_vector
}