美文网首页Dart
Dart - 类型定义

Dart - 类型定义

作者: LouisXWB | 来源:发表于2020-01-02 23:44 被阅读0次

    在 Dart 语言中,函数与 String 和 Number 一样都是对象,可以使用 类型定义(或者叫 方法类型别名)来为函数的类型命名。使用函数命名将该函数类型的函数赋值给一个变量时,类型定义将会保留相关的类型信息。

    比如下面的代码没有使用类型定义:

    class SortedCollection {
      Function compare;
    
      SortedCollection(int f(Object a, Object b)) {
        compare = f;
      }
    }
    
    // 简单的不完整实现。
    int sort(Object a, Object b) => 0;
    
    void main() {
      SortedCollection coll = SortedCollection(sort);
    
      // 我们知道 compare 是一个函数类型的变量,但是具体是什么样的函数却不得而知。
      assert(coll.compare is Function);
    }
    

    上述代码中,当将参数 f 赋值给 compare 时,函数的类型信息丢失了,这里 f 这个函数的类型为 (Object, Object) → int(→ 代表返回),当然该类型也是一个 Function 的子类,但是将 f 赋值给 compare 后,f 的类型 (Object, Object) → int 就会丢失。我们可以使用 typedef 显式地保留类型信息:

    typedef Compare = int Function(Object a, Object b);
    
    class SortedCollection {
      Compare compare;
    
      SortedCollection(this.compare);
    }
    
    // 简单的不完整实现。
    int sort(Object a, Object b) => 0;
    
    void main() {
      SortedCollection coll = SortedCollection(sort);
      assert(coll.compare is Function);
      assert(coll.compare is Compare);
    }
    

    备忘📝:目前类型定义只能用在函数类型上,但是将来可能会有变化。

    因为类型定义只是别名,因此我们可以使用它判断任意函数类型的方法:

    typedef Compare<T> = int Function(T a, T b);
    
    int sort(int a, int b) => a - b;
    
    void main() {
      assert(sort is Compare<int>); // True!
    }
    

    相关文章

      网友评论

        本文标题:Dart - 类型定义

        本文链接:https://www.haomeiwen.com/subject/azuaoctx.html