Dart 2 (五) 流程控制

流程控制

您可以使用以下任何一種方法來控制DART代碼的流程:

  • if and else
  • for 循環(huán)
  • while 和 do-while 循環(huán)
  • break 和 continue
  • switch 和 case
  • assert

您還可以使用try-catch和throw來影響控制流紧武,作為 Exceptions 中解釋的锯玛。

If 和 else

Dart支持if語句和可選的else語句

if (isRaining()) {
  you.bringRainCoat();
} else if (isSnowing()) {
  you.wearJacket();
} else {
  car.putTopDown();
}

與JavaScript不同的是孽亲,條件必須使用布爾值场梆,其他都不行

For 循環(huán)

您可以使用for循環(huán)標準進行遍歷。例如:

var message = StringBuffer('Dart is fun');
for (var i = 0; i < 5; i++) {
  message.write('!');
}

Dart的for循環(huán)中的閉包捕獲了索引的值淹朋,避免了JavaScript中常見的陷阱啥繁。例如

var callbacks = [];
for (var i = 0; i < 2; i++) {
  callbacks.add(() => print(i));
}
callbacks.forEach((c) => c());

輸出是0,然后是1豪筝。相反,示例將用JavaScript將打印2和2摘能。
如果要遍歷的對象是可遍歷的,那么可以使用forEach()方法敲街。如果您不需要知道當前的遍歷計數(shù)器团搞,那么使用forEach()是一個很好的選擇:

candidates.forEach((candidate) => candidate.interview());

可遍歷類,如List和Set也支持for-in形式的遍歷:

var collection = [0, 1, 2];
for (var x in collection) {
  print(x); // 0 1 2
}

While 和 do-while

while循環(huán)計算循環(huán)之前的條件:

while (!isDone()) {
  doSomething();
}

do-while循環(huán)在循環(huán)之后評估條件:

do {
  printLine();
} while (!atEndOfPage());

Break 和 continue

使用break 中斷循環(huán)

while (true) {
  if (shutDownRequested()) break;
  processIncomingRequests();
}

使用continue跳到下一個循環(huán)遍歷:

for (int i = 0; i < candidates.length; i++) {
  var candidate = candidates[i];
  if (candidate.yearsExperience < 5) {
    continue;
  }
  candidate.interview();
}

如果您使用可遍歷的List或set多艇,您可能會以不同的方式編寫該示例:

candidates
    .where((c) => c.yearsExperience >= 5)
    .forEach((c) => c.interview());

Switch 和 case

waitch 語句 逻恐、在Dart中切換語句使用==比較整數(shù)、字符串或編譯時常量峻黍。被比較的對象必須都是同一個類的實例(而不是它的任何子類型)复隆,并且這個類不能重寫==。枚舉類型在switch語句中工作得很好

var command = 'OPEN';
switch (command) {
  case 'CLOSED':
    executeClosed();
    break;
  case 'PENDING':
    executePending();
    break;
  case 'APPROVED':
    executeApproved();
    break;
  case 'DENIED':
    executeDenied();
    break;
  case 'OPEN':
    executeOpen();
    break;
  default:
    executeUnknown();
}

下面的示例省略了case子句中的break語句姆涩,從而生成一個錯誤:

var command = 'OPEN';
switch (command) {
  case 'OPEN':
    executeOpen();
    // ERROR: Missing break

  case 'CLOSED':
    executeClosed();
    break;
}

然而挽拂,Dart確實支持空case,允許一種形式:

var command = 'CLOSED';
switch (command) {
  case 'CLOSED': // Empty case falls through.
  case 'NOW_CLOSED':
    // Runs for both CLOSED and NOW_CLOSED.
    executeNowClosed();
    break;
}

如果你真的想要跳空骨饿,你可以使用一個continue語句和一個標簽:

var command = 'CLOSED';
switch (command) {
  case 'CLOSED':
    executeClosed();
    continue nowClosed;
  // Continues executing at the nowClosed label.

  nowClosed:
  case 'NOW_CLOSED':
    // Runs for both CLOSED and NOW_CLOSED.
    executeNowClosed();
    break;
}

case子句可以有局部變量亏栈,這些變量只能在該子句的作用域內(nèi)可見。

Assert

如果布爾條件為false宏赘,則使用assert語句中斷正常執(zhí)行绒北。您可以在本教程中找到assert語句的示例。以下是一些:

// Make sure the variable has a non-null value.
assert(text != null);

// Make sure the value is less than 100.
assert(number < 100);

// Make sure this is an https URL.
assert(urlString.startsWith('https'));

注意:assert 語句對生產(chǎn)代碼沒有影響;它們只用于開發(fā)察署。Flutter允許在調(diào)試模式中使用斷言闷游。支持的工具有dartdevc,通常默認支持斷言。一些工具脐往,比如dart和dart2js休吠,通過命令行標志支持斷言:--enable-asserts.
要將消息附加到斷言,需要添加一個字符串作為第二個參數(shù)

assert(urlString.startsWith('https'),
    'URL ($urlString) should start with "https".');

