Dart語法快速上手二 《Dart2之變數及基礎型別》
變數
-
變數的定義:dart中萬物皆物件,包括java中認為的基礎資料型別也是物件,所以我們初始化任何物件的時候,只要沒賦值,預設值都是null(null也是物件)
-
變數的分類(根據宣告方式,不再細說有哪些內建型別):
String str = "Bob"; //顯示宣告 var str = "Bob"; // 隱式宣告 Object str = "Bob"; //通用物件宣告 dynamic str = 'Bob'; //動態物件宣告,這裡dynamic和Object是等價的,二者可 被賦值為其他型別的物件 final str = "Bob"; //不可變物件 int value ; assert(value == null);
這裡需要指出一個不同點,java中成員變數如果是int型別,預設情況下會賦值為0,但是dart中萬物皆物件,int型別不賦值的話value的值依然跟其他物件一樣是null。
注意:生產程式碼中將忽略assert()呼叫。在開發期間,assert(condition)會丟擲異常,除非條件為真
常量和Final
如果您從不打算更改變數,請使用final或const,而不是var或型別。最終變數只能設定一次;const變數是編譯時常量。(Const變數是隱式最終的。)最終的頂級或類變數在第一次使用時被初始化,對於要成為編譯時常量的變數,請使用const。如果const變數在類級別,則將其標記為static const。在宣告變數的地方可以通過關鍵字const將值設定為編譯時常量,例如int型別、String字串型別、const變數以及通過其他變數常量通過算術運算之後的結果也可以作為常量
注意:例項變數可以是final,但不能是const(cost只能表示常量),Final例項變數必須在建構函式體啟動之前初始化最終例項變數 - 在變數宣告,建構函式引數或建構函式的初始化列表中。
Final變數和Cost常量的宣告
final name = 'Bob'; // Without a type annotation final String nickname = 'Bobby'; const bar = 1000000; // Unit of pressure (dynes/cm2) const double atm = 1.01325 * bar; // 這是其他常量算術結果賦值為新的常量
const關鍵字不僅用於宣告常量變數。您還可以使用它來建立常量值,以及宣告建立常量值的建構函式。任何變數都可以具有常量值。
var foo = const [];
final bar = const [];
const baz = []; // Equivalent to `const []`
部分情況下Dart是允許省略const關鍵字的,比如:
您可以更改非final,非const變數的值,即使它曾經有一個const值,但是你不能更改一個被宣告成const的值,比如:
baz = [2,3,4]; //you can't do like this
內建型別
Dart語言特別支援以下型別:
- number
- string
- boolean
- list
- map
- rune (用於在字串中表示Unicode字元)
- symbole
您可以使用文字初始化任何這些特殊型別的物件。 例如,'this is a string’是一個字串文字,true是一個布林文字。
因為Dart中的每個變數都是一個物件 、 一個類的例項 -,您通常可以使用建構函式來初始化變數。一些內建型別有自己的建構函式。例如,您可以使Map()建構函式來建立Map
####Number Number型別只有兩種形式:int 和 double,比java少多了。
-
int 整數值不大於64位,具體取決於平臺,在Dart VM上,值可以是-263到263 - 1.編譯為JavaScript的Dart使用JavaScript編號,允許從-253到253 - 1的值。
-
double 64位(雙精度)浮點數,由IEEE 754標準規定。
int和double都是num的子型別。 num型別包括基本運算子,如+, - ,/和*,也是你可以找到abs(),ceil()和floor()以及其他方法的地方。(按位運算子,如>>,在int類中定義。)如果num及其子型別沒有您要查詢的內容,則dart:math庫可能提供你想要的
int 和double可以跟String之間相互轉換
// 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');
int型別指定傳統的按位移位(<<,>>),AND(&)和OR(|)運算子。例如:
assert((3 << 1) == 6); // 0011 << 1 == 0110
assert((3 >> 1) == 1); // 0011 >> 1 == 0001
assert((3 | 4) == 7); // 0011 | 0100 == 0111
String
您可以使用$ {expression}將表示式的值放在字串中。如果表示式是識別符號,則可以跳過{}。要獲取對應於物件的字串,Dart呼叫物件的toString()方法。這點和Koltin很相似
var a = "一"
var b = "個"
print("我是$a個小鴨子");
print('我是${a+b}小鴨子')
你也可以跟java一樣中間用+號來連線兩個字串 建立多行字串的另一種方法:使用帶有單引號或雙引號的三重引號:
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.';
print(s);
輸出結果是:In a raw string, not even \n gets special treatment. 這種把\n換行符直接輸出的方法比java中需要一些轉換符才能完整輸出特定的字元的方法好不少!?
List
var list = [1, 2, 3]; //初始化的方式
assert(list.length == 3);
assert(list[1] == 2);
list[1] = 1;
assert(list[1] == 1);
如果要建立一個常量集合(不可變),可以這樣寫
var constantList = const [1, 2, 3];
可能有學過java的同學看到[]符號,下意識認為是陣列,陣列什麼特性?長度定義好了就不可變,只能修改裡面的元素值啊,但是Dart等於集合了陣列和List集合的優勢,可以通過一些方法來實現增刪改查
var list = [1,2,3];
list.add(4);
print(list.toString());
list.removeAt(0);
print(list.toString());
print(list.contains(2).toString());
/**
上面表示式輸出的結果為
[1, 2, 3, 4]
[2, 3, 4]
true
**/
Map
Dart中的map不僅僅跟常規map一樣可以通過string型別來做key,他的key可以是任何一個object型別
var gifts = {
// Key: Value
'first': 'partridge',
'second': 'turtledoves',
'fifth': 'golden rings'
};
var nobleGases = {
2: 'helium',
10: 'neon',
18: 'argon',
};
你也可以通過構造方法來構造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';
nobleGases.remove(10); //根據key來移除鍵值對
注意:您可能希望看到新的Map()而不僅僅是Map()。從Dart 2開始,new關鍵字是可選的 如果需要建立一個編譯期間的常量map,這樣做
final constantMap = const {
2: 'helium',
10: 'neon',
18: 'argon',
};
Runes(符號文字)
就是可以通過文字轉換成符號表情或者代表特定的文字,擷取一段官網程式碼自行了解
Symbols(不常用,翻譯自官網)
Symbol物件表示在Dart程式中宣告的運算子或識別符號。您可能永遠不需要使用符號,但它們對於按名稱引用識別符號的API非常有用,因為縮小會更改識別符號名稱而不會更改識別符號符號。要獲取識別符號的符號,請使用符號文字,它只是#後跟識別符號:
# radix
#bar