[dart學習]第三篇:dart變量介紹 (二)

 本篇繼續介紹dart變量類型,可參考前文:第二篇:dart變量介紹 (一)

 

(一)finalconst類型html

若是你不打算修改一個變量的值,那麼就把它定義爲final或const類型。其中:final變量的值只能被設置一次,const變量是編譯時常量(const是隱式final)。final變量在第一次使用時初始化。(注:類實例變量能夠是final類型,但不能夠是const類型)python

final類型的用法例子以下,在final關鍵字後,可選擇是否顯式聲明變量類型:express

 

final name ='Bob';
final String nameS = 'Jack Ma';

 

經過上邊的基本用法咱們能夠看到:不一樣於C語言的const,dart的final既能夠做爲變量修飾詞,也能夠做爲變量類型使用編程

當你試圖改變一個final類型的變量值時會發生什麼?咱們來試一下,對上例添加以下修改:數組

name = 'ma yun';

  看,編譯器提示你出錯了!因此,final變量被初始化以後是不能修改其值的。post

關於const類型,官方給的說明是「編譯時常量」,我目前理解也不是太深入,直接舉個栗子吧:ui

  var foo = const [];
  final bar = const [];
  const baz = [];

以上用法都是合法的,你還能夠作以下操做,也是合法的,由於foo是var類型:編碼

foo = [1,2,3];

但你不能夠作下邊的操做,,由於baz是const類型的:spa

baz = [2,5,9];

 下邊看一種const使用的特殊狀況,你們本身體會體會吧:code

//如下3行代碼合法
const a = 2;
const b = 3;
const c = a * b;

//如下代碼編譯出錯,由於a是int而不是const類型的
int a = 2;
const b = 3;
const c = a * b;

//如下兩行代碼合法,由於2看成const常量類型
const b = 3;
const c = 2 * b;

 

(二)Built-in類型

Dart語言支持如下8種內建數據類型。

(1)Numbers類型

Dart的數字類型有兩種:int和double。int變量一般不超過64bit,這取決於運行平臺。double是64bit雙精度浮點型。

int和double都是num的子類型,num類型包括一些基本的操做,如+-*/,(位操做符,如>>,是在int類裏定義的),若是num或num子類型不能知足你的需求,試試dart:math庫。

關於什麼是整型數、什麼是浮點數就再也不舉例子了啊,另外浮點數支持科學表示法。int類型可根據須要自動轉換爲double類型,如: double a = 1;

下邊舉例看看字符串和數字之間的轉換,這個我以爲一般挺有用的:

int i = int.parse('126');    //把字符串‘126’轉化爲整數126
double db = double.parse("12.36");    //把字符串'12.36‘轉化爲12.36
String str = i.toString();    //把整型數字126(變量i)轉化爲字符串’126‘
//下邊一行語句把12.36轉化爲字符串,小數點後保留1位,自動四捨五入
String pStr = db.toStringAsFixed(1);    

 int類型的變量能夠進行位運算操做,以下,再也不細述:

int a = 3<<1;
int b = 2|3;
int c = 8>>1;

 

(2)String類型

Dart的字符串是utf-16的序列。dart和python相似,可使用雙引號,也可使用單引號建立字符串。

下面看一個例子(完整,可編譯),這個栗子裏邊包含了兩個很小、卻很關鍵的知識點:

main()
{
  String s1 = 'Jack Ma';
  String s2 = '$s1 is ma yun';

  int i1 = 123456;
  String s3 = 'I have ${i1.toString()} yuan';

  print(s2);
  print(s3);

  if('Jack Ma is ma yun' == s2)
  {
    print('***');
  }
}

上述代碼的運行結果是:

知識點:

一、你可使用 ${expression} 將表達式的值嵌入到一個字符串中(如上例中s3變量),若是表達式只是一個標識符,則能夠直接省略{}, 如上例中的s2變量

二、可使用 == 操做符比較兩個字符串是否相同

下面再看一個例子:

main()
{
  String s1 = 'Jack Ma';
  String s2 = ' is ';
  String s3 = 'Ma yun';

  String s4 = s1 +s2 +s3;
  String s5 = 'Jack Ma'' is ''Ma yun';

  print(s5);
}

