最终代码
好吧,在6000词之后,这是我们实际写成的所有代码:
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 new_node = Box::new(Node {elem: elem,next: mem::replace(&mut self.head, Link::Empty),});self.head = Link::More(new_node);}pub fn pop(&mut self) -> Option<i32> {match mem::replace(&mut self.head, Link::Empty) {Link::Empty => None,Link::More(node) => {let node = *node;self.head = node.next;Some(node.elem)}}}}impl Drop for List {fn drop(&mut self) {let mut cur_link = mem::replace(&mut self.head, Link::Empty);while let Link::More(mut boxed_node) = cur_link {cur_link = mem::replace(&mut boxed_node.next, Link::Empty);}}}#[cfg(test)]mod test {use super::List;#[test]fn basics() {let mut list = List::new();// Check empty list behaves rightassert_eq!(list.pop(), None);// Populate listlist.push(1);list.push(2);list.push(3);// Check normal removalassert_eq!(list.pop(), Some(3));assert_eq!(list.pop(), Some(2));// Push some more just to make sure nothing's corruptedlist.push(4);list.push(5);// Check normal removalassert_eq!(list.pop(), Some(5));assert_eq!(list.pop(), Some(4));// Check exhaustionassert_eq!(list.pop(), Some(1));assert_eq!(list.pop(), None);}}
天。80行,而且其中的一半都是测试!嘛,我确实说过这第一个教程会花一些时间的!
