Guest User

Untitled

a guest
Jul 21st, 2018
80
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
text 1.56 KB | None | 0 0
  1. use List::*;
  2.  
  3. /// 枚举的应用:链表
  4.  
  5. enum List {
  6. // Cons: 元组结构体包含一个元素以及一个指向下一个结点的指针
  7. Cons(u32, Box<List>),
  8. // Nil: 链表的尾节点
  9. Nil,
  10. }
  11.  
  12. // 为枚举添加方法
  13. impl List {
  14. // 创建空列表
  15. fn new() -> List {
  16. // Nil: List类型
  17. Nil
  18. }
  19.  
  20. // 将一个新元素插入列表开头并返回该新生成列表
  21. fn prepend(self, elem: u32) -> List {
  22. // Cons: List类型
  23. Cons(elem, Box::new(self))
  24. }
  25.  
  26. // 返回列表长度
  27. fn len(&self) -> u32 {
  28. // `self`必须被匹配,因为该方法的行为依赖于`self`的变体
  29. match *self {
  30. // 由于`self`是借用的,所以只能获取`tail`的引用而不是所有权
  31. Cons(_, ref tail) => 1 + tail.len(),
  32. // 空列表无长度
  33. Nil => 0
  34. }
  35. }
  36.  
  37. // 以字符串(堆分配)的形式返回列表
  38. fn stringify(&self) -> String {
  39. match *self {
  40. Cons(head, ref tail) => {
  41. // `format!`与`print!`相似,但是返回的是堆分配的字符串而不是打印到控制台
  42. format!("{}, {}", head, tail.stringify())
  43. },
  44. Nil => {
  45. format!("Nil")
  46. },
  47. }
  48. }
  49. }
  50.  
  51. fn main() {
  52. let mut list = List::new();
  53.  
  54. // 前插入一些值
  55. list = list.prepend(1);
  56. list = list.prepend(2);
  57. list = list.prepend(3);
  58.  
  59. println!("linked list has length: {}", list.len());
  60. println!("{}", list.stringify());
  61. }
Add Comment
Please, Sign In to add comment