Google Dart - Dart內建資料型態(Build-In Data Type)

在寫Dart程式之前,我們必須要先來瞭解Dart有哪些內建的資料型態。說到內建資料型態,大家就會想到Integer, Double, Char, Boolean...等。內建基本資 料型態是構成整個程式的最小型態單位,是程式中不可或缺的元素,接下來就來看看Dart所提供的內建基本資料型態。


Dart提供的內建資料型態主要分種6種類型:

  • 數值型態(Numbers)
  • 字串型態(Strings)
  • 布林值型態(Booleans)
  • 陣列型態(Lists)
  • Key-Value Pair型態(Maps)
  • Symbols  (*因為不常使用,故在此不作說明)
在說明各種資料型態之前,要先瞭解,在Dart中,所有變數或資料型態皆是物件,意即Base Class皆是Object Class,所以不管是Number或Boolean,值都可以設null。


Numbers

Numbers從精準度來看可分為浮點數整數,而Dart在精準度上就只分為intdouble,int代表一切整數數值;double代表一切浮點數數值。但很有趣的,int與double皆是繼承num這個Class。

num

num是代表int與double繼承的Class,可以用來表示int或double的值,所以你可以宣告num資料型態的變數來接int與double的值,使用num來接值時,會根據是否有小數點來判斷為int或double,例如:num value = 10.1;這種就會判斷為double,反之則為int。num本身提供了許多常用的數值運算抽象方法(Abstract Method),例如:abs(), ceil(), floor(), round()...等,int跟double則實作這些抽象方法。以下為num的範例:




int

int代表的是所有整數值,int繼承num並實作num的抽象方法。int數值範圍值會由DartVM決定,在32-bit與64-bit的機器上數值會不太一樣,下表為Dart官網上提供的數據:

Internal representationsmi (small integer)mint (medium integer)bigint
Minimum value-230 (on a 32-bit machine)
-262 (on a 64-bit machine)
-263Limited by RAM
Maximum value230 - 1 (on a 32-bit machine)
262 - 1 (on a 64-bit machine)
263 - 1Limited by RAM
以下為int的範例:



double

double代表的是所有浮點數數值,與int一樣繼承num並實作num的抽象方法。double根據 IEEE-754 double-precision floating-point number的規範實作,所以數值範圍與規範一致。
以下為double的範例:


另外要注意的是,在其他程式語言中我們可以直接int與double做強制轉型,
例如:int a = (int) 10.25;,會得到 a =10。然而Dart卻不行這樣做,但是Dart有提供int與double互轉的方法,例如:int a = (10.25).toInt();會得到 a = 10的結果。以下是使用Dart中常用的數值運算方法範例:

Booleans

Booleans代表TrueFalse兩個值,在Dart中以bool表示布林值。與JavaScript不同是的Dart布林值只有true代表True值,而JavaScript則是可將1或不等於null的物件視為true,例如以下範例:
在Dart Editor中執行時就會發生錯誤,但如果把上面語法轉成JavaScript來看是會執行成功的。下圖為Dart Editor顯示的錯誤訊息:


Strings

Dart中String表示UTF-16編碼格式字串,且Dart沒有Char字元資料型態。String可用兩個單引號(' ')或兩個雙引號區間(" ")表示。較特別的是,Dart可不用String +的運算子就能將兩個字串連接,而且可以跨行連接,例如:
另外,當如果你想把變數值加入字串中,例如在C#中你可以使用string.Format("This is a {0}", apple);。在Dart只要在字串中使用${},在大括號裡加上變數名稱即可,例如:


String也提供了許多常用的String相關Method,如:split(), contains(), startsWith, endsWith(), indexOf(), substring(), trim()...等。在對String內部操作的一些Method裡會搭配使用Regular Expression來達到Filter的效果,如indexOf(), replaceAll(), split()...等,這樣更加強了字串搜尋的能力。下面是搭配使用Regular Expression的範例:


上面範例限量使用一個Regular Expression,意思是要將字串中的數字字元當作分割的條件,所以1與2會當作分割字元,結果就會是abc, dfg, hijk。
其他與String相關的類別還有StringBuffer。使用StringBuffer組合字串的效能會較使用一般String組字串來的高,就類似C#中的StringBuilder一樣。以下為使用StringBuffer的範例:


Lists

在Dart中不管是陣列或集合都稱為List,以List表示。List的初始宣告只要在中括號內加入元素就可以,或者是使用new物件的方式初始化。List使用泛型的方式(List<int>)或根據初始化時內部元素的資料型態來決定此陣列為哪種資料型態的陣列。雖然集合與物件整合在List裡,但其實陣列的特性是沒有消失的,如果你在初始化List時傳入陣列長度的參數,例如:List li = new List(3);,這樣一來就是個長度為三的陣列,且有三個Null的物件在List裡,不然一般如果沒有設定長度的話就是一個鏈結串列(Link List)。


大家看到這個Code一定覺得很奇怪,為什麼要先new List()後再..length = 2,".."是Dart提供的一個非常非常方便的語法,就是可以對某個物件進行一連串的操作。但這不是重點,重點是先new一個List出來代表此List是一個動態增加長度的Link List,接著再設定長度為2,這樣List裡面就會馬上存在兩個Null的元素,這樣一來不僅保有Link List動態增加的特性,也有陣列初始化的效果。這裡要特別提一下,如果List在一開始就有設定長度時,這個List就無法使用Link List相關的Method,例如:remove(), add()...等


Dart的List中的元素可以是動態類別,意思就是可以將不同資料型態的元素加入到同一個List中,Dart會在執行時期自動識別元素的類別。下列Dart的動態類別List範例程式碼:


當然,List也提供常用的List相關方法,如:add(), clear(), forEach(), indexOf, remove(), removeAt(), sort()...等。

Maps

Map資料型態是數個Key-Value Pair的集合,類似Java中的Map與C#中的Dictionary。Map初始化可以直接使用new Map()的方式,或者是用{key:value}的方式。Map和List一樣可以在宣告的時候用泛型的方式來指定key與value的資料型態,
例如:Map<String, int> map = new Map<String, int>()。Map和陣列一樣也能同時存動態型態,每組Key-Value Pair的Key與Value的資料型態可不同,只要注意每個Key值皆是唯一的。另外Map提供常用的Map相關方法,如:addAll(), containsKey(), containsValue(), remove()...等。以下是使用Map的簡單範例:



本篇文章只簡單的介紹了Dart的一些內建資料型態,當然還有一些如DateTime, Function...等一些會用到的資料型態,這些就得靠自己到Dart API Reference翻翻找找。接下來的時間就可以來寫寫Dart Code來試試水溫,之後有時間限量在來寫一些基本的Dart教學文章。



參考來源:
Dart - Build-in types
Strings, Numbers, Booleans, Oh My! - Dart Tips, Ep 4
Dart - Numeric Computation
Dart API Reference





留言

  1. Best casino bonus codes 2021 | Free spins no deposit
    Find a list of the casino bonus codes and promotions for United Kingdom players. Discover bonus codes for casinos with free spins no deccasino deposit on registration.‎How many free spins do worrione.com you receive https://octcasino.com/ from the casino? · ‎What are the bonuses for United Kingdom players? · ‎What are wooricasinos.info the free spins and promotions for United Kingdom players? worrione

    回覆刪除

張貼留言