首页 > 解决方案 > 在迭代器中更改结构的枚举值

问题描述

pub struct Server {
  devices: Vec<Device>,
}

pub struct Device {
  configuration: Configuration,
}

pub enum Configuration {
    Gradient {
        stops: Vec<String>,
        brightness: f32,
        duration: i32,
        random_starting_point: bool,
    },
}

我想通过以下方法动态更新某些设备的配置:

fn update_configuration(&mut self, devices: Vec<Device>, configuration: Configuration) {
    self.devices
        .iter_mut()
        .filter(|device| devices.contains(device.get_id()))
        .for_each(|device| {
            (*device).configuration = configuration;
        });
}

编译器输出:

error[E0507]: cannot move out of `configuration`, a captured variable in an `FnMut` closure

device.update_configuration(configuration);
                           ^^^^^^^^^^^^^ move occurs because `configuration` has type `device::Configuration`, which does not implement the `Copy` trait

而且由于我Vec<String>在那个枚举值中有一个,所以我无法实现这个Copy特征。我确实对内存管理(堆栈、堆)和指针有基本的了解,但我不能完全理解它。

我的问题

标签: rustiteratorclosuresownershipborrowing

解决方案


在 Rust 中,每条数据最多可以有 1 个唯一所有者。您正在获取单个实例Configuration并尝试在可能的多个Devices 之间共享它。解决您的问题的最简单方法是派生一个实现,Clone该实现将允许您在Configuration尝试共享枚举时对枚举进行克隆。

#[derive(Clone)]
pub enum Configuration {}

然后在你的循环中克隆它:

self.devices
    .iter_mut()
    .filter(|device| devices.contains(device.get_id()))
    .for_each(|device| {
        (*device).configuration = configuration.clone();
    });

注意:这将为我假设你想要的Configuration每个提供一个独特的克隆。Device


推荐阅读