我有一些特征(在删除函数和一些参数膨胀之后)看起来像:
trait Foo { }
trait Boo { }
trait Bar<T: Foo> { }
trait Baz { }
如果U
为某些Bar<T>
实施T
和 Foo
实施U
实施了Boo
,那么能够为Baz
推导出U
的实现。但是,我无法编写有效的Rust代码。
尝试了几次:
impl<T: Foo, U: Bar<T> + Boo> Baz for U { }
给出了
错误:类型参数
T
不受impl trait,self type或谓词约束[E0207]
,而
impl<U: Bar<T> + Boo> Baz for U { }
产量
错误:类型名称
中T
未定义或未在范围[E0412]
一个/怎么可以在(稳定的)Rust中做到这一点(希望没有任何动态调度)?
编辑:有些人暗示了一些类似的问题,基本上有两种方法(我发现它们都不适合我的情况):
T
,例如我想编写一些具有fn bla<T: Foo, U: Bar<T>, V: Bar<T>>()
签名的函数,我想知道U
和V
为相同的 {Bar<T>
实现T
{1}}。 (或者有关联类型的方法吗?)U
和T
放入结构中来使用某种包装。我也不想使用它,因为我有几个级别的这种“特征依赖”,所以在每个级别包装东西会使代码膨胀很多。所以更新后的问题是:在不使用关联类型或包装器的情况下是否有解决此问题的方法?
答案 0 :(得分:7)
您可以将T
设为关联类型:
trait Foo { }
trait Boo { }
trait Bar {
type T: Foo;
}
trait Baz { }
impl<U: Bar + Boo> Baz for U
// this where clause is not necessary (this bound is already true)
// where U::T: Foo
{ }
我不想这样做,因为我想跟踪
T
,例如我想编写一些具有fn bla<T: Foo, U: Bar<T>, V: Bar<T>>()
签名的函数,我想知道U
和V
为相同的 {Bar<T>
实现T
{1}}。 (或者有关联类型的方法吗?)
是的,您可以使用相关类型进行操作:
fn bla<U: Bar, V: Bar<T = U::T>>() { }