Dart小知識 -- 函式(Function) && 可選引數(Optional parameters)

ershixiong發表於2019-06-12

函式(Function)

Dart是物件導向的語言,所以 函式也是物件,並且擁有一個型別,叫 Function。這意味著,函式可以賦值給某些變數 或者 當做引數傳遞給其他函式。甚至你可以把一個Dart類的例項當做函式來呼叫。 具體可參考 Callable classes
下面是一個函式的例子:

bool isNoble(int atomicNumber) {
  return _nobleGases[atomicNumber] != null;
}
複製程式碼

當然,dart也支援隱藏型別,下方的函式依然工作(Effectvie Dart 並不推薦這麼做 , type annotations for public APIs):

isNoble(atomicNumber) {
  return _nobleGases[atomicNumber] != null;
}
複製程式碼

如果函式只有一條表示式,還可以使用簡寫的語法:

bool isNoble(int atomicNumber) => _nobleGases[atomicNumber] != null;
複製程式碼

=> expr語法 相當於 {return expr;}. 而一個函式可以擁有兩種型別的引數, 必須引數可選引數。必選引數必須出現在前面,後面才能跟可選引數。名稱可選引數 也可以被標記為 @required.

Callable classes

如果你想讓dart class 可以像函式一樣被呼叫, 需要實現 call() 方法。

class WannabeFunction {
  call(String a, String b, String c) => '$a $b $c!';
}

main() {
  var wf = new WannabeFunction();
  var out = wf("Hi","there,","gang");
  print('$out');
}
複製程式碼

可選引數(Optional parameters)

可選引數又可以分為位置可選或者名稱可選,但不能同時出現。

名稱可選引數

當你呼叫一個函式時,你可以指定引數名稱,語法 paramName: value。 舉例:

enableFlags(bold: true, hidden: false);
複製程式碼

那如何定義這樣的函式呢?使用 {param1, param2, …}來指定名稱引數:

/// Sets the [bold] and [hidden] flags ...
void enableFlags({bool bold, bool hidden}) {...}
複製程式碼

Flutter 中例項建立表示式很複雜,所以 widget 構造時使用名稱可選引數。這使得 例項建立表示式 更易讀。

你可以使用@required註解來標註名稱引數,在任何dart程式碼中,這表示這是一個 必填的引數。 舉例:

const Scrollbar({Key key, @required Widget child})
複製程式碼

當一個Scrollbar被構建的時候,如果缺失 child欄位,語法會報錯。
Required定義在meta包中。可以直接匯入 package:meta/meta.dart,也可以匯入其他包來暴露 meta, 比方說 package:flutter/material.dart

位置可選引數

[]來包裝一些列的函式引數,來表示他們是 位置可選引數:

String say(String from, String msg, [String device]) {
  var result = '$from says $msg';
  if (device != null) {
    result = '$result with a $device';
  }
  return result;
}
複製程式碼

不使用可選引數呼叫的例子:

assert(say('Bob', 'Howdy') == 'Bob says Howdy');
複製程式碼

使用可選引數呼叫的例子:

assert(say('Bob', 'Howdy', 'smoke signal') ==
    'Bob says Howdy with a smoke signal');
複製程式碼

引數預設值(Default parameter values)

可以使用=來定義預設值,不管是 名稱還是位置可選引數。預設值必須是 編譯時常量, 如果沒有預設值提供,那預設將會是null
下面是給名稱可選引數設定預設值的例子:

/// Sets the [bold] and [hidden] flags ...
void enableFlags({bool bold = false, bool hidden = false}) {...}

// bold will be true; hidden will be false.
enableFlags(bold: true);
複製程式碼

下面的例子時 如何給位置可選引數設定預設值:

String say(String from, String msg,
    [String device = 'carrier pigeon', String mood]) {
  var result = '$from says $msg';
  if (device != null) {
    result = '$result with a $device';
  }
  if (mood != null) {
    result = '$result (in a $mood mood)';
  }
  return result;
}

assert(say('Bob', 'Howdy') ==
    'Bob says Howdy with a carrier pigeon');
複製程式碼

你也可以傳遞 lists 或者 maps 作為預設引數。 下例子中的函式, doStuff()就指定了 list引數的預設值(是個list) 和 gifts引數的預設值(是個map):

void doStuff(
    {List<int> list = const [1, 2, 3],
    Map<String, String> gifts = const {
      'first': 'paper',
      'second': 'cotton',
      'third': 'leather'
    }}) {
  print('list:  $list');
  print('gifts: $gifts');
}
複製程式碼

好了,以上就是今天關於dart 函式 和 可選引數相關知識點啦。


如果你覺得這篇文章對你有益,還請幫忙轉發和點贊,萬分感謝。

Flutter爛筆頭

您的關注將是我堅持的動力源泉,再次感謝。

相關文章