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
は所有権ムーブへの特効薬。
対象環境
- Raspbierry pi 3 Model B+
- Raspbian stretch 9.0 2018-11-13
- bash 4.4.12(1)-release
- rustc 1.34.2 (6c2484dc3 2019-05-13)
- cargo 1.34.0 (6789d8a0a 2019-04-01)
$ uname -a Linux raspberrypi 4.19.42-v7+ #1219 SMP Tue May 14 21:20:58 BST 2019 armv7l GNU/Linux