sto cercando di stampare un albero (si tratta di un LinkedList
in questo momento, ma che sarà fisso):Non può uscire di contenuti preso in prestito in caso di corrispondenza un enum
use std::io;
use std::rc::Rc;
enum NodeKind {
Branch(Rc<Node>),
Leaf,
}
struct Node {
value: i32,
kind: NodeKind,
}
fn main() {
let leaf = Node { value: 10, kind: NodeKind::Leaf };
let branch = Node { value: 50, kind: NodeKind::Branch(Rc::new(leaf)) };
let root = Node { value: 100, kind: NodeKind::Branch(Rc::new(branch)) };
let mut current = root;
while true {
println!("{}", current.value);
match current.kind {
NodeKind::Branch(next) => {
current = *next;
}
NodeKind::Leaf => {
break;
}
}
}
let mut reader = io::stdin();
let buff = &mut String::new();
let read = reader.read_line(buff);
}
Il compilatore dice:
error[E0507]: cannot move out of borrowed content
--> src/main.rs:24:27
|
24 | current = *next;
| ^^^^^ cannot move out of borrowed content
Sto leggendo solo il valore, non sta cambiando nulla. Sto assegnando un valore da un riferimento a un altro valore, provando a dereferenziare un valore Rc<T>
e memorizzarlo in una variabile locale mut
.
forse qualcosa di simile può funzionare:
while true {
println!("{}", current.value);
match ¤t.kind {
&NodeKind::Branch(next) => {
current = next;
}
&NodeKind::Leaf => {
break;
}
}
}
o forse
let mut current = &Rc::new(root);
while true {
println!("{}", current.value);
match current.kind {
NodeKind::Branch(next) => {
current = &next;
}
NodeKind::Leaf => {
break;
}
}
}
ma ottengo lo stesso errore più 'next' does not live long enough
Quindi non c'è modo di prendere in prestito un valore nella clausola 'match'? .. –
Sicuro di poter prendere in prestito una clausola' match', ma nel tuo caso sei limitato dal modo in cui la tua struttura viene creata. Anche se hai preso in prestito, avresti comunque bisogno di clonarlo esplicitamente tramite 'Clone' o implicitamente tramite' Copia'. Quello che sembri cercare è Iterator per attraversare l'albero. –
Beh, forse dovrei scrivere 'let mut current = Rc :: new (root)', quindi idea che voglio copiare solo Rc e i32, ma non voglio copiare un'intera struttura. Voglio solo leggere l'indirizzo Rc, dereferenziarlo, copiare i32 e stamparlo, quindi leggere l'indirizzo del nodo successivo e assegnare la corrente a questo indirizzo fino a quando non viene rilevato il nodo foglia. C'è solo la copia di Rc e i32 (che è implementato in lib standard e Rc). –