实现嵌套特征

acl*_*low 10 traits rust

我有一些特征(删除函数和一些参数膨胀后)看起来像:

trait Foo { }
trait Boo { }
trait Bar<T: Foo> { }
trait Baz { }
Run Code Online (Sandbox Code Playgroud)

如果U实现Bar<T>了一些T实现Foo U实现Boo,那么就可以派生Bazfor 的实现U.但是,我无法编写有效的Rust代码.

几次尝试是:

impl<T: Foo, U: Bar<T> + Boo> Baz for U { }
Run Code Online (Sandbox Code Playgroud)

这使

错误:类型参数T不受impl trait,self type或谓词约束[E0207]

impl<U: Bar<T> + Boo> Baz for U { }
Run Code Online (Sandbox Code Playgroud)

产量

错误:类型名称T未定义或未在范围内[E0412]

一个/怎么可能在(稳定)Rust(希望没有任何动态调度)中做到这一点?

编辑:有些人暗示了一些类似的问题,基本上有两种方法(我发现它们都不适合我的情况):

  1. 使用关联类型.我不想这样做,因为我要跟踪的T,例如我想写一些功能,这有这样一个签名fn bla<T: Foo, U: Bar<T>, V: Bar<T>>(),我想知道,UV实施Bar<T>相同的 T.(或者有关联类型的方法吗?)
  2. 通过放置UT结构使用某种包装.我也不想使用它,因为我有几个级别的这种"特征依赖",所以在每个级别包装东西会使代码膨胀很多.

所以更新的问题是:在不使用关联类型或包装器的情况下是否有解决此问题的方法?

mal*_*rbo 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
{ }
Run Code Online (Sandbox Code Playgroud)

我不想这样做,因为我要跟踪的T,例如我想写一些功能,这有这样一个签名fn bla<T: Foo, U: Bar<T>, V: Bar<T>>(),我想知道,UV实施Bar<T>相同的 T.(或者有关联类型的方法吗?)

是的,您可以使用相关类型执行此操作:

fn bla<U: Bar, V: Bar<T = U::T>>() { }
Run Code Online (Sandbox Code Playgroud)