介绍
视频地址:www.bilibili.com/video/av78062009/
相关源码:github.com/anonymousGiga/Rust-link...
详细内容
上一节我们已经完成了链表的基本功能。本节就对上一节的例子进行测试。
步骤如下:
cargo new mylist --lib
在mylist/src/lib.rs中写入如下代码:
use std::mem; | |
pub struct List{ | |
head: Link, | |
} | |
enum Link { | |
Empty,More(Box<Node>), | |
} | |
struct Node { | |
elem: i32, | |
next: Link, | |
} | |
impl List { | |
pub fn new() -> Self { | |
List { head: Link::Empty }} | |
pub fn push(&mut self, elem: i32) {let node = Box::new(Node { | |
elem: elem, | |
next: mem::replace(&mut self.head, Link::Empty),}); | |
self.head = Link::More(node);} | |
pub fn pop(&mut self) -> Option<i32> { | |
match mem::replace(&mut self.head, Link::Empty) { | |
Link::Empty => None, | |
Link::More(node) => { | |
self.head = node.next;Some(node.elem) | |
}}} | |
} | |
mod tests { | |
use super::List; | |
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);} | |
} |
运行测试如下:
cargo test