Я хочу создать простой связанный список и добавить в него значение. Каким образом должен быть реализован метод add
для вывода этого кода 100 50 10 5
в строке 42, второй вызов root.print()
?Как реализовать метод добавления связанного списка?
use std::rc::Rc;
struct Node {
value: i32,
next: Option<Box<Node>>,
}
impl Node {
fn print(&self) {
let mut current = self;
loop {
println!("{}", current.value);
match current.next {
Some(ref next) => {
current = &**next;
}
None => break,
}
}
}
fn add(&mut self, node: Node) {
let item = Some(Box::new(node));
let mut current = self;
loop {
match current.next {
None => current.next = item,
_ => {}
//Some(next) => { current = next; }
}
}
}
}
fn main() {
let leaf = Node {
value: 10,
next: None,
};
let branch = Node {
value: 50,
next: Some(Box::new(leaf)),
};
let mut root = Node {
value: 100,
next: Some(Box::new(branch)),
};
root.print();
let new_leaf = Node {
value: 5,
next: None,
};
root.add(new_leaf);
root.print();
}
Я переписал функцию:
fn add(&mut self, node: Node) {
let item = Some(Box::new(node));
let mut current = self;
loop {
match current {
&mut Node {
value: _,
next: None,
} => current.next = item,
_ => {}
//Some(next) => { current = next; }
}
}
}
но компилятор говорит
error[E0382]: use of moved value: `item`
--> <anon>:28:40
|
28 | None => current.next = item,
| ^^^^ value moved here in previous iteration of loop
|
= note: move occurs because `item` has type `std::option::Option<std::boxed::Box<Node>>`, which does not implement the `Copy` trait
Я не понимаю, почему он говорит, что пункт был ранее перемещен если он используется только один раз, и как следует использовать филиал Some(_)
чтобы перебирать список?
Почему вы считаете, что 'kind' должен быть ссылкой (' & mut T') вместо простого значения ('T')? –
Потому что лист становится веткой после вставки значения. В коде над листом с «значением» должна быть ветка после добавления «newLeaf» –
@MatthieuM. Я считаю, что OP хочет указать, что 'kind' изменен; но запрещается просто писать 'kind: mut NodeKind'. Решение состоит в том, чтобы понять, что изменчивость наследуется: ничто в структуре не является 'mut' * per se *, но данный экземпляр * всей структуры * является либо' mut', либо нет. (Я пытался найти хороший ресурс документа об этом, но я не смог его найти?) – mdup