接着學習dart的函數。windows
一、函數Function函數
dart是一種真正的面向對象的語言,一般一個函數也是Function類型的對象,這也就是說能夠把函數賦值給一個變量,或者做爲另外一個函數的入參進行傳遞。學習
咱們直接來看一個簡單的函數例子吧:spa
//定義一個函數,名字叫testFunc,,參數有兩個int,返回值也是int int testFunc(int a, int b) { return a+b; } main() { var c=testFunc(2,4); //調用剛纔定義的函數 print('Function test = $c'); //打印函數的返回值,注意:這裏不一樣於C語言的d%用法 }
函數的運行信息以下圖:3d
附:即使定義的函數沒有顯式聲明函數的返回類型,編譯器也能認,可是不建議你們那樣作。code
若是函數體只有一句表達式,那麼還能夠這樣簡介地定義函數:對象
int testFunc(int a, int b) => a+b;
=> expr; 語法就是 {return expr; } 的簡短寫法,一樣,這種寫法我的也不太推薦,咱們仍是要注意函數定義的易讀性。blog
函數的入參能夠是必須的,也能夠是可選擇的,相似於帶有默認值的參數,可選擇的參數必須放在必須的參數以後。element
<一> 可選參數cmd
可選參數能夠是位置參數或者命名參數。當定義函數的時候,可使用 {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;