我想創建一個簡單的鏈接列表並向其中添加一個值。 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')? –
因爲在插入值後葉子變成分支。在'value'的葉子上面的代碼應該是'newLeaf'加入後的一個分支 –
@MatthieuM。我相信OP要指定'kind'是可變的;但是禁止簡單地寫'kind:mut NodeKind'。解決的辦法是理解可變性是繼承的:結構體中沒有任何內容是'mut' *本身*,但是整個結構體*的給定實例*是'mut'或不是。 (我試圖找到一個很好的文檔資源,但我找不到一個?) – mdup