更改迭代器中结构的枚举值
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
的独特克隆,这就是我假设您想要的。
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
的独特克隆,这就是我假设您想要的。