使用结构方法从循环内修改结构内部状态的最惯用方法是什么?

时间:2019-10-15 19:14:55

标签: rust

似乎可以单独修改向量,但是一旦将其包装在结构中,就不能通过结构上的方法对其进行突变。

我在下面为我的用例创建了一个非常简化的版本,分为两个版本,一个只有一个向量,另一个带有一个结构。

为什么这段代码很好:

struct Task {
    foo: String,
}

fn main() {
    let mut list_of_tasks = Vec::new();

    loop {
        list_of_tasks.push(Task {
            foo: String::from("bar"),
        });
    }
}

但这不是:

struct Task {
    foo: String,
}

struct ListOfTasks(pub Vec<Task>);

impl ListOfTasks {
    fn push(mut self, task: Task) {
        self.0.push(task);
    }
}

fn main() {
    let list_of_tasks = ListOfTasks(Vec::new());

    loop {
        list_of_tasks.push(Task {
            foo: String::from("bar"),
        });
    }
}

第二个示例失败:

error[E0382]: use of moved value: `list_of_tasks`
  --> src/main.rs:17:9
   |
14 |     let list_of_tasks = ListOfTasks(Vec::new());
   |         ------------- move occurs because `list_of_tasks` has type `ListOfTasks`, which does not implement the `Copy` trait
...
17 |         list_of_tasks.push(Task {
   |         ^^^^^^^^^^^^^ value moved here, in previous iteration of loop

我想我对移动使用mut self的结构不了解,但是在网上找不到任何明显的例子来说明如何实现这一点。

0 个答案:

没有答案
相关问题