我有一些特点(在删除函数和一些参数inflating 后)看起来像:

trait Foo { }
trait Boo { }
trait Bar<T: Foo> { }
trait Baz { }

如果U实现Bar<T>用于一些T实现Foo and U实现Boo,则可以导出Baz用于U的实现.然而,我无法编写有效的防 rust 代码来执行此操作.

有几次try 是:

impl<T: Foo, U: Bar<T> + Boo> Baz for U { }

这给了

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

鉴于

impl<U: Bar<T> + Boo> Baz for U { }

yields

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

在(稳定的) rust 迹中(希望没有任何动态调度)可以/如何做到这一点?

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

  1. 使用关联类型.我不想这样做,因为我想跟踪T,例如,我想写一些有签名的函数,比如fn bla<T: Foo, U: Bar<T>, V: Bar<T>>(),我想知道UVsame T实现Bar<T>.(或者有没有相关类型的方法可以做到这一点?)
  2. 使用某种包装,将UT放入 struct 中.我也不想使用它,因为我有几层这样的"trait 依赖",所以在每一层中包装东西会让代码inflating 很多.

所以最新的问题是:Is there a solution to this problem without using associated types or wrappers?

推荐答案

您可以将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>>(),我想知道UVsameT实现Bar<T>.(Or is there way of doing this with associated types?)

是的,您可以使用关联的类型:

fn bla<U: Bar, V: Bar<T = U::T>>() { }

Rust相关问答推荐

使用windows crate Rust 展示windows

如何最好地并行化修改同一Rust向量的多个切片的代码?

如果成员都实现特征,是否在多态集合上实现部分重叠的特征?

异步FN中的 rust 递归

在执行其他工作的同时,从共享裁判后面的VEC中删除重复项

同时从不同线程调用DLL的不同函数会出现分段错误或产生STATUS_STACK_BUFFER_OVERRUN

用 rust 蚀中的future 展望 struct 的future

如何对一个特征的两个实现进行单元测试?

Nom 解析器无法消耗无效输入

Google chrome 和 Apple M1 中的计算着色器

分配给下划线模式时会发生什么?

Rust 生命周期:这两种类型声明为不同的生命周期

&self 参数在 trait 的功能中是必需的吗?

Rust 中 `Option` 的内存开销不是常量

如何在 Rust 中编写修改 struct 的函数

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

意外的正则表达式模式匹配

当用作函数参数时,不强制执行与绑定的关联类型

TinyVec 如何与 Vec 大小相同?

在 Rust 中组合特征的不同方法是否等效?