Flutter/Dart第12天:Dart控制流詳解

来源:https://www.cnblogs.com/obullxl/archive/2023/10/14/NTopic2023101301.html
-Advertisement-
Play Games

本文是Dart語言學習的第12天,和前面11天相比,本文可能相對比較簡單,因為本文要學習的是Dart語言的控制流,也就是迴圈和分支。且前面的11天學習中,多多少少都涉及到了控制流,同時對Java或者JavaScript比較熟悉的朋友,可能比較容易上手…… ...


Dart控制流主要由迴圈分支組成:

重要說明:本博客基於Dart官網文檔,但並不是簡單的對官網進行翻譯,在覆蓋核心功能情況下,我會根據個人研發經驗,加入自己的一些擴展問題和場景驗證。

迴圈

Dart可通過迴圈來控制邏輯流,它支持3種語句:for迴圈,whiledo while迴圈,breakcontinue

同時,也可以通過非迴圈來控制邏輯流,包括:分支(如:ifswitch)和異常(trycatchthrow)等

for迴圈

for迴圈可以使用在迭代中,標準用法如下代碼樣例:

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

for-in迴圈常用於無需關註迭代的索引,如下代碼樣例,包含了閉包列表和迭代:

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

for (final c in callbacks) {
  c();
}
// 解構:01

