更改迭代器中结构的枚举值

Changing enum value of struct in iterator

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 特征。我确实对内存管理(堆栈、堆)和指针有基本的了解,但我不能完全理解它。

我的问题

在 Rust 中,每条数据最多只能有 1 个唯一所有者。您正在使用 Configuration 的单个实例并尝试在可能的多个 Device 之间共享它。解决问题的最简单方法是派生 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();
    });

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