接着學習dart的函數。
1、函數Function
dart是一種真正的面向對象的語言,通常一個函數也是Function類型的對象,這也就是說可以把函數賦值給一個變量,或者作為另一個函數的入參進行傳遞。
我們直接來看一個簡單的函數例子吧:
//定義一個函數,名字叫testFunc,,參數有兩個int,返回值也是int int testFunc(int a, int b) { return a+b; } main() { var c=testFunc(2,4); //調用剛才定義的函數 print('Function test = $c'); //打印函數的返回值,注意:這里不同於C語言的d%用法 }
函數的運行信息如下圖:
附:即便定義的函數沒有顯式聲明函數的返回類型,編譯器也能認,但是不建議大家那樣做。
如果函數體只有一句表達式,那么還可以這樣簡介地定義函數:
int testFunc(int a, int b) => a+b;
=> expr; 語法就是 {return expr; } 的簡短寫法,同樣,這種寫法個人也不太推薦,我們還是要注意函數定義的易讀性。
函數的入參可以是必須的,也可以是可選擇的,類似於帶有默認值的參數,可選擇的參數必須放在必須的參數之后。
<一> 可選參數
可選參數可以是位置參數或者命名參數。當定義函數的時候,可以使用 {param1, param2, …} 這種形式去指定命名參數,其實就是下邊這種形式:
調用的時候可以這樣調用:
main() { var c=testFunc(a: 2, b:4); print('Function test = $c'); }
位置參數看以下例子(有點類似於windows cmd 命令里的可選參數):
String say(String from, String msg, [String device]) { var result = '$from says $msg'; if (device != null) { result = '$result with a $device'; } return result; }
以上say函數的前兩個參數是必須的,從第三個開始是可選擇的參數,這些可選擇的參數都被包括在[]符號內。
這樣調用:
main() { var c=say('Jack','Hello world'); print(c); }
運行結果為:
如果我們這樣調用: var c=say('Jack','Hello world','windows'); ,那么,運行結果將變為:
<二>默認參數
默認參數類似於C/C++語言的默認參數,dart的默認參數也使用=進行賦值(推薦使用=)。命名參數或位置參數都可以有默認值,如上例可以這樣修改:
int testFunc({int a=7, int b}) { return a+b; } main() { var c=testFunc(b:2); print('Function test = $c'); }
程序的運行結果為:
這里要特別指出一點:普通C/C++的默認賦值參數只能排在形參的最后,也就是說上例如果在C語言中testFunc函數只能是b有默認值,而a不能有默認值。但是由於我們使用了dart語言的命名參數特性,所以對有默認值形參的位置就沒有這些限制了。怎么樣,dart還是有自己獨特的強大之處吧。
位置參數的帶有默認值的形式就不再贅述了,下邊直接貼一段例子大家理解消化一下就行:
// demo1
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'); //demo2 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'); }
<三>main函數
main函數是dart語言編寫的程序的頂層入口函數,返回值為void,並且有一個可選擇的list參數。不再細述。
<四>將函數作為入參傳遞或賦值
直接看例子吧:
void printElement(int element) { print(element); } main() { var list = [1, 2, 3]; // Pass printElement as a parameter. list.forEach(printElement); }
再看一個將函數作為變量進行賦值的:
int main() { var loudify = (msg) => '!!! ${msg.toUpperCase()} !!!'; //復合語句,稍微有點復雜,大家結合前邊對 => 的介紹進行理解 print(loudify('hello')); }
所有的函數都是有返回值的,如果程序里沒有明確指明返回值,如 foo() {} ,則默認返回 null;