我有一些特征(删除函数和一些参数膨胀后)看起来像:
trait Foo { }
trait Boo { }
trait Bar<T: Foo> { }
trait Baz { }
如果 U
实现了 Bar<T>
,某些 T
实现 Foo
和 U
实现 Boo
,则可以为 U
派生 Baz
的实现 . 但是,我无法编写有效的Rust代码 .
几次尝试是:
impl<T: Foo, U: Bar<T> + Boo> Baz for U { }
这使
error:类型参数T不受impl trait,self type或谓词约束[E0207]
而
impl<U: Bar<T> + Boo> Baz for U { }
产量
错误:类型名称T未定义或未在范围内[E0412]
一个/怎么可能在(稳定)Rust(希望没有任何动态调度)中做到这一点?
Edit :有些人暗示了一些类似的问题,基本上有两种方法(我发现它们都不适合我的情况):
-
使用关联类型 . 我不想这样做,因为我想跟踪
T
,例如我想写一些像fn bla<T: Foo, U: Bar<T>, V: Bar<T>>()
这样的签名的函数,我想知道U
和V
为T
实现Bar<T>
. (或者有关联类型的方法吗?) -
通过将
U
和T
放在结构中来使用某种包装 . 我也不想使用它,因为我有几个级别的"trait dependencies",所以在每个级别包装东西会使代码膨胀很多 .
所以更新的问题是:没有使用关联的类型或包装器,是否有解决此问题的方法?
1 回答
你可以这样做
T
一个相关的类型:是的,您可以使用相关类型执行此操作: