DFINITY学习系列 - Motoko源码细读:List篇(1)

声明类型的方法, 可以声明一个?类型:

public type List<T> = ?(T, List<T>);

创建一个空List :

 public func nil<T>() : List<T> = null;

使用 :

private var nilList = List.nil<Nat>();
private var nilList : List.List<Nat> = List.nil<Nat>();

判断一个List是否为空:
使用 :

var isNil = List.isNil(list_name);
public func isNil<T>(l : List<T>) : Bool {
      switch l {
      case null { true  };
      case _    { false };
      }
    };

switch判断,null即空,非null就返回非空false

通过放入一个值得方式创建一个List: push
使用

 var list = List.push<Nat>(nat, list);
public func push<T>(x : T, l : List<T>) : List<T> = ?(x, l);

没懂这种函数的写法<<<<<<<<<

得到list的最后一个元素 : 返回一个?T类型
用法 :

var nat = List.last<Nat>(list_name);
public func last<T>(l : List<T>) : ?T {
    switch l {
    case nfull        { null };
    case (?(x,null)) { ?x };
    case (?(_,t))    { last<T>(t) };
    }
  };

//源码解读
last方法通过递归的方式进行循环往复地求最后一个元素。
判断方法为,如果无元素,就返回null;
如果有元素: 如果是?(x,null)类型,表示已经到了最后,就返回?x
如果有元素,且有下个元素,表示没到最后,就继续地柜
case(?(_, t) 表示在有下一个元素的情况下,不管本值为任意值,继续向下递归

//猜想
递归,每次递归的时候,返回的都是一个?(x, nextList) , x是当前列表的头元素,nextlist是下一个列表的指针。
每个列表的指针指向的为

?{
  element <T>
  nextList List.List<T>
}

即每一个列表的名字就是这个列表当前的元素和下一个?(元素)的结构体的指针。

//感悟 : 每个库的方法调用时都要加上 来表示返回的类型,否则库不知道返回什么类型。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值