这是“too-many-lists”一书的第二个实现和第三个实现。之前的部分参见此文章. 源码1, 源码2在书中贴得很清楚,我觉得这两部分的学习重点和list本身比较独立,主要是一些相对细节的知识点,整理如下。
Option & Generic
Option
的最基本使用并不难, 但是你知道这些用法吗?
take()
可以替代mem::replace(&mut option, None)
map
可以替代match option { None => None, Some(x) => Some(y) }
as_ref()
,as_mut()
和as_deref_mut()
impl<T> Option<T> { pub fn as_ref(&self) -> Option<&T>; }
Iterator
三种不同类型的Iterator:
- IntoIter -
T
- IterMut -
&mut T
- Iter -
&T
其他知识点:
- 看报错:
rustc --explain E0106
lifetime elision
- turbofish
Rc
& Arc
Rust的垃圾回收机制是引用计数, Rc
是Reference Counted的缩写, 是个单线程的引用计数指针. Rc
是Atomically Reference Counted的缩写, 是个线程安全的引用计数指针. 对于如下layout:
list1 = A -> B -> C -> D
list2 = tail(list1) = B -> C -> D
list3 = push(list2, X) = X -> B -> C -> D
list1 -> A ---+
|
v
list2 ------> B -> C -> D
^
|
list3 -> X ---+
B
的所有权是共享的, 因此不能使用Box
.
Rc
中的重要方法: try_unwrap()
.