Создайте универсальную структуру из функции черты в Rust - PullRequest
0 голосов
/ 03 ноября 2019

Я хочу написать черту, которая позволяет мне создавать новые структуры типа реализации, но с другими параметрами типа. Например, скажем, у меня есть какая-то структура

struct Generic<T> {
    t: T,
}

, и я хочу черту Constructable, которая позволяет мне вызывать Generic::new_from_q::<Q>(q as Q), т.е. моя черта будет выглядеть так (в псевдо-ржавчине):

trait Constructable {
    fn new_from_q<Q>(q: Q) -> Self<Q>; // Self<Q> would be e.g. Generic<Q>
}

impl<T> Constructable for Generic<T> {
    type T = T;
    fn new_from_q<Q>(q: Q) -> Generic<Q> {
        Generic { t: q }
    }
}

Конечно, это не имеет смысла, поскольку черта не может гарантировать, что Self сможет принимать параметр типа Q. Наиболее близким к реализации желаемого поведения конструктора является следующее:

trait Constructable {
    type T;
    fn new_from_q<Q>(q: Q) -> impl Constructable<T = Q>; // currently invalid
}

( детская площадка ), что в настоящее время невозможно из-за ограничений синтаксиса impl Trait (см. # 34511 ), что (я думаю)

  • недопустимо в чертах
  • не может принимать значения для связанных типов

Итак, как мне обойти эти ограничения? Есть ли какой-то общий шаблон программирования, позволяющий мне это делать (я бы хотел избежать объектов динамической черты)?

...