Dart之旅02:變量、類型

變量聲明

這是一個聲明變量的例子:

var name = 'Bob';

這里其實類似kotlin的類型推斷皇拣,最后編譯出來的name是String類型的對象严蓖。值為Bob薄嫡。

如果想像Object那樣存儲任意類型,那么可以直接使用Object或者dynamic關鍵字颗胡。

當然也可以明確指定變量類型:

String name = 'Bob';

變量默認值

在dart中所有變量的默認值都是null毫深,即使是數字變量。所以數字變量也是需要判空的毒姨。

int lineCount;
assert(lineCount == null);

final和const

類似于kotlin哑蔫,const指定的是一個字面量(編譯時常量),而final則是初始化時又一次賦值(運行時常量)弧呐,之后就再也不能變化的常量闸迷。

注意:final類型的變量在初始化時必須進行賦值,這點和java很像俘枫,可以在構造函數中賦值腥沽。

一個變量被final修飾的話可以省去var關鍵字:

final name = 'Bob';
final String nickname = 'Bobby';

const通常用來修飾頂層字面量,如果要是在類中則要使用static const鸠蚪,通辰裱簦可以聲明一個數字,字符串邓嘹,或者一個表達式:

const bar = 1000000; // Unit of pressure (dynes/cm2)
const double atm = 1.01325 * bar; // Standard atmosphere
const T = true;

const num = T?41:43;

const關鍵字不僅僅可以用來指定常量酣栈,也可以給變量聲明為一個常量值比如:

var foo = const [];
final bar = const [];
const baz = []; // Equivalent to `const []`

這里的const關鍵字可以省略,就想baz一樣汹押。const修飾的東西內容不可以改變矿筝,但foo那種則本身是一個變量,可以更改值棚贾。

內置類型(Built-in types)

內置類型有以下幾個:

  • numbers
  • strings
  • booleans
  • lists(also known as arrays)
  • maps
  • runes(用于在字符串中表達Unicode字符)
  • symbols

它們都是一些對象窖维,有一些有自己的構造方法例如:Map()

int

Integer values no larger than 64 bits, depending on the platform. On the Dart VM, values can be from -2^63 to 2^63 - 1. Dart that’s compiled to JavaScript uses JavaScript numbers, allowing values from -2^53 to 2^53 - 1.

double

double遵循IEEE 754標準,也是64位的妙痹。

int和double都是num類型的子類铸史。num類型重載了加減乘除運算符,也包含絕對值abs()怯伊,向上向下取整的運算ceilfloor琳轿。
移位運算符則在int中重載。更多的數字運算則在dart:math庫中存在耿芹。

字符串和數字之間的轉換
// 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');
位運算

這個其實不太常用姑且記下:
The int type specifies the traditional bitwise shift (<<, >>), AND (&), and OR (|) operators. For example:

assert((3 << 1) == 6); // 0011 << 1 == 0110
assert((3 >> 1) == 1); // 0011 >> 1 == 0001
assert((3 | 4) == 7); // 0011 | 0100 == 0111
字符串

dart的字符串是UTF-16的代碼單元崭篡。你可以使用單引號或者雙引號都可以。

var s1 = 'Single quotes work well for string literals.';
var s2 = "Double quotes work just as well.";
var s3 = 'It\'s easy to escape the string delimiter.';
var s4 = "It's even easier to use the other delimiter.";
字符串模板

字符串模板與kotlin和php的一樣吧秕,這里不加贅述了琉闪。但在dart中==運算比較的是字符串的內容,這點和kotlin是一樣的砸彬。字符串拼接也是加號颠毙。

多行字符串

這有點類似于kotlin斯入,或者<pre>:

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

var s2 = """This is also a
multi-line string.""";

dart中比較好的一點是,如果你想打印raw字符串蛀蜜,則可以加上r表示:

var s = r'In a raw string, not even \n gets special treatment.';

字符串字面量是一個編譯時常量刻两,可以賦值在const上,這點和kotlin一樣的:

// These work in a const string.
const aConstNum = 0;
const aConstBool = true;
const aConstString = 'a constant string';

// These do NOT work in a const string.
var aNum = 0;
var aBool = true;
var aString = 'a string';
const aConstList = [1, 2, 3];

const validConstString = '$aConstNum $aConstBool $aConstString';
// const invalidConstString = '$aNum $aBool $aString $aConstList';
Lists

或許大多數的語言中最常用的是數組涵防,但dart中它是一個List對象下面是一個簡單的dart list:

var list = [1,2,3];

這里的list變量會被分析為List<int>類型闹伪,如果你試圖將一個非整形的值放入其中,就會產生異常壮池。
List和數組一樣偏瓤,也是從零開始的。
List的用法和java的數組很像椰憋,但其實它就是一個對象厅克。List有很多方便的工具方法。這里在后續(xù)章節(jié)中詳述

Maps

Map和Java以及大多數語言的定義一樣橙依,都是只有一個唯一的key证舟,這個key指定一個value。dart支持map字面量和Map類型:

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構造器來創(chuàng)建:

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';

如果獲取一個不存在的key的值抵知,那么就會返回null。

var gifts = {'first': 'partridge'};
assert(gifts['fifth'] == null);

length屬性指代鍵值對的數量软族。

var gifts = {'first': 'partridge'};
gifts['fourth'] = 'calling birds';
assert(gifts.length == 2);

一個map可以是一個字面量:

