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

pir*_*irt 5 struct properties rust

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

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

Pau*_*aul 4

目前还没有办法通过特征来做到这一点,最接近的是“特征中的字段”RFC(讨论RFC),但目前看来还不是很活跃。

最简单的方法是拥有一个带有方法的类型/结构,并将该字段包含在您想要的任何结构中:

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

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

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

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()
    }
}
Run Code Online (Sandbox Code Playgroud)

现在您可以为此编写一个复杂的宏,它可以自动执行实现部分(将更新注入到 setter 和last_updatedimpl 块中的方法中),但除非您经常这样做,否则我认为这是不值得的。