Dart學習

一個簡單的 Dart 程序

下面的代碼用到了很多 Dart 的基本功能:

// 定義一個函數
printInteger(int aNumber) {
  print('The number is $aNumber.'); // 打印到控制檯。
}

// 應用從這裏開始執行。
main() {
  var number = 42; // 聲明並初始化一個變量。
  printInteger(number); // 調用函數。
}

概念

在學習 Dart 語言時, 應該基於以下事實和概念:

  • 任何保存在變量中的都是一個 對象 , 並且所有的對象都是對應一個 類 的實例。 無論是數字,函數和 null 都是對象。所有對象繼承自 Object 類。
  • 儘管 Dart 是強類型的,但是 Dart 可以推斷類型,所以類型註釋是可選的。 在上面的代碼中, number 被推斷爲 int 類型。 如果要明確說明不需要任何類型, 需要使用特殊類型 dynamic 。
  • Dart 支持泛型,如 List (整數列表)或 List (任何類型的對象列表)。
  • Dart 支持頂級函數(例如 main() ), 同樣函數綁定在類或對象上(分別是 靜態函數 和 實例函數 )。 以及支持函數內創建函數 ( 嵌套 或 局部函數 ) 。
  • 類似地, Dart 支持頂級 變量 , 同樣變量綁定在類或對象上(靜態變量和實例變量)。 實例變量有時稱爲字段或屬性。
  • 與 Java 不同,Dart 沒有關鍵字 “public” , “protected” 和 “private” 。 如果標識符以下劃線(_)開頭,則它相對於庫是私有的。 有關更多信息,參考 庫和可見性。
  • 標識符 以字母或下劃線(_)開頭,後跟任意字母和數字組合。
  • Dart 語法中包含 表達式( expressions )(有運行時值)和 語句( statements )(沒有運行時值)。 例如,條件表達式 condition ? expr1 : expr2 的值可能是 expr1 或 expr2 。 將其與 if-else 語句 相比較,if-else 語句沒有值。 一條語句通常包含一個或多個表達式,相反表達式不能直接包含語句。
  • Dart 工具提示兩種類型問題:警告_和_錯誤。 警告只是表明代碼可能無法正常工作,但不會阻止程序的執行。 錯誤可能是編譯時錯誤或者運行時錯誤。 編譯時錯誤會阻止代碼的執行; 運行時錯誤會導致代碼在執行過程中引發 [異常](#exception)。

Set集合
在 Dart 中 Set 是一個元素唯一且無需的集合。 Dart 爲 Set 提供了 Set 字面量和 Set 類型。
版本提示: 雖然 Set 類型 一直是 Dart 的核心部分, 但在 Dart2.2 中才引入了 Set 字面量 。
下面是通過字面量創建 Set 的一個簡單示例:

var halogens = {'fluorine', 'chlorine', 'bromine', 'iodine', 'astatine'};

Note: Dart 推斷 halogens 類型爲 Set 。如果嘗試爲它添加一個 錯誤類型的值,分析器或執行時會拋出錯誤。更多內容,參閱 類型推斷。
要創建一個空集,使用前面帶有類型參數的 {} ,或者將 {} 賦值給 Set 類型的變量:

var names = <String>{};
// Set<String> names = {}; // 這樣也是可以的。
// var names = {}; // 這樣會創建一個 Map ,而不是 Set 。

函數是一等對象
一個函數可以作爲另一個函數的參數。 例如:

void printElement(int element) {
  print(element);
}

var list = [1, 2, 3];

// 將 printElement 函數作爲參數傳遞。
list.forEach(printElement);

匿名函數
多數函數是有名字的, 比如 main() 和 printElement()。 也可以創建沒有名字的函數,這種函數被稱爲 匿名函數, 有時候也被稱爲 lambda 或者 closure 。 匿名函數可以賦值到一個變量中, 舉個例子,在一個集合中可以添加或者刪除一個匿名函數。
匿名函數和命名函數看起來類似— 在括號之間可以定義一些參數或可選參數,參數使用逗號分割。
後面大括號中的代碼爲函數體:

([[Type] param1[, …]]) {
  codeBlock;
};

下面例子中定義了一個包含一個無類型參數 item 的匿名函數。 list 中的每個元素都會調用這個函數,打印元素位置和值的字符串。

var list = ['apples', 'bananas', 'oranges'];
list.forEach((item) {
  print('${list.indexOf(item)}: $item');
});

如果函數只有一條語句, 可以使用箭頭簡寫。粘貼下面代碼到 DartPad 中 並點擊運行按鈕,驗證兩個函數是等價性。

list.forEach(
    (item) => print('${list.indexOf(item)}: $item'));

返回值
所有函數都會返回一個值。 如果沒有明確指定返回值, 函數體會被隱式的添加 return null; 語句。

foo() {}
assert(foo() == null);

類型判定運算符
as, is, 和 is! 運算符用於在運行時處理類型檢查:

as 	Typecast (也被用於指定庫前綴)
is 	True if the object has the specified type
is! 	False if the object has the specified type

例如, obj is Object 總是 true。 但是隻有 obj 實現了 T 的接口時, obj is T 纔是 true。
使用 as 運算符將對象強制轉換爲特定類型。 通常,可以認爲是 is 類型判定後,被判定對象調用函數的一種縮寫形式。 請考慮以下代碼:

if (emp is Person) {
 // Type check
 emp.firstName = 'Bob';
}

使用 as 運算符進行縮寫:

(emp as Person).firstName = 'Bob';

提示: 以上代碼並不是等價的。 如果 emp 爲 null 或者不是 Person 對象, 那麼第一個 is 的示例,後面將不回執行; 第二個 as 的示例會拋出異常。

參考:Dart編程語言中文網

發佈了218 篇原創文章 · 獲贊 91 · 訪問量 25萬+
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章