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

函數(Function)

Dart是面向對象的語言,因此 函數也是對象,而且擁有一個類型,叫 Function。這意味着,函數能夠賦值給某些變量 或者 當作參數傳遞給其餘函數。甚至你能夠把一個Dart類的實例當作函數來調用。 具體可參考 Callable classes
下面是一個函數的例子:bash

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

固然,dart也支持隱藏類型,下方的函數依然工做(Effectvie Dart 並不推薦這麼作 , type annotations for public APIs):ide

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

若是函數只有一條表達式,還可使用簡寫的語法:函數

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

=> expr語法 至關於 {return expr;}. 而一個函數能夠擁有兩種類型的參數, 必須參數可選參數。必選參數必須出如今前面,後面才能跟可選參數。名稱可選參數 也能夠被標記爲 @required.ui

Callable classes

若是你想讓dart class 能夠像函數同樣被調用, 須要實現 call() 方法。atom

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)

可選參數又能夠分爲位置可選或者名稱可選,但不能同時出現。spa

名稱可選參數

當你調用一個函數時,你能夠指定參數名稱,語法 paramName: value。 舉例:code

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

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

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

Flutter 中實例建立表達式很複雜,因此 widget 構造時使用名稱可選參數。這使得 實例建立表達式 更易讀。對象

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

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爛筆頭
您的關注將是我堅持的動力源泉,再次感謝。
相關文章
相關標籤/搜索