Typedefs

2020-07-06 12:02 更新

在 Dart 中,函數也是對象,就想字符和數字對象一樣。 使用 typedef ,或者 function-type alias 為函數起一個別名, 別名可以用來聲明字段及返回值類型。 當函數類型分配給變量時,typedef會記錄類型信息。

請考慮以下代碼,代碼中未使用 typedef :

class SortedCollection {
  Function compare;

  SortedCollection(int f(Object a, Object b)) {
    compare = f;
  }
}

// Initial, broken implementation. // broken ?
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 。如果我們使用顯式的名字并保留類型信息, 這樣開發(fā)者和工具都可以使用這些信息:

typedef Compare = int Function(Object a, Object b);

class SortedCollection {
  Compare compare;

  SortedCollection(this.compare);
}

// Initial, broken implementation.
int sort(Object a, Object b) => 0;

main() {
  SortedCollection coll = SortedCollection(sort);
  assert(coll.compare is Function);
  assert(coll.compare is Compare);
}

提示: 目前,typedefs 只能使用在函數類型上, 我們希望將來這種情況有所改變。

由于 typedefs 只是別名, 他們還提供了一種方式來判斷任意函數的類型。例如:

typedef int Compare(int a, int b);

int sort(int a, int b) => a - b;

main() {
  assert(sort is Compare); // True!
}


以上內容是否對您有幫助:
在線筆記
App下載
App下載

掃描二維碼

下載編程獅App

公眾號
微信公眾號

編程獅公眾號