pir*_*irt 5 struct properties rust
我知道 Rust 没有继承,并且该语言提供了通过使用 Traits 在对象之间共享相同方法的不同实现的简单方法。但是是否有一种惯用的方法来共享属性名称定义,或者是否需要在每个结构上定义它们?
我的用例是我有许多不同的结构来跟踪某些信息。每条信息都可以更新,我希望每个结构都知道其上次更新的日期。是否有一个通用模式(也许是宏?)来last_update
向所有结构添加属性,或者我必须将其显式添加到每个结构中?
目前还没有办法通过特征来做到这一点,最接近的是“特征中的字段”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_updated
impl 块中的方法中),但除非您经常这样做,否则我认为这是不值得的。