Как можно реализовать коллекцию разнородных элементов, оставляя возможность специализировать тип элементов? - PullRequest
0 голосов
/ 13 апреля 2020

Я хочу написать коллекцию разнородных элементов (т.е. элементы не имеют одинаковый тип), все они реализуют общую черту (все упомянутые мной черты являются объектно-безопасными). Мое первое предположение - иметь коллекцию, элементы которой являются объектами черты:

trait Object {
    fn fct(&self);
}

struct List {
    data: Vec<Box<dyn Object>>
}

Пока все хорошо. Как писателю библиотеки, мне нужны только элементы для реализации черты Object.

Проблема в том, что как писатель библиотеки я хотел бы, чтобы моя библиотека широко использовалась. Поэтому я хотел бы позволить пользователю библиотеки специализировать используемый тип (т. Е. Пользователь может захотеть «уточнить» ограничение объекта признака).

Например, у пользователя может быть вторичный trait и различные структуры, все они реализуют как Object, так и Trait:

trait Secondary {
    fn snd(&self);
}

Я бы хотел сказать: «Давайте иметь List, где элементы могут быть из различных типов, если они реализуют как Object (требуется библиотекой), так и Secondary, требуемый пользователем. ".

Я думал о наличии обобщенной c коллекции с ограничением черты :

struct List<T>
where
    T: Object,
{
    data: Vec<Box<T>>,
}

Я хотел бы иметь возможность создать список, например:

trait Both: Object + Secondary {}

fn main() {
    let list: List<dyn Both>;
}

Но это отклонено, поскольку dyn Both не имеет известного размера. Я попытался List<Box<dyn Both>>, но box<dyn Both> не реализует Object.

Я в порядке, меняя способ решения проблемы, возможно, я ошибаюсь, пытаясь смешать как дженерики, так и объекты-черты.

Я согласен с тем, что пользователю нужно написать дополнительную черту:

trait Both: Object + Secondary {}

Контекст - это библиотека для текстовых пользовательских интерфейсов (в основном, я просто пишу несколько дополнительных виджетов для tui crate), и я хочу написать виджет, представляющий собой просто список различных виджетов (т. Е. Обычно Object признак работающего примера Widget), но при этом есть возможность добавить больше ограничений на виджеты.

...