rust - 在迭代器中更改结构的枚举值
问题描述
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
s 之间共享它。解决您的问题的最简单方法是派生一个实现,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
推荐阅读
- angular - 角度拦截器处理 [object,object]
- web-scraping - 当我在输入字段中输入一些文本并在 Puppeteer 中按 Enter 键时,WaitForSelector 不起作用
- javascript - 如何在循环Vue中为每个孩子设置不同的状态变量
- php - FFMPEG 在终端中工作,但不在 php 脚本中
- selenium - Python - 无法从带有嵌入脚本的网页中获取所有文本 - Selenium、ChromeDriveManager、BS、requests_html
- php - 如何更改 Maatwebsite 包(LaravelExcel)中的关闭以导出不带双引号的数据
- vba - 如何在 VBA 中复制没有数字的 MS-Word“列表段落”文本字符串
- amazon-web-services - 如何使用 Terraform 使 AWS CloudFront Distribution 缓存失效?
- python - 字典式减法
- android - 模拟器预览未像模拟器一样在 Jetpack Compose 中显示