要assert的第一個參數(shù)可以是解析為布爾值的任何表達式钙勃。如果表達式的值為true蛛碌,則斷言成功并繼續(xù)執(zhí)行。如果為false辖源,則斷言失敗并拋出異常(AssertionError)蔚携。

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末,一起剝皮案震驚了整個濱河市克饶,隨后出現(xiàn)的幾起案子酝蜒,更是在濱河造成了極大的恐慌,老刑警劉巖矾湃,帶你破解...
    沈念sama閱讀 211,948評論 6 492
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件亡脑,死亡現(xiàn)場離奇詭異,居然都是意外死亡邀跃,警方通過查閱死者的電腦和手機霉咨,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 90,371評論 3 385
  • 文/潘曉璐 我一進店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來拍屑,“玉大人途戒,你說我怎么就攤上這事〗┏郏” “怎么了喷斋?”我有些...
    開封第一講書人閱讀 157,490評論 0 348
  • 文/不壞的土叔 我叫張陵,是天一觀的道長蒜茴。 經(jīng)常有香客問我星爪,道長,這世上最難降的妖魔是什么粉私? 我笑而不...
    開封第一講書人閱讀 56,521評論 1 284
  • 正文 為了忘掉前任顽腾,我火速辦了婚禮,結(jié)果婚禮上毡鉴,老公的妹妹穿的比我還像新娘崔泵。我一直安慰自己,他們只是感情好猪瞬,可當我...
    茶點故事閱讀 65,627評論 6 386
  • 文/花漫 我一把揭開白布憎瘸。 她就那樣靜靜地躺著,像睡著了一般陈瘦。 火紅的嫁衣襯著肌膚如雪幌甘。 梳的紋絲不亂的頭發(fā)上,一...
    開封第一講書人閱讀 49,842評論 1 290
  • 那天,我揣著相機與錄音锅风,去河邊找鬼酥诽。 笑死,一個胖子當著我的面吹牛皱埠,可吹牛的內(nèi)容都是我干的肮帐。 我是一名探鬼主播,決...
    沈念sama閱讀 38,997評論 3 408
  • 文/蒼蘭香墨 我猛地睜開眼边器,長吁一口氣:“原來是場噩夢啊……” “哼训枢!你這毒婦竟也來了?” 一聲冷哼從身側(cè)響起忘巧,我...
    開封第一講書人閱讀 37,741評論 0 268
  • 序言:老撾萬榮一對情侶失蹤恒界,失蹤者是張志新(化名)和其女友劉穎,沒想到半個月后砚嘴,有當?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體十酣,經(jīng)...
    沈念sama閱讀 44,203評論 1 303
  • 正文 獨居荒郊野嶺守林人離奇死亡,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 36,534評論 2 327
  • 正文 我和宋清朗相戀三年际长,在試婚紗的時候發(fā)現(xiàn)自己被綠了耸采。 大學(xué)時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點故事閱讀 38,673評論 1 341
  • 序言:一個原本活蹦亂跳的男人離奇死亡工育,死狀恐怖洋幻,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情翅娶,我是刑警寧澤,帶...
    沈念sama閱讀 34,339評論 4 330
  • 正文 年R本政府宣布好唯,位于F島的核電站竭沫,受9級特大地震影響,放射性物質(zhì)發(fā)生泄漏骑篙。R本人自食惡果不足惜蜕提,卻給世界環(huán)境...
    茶點故事閱讀 39,955評論 3 313
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望靶端。 院中可真熱鬧谎势,春花似錦、人聲如沸杨名。這莊子的主人今日做“春日...
    開封第一講書人閱讀 30,770評論 0 21
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽台谍。三九已至须喂,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背坞生。 一陣腳步聲響...
    開封第一講書人閱讀 32,000評論 1 266
  • 我被黑心中介騙來泰國打工仔役, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留,地道東北人是己。 一個月前我還...
    沈念sama閱讀 46,394評論 2 360
  • 正文 我出身青樓又兵,卻偏偏與公主長得像,于是被迫代替她去往敵國和親卒废。 傳聞我的和親對象是個殘疾皇子沛厨,可洞房花燭夜當晚...
    茶點故事閱讀 43,562評論 2 349

推薦閱讀更多精彩內(nèi)容

  • 第2章 基本語法 2.1 概述 基本句法和變量 語句 JavaScript程序的執(zhí)行單位為行(line),也就是一...
    悟名先生閱讀 4,132評論 0 13
  • 目錄 參考資料 語言特性 關(guān)鍵字 變量與常量 數(shù)據(jù)類型 運算符 operators 控制流程語句 異常 Excep...
    GuoDongW閱讀 185,008評論 22 341
  • 目錄‖ 下一章 第二十一章 心陷囹圄 “尚錦升熊,你還好嗎俄烁?”杜月著急地看著尚錦。 “我沒事级野,月兒页屠,只是耗盡了真...
    藍澈貝兒閱讀 396評論 3 12
  • 啊……其實這個反思遲到蠻久的了。只是一直在逃避逃避逃避蓖柔。 明明知道自己就算上本專業(yè)的研究生以后也不會從事這個專業(yè)的...
    windly_shaw閱讀 262評論 2 1
  • 2018-01-21 大耳朵 人生若只如初見辰企,一切都是那樣美好。 彼時况鸣,彼此都是對方心里的唯一牢贸。愿意付出所有,只恨...
    大耳朵_9b9a閱讀 141評論 0 0