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

Struct 在Rust中使用多个具有相同属性的结构的惯用方法是什么?,struct,rust,properties,Struct,Rust,Properties,我知道Rust没有继承性,该语言提供了一种简单的方法,通过使用Traits跨对象共享相同方法的不同实现。但是,是否有一种惯用的方法来共享属性名定义,或者需要在每个结构上定义它们 我的用例是,我有许多不同的结构来跟踪一些信息。每一条信息都可以更新,我希望每个结构都知道上次更新的日期。是否有一个共同的模式(可能是宏?)向所有结构添加一个last\u update属性,或者我必须将它显式地添加到每个结构?目前没有办法通过traits实现这一点,最接近的是“Fields in traits”RFC(,)

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


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

目前没有办法通过traits实现这一点,最接近的是“Fields in traits”RFC(,),但到目前为止,它似乎并不十分活跃

最简单的方法是使用带有方法的类型/结构,并将该字段包含在所需的任何结构中:

struct UpdateTimestamp{
timestamp:timestamp,//伪类型
}
impl UpdateTimestamp{
fn更新(&mut self){
self.timestamp=now();//伪函数
}
fn上次更新(&self)->时间戳{
自我时间戳
}
}
然后,您可以将其包含在需要功能的任何结构中:

struct MyStruct{
my_字段:u32,
我的其他字段:i32,
更新\u ts:UpdateTimestamp,
}
impl MyStruct{
fn my_字段(&self)->u32{
//Getter-无更新
self.my_字段
}
fn设置我的字段(&mut self,我的字段:u32){
self.update_ts.update();
self.my_field=我的_字段;
}
fn上次更新(&self)->时间戳{
self.update\u ts.last\u updated()
}
}

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

您的示例非常基本,所以我的答案是基本的,是的。有很多选项,细节取决于具体情况。如果您只想在每个结构上添加一个
last\u updated
字段,那么最好的选择就是简单地添加它。如果您想在每个结构上提供一些附加功能,有很多方法可以实现,我们需要更多地了解您的需求。这些是否真的需要是结构,或者一些更高级别的抽象(例如,基于将字段名称映射到值的哈希映射)也会起作用?值得一提的是,无论何时更改常规结构中不同字段的值,都不可能自动更新上次更新的
字段,以防这是您想要的。字段赋值不能触发Rust中的任何自定义行为。受@Sven的评论启发,我写了一篇文章来演示如何使用decorator结构,通过一个带闭包的
update
方法来提供这种行为。当您想向类型添加行为时,实现特征是一种方法,但将其包装在另一种类型中可以同时添加数据(如时间戳字段)。@trentcl我喜欢这样将旧值移动到闭包中以实现封装–没有办法从闭包中泄漏可变引用。我更喜欢是,好的一点,将来会。谢谢你的编辑!