簡介
函數是所有編程語言都有的內容,不管是面向對象還是面向過程,函數都是非常重要的一部分。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
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/
最通俗的解讀,最深刻的干貨,最簡潔的教程,眾多你不知道的小技巧等你來發現!
歡迎關注我的公眾號:「程序那些事」,懂技術,更懂你!