Я делаю модуль обработки графиков в Rust. Ядро модуля моделирует идею наличия нескольких контейнеров, которые содержат данные на графике. Например, у меня может быть график, внутренняя структура которого равна HashMap
или, возможно, AdjacencyMatrix
и т. Д.
Эти контейнеры должны реализовывать черту:
trait GraphData<V> {
fn has_edge(&self, v: &V, u: &V) -> bool;
fn nodes(&self) -> Iterator<V>; // Here's the problem...
}
Я не могу просто вернуть черту в своем определении черты. Я знаю, что должен использовать объект черты, но я не хочу Box
его. Я хотел бы, чтобы контейнер предоставил свою собственную NodeIter
структуру. Однако я застрял бы с той же проблемой, объясненной в Конструкторы связанного типа, часть 1: основные понятия и введение . В этом посте рассказывается о конструкторах связанных типов (ATC), которых нет в Rust. Мой GraphData
напоминает описанный Collection
.
Есть ли какой-нибудь обходной путь, который я мог бы использовать для "имитации" УВД, или какой-либо другой шаблон, специфичный для Rust, который я мог бы использовать для этой ситуации?
Я не хочу зависеть от динамической отправки и прибегать к использованию Box
или ключевому слову dyn
.
Я думал определить структуру NodeIter
для каждого типа контейнера графа.
Я создал в своем модуле и добавил «узлы» внутри реализации самого контейнера. Однако я считаю, что это плохое повторное использование кода.