próbuję wydrukować drzewa (jest to LinkedList
teraz, ale że zostanie ustalona):nie można przenieść z pożyczonym zawartości podczas dopasowywania 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);
}
Kompilator mówi:
error[E0507]: cannot move out of borrowed content
--> src/main.rs:24:27
|
24 | current = *next;
| ^^^^^ cannot move out of borrowed content
Czytam tylko wartość, nie zmieniając niczego. Przypisuję wartość z odwołania do innej wartości, próbując usunąć wartość Rc<T>
i zapisać ją w lokalnej zmiennej mut
.
może coś takiego może działać:
while true {
println!("{}", current.value);
match ¤t.kind {
&NodeKind::Branch(next) => {
current = next;
}
&NodeKind::Leaf => {
break;
}
}
}
czy może
let mut current = &Rc::new(root);
while true {
println!("{}", current.value);
match current.kind {
NodeKind::Branch(next) => {
current = &next;
}
NodeKind::Leaf => {
break;
}
}
}
ale pojawia się ten sam błąd plusa 'next' does not live long enough
Więc nie ma sposobu, aby pożyczyć wartość w klauzuli "mecz"? .. –
Oczywiście możesz pożyczyć w klauzuli "mecz", ale w Twoim przypadku jesteś ograniczony przez sposób, w jaki twoja struktura jest tworzona. Nawet jeśli pożyczyłeś, nadal będziesz musiał sklonować go jawnie przez 'Klon' lub niejawnie przez' Kopiuj'. To, czego szukasz, to Iterator, który przemierza drzewo. –
Cóż, może powinienem napisać 'let mut current = Rc :: new (root)', więc myślę, że chcę skopiować tylko Rc i i32, ale nie chcę kopiować całej struktury. Chcę tylko odczytać adres Rc, usunąć go, skopiować i32 i wydrukować, następnie odczytać adres następnego węzła i przypisać bieżący adres do momentu napotkania węzła liści. Jest tylko kopiowanie Rc i i32 (które jest zaimplementowane w standardowej bibliotece, jak również Rc). –