やってみる

アウトプットすべく己を導くためのブログ。その試行錯誤すらたれ流す。

Rust自習(連結リスト2)

 push_headを実装する。

成果物

コード

    pub fn push_head(&mut self, item: T) {
        let new_node = Node::new(item);
        let old_head = std::mem::replace(&mut self.head, Some(Box::new(new_node)));
        std::mem::replace(&mut self.head.as_mut().unwrap().next, old_head);
    }

 push_headメソッドは、先頭にノードを追加する。

テストコード

    #[test]
    fn LikedList_push_head_3() {
        let mut list: LinkedList<i32> = LinkedList::new();
        list.push_head(0);
        assert_eq!(list.head, Some(Box::new(Node { item: 0, next: None, prev: None })));
        list.push_head(1);
        assert_eq!(list.head, 
            Some(Box::new(Node { item: 1, next: 
                Some(Box::new(Node { item: 0, next: None, prev: None }))
            , prev: None
            }))
        );
        list.push_head(2);
        assert_eq!(list.head, 
            Some(Box::new(Node { item: 2, next: 
                Some(Box::new(Node { item: 1, next: 
                    Some(Box::new(Node { item:0, next: None, prev: None }))
                , prev: None
                }))
            , prev: None
            }))
        );
    }

 後から追加したものほど先頭にあることを確認。

所感

 これまで所有権や参照まわりで苦戦しまくったからか、少し理解できてきた。&mut, Option.as_mut(), Option.unwrap(), std::mem::replaceにも馴染んできた。std::memは所有権ムーブへの特効薬。

対象環境

$ uname -a
Linux raspberrypi 4.19.42-v7+ #1219 SMP Tue May 14 21:20:58 BST 2019 armv7l GNU/Linux

前回まで