Может ли признак иметь супертрату, параметризованную обобщением? - PullRequest
1 голос
/ 27 мая 2019

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

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

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

impl A for D { ... }

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

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

Ответы [ 2 ]

2 голосов
/ 27 мая 2019

Нет.Система типов 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 голос

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

С учетом этого примераиз B:

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

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

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

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

trait A: UniversalB {}

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

См. Также:

...