类似结构的rust中的代码重复消除

类似结构的rust中的代码重复消除,rust,Rust,我有一个小项目,其中有一些类似的结构,Ord和PartialOrd的实现是相同的。我不熟悉动态语言(主要是动态语言),在动态语言中,代码复制通常被认为是反模式的,我想知道是否有办法避免代码复制?或者,更一般地说,这是我应该担心生锈的原因吗 例如: struct事件{ 开始:i32, 完:i32,, . . . } 事件请求{ fn cmp(&self,其他:&self)->订购{ 设cmp=self.start.cmp(&other.start); 如果cmp==排序::相等{ (self.en

我有一个小项目,其中有一些类似的结构,
Ord
PartialOrd
的实现是相同的。我不熟悉动态语言(主要是动态语言),在动态语言中,代码复制通常被认为是反模式的,我想知道是否有办法避免代码复制?或者,更一般地说,这是我应该担心生锈的原因吗

例如:

struct事件{
开始:i32,
完:i32,,
. . .
}
事件请求{
fn cmp(&self,其他:&self)->订购{
设cmp=self.start.cmp(&other.start);
如果cmp==排序::相等{
(self.end-self.start).cmp(&(other.end-other.start))
}否则{
化学机械抛光
}
}
}
事件的impl PartialOrd{
fn partial_cmp(&self,other:&self)->选项{Some(self.cmp(&other))}
}
结构保留{
开始:i32。
完:i32,,
. . . 
}
请求保留{
//与事件相同的实现
}
请求预约{
//与事件相同的实现
}

有没有办法让
Reservation
Event
共享
cmp
的实现,这样就不需要复制代码了?

问题的核心是,首先要在两个结构上复制相同的字段。通过将它们分解成一些单独的结构,可以很容易地避免这种情况,例如:

#[推导(Eq,PartialEq)]
结构时间范围{
开始:i32,
完:i32,,
}
然后您可以为它实现一次
Ord
&
PartialOrd

impl命令用于时间范围{
// ...
}
时间范围的impl PartialOrd{
// ...
}
由于
TimeRange
现在是
Ord
,您可以简单地导出
Event
Reservation
Ord
特征,因为这将委托给
TimeRange
的impl

#[派生(Eq,PartialEq,Ord,PartialOrd)]
结构事件{
范围:时间范围,
}
#[推导(等式,PartialEq,Ord,PartialOrd)]
结构保留{
范围:时间范围,
}

此外,在您的特定示例中,您似乎首先按
开始
排序,然后按持续时间排序。但如果
start
-s相等,则按持续时间进行比较等同于按
end
进行比较,因此您可以按
start
然后按
end
进行有效排序,默认派生的
Ord
将为您提供哪些属性,而无需编写任何代码。

它是否与
Reservation
Event
中不应有助于排序的其他属性一起工作?不与
派生
属性一起工作,不可以。仅使用字段子集无法导出
Ord
。但至少您可以从
事件的实现中调用
self.range.cmp()
。多亏了@CoronA。如果你有时间的话,澄清一下(关于有额外的属性)会很好地补充到答案中。