4个版本
0.2.0 | 2024年6月16日 |
---|---|
0.1.2 | 2024年6月11日 |
0.1.1 | 2024年6月11日 |
0.1.0 | 2024年6月10日 |
734 在 数据结构
每月155 次下载
21KB
312 行
rust-list
Rust中单链表的实现。这是在《Rust Book》第15章中引入的递归定义的列表。虽然链表在Rust中不受欢迎,但对于许多函数式程序员来说,它是一个熟悉的结构。
此crate将Rust Book中直接找到的基本cons列表的实现扩展,以提供一些类似于为Vec
实现的便利性。具体来说,定义了一个list!
宏,用于简化实例化,并提供了以下特质的手动实现:
Display
Iterator
IntoIterator
FromIterator
派生特质
Debug
Default
PartialEq
PartialOrd
定义
类型定义直接来自《Rust Book》。
pub enum List<T> {
Nil,
Cons(T, Box<List<T>>),
}
使用
创建新的列表
定义了一个宏 list!
,允许进行简单的实例化。否则,提供了cons()
和nil()
函数作为替代。
use rust_list::{List, list, nil, cons};
use rust_list::List::{Cons, Nil};
let xs = list![1, 2, 3];
let ys = cons(1, cons(2, cons(3, nil())));
assert_eq!(xs, ys);
assert_eq!("list![1, 2, 3]", xs.to_string());
// Defined manually
assert_eq!(xs, Cons(1, Box::new(Cons(2, Box::new(Cons(3, Box::new(Nil)))))));
操作
let mut xs = list![1, 2, 3];
xs.push(0);
assert_eq!(xs, list![0, 1, 2, 3]);
assert_eq!(Some(&3), xs.last());
assert_eq!(xs.len(), 4);
assert_eq!(xs.is_empty(), false);
xs.pop();
assert_eq!(xs, list![1, 2, 3]);
xs.append(list![4, 5, 6]);
assert_eq!(xs, list![1, 2, 3, 4, 5, 6]);
assert_eq!("list![1, 2, 3, 4, 5, 6]", xs.to_string());
xs.reverse();
assert_eq!(xs, list![6, 5, 4, 3, 2, 1]);
let ys: List<_> = xs.map(|x| x * 2).collect();
assert_eq!(ys, list![12, 10, 8, 6, 4, 2]);
let zs: List<_> = xs.into_iter().filter(|x| *x < 4).collect();
assert_eq!(zs, list![3, 2, 1]);
assert_eq!(zs.fold(0, |acc, x| acc + x * 2), 12);
let id = list![1, 2, 3].rfold(Nil, |xs, x| cons(x, xs));
assert_eq!(id, list![1, 2, 3]);