rust - 是否有任何方便的方法来修改 Rust 结构的字段,同时克隆它而不不必要地克隆要修改的字段?
问题描述
我有一些代码需要在克隆期间修改结构的字段。我想避免在修改之前不必要地克隆该字段。原始结构包含在一个中,Rc
所以我只能通过引用访问它。这是一个简单的示例,它天真地尝试使用struct update 语法:
use std::rc::Rc;
#[derive(Clone, Debug)]
struct B {
value: i32,
}
#[derive(Clone, Debug)]
struct A {
b: B,
c: i32,
}
impl A {
fn update_c(&self, c: i32) -> Self {
A {
c,
..*self
}
}
fn update_b(&self, b: B) -> Self {
A {
b,
..*self
}
}
}
fn main() {
let a = Rc::new(A {
b: B { value: 0 },
c: 0,
});
let a = Rc::new(a.update_c(-1));
}
不幸的是,这不能编译,因为我的类型没有实现Copy
,而且我真的不希望它实现Copy
。我还猜测在这种情况下,执行取消引用时的副本与..*a
在修改之前克隆整个结构一样昂贵。
到目前为止,我发现完成这项工作的唯一方法是手动克隆每个字段:
fn update_c(&self, c: i32) -> Self {
Self {
c,
b: self.b.clone()
}
}
但这对于具有许多字段的结构来说并不方便。是否有不同的解决方案或带有自定义派生的板条箱,以便为每个字段提供此功能,而不必成倍增加您为添加新字段而编写的代码量?
解决方案
推荐阅读
- regex - 如何删除字符串中的括号字符(飞镖)
- regex - 正则表达式匹配除模式之外的所有内容
- angular - 通过@input 更改角度主机
- c# - BINARY_CHECKSUM 实体框架核心 5
- ios - 具有矩形功能的相机访问 (Objc iOS)
- kubernetes - 如何配置 ClusterIssuer 以自定义证书持续时间和续订?
- elasticsearch - Elastic Search / Logstash:同一文档上的大量(近)并发更新
- html - 如何在没有 .load() 函数的情况下自动生成静态 HTML 文件
- c++ - 如何更改 gtkmm 组合框的 CSS 样式?
- javascript - 如何使用 NodeJS 从 azure blob 存储中读取 csv 文件?