Sono molto interessato a Rust e sto iniziando il mio primo progetto non banale nella lingua. Ho ancora un po 'di problemi a comprendere appieno i concetti di prestito e durata.Come modellare strutture dati ricorsive complesse (grafici)?
L'applicazione è un simulatore di porte logiche in cui i componenti sono definiti in modo ricorsivo (in termini di altri componenti e relative interconnessioni).
mio piano attuale è di attuare questo simile come farebbe in C++ avendo una struttura di componenti possedere un vettore di componenti (sue sottocomponenti) e un vettore di reti che descrivono le interconnessioni tra i componenti:
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>> ??
....
}
}
In C++, la rete sarebbe facile da implementare come una serie di puntatori ai componenti ma non sono sicuro del modo migliore per farlo in Rust, suppongo che dovrei usare i puntatori presi in prestito? O c'è un modo migliore?
Si consideri il seguente principale:
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...
}
Come posso configurare circuito di creare una rete tra i sub1 e sub2? Devo aggiungere add_subcomponent a un puntatore preso in prestito per il componente aggiunto? o la scatola?
Sarebbe bello se qualcuno potesse indicarmi la giusta direzione.
Grazie mille.
Questo è un grafico.I grafici sono sfortunatamente un po 'complicati (i semplici puntatori presi in prestito generalmente non funzionano molto bene e tutte le alternative hanno complicati compromessi). Alberi e così sono facili, ma grafici ... – delnan
Hai dato un'occhiata a https://github.com/bluss/petulant-avenger-graphlibrary? –
Assicurati di sviare le risposte utili e segna una risposta come accettata se ha risolto il tuo problema! Se nessuna risposta è accettabile, considera di lasciare commenti che spieghino il motivo o modifica la tua domanda per esprimere il problema in modo diverso. – Shepmaster