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
若是你想讓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');
}
複製代碼
可選參數又能夠分爲位置可選或者名稱可選,但不能同時出現。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');
複製代碼
可使用=
來定義默認值,無論是 名稱仍是位置可選參數。默認值必須是 編譯時常量, 若是沒有默認值提供,那默認將會是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 函數 和 可選參數相關知識點啦。
若是你以爲這篇文章對你有益,還請幫忙轉發和點贊,萬分感謝。