Dart2基礎(六)
阿新 • • 發佈:2018-12-13
目錄
Dart2是純面相物件的語言,所以函式也是一個物件。
函式也可以作為引數,傳入其他的函式中。
所有函式都有返回值,如果沒有指定返回值,則返回null。
-
基本定義
函式的定義很簡單,下面是一些簡單的例子。
// 定義一個不帶返回值的函式,可以帶void, 也可以不帶 void say(var word){ print("I say '${word}'"; } // 引數可以不用指定型別,如果不指定,則預設是var bool isInt(numVar){ return numVar is int; } // 如果函式只有一個return 語句可以用 => 簡寫 // 需要注意 => 後面只能是一個表示式或者是單條語句。 bool isInt2(numVar) => numVar is int; main(){ say('hello world'); // I say 'hello world' print(isInt('a')); // false print(isInt(1)); // true }
-
可選引數
函式允許定義可選的引數。
定義可選引數有兩種方式一種使用{}, 另一種使用[]。區別就是, 如果用{}宣告,在使用時必須帶著引數名,如:a:123;如果用[]宣告,在使用時需要按照順序使用。
void travel({String from, String to}){ print("From ${from} to ${to}"); } void travel2(String from, [String to, String city]){ print("From ${from} to ${to} and ${city}; } main(){ travel(); // From null to null // 必須傳入的是哪個引數的值 travel(to:"usa"); // From null to usa; travel(from:"china", to:"usa") // From china to usa; travel2("china"); // From china to null and null; // 按照順序傳入引數值 travel2("china", "usa"); // From china to usa and null; travel2("china", "usa", "england"); // From china to usa and england; }
可選的引數,也是可以用@required指定可選的引數變成比填。要使用@required需要引入包 package:meta/meta.dart,如果是用flutter,則可以引入包package:flutter/material.dart。
void travel({@required String from , String to}){}
-
引數預設值
函式的引數可以用=來定義預設值,如果沒有用=賦予預設值,那麼引數預設值為null。
引數的預設值必須是編譯時常量。
ps: 您可能見過用:來賦予引數預設值,這是老程式碼的使用方式,但是這個將在後續版本中去掉,所以最好還是用=。
void travel({String from="china", String to="usa"}){
print("From ${from} to ${to}");
}
// list和map的預設值需要用const修飾
void animals([List<String> names= const ["cat", "dog"], Map<String, String> nameMap = const{
"c": "cat",
"d": "dog"
}]){
print("animals: ${names}");
print("nameMap: ${nameMap}");
}
main(){
travel(); // From china to usa;
travel(from:"japan"); // From japan to usa;
animals(); // animals:['cat', 'dog'] nameMap: {'c', 'cat', 'd': 'dog'}
}
-
匿名函式
匿名函式的定義
([[Type] param1[, …]]) { codeBlock; };
main(List<String> args) {
var listVar = ["cat", 'dog'];
listVar.forEach((animal){
print("animal is ${animal}");
});
// 如果只有一行程式碼,可以使用=>
listVar.forEach((animal) => print("animal is ${animal}"));
}
-
作用域
Dart2語言的變數是有作用域的,變數的作用域是由程式碼佈局決定的。下面是一個簡單的例子。
var level1 = "level1";
main(List<String> args) {
var level2 = "level2";
// 定義一個內部函式
void testScope(){
var level3 = "level3";
print(level1); // level1
print(level2); // level2
print(level3); // level3
}
// 執行內部函式
testScope();
}
-
閉包
閉包是一個函式物件,可以讀取其他作用域內的變數使用。
使用匿名函式可以輕鬆實現一個閉包。
// 本例項來自於官網
Function makeAdder(num){
return (addNum){
return addNum + num;
};
}
main(){
var add5 = makeAdder(5);
var add10 = makeAdder(10);
print(add5(1)); // 6
print(add10(1)); // 11
}
-
main函式
main函式是應用的入口。每一個應用都必須有一個Main函式作為入口。main函式沒有返回值,並且有一個 List<String>型別的變數。
main(List<String> args) {
print(args)
}
// 執行命令 dart test.dart hello world
// 結果: [hello, world]