在Rust中的多个向量中有一个struct实例

内容来源于 Stack Overflow,并遵循CC BY-SA 3.0许可协议进行翻译与使用

  • 回答 (1)
  • 关注 (0)
  • 查看 (67)

我正在Rust中构建一个备份Docker卷的应用程序。

我想知道哪些容器正在使用目标卷。

这是我使用的代码:

 let volume = await!(get_volume_by_name(&docker, &volume_name));

    let container_details = await!(get_container_details(&docker));

    let mut connected_containers = Vec::new();

    for container_detail in container_details {
        for mount in container_detail.mounts {
            if mount.destination == volume.mountpoint {
                connected_containers.push(container_detail);
            }
        }
    }

我正在尝试将所有匹配的容器放在一个向量中。我得到的错误是:

error[E0382]: use of moved value: `container_detail`
  --> src/main.rs:32:43
   |
29 |     for container_detail in container_details {
   |         ---------------- move occurs because `container_detail` has type `shiplift::rep::ContainerDetails`, which does not implement the `Copy` trait
...
32 |                 connected_containers.push(container_detail);
   |                                           ^^^^^^^^^^^^^^^^ value moved here, in previous iteration of loop

我知道你在2个向量中不能有相同的值,但我怎么做这样的事情呢?

如何获得与给定(非平凡条件)匹配的值的“列表”?

提问于
用户回答回答于

最简单的方法是克隆container_details

if mount.destination == volume.mountpoint {
   connected_containers.push(container_detail.clone());
}

这需要shiplift::rep::ContainerDetails实现Clone.

这确实有一些缺点:

  1. 内存使用量加倍(但因为它被称为Details,我认为它不会使用那么多内存)。
  2. 对项目的更改container_details未反映在克隆版本中。

有了get_container_details回报Vec<Rc<ContainerDetails>>,而不是,然后克隆container_detail将只克隆一个参考。

扫码关注云+社区

领取腾讯云代金券