Dart語法備忘

var荷辕,dynamic,Object

var

如果沒有初始化件豌,可以變成任何類型疮方。

var a;
a = 'ducafecat';
a = 123;
a = true;

若果有初始值,則類型會(huì)被鎖定茧彤,下例會(huì)報(bào)錯(cuò):

var a = 'ducafecat';
a = 123;

報(bào)錯(cuò):


image.png

編譯報(bào)錯(cuò):


image.png

編譯,運(yùn)行均正常:


image.png

Object

動(dòng)態(tài)任意類型惫谤,編譯階段檢查類型

Object a = 'doucafecat';
a = 123;
a = [2222];

編譯運(yùn)行均正常:


image.png

dynamic

動(dòng)態(tài)任意類型溜歪,編譯階段不檢查類型

dynamic a = 'doucafecat';
a = 123;
a = [1111];

編譯運(yùn)行均正常:


image.png

總結(jié)

var 初始化確定類型后不可更改類型, Object 以及dynamic 可以更改類型
Object 編譯階段檢查類型, 而 dynamic 編譯階段不檢查類型调衰。
var實(shí)際上是編譯期拋給我們的“語法糖”自阱,一旦被編譯,
編譯期會(huì)自動(dòng)匹配var 變量的實(shí)際類型萝喘,并用實(shí)際類型來替換該變量的申明琼懊,
這看上去就好像我們在編碼的時(shí)候是用實(shí)際類型進(jìn)行申明的爬早。
而dynamic被編譯后,實(shí)際是一個(gè) object類型醉旦,
只不過編譯器會(huì)對dynamic類型進(jìn)行特殊處理桨啃,
讓它在編譯期間不進(jìn)行任何的類型檢查,而是將類型檢查放到了運(yùn)行期匈棘。

異步相關(guān)

await for

await for (variable declaration in expression) {
  // Executes each time the stream emits a value.
}

表達(dá)式 的值必須有Stream 類型(流類型)析命。
執(zhí)行過程如下:
1.在 stream 發(fā)出一個(gè)值之前等待
2.執(zhí)行 for 循環(huán)的主體,把變量設(shè)置為發(fā)出的值鹃愤。
3.重復(fù) 1 和 2,直到 Stream 關(guān)閉
如果要停止監(jiān)聽 stream 瘩将,你可以使用 break 或者 return 語句,跳出循環(huán)并取消來自 stream 的訂閱 肠仪。

main() async {
  ...
  await for (var request in requestServer) {
    handleRequest(request);
  }
  ...
}

sync * 同步生成器

Iterable naturalsTo(n) sync* {
  print("Begin");

  int k = 0;
  while (k < n) yield k++;

  print("End");
}

main() {
  var it = naturalsTo(3).iterator;
  while(it.moveNext()) {
    print(it.current);
  }
}

運(yùn)行結(jié)果:

Begin
0
1
2
End

當(dāng)調(diào)用naturalsTo的時(shí)候藤韵,會(huì)立即返回Iterable(很像async函數(shù)立即返回Future)熊经,并且可以通過Iterable提取iterator。在有代碼調(diào)用moveNext前匹涮,函數(shù)主體并不會(huì)執(zhí)行槐壳。yield(生成)用于聲明一個(gè)求值表達(dá)式,當(dāng)?shù)谝淮芜\(yùn)行函數(shù)的時(shí)候雳攘,代碼會(huì)執(zhí)行到y(tǒng)ield關(guān)鍵字聲明的位置枫笛,并暫停執(zhí)行,moveNext會(huì)返回true給調(diào)用者刑巧。函數(shù)會(huì)在下次調(diào)用moveNext的時(shí)候恢復(fù)執(zhí)行。當(dāng)循環(huán)結(jié)束的時(shí)候吠冤,函數(shù)會(huì)隱式地執(zhí)行return恭理,這會(huì)使迭代終止,moveNext返回false薄风。

async * 異步生成器

import 'dart:async';

Stream asynchronousNaturalsTo(n) async* {
  print("Begin");

  int k = 0;
  while (k < n) yield k++;

  print("End");
}

main() {
  asynchronousNaturalsTo(3).listen((v) {
    print(v);
  });
}

運(yùn)行結(jié)果:

Begin
0
1
2
End

當(dāng)運(yùn)行asynchronousNaturalsTo的時(shí)候拍嵌,會(huì)立即返回Stream,但函數(shù)體并不會(huì)執(zhí)行撇他,就像sync*生成器和async函數(shù)一樣。一旦開始listen監(jiān)聽數(shù)據(jù)流困肩,函數(shù)體會(huì)開始執(zhí)行。當(dāng)執(zhí)行到y(tǒng)ield關(guān)鍵字的時(shí)候勇劣,會(huì)將yield聲明的求值表達(dá)式的計(jì)算結(jié)果添加到Stream數(shù)據(jù)流中潭枣。異步生成器沒有必要暫停,因?yàn)閿?shù)據(jù)流可以通過StreamSubscription進(jìn)行控制命咐。需注意的是谐岁,數(shù)據(jù)流不能重復(fù)監(jiān)聽。

