首页 > 解决方案 > 是否有任何方便的方法来修改 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()
    }
}

锈游乐场链接

但这对于具有许多字段的结构来说并不方便。是否有不同的解决方案或带有自定义派生的板条箱,以便为每个字段提供此功能,而不必成倍增加您为添加新字段而编写的代码量?

标签: rust

解决方案


推荐阅读