我正在try 编写处理过渡系统的代码.现在,我使用的是一个TransitionSystem
特征,它有关联的类型EdgeColor
和StateColor
,分别给出了边缘使用的 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
,而不必在每个地方指定它.
对于冗长而复杂的解释,我深表歉意.如果还有什么不清楚的地方,我很乐意进一步澄清.我非常感谢您的任何意见!