同樣的,for-in迴圈還可以使用對象模式(Pattern模式詳解:https://ntopic.cn/p/2023100501),解構迭代的元素:

for (final Candidate(:name, :yearsExperience) in candidates) {
  print('$name has $yearsExperience of experience.');
}

對於迭代類型(Dart可迭代集合詳解:https://ntopic.cn/p/2023092701),forEach()方法也可以實現迴圈:

var collection = [1, 2, 3];
collection.forEach(print); // 1 2 3

while和do while迴圈

while迴圈do while迴圈最大的區別:while先檢測迴圈條件,然後執行迴圈邏輯;do while預設先執行1次迴圈邏輯,然後檢測迴圈條件,以決定後續是否繼續執行迴圈邏輯。

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

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

break和continue迴圈控制

breakcontinue在迴圈中的最大區別:break中斷整個迴圈,而continue中斷當前迴圈的後續邏輯

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

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

// 若`candidates`是可迭代列表,則上面的邏輯可改寫如下:
candidates
    .where((c) => c.yearsExperience >= 5)
    .forEach((c) => c.interview());

分支

Dart也可通過分支來控制邏輯流:if語句和元素,if-case語句和元素,switch語句和switch表達式等。

同樣的,我們也可以通過其他方式來控制邏輯流:如迴圈(就是本文的第1節)和異常(trycatchthrow)等

if/else分支

if語句可以有else可選項子句,if後面的括弧中的表達式計算值必須是boolean類型,如下代碼樣例:

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

if-case模式

Dart中if語句後的case子句可以帶一個模式(Pattern模式詳解:https://ntopic.cn/p/2023100501):

if (pair case [int x, int y]) return Point(x, y);

上訴代碼樣例中,列表模式[int x, int y]首先匹配pair值,並且把列表第1和第2個int類型的元素解構並賦值給了xy變數。

如果模式未能成功匹配,則需要進入else分支:

if (pair case [int x, int y]) {
  print('Was coordinate array $x,$y');
} else {
  throw FormatException('Invalid coordinates.');
}

switch語句和switch表達式

switch語句後面可以有多個case子句,每一個case子句都可以是一個模式(Pattern模式詳解:https://ntopic.cn/p/2023100501)。

當沒有case子句匹配時,就會執行default子句或者_通配符子句:

switch (command) {
  case 'OPEN':
    executeOpen();
    continue newCase; // 繼續執行

  case 'DENIED':
  case 'CLOSED':
    executeClosed(); // `DENIED`和`CLOSED`均會執行

  newCase:
  case 'PENDING':
    executeNowClosed(); // `OPEN`和`PENDING`均會執行
}

在switch語句中,還可以使用模式,有如下幾種用法:

var x = switch (y) { ... };

print(switch (x) { ... });

return switch (x) { ... };

switch表達式可以重寫switch語句,如下為switch語句的代碼樣例:

// `slash`, `star`, `comma`, `semicolon`等,需要是常量
switch (charCode) {
  case slash || star || plus || minus: // `邏輯或`模式
    token = operator(charCode);
  case comma || semicolon: // `邏輯或`模式
    token = punctuation(charCode);
  case >= digit0 && <= digit9: // `關係`和`邏輯與`模式
    token = number();
  default:
    throw FormatException('Invalid');
}

上訴代碼樣例,可以使用switch表達式重寫如下:

token = switch (charCode) {
  slash || star || plus || minus => operator(charCode),
  comma || semicolon => punctuation(charCode),
  >= digit0 && <= digit9 => number(),
  _ => throw FormatException('Invalid')
};

switch表達式不同於switch語句的語法,包括以下幾個方面:

  • Case可選項無需使用case開頭。
  • Case可選項的邏輯是一個表達式,而不是一系列的語句。
  • Case可選項都必須有邏輯,空可選性不代表隱性失敗。
  • Case可選項模式,邏輯使用=>分割。
  • 多個Case可選項之間,使用,分割。
  • 預設可選項,只能使用_

Switch還可以使用在窮舉檢測中,就是所有的值都有對應的可選項被處理,以避免引發編譯錯誤。預設可選項(default_)涵蓋了所有其他情況,因此它可以保障窮舉性。

case-when子句

case-when子句:case子句後面增加when子句。case-when子句可以用在if-caseswitch語句switch表達式中。

switch (pair) {
  case (int a, int b) when a > b:
    print('First element greater');
  case (int a, int b):
    print('First element not greater');
}

case-when子句計算任何一個boolean類型的值,值為true代表可以執行本Case可選項邏輯,為false繼續執行下一個Case可選項,並不會退出整個Switch語句。


我的本博客原地址:https://ntopic.cn/p/2023101301


本文作者:奔跑的蝸牛,轉載請註明原文鏈接:https://ntopic.cn


您的分享是我們最大的動力!

-Advertisement-
Play Games
更多相關文章
  • 本篇文章深入探討了Go語言的泛型特性,從其基礎概念到高級用法,並通過實戰示例展示了其在實際項目中的應用。 關註【TechLeadCloud】,分享互聯網架構、雲服務技術的全維度知識。作者擁有10+年互聯網服務架構、AI產品研發經驗、團隊管理經驗,同濟本復旦碩,復旦機器人智能實驗室成員,阿裡雲認證的資 ...
  • 目錄 1. MySQL準備 2. JDBC項目 3. JDBC新增 4. JDBC查詢 5. JDBC修改 6. JDBC刪除 內容 MySQL準備 新建表t_person CREATE TABLE `t_person` ( `id` int(11) NOT NULL AUTO_INCREMENT ...
  • 錯誤也可以理解為異常,代表應用程式在執行過程中的發生了非預期的行為,常見異常比如有空指針、數組越界、網路超時、IO異常等,Dart語言也支持拋出和捕獲異常。和Java不同的是,Dart語言只有未檢測異常。Dart中的異常需要被捕獲並被處理,否則可能導致程式退出…… ...
  • 目錄 1. JDBC簡介 2. JDBC項目 3. JDBC的導入 4. JDBC的使用 內容 JDBC簡介 什麼是JDBC JDBC的全稱是Java資料庫連接(Java Database connect),它是一套用於執行SQL語句的Java API。應用程式可通過這套API連接到關係資料庫,並使 ...
  • 字典用於存儲鍵值對形式的數據。字典是一個有序、可更改的集合,不允許重覆。從 Python 3.7 版本開始,字典是有序的。在 Python 3.6 及更早版本中,字典是無序的。字典用花括弧編寫,具有鍵和值: 示例,創建並列印一個字典: thisdict = { "brand": "Ford", "m ...
  • 1、 安裝 pip install openpyxl 想要在文件中插入圖片文件,需要安裝pillow,安裝文件:PIL-fork-1.1.7.win-amd64-py2.7.exe · font(字體類):字型大小、字體顏色、下劃線等 · fill(填充類):顏色等 · border(邊框類):設置單元 ...
  • 正文 面的幾個章節已經分析了spring基於@AspectJ的源碼,那麼接下來我們分析一下Aop的另一個重要功能,事物管理。最全面的Java面試網站 事務的介紹 1.資料庫事物特性 原子性 多個資料庫操作是不可分割的,只有所有的操作都執行成功,事物才能被提交;只要有一個操作執行失敗,那麼所有的操作都 ...
  • 餅圖,或稱餅狀圖,是一個劃分為幾個扇形的圓形統計圖表。在餅圖中,每個扇形的弧長(以及圓心角和麵積)大小,表示該種類占總體的比例,且這些扇形合在一起剛好是一個完全的圓形。 餅圖最顯著的功能在於表現“占比”。習慣上,人們通過比較餅圖扇形的大小來獲得對數據的認知。 使用餅圖時,須確認各個扇形的數據加起來等 ...
一周排行
    -Advertisement-
    Play Games
  • 移動開發(一):使用.NET MAUI開發第一個安卓APP 對於工作多年的C#程式員來說,近來想嘗試開發一款安卓APP,考慮了很久最終選擇使用.NET MAUI這個微軟官方的框架來嘗試體驗開發安卓APP,畢竟是使用Visual Studio開發工具,使用起來也比較的順手,結合微軟官方的教程進行了安卓 ...
  • 前言 QuestPDF 是一個開源 .NET 庫,用於生成 PDF 文檔。使用了C# Fluent API方式可簡化開發、減少錯誤並提高工作效率。利用它可以輕鬆生成 PDF 報告、發票、導出文件等。 項目介紹 QuestPDF 是一個革命性的開源 .NET 庫,它徹底改變了我們生成 PDF 文檔的方 ...
  • 項目地址 項目後端地址: https://github.com/ZyPLJ/ZYTteeHole 項目前端頁面地址: ZyPLJ/TreeHoleVue (github.com) https://github.com/ZyPLJ/TreeHoleVue 目前項目測試訪問地址: http://tree ...
  • 話不多說,直接開乾 一.下載 1.官方鏈接下載: https://www.microsoft.com/zh-cn/sql-server/sql-server-downloads 2.在下載目錄中找到下麵這個小的安裝包 SQL2022-SSEI-Dev.exe,運行開始下載SQL server; 二. ...
  • 前言 隨著物聯網(IoT)技術的迅猛發展,MQTT(消息隊列遙測傳輸)協議憑藉其輕量級和高效性,已成為眾多物聯網應用的首選通信標準。 MQTTnet 作為一個高性能的 .NET 開源庫,為 .NET 平臺上的 MQTT 客戶端與伺服器開發提供了強大的支持。 本文將全面介紹 MQTTnet 的核心功能 ...
  • Serilog支持多種接收器用於日誌存儲,增強器用於添加屬性,LogContext管理動態屬性,支持多種輸出格式包括純文本、JSON及ExpressionTemplate。還提供了自定義格式化選項,適用於不同需求。 ...
  • 目錄簡介獲取 HTML 文檔解析 HTML 文檔測試參考文章 簡介 動態內容網站使用 JavaScript 腳本動態檢索和渲染數據,爬取信息時需要模擬瀏覽器行為,否則獲取到的源碼基本是空的。 本文使用的爬取步驟如下: 使用 Selenium 獲取渲染後的 HTML 文檔 使用 HtmlAgility ...
  • 1.前言 什麼是熱更新 游戲或者軟體更新時,無需重新下載客戶端進行安裝,而是在應用程式啟動的情況下,在內部進行資源或者代碼更新 Unity目前常用熱更新解決方案 HybridCLR,Xlua,ILRuntime等 Unity目前常用資源管理解決方案 AssetBundles,Addressable, ...
  • 本文章主要是在C# ASP.NET Core Web API框架實現向手機發送驗證碼簡訊功能。這裡我選擇是一個互億無線簡訊驗證碼平臺,其實像阿裡雲,騰訊雲上面也可以。 首先我們先去 互億無線 https://www.ihuyi.com/api/sms.html 去註冊一個賬號 註冊完成賬號後,它會送 ...
  • 通過以下方式可以高效,並保證數據同步的可靠性 1.API設計 使用RESTful設計,確保API端點明確,並使用適當的HTTP方法(如POST用於創建,PUT用於更新)。 設計清晰的請求和響應模型,以確保客戶端能夠理解預期格式。 2.數據驗證 在伺服器端進行嚴格的數據驗證,確保接收到的數據符合預期格 ...