視訊地址:www.bilibili.com/video/av78062009/
相關原始碼:github.com/anonymousGiga/Rust-link...
在之前的章節中,我們實現了一個最小的可執行的單連結串列,然而這僅僅只是一個最小的可執行的連結串列。從本節開始,我們將建立一個更加完善的連結串列,這個連結串列能處理任何型別的元素,並且支援迭代器。
在之前的章節中,我們定義Link如下:
enum Link {
Empty,
More(Box<Node>),
}
實際上,我們這是定義了一個Option類似的型別,所以我們可以直接使用Option。下面我們就在我們之前的程式碼基礎上修改為Option。
pub struct List {
head: Link,
}
type Link = Option<Box<Node>>;
struct Node {
elem: i32,
next: Link,
}
impl List {
pub fn new() -> Self {
List { head: None }
}
pub fn push(&mut self, elem: i32) {
let node = Box::new(Node {
elem: elem,
next: self.head.take(),
});
self.head = Some(node);
}
pub fn pop(&mut self) -> Option<i32> {
match self.head.take() {
None => None,
Some(node) => {
self.head = node.next;
Some(node.elem)
}
}
}
}
impl Drop for List {
fn drop(&mut self) {
let mut link = self.head.take();
while let Some(mut node) = link {
link = node.next.take();
}
}
}
#[cfg(test)]
mod tests {
use super::List;
#[test]
fn basics() {
let mut list = List::new();
assert_eq!(list.pop(), None);
list.push(1);
list.push(2);
list.push(3);
assert_eq!(list.pop(), Some(3));
assert_eq!(list.pop(), Some(2));
list.push(4);
list.push(5);
assert_eq!(list.pop(), Some(5));
assert_eq!(list.pop(), Some(4));
assert_eq!(list.pop(), Some(1));
assert_eq!(list.pop(), None);
}
}
實際上,我們還可以對pop函式進行改造,如下:
pub fn pop(&mut self) -> Option<i32> {
self.head.take().map(|node| {
self.head = node.next;
node.elem
})
}
本作品採用《CC 協議》,轉載必須註明作者和本文連結