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