簡介
函式是所有程式語言都有的內容,不管是物件導向還是程式導向,函式都是非常重要的一部分。dart中的函式和java中的函式有什麼區別呢?
dart作為一種物件導向的程式語言,它的函式也是一個物件,用Function來表示。先看下函式的定義:
abstract class Function {
external static apply(Function function, List<dynamic>? positionalArguments,
[Map<Symbol, dynamic>? namedArguments]);
int get hashCode;
bool operator ==(Object other);
}
既然函式是一個物件,那麼可以將函式賦值給物件,還可以將函式當做引數傳遞給其他的函式。
下面是一個簡單的函式,由返回值,函式名稱,引數和函式體來表示:
bool isStudent(int age){
return age < 20;
}
儘管dart建議我們指定函式的返回值型別,但是你也可以忽略返回值:
isStudent(int age){
return age < 20;
}
函式還有一個簡寫方式,如果函式體只有一條語句,那麼可以使用=> 來替代括號:
isStudent(int age) => age < 20;
看起來更加簡潔。
函式的引數
dart中的函式引數有普通引數,也有命名引數。
普通引數很好理解,那麼什麼是命名引數呢?
命名引數就是給引數傳遞的時候起了一個名字,這樣函式在呼叫的時候,可以指定引數的名字,來賦值。
看一個函式引數和命名引數的例子:
bool calculator(int age , {int? size}){
}
可以這樣呼叫:
calculator(15,size:10);
預設情況下命名引數是可選的,也就是說函式在呼叫的時候可以選擇是否傳遞可選的引數。
如果必須要傳遞某個引數,那麼可以將其設定為required.
除了命名引數之外,dart還有可選的位置引數,就是將引數放在[]中,如下所示:
String say(String from, String msg, [String? device]) {
var result = '$from says $msg';
if (device != null) {
result = '$result with a $device';
}
return result;
}
上面的函式在呼叫的時候,可以只傳入普通引數,也可以額外的傳入可選的位置引數,如下:
say('Bob', 'Howdy');
say('Bob', 'Howdy', 'smoke signal');
dart中的引數還可以設定預設值,如下:
String say(String from='mack', String msg, [String? device='ios']) {
...
}
main函式
dart中main函式是應用程式的啟動入口,main()是一個特殊的函式,他是沒有返回值的帶有可選List<String>引數的函式,如下所示:
void main() {
print('Hello, World!');
}
void main(List<String> arguments) {
print(arguments);
}
匿名函式
大部分函式都是帶有名字的,方便函式的呼叫。在某些情況下,函式也可以不帶名字,這樣的函式叫做匿名函式。
匿名函式就是沒有名字的函式,如下所示:
([[Type] param1[, …]]) {
codeBlock;
};
匿名函式通常用在不需要被其他場景呼叫的情況,比如遍歷一個list:
const list = ['apples', 'bananas', 'oranges'];
list.forEach((item) {
print('${list.indexOf(item)}: $item');
});
閉包
提到閉包,大家馬上就會想到javascript,沒錯,除了javascript,dart中也可以構建閉包。
什麼是閉包呢?簡單點說就是函式的函式。也就是一個函式中定義的變數,在函式範圍外被其他的函式所使用。
Function sum(int age1){
return (int i) => age1 +i;
}
void main() {
var sum2 = sum(2);
var result = sum2(5);
}
上例子中,sum傳入的變數2,被在後續的sum2中使用。
函式的返回值
所有的函式都有返回值,如果沒有顯示返回的話,那麼返回的就是null.
所以對下面的函式來說:
foo() {}
它的值是null,也就是說下面的表示式是true:
assert(foo() == null);
總結
以上,就是Dart中函式的定義了。
本文已收錄於 http://www.flydean.com/03-dart-function/
最通俗的解讀,最深刻的乾貨,最簡潔的教程,眾多你不知道的小技巧等你來發現!
歡迎關注我的公眾號:「程式那些事」,懂技術,更懂你!