gpt4 book ai didi

rust - 类似结构的 rust 代码重复数据删除

转载 作者:行者123 更新时间:2023-12-03 11:35:39 26 4
gpt4 key购买 nike

我有一个小项目,其中有一些类似的结构,其中执行 OrdPartialOrd是一样的。我是(主要)动态语言的新手,其中代码重复通常被认为是一种反模式,我想知道是否有办法避免重复此代码?或者,更一般地说,这是我应该担心使用rust 的事情吗?

例如:

struct Event {
start: i32,
end: i32,
. . .
}

impl Ord for Event {
fn cmp(&self, other: &Self) -> Ordering {
let cmp = self.start.cmp(&other.start);
if cmp == Ordering::Equal {
(self.end - self.start).cmp(&(other.end - other.start))
} else {
cmp
}
}
}

impl PartialOrd for Event {
fn partial_cmp(&self, other: &Self) -> Option<Ordering> { Some(self.cmp(&other)) }
}

struct Reservation {
start: i32.
end: i32,
. . .
}

impl Ord for Reservation {
// same implementation as Event
}

impl PartialOrd for Reservation {
// same implementation as Event
}

有没有办法拥有 ReservationEvent分享 cmp的实现这样代码就不需要重复了吗?

最佳答案

您问题的核心是您首先在两个结构上复制相同的字段。这可以通过将它们分解为一些单独的结构来轻松避免,例如:

#[derive(Eq, PartialEq)]
struct TimeRange {
start: i32,
end: i32,
}

然后你可以实现 Ord & PartialOrd为它一次。

impl Ord for TimeRange {
// ...
}

impl PartialOrd for TimeRange {
// ...
}

由于 TimeRange现在是 Ord ,您可以简单地推导出 Ord Event 的特征和 Reservation因为那将委托(delegate)给 TimeRange的意思。

#[derive(Eq, PartialEq, Ord, PartialOrd)]
struct Event {
range: TimeRange,
}

#[derive(Eq, PartialEq, Ord, PartialOrd)]
struct Reservation {
range: TimeRange,
}

此外,在您的具体示例中,您似乎按 start 排序首先,然后是持续时间。但是如果 start -s 相等,则按时长比较相当于按 end 比较因此你有效地按 start 排序然后 end ,默认派生 Ord无需编写任何代码即可给您。

关于rust - 类似结构的 rust 代码重复数据删除,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/61561612/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com