Меня очень интересует Rust, и теперь я начинаю свой первый нетривиальный проект на этом языке. У меня все еще есть небольшая проблема, полностью понимающая концепции заимствования и жизни.Как смоделировать сложные рекурсивные структуры данных (графики)?
Приложение представляет собой логический логический симулятор, в котором компоненты определяются рекурсивно (с точки зрения других компонентов и их взаимосвязей).
Мой текущий план осуществить это подобно тому, как я бы в C++ при наличии компонентов структуры, владеющей вектор компонентов (его суб-компоненты) и вектор сетей, описывающих взаимосвязью между этими компонентами:
pub struct Pin {
name: String
}
pub struct Net<'a> {
nodes: Vec<(&'a Component<'a>,&'a Pin)>
}
pub struct Component<'a> {
sub_components: Vec<Box<Component<'a>>>,
in_pins: Vec<Pin>,
out_pins: Vec<Pin>,
netlist: Vec<Net<'a>>
}
impl<'a> Component<'a> {
pub fn new() -> Component<'a> {
...
}
pub fn add_subcomponent(& mut self, comp: Component<'a>) {
// -> &Box<Component<'a>> ??
....
}
}
В C++ Net легко реализовать в виде массива указателей на Компоненты, но я не уверен, что это лучший способ сделать это в Rust, я полагаю, что я должен использовать заимствованные указатели? Или есть лучший способ?
Рассмотрим следующие основные:
fn main() {
let sub1 = Component::new();
let sub2 = Component::new();
let circuit = Component::new();
circuit.add_subcomponent(sub1);
circuit.add_subcomponent(sub2);
// sub1 and sub2 are now empty...
}
Как настроить схему, чтобы создать сеть между SUB1 и sub2? Должен ли я добавить add_subcomponent возвращенный заимствованный указатель на добавленный компонент? или ящик?
Было бы здорово, если бы кто-то мог указать мне в правильном направлении.
Большое спасибо.
Это график.Графики, к сожалению, немного сложны (простые заимствованные указатели, как правило, не работают очень хорошо, и все альтернативы усложняют компромисс). Деревья и т. Д. Просты, но графики ... – delnan
Вы видели https://github.com/bluss/petulant-avenger-graphlibrary? –
Пожалуйста, не забудьте добавить полезные ответы и пометить ответ как принятый, если он решит вашу проблему! Если ответ не является приемлемым, подумайте о том, чтобы оставить комментарии, объясняющие, почему, или отредактируйте свой вопрос, чтобы сформулировать проблему по-разному. – Shepmaster