Dart語言學習筆記(一) —— Dart簡介

風雨vs同舟發表於2018-08-24

簡介

Dart([KK] 英語發音:/dɑrt/, [DJ] 英語發音:/dɑ:t/)

Dart是一種適用於全球資訊網的開放原始碼程式語言,由Google主導開發,於2011年10月公開。它的開發團隊由Google Chrome瀏覽器V8引擎團隊的領導者拉爾斯·巴克主持,目標在於成為下一代結構化Web開發語言。類似JavaScriptDart也是一種面嚮物件語言,但是它採用基於類程式設計。它只允許單一繼承,語法風格接近C語言。 --維基百科

閒話少說,上程式碼,先看看Dart長什麼樣:

// 定義一個函式。
printInteger(int aNumber) {
  print('The number is $aNumber.'); // 使用字串插值寫法,列印到控制檯。
}

// 這是應用程式開始執行的地方。
main() {
  var number = 42; // 宣告並初始化變數。
  printInteger(number); // 呼叫一個函式。
}
複製程式碼

注意:Dart語言的函式必須要先宣告,再呼叫,宣告程式碼要寫在呼叫程式碼前面。

Dart變數型別

1.使用var宣告一個變數並賦值(官方推薦):

var name = 'Bob' ; 
複製程式碼

變數儲存引用。變數name包含對String值為“Bob” 的物件的引用。name推斷變數的型別String,但也可以通過指定它來更改該型別。

2.如果物件不限於單一型別,還可以使用dynamic來進行宣告:

dynamic name = 'Bob' ;
複製程式碼

3.另一種選擇是顯式宣告可以推斷出的型別:

String name = 'Bob' ; 
複製程式碼

備註:如果只宣告變數不賦值,則預設值為null,包括數字型別變數。在Dart裡一切都是物件,數字也是一種物件型別,例如:

num lineCount;  
lineCount ==null;// true  
複製程式碼

final 與 const

如果不打算更改變數,請使用finalconst宣告。filalconst變數都只能在初始化時賦值一次,宣告後不可再改變; const變數是編譯時常量。

注意: 例項變數可以是final,但不能是const。

以下是建立和設定最終變數的示例:

final name = 'Bob' ; //沒有型別註釋
final String nickname = 'Bobby' ;  
複製程式碼

無法更改final變數的值:

name = 'Alice' ; //錯誤:final變數只能設定一次。  
複製程式碼

Dart內建型別

Dart語言特別支援以下型別:

  • numbers
  • strings
  • booleans
  • lists (也稱為陣列)
  • maps
  • runes (用於表示字串中的Unicode字元)
  • symbols

因為Dart中的每個變數都引用一個物件 ,一個類的例項,您通常可以使用建構函式來初始化變數。一些內建型別有自己的建構函式。例如,您可以使用Map()建構函式來建立map物件。

1.Numbers有兩種型別

int:整數值不大於64位,具體取決於平臺。

double:64位(雙精度)浮點數。

intdouble是number的子型別。

字串與數字型別互轉:

// String -> int
var one = int.parse('1');
assert(one == 1);

// String -> double
var onePointOne = double.parse('1.1');
assert(onePointOne == 1.1);

// int -> String
String oneAsString = 1.toString();
assert(oneAsString == '1');

// double -> String
String piAsString = 3.14159.toStringAsFixed(2);
assert(piAsString == '3.14');
複製程式碼

2. Strings

可以使用單引號' '或雙引號" "來建立字串:

var s1 = 'Single quotes work well for string literals.';
var s2 = "Double quotes work just as well.";
複製程式碼

可以通過${expression}將一個表示式放入字串中,如果表示式expression是一個識別符號,則可以直接省略花括號{},為了獲取與物件對應的字串, Dart 會呼叫物件的 toString () 方法。

可以使用相鄰的字串文字或+ 運算子連線字串:

var s1 = 'String ''concatenation'" works even over line breaks.";
assert(s1 == 'String concatenation works even over ''line breaks.'); 

var s2 = 'The + operator ' + 'works, as well.';
assert(s2 == 'The + operator works, as well.'); 
複製程式碼

建立多行字串的另一種方法:使用帶有單引號或雙引號的三重引號:

var s1 = '''
You can create
multi-line strings like this one.
''';

var s2 = """This is also a
multi-line string.""";
複製程式碼

可以通過為其新增字首來建立“原始”字串r

var s = r'In a raw string, not even \n gets special treatment.';
複製程式碼

3. Booleans

布林值使用bool宣告,取值為:truefalse ,它們都是編譯時常量。

