Dart學習筆記 – 函式
Dart 是一個面嚮物件語言,方法也是物件並且具有一種型別,Function
。這意味著,方法可以賦值給變數,也可以當作其他方法的引數。也可以把Dart類的例項當作方法來呼叫。
下面是定義方法的示例:
bool isEmpty(String str) { return str==null || str.isEmpty; }
可以選擇忽略型別定義,但推薦有返回型別的定義:
isEmpty(String str) { return str==null || str.isEmpty; }
如果只有一個表示式,可以使用箭頭語法:
bool isEmpty(String str) => str==null || str.isEmpty;
可選引數
可選命名引數
可以使用paramName: value
來指定命名引數:
test(foo: false, bar: true);
定義方法的時候,使用{param1, param2, ...}
的形式來指定命名引數:
test({bool foo, bool far}){ // ... }
可選位置引數
把引數反倒[]
中就變成可選位置引數:
void test(String s1, String s2, [String s3]) { print('$s1 - $s2 - $s3'); }
下面是不使用可選引數呼叫上面方法的示例:
test('a', 'b');
下面是使用可選引數呼叫上面方法的示例:
test('a', 'b', 'c');
預設引數值
定義方法的時候,可以使用=
來定義可選引數的預設值。預設值只能是編譯時常量。如果沒有提供預設值,則預設值為null
。
下面是設定可選引數預設值的示例:
test({bool foo = false, bool far = false}){ // ... } void test2(String s1, String s2, [String s3 = '']) { // ... } void test3( {List list = const [1, 3], Map<string, string=""> map = const {'a': '1'}}) { // ... } ```</string,> ### 入口函式 每個應用都需要有個頂級的 `main()` 入口方法才能執行。 `main()`方法的返回值為`void`並且有個可選的 `List<string>` 引數,該引數會接收命令列輸入的引數資料。</string> ```dart void main(List<string> args) { print(args); } ```</string> ### 方法也是一個物件 可以把方法當作另外一個方法的引數。例如: ```dart var list = [1, 2, 3]; void printEle(ele) => print(ele); void forEachPrint(List list, void f(var ele)) { for (var ele in list) { f(ele); } } forEachPrint(list, printEle);
方法也可以賦值給一個變數:
Function test = (var msg) => print(msg); test(123); print(test is Function); // true
匿名方法
建立沒有名稱的方法,稱為匿名方法(函式)。匿名函式可以賦值給變數,也可以當作引數使用。匿名函式的格式:
([[Type] param1[, …]]) { codeBlock; };
示例程式碼:
var list = [1, 2, 3]; list.forEach((num) { print(num); });
靜態作用域
Dart 是靜態作用域語言,基本上大括號裡面定義的變數只能再大括號裡面使用。
var topLevel = true; main() { var insideMain = true; myFunction() { var insideFunction = true; nestedFunction() { var insideNestedFunction = true; assert(topLevel); assert(insideMain); assert(insideFunction); assert(insideNestedFunction); } } }
閉包
閉包是一個方法物件,不管該物件在何處被呼叫,該物件都可以訪問其作用域內的變數。
示例:
dart Function makeAddr(num addBy) { return (num i) => addBy + i; } void main(List<string> args) { var add1 = makeAddr(2); var add2 = makeAddr(3); print(add1(1)); // 3 print(add2(2)); // 5 }