函式(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 函式 和 可選引數相關知識點啦。
如果你覺得這篇文章對你有益,還請幫忙轉發和點贊,萬分感謝。
您的關注將是我堅持的動力源泉,再次感謝。