我正在try 编写处理过渡系统的代码.现在,我使用的是一个TransitionSystem特征,它有关联的类型EdgeColorStateColor,分别给出了边缘使用的 colored颜色 类型和状态使用的 colored颜色 类型.为了尽可能通用,该实现允许在任一位置(即,在边缘上或在状态上)使用特殊的Void类型来指示缺少真实 colored颜色 .

现在,我试图将子性状添加到TransitionSystem,这些本质上只是标记性状,表明在某个位置(状态或转换),使用的类型具有某些所需的属性(在我的代码中,这意味着它实现了Color性状).

有没有一种好的方式通过subtrait本身来表达这一点?我已经找到了一种方法来表达supertrait必须使用实现Color的关联类型,但结果代码相当冗长.我举了一个小例子来说明我的问题是什么,我try 了什么样的解决方法,以及我实际上在追求什么:

想象一下这样的特征

trait Super {
    type Out;
}

现在,Super的所有实现者都有一个关联的类型Out,但有些Super与其他的不同,并且关联的类型满足一些额外的界限,我们希望在Super的子特性中捕捉到这些界限.我们目前可以这样做:

trait SubWithBound: Super
where
    Self::Out: Eq,
{
}

但现在,每当我们想要接受一个Super,其中关联的类型Out实现Eq时,我们就不得不对它相当冗长.以下代码不起作用

fn sub_with_bound<X: SubWithBound>(x: X, y: X) {
    if x.eq(&y) {
        panic!("Equal")
    }
}

为了使它起作用,我们还必须在sub_with_bound的签名中指定where X::Out: Eq.

我目前正在试验的一个解决方法是,假设我们在子性状上有一个额外的关联类型,将特征界限放在上面,然后强制上级和下级性状的关联类型相等.类似于下面的内容:

trait SubCheat: Super<Out = Self::OutBound> {
    type OutBound: Eq;
}

现在,虽然这看起来确实有效,但当我有一个方法接受两个不同的SubCheat实现者时,类型系统不再能计算出适当的类型,其中关联的类型相等.因此,下面的代码

fn sub_cheat<X: SubCheat, Y: SubCheat<Out = X::Out>>(x: X, y: Y) {
    if x.eq(&y) {
        panic!("Works")
    }
}

不起作用,我必须求助于OutBound关联类型,而不是指定Out关联类型的相等性.

有没有什么方法可以更简洁、更不容易混淆地表达我想要实现的目标?基本上,我想要以下内容:

  • 具有(超级)性状Super和相关联的类型Out
  • 具有Super的一个或多个子性状Sub1,Sub2,...,其将上性状Super的关联类型Out限制为实现Bound
  • 每当我现在使用特征界限X: Sub1时,它应该自动强制实施X::Out: Bound,而不必在每个地方指定它.

对于冗长而复杂的解释,我深表歉意.如果还有什么不清楚的地方,我很乐意进一步澄清.我非常感谢您的任何意见!

推荐答案

这在RFC 2089: Extended implied bounds年前似乎是不可能的.

有关您的确切问题的讨论,请参见this thread.

Rust相关问答推荐

捕获Rust因C++异常而产生panic

如何在不安全的代码中初始化枚举 struct

基于对vec值的引用从该值中删除该值

在一个tauri协议处理程序中调用一个rectuc函数的推荐技术是什么?

如何处理动态 struct 实例化?

在函数内定义impl和在函数外定义impl的区别

如何从ruust中的fig.toml中读取?

循环访问枚举中的不同集合

为什么&;mut buf[0..buf.len()]会触发一个可变/不可变的borrow 错误?

Rust将String上的迭代器转换为&;[&;str]

期望一个具有固定大小 x 元素的数组,找到一个具有 y 元素的数组

.在 Rust 模块标识符中

Rust 并行获取对 ndarray 的每个元素的可变引用

sha256 摘要仅适用于 &*

Rust 编译器不统一在 if let 表达式的分支中都 impl Future 的类型

Some(v) 和 Some(&v) 有什么区别?

返回迭代器的特征

Rust 异步和 AsRef 未被发送

我如何将特征作为 struct 的拥有字段?

TcpStream::connect - 匹配武器具有不兼容的类型