Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- use List::*;
- /// 枚举的应用:链表
- enum List {
- // Cons: 元组结构体包含一个元素以及一个指向下一个结点的指针
- Cons(u32, Box<List>),
- // Nil: 链表的尾节点
- Nil,
- }
- // 为枚举添加方法
- impl List {
- // 创建空列表
- fn new() -> List {
- // Nil: List类型
- Nil
- }
- // 将一个新元素插入列表开头并返回该新生成列表
- fn prepend(self, elem: u32) -> List {
- // Cons: List类型
- Cons(elem, Box::new(self))
- }
- // 返回列表长度
- fn len(&self) -> u32 {
- // `self`必须被匹配,因为该方法的行为依赖于`self`的变体
- match *self {
- // 由于`self`是借用的,所以只能获取`tail`的引用而不是所有权
- Cons(_, ref tail) => 1 + tail.len(),
- // 空列表无长度
- Nil => 0
- }
- }
- // 以字符串(堆分配)的形式返回列表
- fn stringify(&self) -> String {
- match *self {
- Cons(head, ref tail) => {
- // `format!`与`print!`相似,但是返回的是堆分配的字符串而不是打印到控制台
- format!("{}, {}", head, tail.stringify())
- },
- Nil => {
- format!("Nil")
- },
- }
- }
- }
- fn main() {
- let mut list = List::new();
- // 前插入一些值
- list = list.prepend(1);
- list = list.prepend(2);
- list = list.prepend(3);
- println!("linked list has length: {}", list.len());
- println!("{}", list.stringify());
- }
Add Comment
Please, Sign In to add comment