暫停

import 'dart:async';

Stream get asynchronousNaturals async* {
  print("Begin");

  int k = 0;
  while (k < 3) {
    print("Before Yield");
    yield k++;
  }

  print("End");
}

main() {
  StreamSubscription subscription = asynchronousNaturals.listen(null);
  subscription.onData((value) {
    print(value);
    subscription.pause();
  });
}

運(yùn)行結(jié)果:

Begin
Before Yield
0
Before Yield

Completer

class AsyncOperation {
  Completer _completer = new Completer();

  Future<T> doOperation() {
    _startOperation();
    return _completer.future; // Send future object back to client.
  }

  // Something calls this when the value is ready.
  void _finishOperation(T result) {
    _completer.complete(result);
  }

  // If something goes wrong, call this.
  void _errorHappened(error) {
    _completer.completeError(error);
  }}
最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末窜司,一起剝皮案震驚了整個(gè)濱河市塞祈,隨后出現(xiàn)的幾起案子迷捧,更是在濱河造成了極大的恐慌漠秋,老刑警劉巖抵屿,帶你破解...
    沈念sama閱讀 218,386評論 6 506
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場離奇詭異轧葛,居然都是意外死亡,警方通過查閱死者的電腦和手機(jī)求晶,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 93,142評論 3 394
  • 文/潘曉璐 我一進(jìn)店門衷笋,熙熙樓的掌柜王于貴愁眉苦臉地迎上來芳杏,“玉大人,你說我怎么就攤上這事吝秕】栈茫” “怎么了?”我有些...
    開封第一講書人閱讀 164,704評論 0 353
  • 文/不壞的土叔 我叫張陵棒假,是天一觀的道長。 經(jīng)常有香客問我棍现,道長己肮,這世上最難降的妖魔是什么悲关? 我笑而不...
    開封第一講書人閱讀 58,702評論 1 294
  • 正文 為了忘掉前任,我火速辦了婚禮寓辱,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘诱鞠。我一直安慰自己这敬,他們只是感情好,可當(dāng)我...
    茶點(diǎn)故事閱讀 67,716評論 6 392
  • 文/花漫 我一把揭開白布阳掐。 她就那樣靜靜地躺著冷蚂,像睡著了一般。 火紅的嫁衣襯著肌膚如雪艺骂。 梳的紋絲不亂的頭發(fā)上,一...
    開封第一講書人閱讀 51,573評論 1 305
  • 那天彻亲,我揣著相機(jī)與錄音,去河邊找鬼畸肆。 笑死,一個(gè)胖子當(dāng)著我的面吹牛轴脐,可吹牛的內(nèi)容都是我干的抡砂。 我是一名探鬼主播,決...
    沈念sama閱讀 40,314評論 3 418
  • 文/蒼蘭香墨 我猛地睜開眼碴巾,長吁一口氣:“原來是場噩夢啊……” “哼丑搔!你這毒婦竟也來了?” 一聲冷哼從身側(cè)響起啤月,我...
    開封第一講書人閱讀 39,230評論 0 276
  • 序言:老撾萬榮一對情侶失蹤谎仲,失蹤者是張志新(化名)和其女友劉穎,沒想到半個(gè)月后夹姥,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體辙诞,經(jīng)...
    沈念sama閱讀 45,680評論 1 314
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 37,873評論 3 336
  • 正文 我和宋清朗相戀三年圾亏,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了封拧。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片夭问。...
    茶點(diǎn)故事閱讀 39,991評論 1 348
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡,死狀恐怖捧杉,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情味抖,我是刑警寧澤,帶...
    沈念sama閱讀 35,706評論 5 346
  • 正文 年R本政府宣布忍坷,位于F島的核電站,受9級特大地震影響佩研,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜旬薯,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 41,329評論 3 330
  • 文/蒙蒙 一适秩、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧隶症,春花似錦、人聲如沸淋样。這莊子的主人今日做“春日...
    開封第一講書人閱讀 31,910評論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽儡司。三九已至,卻和暖如春捕犬,著一層夾襖步出監(jiān)牢的瞬間酵镜,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 33,038評論 1 270
  • 我被黑心中介騙來泰國打工垢粮, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留靠粪,地道東北人毫蚓。 一個(gè)月前我還...
    沈念sama閱讀 48,158評論 3 370
  • 正文 我出身青樓元潘,卻偏偏與公主長得像君仆,于是被迫代替她去往敵國和親。 傳聞我的和親對象是個(gè)殘疾皇子袖订,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 44,941評論 2 355