问题描述
我知道Rust没有继承,并且该语言提供了一种简便的方法,可以通过使用Traits在对象之间共享相同方法的不同实现。但是,是否有惯用的方式来共享属性名称定义,还是需要在每个结构上都定义它们?
我的用例是,我有许多跟踪某些信息的不同结构。每条信息都可以更新,我希望每个结构都知道其最后更新的日期。是否有一种通用模式(也许是宏?)将last_update
属性添加到所有结构,还是必须将其显式添加到每个结构?
解决方法
目前无法通过特征来完成此操作,最接近的是“特征中的字段” RFC(discussion,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
}
}
然后,您可以将其包含在任何需要功能的结构中:
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
方法),但是除非您这样做很多我认为这不值得。