final constantMap = const {
  2: 'helium',
  10: 'neon',
  18: 'argon',
};
Runes

在dart中Runes是一個UTF-32編碼的字符串刷喜。Unicode定義了一個數字化的值給一個字符,但UTF-16定一個的字符串還是有限的立砸,String要是想表達UTF-32的字符就需要一些特殊的語法掖疮。

通常的表達Unicode的方法是\uXXXX,XXXX是一個四位的十六進制,例如(?) is \u2665颗祝,如果要表達多于或者少于4個16進制數的時候就要使用一個大括號浊闪,例如:(??) is \u{1f600}.

String類又一些方法可以轉換成Runes類型。codeUnits屬性可以獲取字符位數組螺戳。runes屬性則可以生成Runes對象

下面是一個測試用例:

main() {
  var clapping = '\u{1f44f}';
  print(clapping);
  print(clapping.codeUnits);
  print(clapping.runes.toList());

  Runes input = new Runes(
      '\u2665  \u{1f605}  \u{1f60e}  \u{1f47b}  \u{1f596}  \u{1f44d}');
  print(new String.fromCharCodes(input));
}

output:

??
[55357, 56399]
[128079]
?  ??  ??  ??  ??  ??
最后編輯于
?著作權歸作者所有,轉載或內容合作請聯系作者
  • 序言:七十年代末规揪,一起剝皮案震驚了整個濱河市,隨后出現的幾起案子温峭,更是在濱河造成了極大的恐慌,老刑警劉巖字支,帶你破解...
    沈念sama閱讀 218,036評論 6 506
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件凤藏,死亡現場離奇詭異奸忽,居然都是意外死亡,警方通過查閱死者的電腦和手機揖庄,發(fā)現死者居然都...
    沈念sama閱讀 93,046評論 3 395
  • 文/潘曉璐 我一進店門栗菜,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人蹄梢,你說我怎么就攤上這事疙筹。” “怎么了禁炒?”我有些...
    開封第一講書人閱讀 164,411評論 0 354
  • 文/不壞的土叔 我叫張陵而咆,是天一觀的道長。 經常有香客問我幕袱,道長暴备,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 58,622評論 1 293
  • 正文 為了忘掉前任们豌,我火速辦了婚禮涯捻,結果婚禮上,老公的妹妹穿的比我還像新娘望迎。我一直安慰自己障癌,他們只是感情好,可當我...
    茶點故事閱讀 67,661評論 6 392
  • 文/花漫 我一把揭開白布辩尊。 她就那樣靜靜地躺著涛浙,像睡著了一般。 火紅的嫁衣襯著肌膚如雪对省。 梳的紋絲不亂的頭發(fā)上蝗拿,一...
    開封第一講書人閱讀 51,521評論 1 304
  • 那天,我揣著相機與錄音蒿涎,去河邊找鬼哀托。 笑死,一個胖子當著我的面吹牛劳秋,可吹牛的內容都是我干的仓手。 我是一名探鬼主播,決...
    沈念sama閱讀 40,288評論 3 418
  • 文/蒼蘭香墨 我猛地睜開眼玻淑,長吁一口氣:“原來是場噩夢啊……” “哼嗽冒!你這毒婦竟也來了?” 一聲冷哼從身側響起补履,我...
    開封第一講書人閱讀 39,200評論 0 276
  • 序言:老撾萬榮一對情侶失蹤添坊,失蹤者是張志新(化名)和其女友劉穎,沒想到半個月后箫锤,有當地人在樹林里發(fā)現了一具尸體贬蛙,經...
    沈念sama閱讀 45,644評論 1 314
  • 正文 獨居荒郊野嶺守林人離奇死亡雨女,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內容為張勛視角 年9月15日...
    茶點故事閱讀 37,837評論 3 336
  • 正文 我和宋清朗相戀三年,在試婚紗的時候發(fā)現自己被綠了阳准。 大學時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片氛堕。...
    茶點故事閱讀 39,953評論 1 348
  • 序言:一個原本活蹦亂跳的男人離奇死亡,死狀恐怖野蝇,靈堂內的尸體忽然破棺而出讼稚,到底是詐尸還是另有隱情,我是刑警寧澤绕沈,帶...
    沈念sama閱讀 35,673評論 5 346
  • 正文 年R本政府宣布锐想,位于F島的核電站,受9級特大地震影響七冲,放射性物質發(fā)生泄漏痛倚。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點故事閱讀 41,281評論 3 329
  • 文/蒙蒙 一澜躺、第九天 我趴在偏房一處隱蔽的房頂上張望蝉稳。 院中可真熱鬧,春花似錦掘鄙、人聲如沸耘戚。這莊子的主人今日做“春日...
    開封第一講書人閱讀 31,889評論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽收津。三九已至,卻和暖如春浊伙,著一層夾襖步出監(jiān)牢的瞬間滔驾,已是汗流浹背隙袁。 一陣腳步聲響...
    開封第一講書人閱讀 33,011評論 1 269
  • 我被黑心中介騙來泰國打工, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留,地道東北人臣咖。 一個月前我還...
    沈念sama閱讀 48,119評論 3 370
  • 正文 我出身青樓吠昭,卻偏偏與公主長得像饶套,于是被迫代替她去往敵國和親鞋喇。 傳聞我的和親對象是個殘疾皇子,可洞房花燭夜當晚...
    茶點故事閱讀 44,901評論 2 355

推薦閱讀更多精彩內容