我知道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()
}
}
现在您可以为此编写一个复杂的宏,该宏可以自动化实现部分(将更新注入到setl和last_updated
impl块中的方法中),但是除非您做了很多,否则我认为这样做是不值得的。
本文收集自互联网,转载请注明来源。
如有侵权,请联系[email protected] 删除。
我来说两句