Можете ли вы сделать что-то подобное в Rust?
trait A : forall<T> B<T> { ... }
То есть, если мы хотим:
impl A for D { ... }
Сначала мы должны реализовать:
impl<T> B<T> for D { ... }
2 ответа
Нет. Система типов 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 {}
Реализации, возможно, должны быть скорректированы соответствующим образом.
Смотрите также:
- Язык программирования Rust, глава 10, Раздел 1 об универсальных типах данных в определениях методов
Похожие вопросы
Новые вопросы
types
Типы и системы типов используются для обеспечения уровней абстракции в программах.