Typedefs 3个月前

编程语言
961
Typedefs

在 Dart 中,函数是对象,就像字符串和数字是对象一样。一个 typedef,或者叫做”函数类型别名“,给函数类型起了一个名字,使你可以在定义字段和返回值类型时使用。在将一个函数类型赋值给一个变量时,一个 typedef 保留了类型信息。

考虑以下代码,不使用 typedef 的情况:

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(箭头的意思是返回),而 compare 的类型是 Function。如果我们修改一下代码,来使用明确的名字并且保留类型信息,开发者和工具都可以使用这个类型信息。

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

说明:目前,typedefs 仅可用于函数类型。我们预计这会有所改变。

因为 typedef 只是简单的别名,所以它们提供了一种方式来检查任意函数的类型。比如:

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!
}
image
EchoEcho官方
无论前方如何,请不要后悔与我相遇。
1377
发布数
439
关注者
2223688
累计阅读

热门教程文档

Linux
51小节
Objective-C
29小节
Python
76小节
Swift
54小节
C++
73小节