上例運行的結果是  

Amazing!!!咱們看看s5是個什麼變量,字符串,咱們再看看它是怎麼賦值的?個人天吶, 把 'Jack ma'、' is '和'Ma yun'三個字符串緊挨着放在一塊兒,dart就能把他們合併成一個字符串變量。你們能夠打印下s4觀察輸出。

知識點

一、可使用 + 操做符,將多個字符串進行拼接;

二、能夠把相鄰的字符串放在一塊兒,編譯器自動爲你拼接;

三、可使用三個引號(雙引號或單引號都可)建立跨行字符串(和Python相似);

四、能夠經過前綴r來建立原始字符串(和Python相似,原始字符串不對轉義字符進行特殊處理,如 r'hh\n' 不會將\n處理爲換行)。

  

(3)Booleans類型

Dart使用類型bool來表示boolean值,只有兩個對象是bool類型:true和false,這兩個都是編譯時常量。

bool類型比較簡單,官網惟一的提示就是 不能使用 if(非布爾值) 或 assert(非布爾值) 這樣的表達式。

(4)Lists類型

在Dart中,數組是列表對象。看下例子:

var list_a = [2,3,6]; 
//list_a[0] = 'string';  Error

 

以上程序,dart推斷list_a是 List<int> ,當你試圖添加一個非整型數據進去時,編譯器會報錯。

dart的數組像C語言同樣,下標從0開始,到length-1爲止,其中,能夠經過list.length獲取得數組的長度,以下:

main()
{
  var list_a = const [2,3,6]; // 定義一個編譯時常量list
  print(list_a[0]);      // 打印:2
  print(list_a[2]);      // 打印:6
  print(list_a.length);    // 打印:3
}

 

(5)Sets類型

Dart中的set是一系列無序項的集合。看一個簡單的例子:

 

var set_exam = {'set111', 'set222', 'set333'};

 

上例中,dart可以推斷出set_exam是String類型的set,當你試圖追加非string類型的值時,會報錯。

當你想建立一個空的set時,須要在{}符號前添加set裏變量的類型,或者使用set類型建立,如:

//建立一個set,其中可存放string類型的值
var names = <String>{};
或者
Set<String> names = {};    //與上面的等價
//var names = {}; 這句話就不行了,這是建立了一個map,而不是set

 

向一個set中添加數據可以使用add()或addAll()方法,以下例:

 

  var set_1 = {'111', '222', '333'};
  var set_2 = <String>{};
  set_2.add('Add method');
  set_2.addAll(set_1);

 

使用 length 屬性去獲取一個set裏的元素個數,如:

  var set_1 = {'111', '222', '333'};
  var set_2 = <String>{};
  set_2.add('Add method');
  set_2.addAll(set_1);
  var set_num = set_2.length;
  print(set_num);    //打印出的值爲 4

 

建立一個const的set,可直接在{}前添加const修飾.

 

(6)Maps類型

Dart的map是一種key-value鍵對的類型,key和value都可以是任意值。一個key只能對應一個value,可是一個value卻能夠有多個key。看一個map的簡單例子吧:

  var map_1 = {'first':'111', 'second':'222', 'third':'333'};
  var map_2 = {1:'111', 2:'111', 3:'333'};

上例中,dart推斷map_1是 Map<String,String> 類型,而map_2是 Map<int, String> 類型。同set同樣,在類型肯定後,你不能再添加非此類型的鍵值對了。

也可使用Map構造一個map變量:

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

向一個map變量中添加鍵值對:

var gifts = {'first': 'partridge'};
gifts['fourth'] = 'calling birds'; // Add a key-value 

 能夠直接 String st=gifts['first']; 來獲取某個鍵對應的值,當這個鍵在map中不存在時,將返回null.

像set同樣,map也可使用 .length 來獲取其中的鍵值對數,再也不細述。

 

(7)Runes類型

Dart的rune類型主要是unicode編碼之類的,我還沒看太明白。。。

(8)Symbols類型

Dart的Symbol表示程序中出現的操做符或標識符,實際編程中沒啥接觸,再也不細述。

相關文章
相關標籤/搜索