Можно ли сделать что-то подобное в Rust?
trait A : forall<T> B<T> { ... }
То есть, если мы хотим:
impl A for D { ... }
Мы должны сначала реализовать:
impl<T> B<T> for D { ... }
Нет. Система типов 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 со временем добавит аналогичную функциональность и для типов, но я не ожидаю этого в ближайшее время.
Хотя язык не может указать такое более высокое родственное ограничение, часто можно переосмыслить трейт B
, чтобы его реализация была универсальной для этого типа параметра T
.
Учитывая этот пример B
:
trait B<T> {
fn foo(bar: T) -> u32;
}
Тип, который реализует B
для любого T
, будет практически эквивалентен типу, реализующему черту ниже:
trait UniversalB {
fn foo<T>(bar: T) -> u32;
}
Этот объявляет параметры типа на уровне вызова метода. Хотя эта черта больше не является объектно-безопасной, ее все еще можно использовать в качестве суперчерты:
trait A: UniversalB {}
Реализации могут нуждаться в соответствующей корректировке.
Смотрите также:
Возможно, вы захотите предоставить более конкретный вариант использования.