1.本文主要講一下Dart中的方法是怎麼定義的,下面先看一個簡單的例子:git
void printNumber(num number) { print('The number is $number.'); }
2.雖然Dart的編程規範推薦定義方法是要明確變量類型,但其實上面的代碼咱們徹底能夠寫做:github
printNumber(number) { // Omitting types is OK. print('The number is $number.'); }
本人建議仍是使用第一種吧,代碼的可讀性比較強。編程
3.若是方法的方法體只有一個表達式,如上面這段代碼,能夠寫成:閉包
void printNumber(num number) => print('The number is $number.');
這樣是否是很高大上呢?有種lambda表達式的感受。這裏須要注意的是當方法體是一個聲明語句的時候就不能這樣使用了,以下面這段代碼就沒法使用這種簡寫:ide
printNumber(number) { // Omitting types is OK. var N = number * 2 ; }
4.Dart中方法的定義也十分簡單:函數
printNumber(2333);
5.Dart方法的參數有兩種類型,必須參數和可選參數,其中必須參數定義在參數列表的前面部分,可選參數定義在參數列表的剩餘部分。學習
可選參數又能夠分爲:可選命名參數
和可選位置參數
。同一個參數只能是可選命名參數或可選位置參數,不能兼具二者的功能。
同時可選參數能夠設定默認值,如沒有設定默認值則至關於null。命令行
可選命名參數顧名思義,就是在給其賦值的時候經過參數名來賦值。
可選命名參數使用{param1, param2, …}
這種形式定義,以下:code
enableFlags({bool bold:false, bool hidden:true}) { // ... }
可選命名參數使用:
設置默認值。
可選命名參數的調用方式以下:對象
enableFlags(bold: true, hidden: false);
可選位置參數與可選命名參數相似,不過它是經過位置來賦值的。
可選位置參數使用[]
包裹可選位置參數列表,與可選命名參數不一樣的是可選位置參數經過=
來設置默認值:
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');
須要注意的是在調用包含可選位置參數的方法時,必定要根據可選位置參數的位置進行賦值。
在Dart中全部的程序都必須包含main方法來做爲程序的入口。main方法的返回值是void而且它有一個List
void main() { querySelector("#sample_text_id") ..text = "Click me!" ..onClick.listen(reverseText); }
注意:..操做符能夠用於對單個對象進行多重操做。
下面這個例子是Dart在命令行程序中的使用範例:
void main(List<String> arguments) { print(arguments); assert(arguments.length == 2); assert(int.parse(arguments[0]) == 1); assert(arguments[1] == 'test'); }
在Dart中你能夠將方法做爲參數傳遞給另外一個方法:
printElement(element) { print(element); } var list = [1, 2, 3]; // Pass printElement as a parameter. list.forEach(printElement);
一樣的,能夠將方法賦值給一個變量:
var loudify = (msg) => '!!! ${msg.toUpperCase()} !!!'; assert(loudify('hello') == '!!! HELLO !!!');
在Dart中方法能夠嵌套,而且內層方法能夠訪問外層方法定義的變量:
var topLevel = true; main() { var insideMain = true; myFunction() { var insideFunction = true; nestedFunction() { var insideNestedFunction = true; assert(topLevel); assert(insideMain); assert(insideFunction); assert(insideNestedFunction); } } }
閉包的做用是即便方法在原先聲明範圍外使用,方法內部的變量都是可訪問的:
Function makeAdder(num addBy) { return (num i) => addBy + i; } main() { // 建立一個+2方法. var add2 = makeAdder(2); // 建立一個+4方法. var add4 = makeAdder(4); assert(add2(3) == 5); assert(add4(3) == 7); }
在上面這段代碼中,add2,add4這兩個方法在main方法中使用,但他們卻能夠訪問addBy 這個變量。這就是語法閉包的意思。
下面這個例子用於展現頂層方法,靜態方法和類成員方法(實例方法)的等效判斷:
foo() {} // A top-level function class SomeClass { static void bar() {} // A static method void baz() {} // An instance method } main() { var x; // Comparing top-level functions. x = foo; assert(foo == x); // Comparing static methods. x = A.bar; assert(A.bar == x); // Comparing instance methods. var v = new A(); // Instance #1 of A var w = new A(); // Instance #2 of A var y = w; x = w.baz; // These closures refer to the same instance (#2), // so they're equal. assert(y.baz == x); // These closures refer to different instances, // so they're unequal. assert(v.baz != w.baz); }
全部的Dart方法都有返回值,若在代碼中沒有返,則返回值爲null。
Dart的方法基本使用就講到這裏,更多的Dart學習內容和相關源碼都會在github上的DartNovel開源項目進行同步,歡迎關注。