persistent_singly_stack.rs 2.7 KB
Newer Older
梦境迷离's avatar
梦境迷离 已提交
1
///一个持久化的单向链表 栈
梦境迷离's avatar
梦境迷离 已提交
2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27
///指一个元素的引用可以同时被多个所有者持有
///使用引用计数 Rc(只有访问权限)
use std::rc::Rc;

pub struct List<T> {
    head: Link<T>,
}

//定义别名,方便一点
type Link<T> = Option<Rc<Node<T>>>;

struct Node<T> {
    elem: T,
    next: Link<T>,
}

impl<T> List<T> {
    pub fn new() -> Self {
        List { head: None }
    }

    pub fn append(&self, elem: T) -> List<T> {
        List {
            head: Some(Rc::new(Node {
                elem,
                next: self.head.clone(),
梦境迷离's avatar
梦境迷离 已提交
28
            })),
梦境迷离's avatar
梦境迷离 已提交
29 30 31 32 33
        }
    }

    pub fn tail(&self) -> List<T> {
        //and_then 如果self为[`None`],则返回[`None`],否则调用'f'并包装值,返回结果。有些语言称此操作为flatmap。
梦境迷离's avatar
梦境迷离 已提交
34 35 36
        List {
            head: self.head.as_ref().and_then(|node| node.next.clone()),
        }
梦境迷离's avatar
梦境迷离 已提交
37 38 39 40 41 42 43
    }

    pub fn head(&self) -> Option<&T> {
        self.head.as_ref().map(|node| &node.elem)
    }

    pub fn iter(&self) -> Iter<'_, T> {
梦境迷离's avatar
梦境迷离 已提交
44 45 46
        Iter {
            next: self.head.as_ref().map(|node| &**node),
        }
梦境迷离's avatar
梦境迷离 已提交
47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110
    }
}

impl<T> Drop for List<T> {
    fn drop(&mut self) {
        let mut head = self.head.take();
        while let Some(node) = head {
            //如果'Rc'只有一个强引用,则返回内部值。否则,将使用传入的相同'Rc'返回一个[`Err`]。即使存在突出的弱引用,也会成功
            if let Ok(mut node) = Rc::try_unwrap(node) {
                head = node.next.take();
            } else {
                break;
            }
        }
    }
}

pub struct Iter<'a, T> {
    next: Option<&'a Node<T>>,
}

impl<'a, T> Iterator for Iter<'a, T> {
    type Item = &'a T;
    fn next(&mut self) -> Option<Self::Item> {
        self.next.map(|node| {
            self.next = node.next.as_ref().map(|node| &**node);
            &node.elem
        })
    }
}

#[cfg(test)]
mod test {
    use super::List;

    #[test]
    fn basics() {
        let list = List::new();
        assert_eq!(list.head(), None);

        let list = list.append(1).append(2).append(3);
        assert_eq!(list.head(), Some(&3));

        let list = list.tail();
        assert_eq!(list.head(), Some(&2));

        let list = list.tail();
        assert_eq!(list.head(), Some(&1));

        let list = list.tail();
        assert_eq!(list.head(), None);

        let list = list.tail();
        assert_eq!(list.head(), None);
    }

    #[test]
    fn iter() {
        let list = List::new().append(1).append(2).append(3);
        let mut iter = list.iter();
        assert_eq!(iter.next(), Some(&3));
        assert_eq!(iter.next(), Some(&2));
        assert_eq!(iter.next(), Some(&1));
    }
梦境迷离's avatar
梦境迷离 已提交
111
}