#list #cons #functional #collection

rust_list

Rust中的单链表,带有宏以便于实例化

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数据结构

Download history 76/week @ 2024-06-04 292/week @ 2024-06-11 24/week @ 2024-06-18 4/week @ 2024-07-02

每月155 次下载

Apache-2.0

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]);

无运行时依赖