当前位置: 首页 > 知识库问答 >
问题:

我如何使许多实现相同特性的不同结构相互比较?

路和悌
2023-03-14

在Java行话中,我有一个接口R,一个接口RT扩展了R(其中RT实现了所有R)和一系列其他类,它们都实现了RT

过渡到生锈,我有两个特点

trait R { ... }
trait RT { ... }

其中RTR的子特征:

impl R for X where X: RT { ... }

接下来,我有一堆结构,所有这些结构都实现了RT:

struct RV { ... }
impl RT for RV { ... }

struct I { ... }
impl RT for I { ... }

struct U { ... }
impl RT for U { ... }

// ...

到目前为止还不错。

现在我希望所有这些结构都可以相互比较,因为它们都实现了RT

Java我会将RT更改为

interface RT extends R, Comparable<RT>

并为equalscompareTo添加默认实现。

在《铁锈》中,我不知道是否或如何才能做到这一点。

我可以说trait-RT:PartialEq,但这只会使一个实现与它本身具有可比性(RV==RV,而不是RV==U)。

我的下一个想法是为每个结构添加总体实现:

impl PartialEq<RV> for X where X: RT
impl PartialEq<I> for X where X: RT
// ...

我理解为什么这是不允许的,但是我仍然被我最初的问题困扰着。

我无法将值转换为比较(RV as RT==U as RT),因为RT无法生成对象。

我可以手动实现ParatalEq

我考虑过使用宏来生成所有不同的实现,但这感觉太像暴力强迫了,所以我对程序的初始设计提出了质疑。

我如何使所有不同的结构相互比较?


共有1个答案

罗兴运
2023-03-14

这种模式经常出现在模拟标记联合的Java中,这在Java语言中是缺失的。在Rust中,除非您正在编写一个库,其用户可能需要定义新的RT实现,否则我怀疑您会更喜欢使用枚举而不是trait对象:

#[derive(PartialEq, Eq)]
enum AnyRT {
    RV(RV),
    I(I),
    U(U),
}

impl RT for AnyRT {
    fn foo(&self, ...) {
        match self {
            AnyRT::RV(rv) => rv.foo(...),
            AnyRT::I(i) => i.foo(...),
            AnyRT::U(u) => u.foo(...),
        }
    }
}

根据您的应用程序,您可能会发现根本不需要RT特征和/或单独的RVIU结构。

 类似资料:
  • 我是Resilience4J的新手,并试图与Spring Boot集成。 我的应用程序有几个远程系统调用。我希望所有远程呼叫都有相同的断路器配置。

  • 问题内容: 我有以下接口,我想在类中多次实现: 现在,我希望能够通过以下方式实现此接口: 但是,这给了我错误:在行上: 是否可以使用不同的泛型两次实现接口?如果不是,那么我在这里可以做的下一步工作是什么? 问题答案: 您需要使用内部或匿名类。例如:

  • 问题内容: 提前致谢。感谢您的帮助。 我想比较两个相同类型和结构的任意JToken(NewtonSoft的Json.Net)。 主要目标 是能够使用此方法对两个Json字符串进行排序,以便即使开始时它们具有相同的数据,但顺序不同,最后它们是两个完全相同的字符串。因此排序标准并不重要,重要的是该标准始终相同。并且应该考虑每个小数据元素。 JToken可以是以下几种类型之一:。我没有考虑比较。 获得一

  • 我的办公自动化系统中有以下内容。yaml文件: 它不喜欢“description:”这句话:如果有内部异常,那么内部异常。如果我去掉这个,它就不喜欢“属性:”。我尝试了很多东西,但都不管用。我不明白什么?

  • 我的应用程序需要存储一组与另一个“真实”表具有相同数据库结构的“暂存数据”,但在人工查看暂存数据的内容之前,不能将其写入真实表。这些不仅是对实际表的添加,而且是对它的更新(因此,换句话说,在staging table中,有一些值与实际表具有相同的主键,因为它们引用了相同的实体实例)。 我的方法是让两个JPA对象具有相同的结构(即字段、列名等),但存储在不同的表中,并与Spring透视图完全分开处理

  • 比如我要用一个name字段 比较树状结构里面的所有name字段 包括所有children 看有没有相同的 不知道树状结构里面有多少级 怎么比较, 并且如果过滤掉自己