特性可以具有由通用参数化的超特性吗?

时间:2019-05-27 15:50:22

标签: types rust higher-kinded-types

您可以在Rust中做类似的事情吗?

trait A : forall<T> B<T> { ... }

也就是说,如果我们想要的话:

impl A for D { ... }

我们必须首先实现:

impl<T> B<T> for D { ... }

2 个答案:

答案 0 :(得分:1)

不。 Rust的类型系统目前不支持任何涉及高级类型的功能。但是,它确实支持与您描述的结构类似的结构,但仅限于生命周期参数。例如:

trait B<'a> {}

trait A: for<'a> B<'a> {}

struct D;

impl A for D { }

这是一个错误:

error[E0277]: the trait bound `for<'a> D: B<'a>` is not satisfied
 --> src/lib.rs:7:6
  |
7 | impl A for D { }
  |      ^ the trait `for<'a> B<'a>` is not implemented for `D`

在添加全面实施之前,

impl<'a> B<'a> for D { }

Rust最终也将为类型添加类似的功能并非不可能,但我不希望很快出现。

答案 1 :(得分:0)

尽管该语言无法执行您所描述的内容,但有可能重新考虑特征B,使其在此假设参数类型T上变得通用。

考虑以下示例B

trait B<T> {
    fn foo(bar: T) -> u32;
}

为任何B实现T的类型实际上等同于实现以下特征的类型:

trait UniversalB {
    fn foo<T>(bar: T) -> u32;
}

此方法在方法调用级别声明类型参数。尽管此特征不再是对象安全的,但仍可以用作超级特征:

trait A: UniversalB {}

可能需要对实现进行相应调整。