在Rust中具有相同属性的多个结构的惯用方式是什么?

问题描述

我知道Rust没有继承,并且该语言提供了一种简便的方法,可以通过使用Traits在对象之间共享相同方法的不同实现。但是,是否有惯用的方式来共享属性名称定义,还是需要在每个结构上都定义它们?

我的用例是,我有许多跟踪某些信息的不同结构。每条信息都可以更新,我希望每个结构都知道其最后更新的日期。是否有一种通用模式(也许是宏?)将last_update属性添加到所有结构,还是必须将其显式添加到每个结构?

解决方法

目前无法通过特征来完成此操作,最接近的是“特征中的字段” RFC(discussionRFC),但是到目前为止,这似乎还不是很有效

执行此操作的最简单方法是使类型/结构具有方法,并将该字段包含在所需的任何结构中:

struct UpdateTimestamp {
    timestamp: Timestamp,// dummy type
}

impl UpdateTimestamp {
    fn update(&mut self) {
        self.timestamp = now(); // dummy function
    }
    fn last_updated(&self) -> Timestamp {
        self.timestamp
    }
}

然后,您可以将其包含在任何需要功能的结构中:

struct MyStruct {
    my_field: u32,my_other_field: i32,update_ts: UpdateTimestamp,}

impl MyStruct {
    fn my_field(&self) -> u32 {
        // Getter - no update
        self.my_field
    }
    fn set_my_field(&mut self,my_field: u32) {
        self.update_ts.update();
        self.my_field = my_field;
    }
    fn last_updated(&self) -> Timestamp {
        self.update_ts.last_updated()
    }
}

现在,您可以为此编写一个复杂的宏,该宏可以自动化实现部分(将更新注入setter和impl块中的last_updated方法),但是除非您这样做很多我认为这不值得。