Можете ли вы сделать что-то подобное в Rust?

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

То есть, если мы хотим:

impl A for D { ... }

Сначала мы должны реализовать:

impl<T> B<T> for D { ... }
1
Clinton 27 Май 2019 в 18:50

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 в конечном итоге добавит аналогичную функциональность и для типов, но я не ожидаю этого в ближайшее время.

3
Peter Hall 27 Май 2019 в 19:00

Хотя язык не может определить такое ограничение с более высоким родом, часто можно переосмыслить черту B, чтобы его реализация была универсальной для этого типа параметра T.

Учитывая этот пример B:

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

Тип, который реализует B для любого T, будет практически эквивалентен типу, реализующему черту ниже:

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

Этот объявляет параметры типа на уровне вызова метода. Хотя эта черта больше не является объектно-безопасной, она все же может использоваться как супертрейт:

trait A: UniversalB {}

Реализации, возможно, должны быть скорректированы соответствующим образом.

Смотрите также:

1
E_net4 wants more downvoters 1 Июл 2019 в 13:12