将一个成员的所有权从一个结构体转移到另一个结构体?

9

我有两个结构体:

struct MyVector {
    storage: Vec<u32>,
}

struct MyVectorBuilder {
    storage: Vec<u32>,
}

impl MyVectorBuilder {
    fn new() -> MyVectorBuilder {
        MyVectorBuilder { storage: Vec::new() }
    }

    fn build_my_vector(&mut self) -> MyVector {
        // Doesn't compile: ^^^^ cannot move out of borrowed content
        MyVector { storage: self.storage }
    }
}

有没有办法告诉编译器,build_my_vector() 调用后将不再使用 MyVectorBuilder ,以便让我将 storage 移动到 MyVector


注意:您可能需要更熟悉Rust命名约定,方法应为“snake_case”,而不是“PascalCase”。 - Matthieu M.
@MatthieuM。谢谢,老习惯了。 - Shmoopy
5
没问题,编译器会一遍又一遍地提醒你,直到你达到要求为止 :) - Matthieu M.
3个回答

10
是的。将 MyVectorBuilder 的所有权传递给 MakeMyVector
fn make_my_vector(self) -> MyVector {
    MyVector { storage: self.storage }
}

5
有没有一种方法可以告诉编译器,在调用BuildMyVector()之后将不再使用MyVectorBuilder,以便让我将存储器移动到MyVector中?
是的,通过值传递MyVectorBuilder:
fn build_my_vector(self) -> MyVector {
    MyVector { storage: self.storage }
}

一般来说,出于这个原因,我建议构建器的“build”步骤采用按值接收其参数。
如果需要构建两次,则构建器可以实现“Clone”。

1
从Rust 1.40.0开始,你可以使用mem::take函数。
fn build_my_vector(&mut self) -> MyVector {
    MyVector { storage: take(self.storage) }
}

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接