// Check for an empty string.
var fullName = '';
assert(fullName.isEmpty);

// Check for zero.
var hitPoints = 0;
assert(hitPoints <= 0);

// Check for null.
var unicorn;
assert(unicorn == null);

// Check for NaN.
var iMeantToDoThis = 0 / 0;
assert(iMeantToDoThis.isNaN);
複製程式碼

4. Lists

Dart裡的list與JavaScript裡的list類似,以下是宣告方式:

var list = [1, 2, 3];
複製程式碼

注意: 解析器推斷出list有型別List。如果嘗試將非整數物件新增到此列表,則解析器或執行時會引發錯誤。

列表的索引使用從0開始,其中0是第一個元素的索引,list.length - 1是最後一個元素的索引。

5. Maps

通常,對映是關聯鍵和值的物件。鍵和值都可以是任何型別的物件。每個鍵只出現一次,但可以多次使用相同的值。

宣告示例:

var gifts = {
  // Key:    Value
  'first': 'partridge',
  'second': 'turtledoves',
  'fifth': 'golden rings'
};

var nobleGases = {
  2: 'helium',
  10: 'neon',
  18: 'argon',
};
複製程式碼

注意: 該解析推斷gifts元素型別 Map<String, String>,且nobleGases元素型別 Map<int, String>。如果您嘗試將錯誤型別的值新增到任一對映,則解析器或執行時會引發錯誤。

也可以使用Map建構函式建立相同的物件:

var gifts = Map();
gifts['first'] = 'partridge';
gifts['second'] = 'turtledoves';
gifts['fifth'] = 'golden rings';

var nobleGases = Map();
nobleGases[2] = 'helium';
nobleGases[10] = 'neon';
nobleGases[18] = 'argon';
複製程式碼

注意:可能希望看到new Map()而不僅僅是Map()。從Dart 2開始,new關鍵字是可選的。

var gifts = {'first': 'partridge'};

// 增
gifts['fourth'] = 'calling birds'; // Add a key-value pair

// 刪
gifts.remove('first');

// 改
gifts['fourth'] = '1234'; 

// 查
var item = gifts['fourth'];
複製程式碼

6. Functions

Dart是一種真正的面嚮物件語言,因此即使是函式也是物件,並且具有Function型別。這意味著函式可以分配給變數或作為引數傳遞給其他函式。你也可以像呼叫函式一樣呼叫Dart類的例項。

函式示例:

bool isNoble(int atomicNumber) {
  return _nobleGases[atomicNumber] != null;
}

// 可以省略返回值型別
isNoble(atomicNumber) {
  return _nobleGases[atomicNumber] != null;
}

// 箭頭函式
bool isNoble(int atomicNumber) => _nobleGases[atomicNumber] != null;

複製程式碼

重要的概念

當您瞭解Dart語言時,請記住以下事實和概念:

  • 您可以放在變數中的所有內容都是一個物件,每個物件都是一個類的例項。偶數,函式和 null物件。所有物件都從Object類繼承。

  • 儘管Dart是強型別的,但型別註釋是可選的,因為Dart可以推斷型別。在上面的程式碼中,number 推斷為型別int。如果要明確說明不需要任何型別,請使用特殊型別dynamic。

  • Dart支援泛型型別,如List(整數列表)或List(任何型別的物件列表)。

  • Dart支援頂級函式(例如main()),以及繫結到類或物件的函式(分別是靜態和例項方法)。您還可以在函式內建立函式(巢狀函式或本地函式)。

  • 類似地,Dart支援頂級變數,以及繫結到類或物件的變數(靜態和例項變數)。例項變數有時稱為欄位或屬性。

  • 與Java,Dart不具備關鍵字public,protected和private。如果識別符號以下劃線(_)開頭,則它對其庫是私有的。

  • 識別符號可以以字母或下劃線(_)開頭,後跟這些字元加數字的任意組合。

  • 有時候事物是表達還是陳述是很重要的,因此有助於準確地理解這兩個詞。

  • Dart工具可以報告兩種問題:警告和錯誤。警告只是表明您的程式碼可能無法正常工作,但它們不會阻止您的程式執行。錯誤可以是編譯時或執行時。編譯時錯誤會阻止程式碼執行; 執行時錯誤導致 程式碼執行時引發異常。

尾記:文章為本人學習Dart時做的筆記,這樣做學習起來,知識框架相對比較完整,也容易反覆檢視,也方便其他小夥伴檢視。文章所有內容幾乎都來自Dart programming language,部分來自網際網路,如有雷同,完全是我抄襲。哈哈~

相關文章