首页 > 其他分享 >Flutter/Dart第12天:Dart控制流详解

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

时间:2023-10-14 16:12:42浏览次数:36  
标签:case 12 int 控制流 Dart switch 循环 子句

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


标签:case,12,int,控制流,Dart,switch,循环,子句
From: https://www.cnblogs.com/obullxl/p/NTopic2023101301.html

相关文章

  • 【2023潇湘夜雨】WIN11_Pro_23H2.22631.2428软件选装纯净版10.12
    【系统简介】=============================================================1.本次更新母盘来自WIN11_Pro_23H2.22631.2428。2.增加部分优化方案,手工精简部分较多。3.OS版本号为22631.2428。精简系统只是为部分用户安装,个别要求高的去MSDN下。4.集成《DrvCeo-2.13.0.8》网卡版、......
  • lesson12-窗口监听事件
      packagecom.zym.lesson12;importjavax.swing.*;importjava.awt.*;importjava.awt.event.WindowAdapter;importjava.awt.event.WindowEvent;publicclassTestWindowListener{publicstaticvoidmain(String[]args){newWinFrame("less......
  • 每日总结10.12
    今天的学习日程多元而有趣。上午,我首先参加了统一建模语言(UML)课程,这是一门重要的计算机科学课程,用于软件工程和系统设计。通过学习UML,我学到了如何以图形化的方式表示和分析软件系统的结构和行为,这对于未来的软件开发项目将非常有帮助。接下来是体育课,这对保持身体健康和增强体能......
  • 2023-10-12-周四
    忘了这一天在干什么了只记得晚上回寝室后,,就早早的上床了根据著名的苏浩定理:"上床不等于睡觉"所以上床看手机,,,看到1:30差不多吧..,.就睡觉了期间还想找找其它的电视剧,,,,没发现什么电视剧可以必得上<<笑傲江湖>>了╮(╯▽╰)╭,,,,<<笑傲江湖>>就是yyds......
  • 10.12(动手动脑)
    子函数的创建,父函数构造函数的实现情况packagehomework;classGrandparent{publicGrandparent(){System.out.println("GrandParentCreated.");}publicGrandparent(Stringstring){System.out.println("GrandParent......
  • 大二打卡(10.12)
    今天做了什么:uml课,老师讲的越来越云里雾里,也不知道我写的那个系统行不行,老师就评价了点一班的体育课,开局就被阴阳,难顶,练了练发球,这个动作真费胳膊,肩膀子稍微有点疼数据结构,上节课好好听了,这节课老师的提问没有一点不会的,得劲离散数学,第一个上交了,但是太着急了没写对,有点丢人,后......
  • 10.12
    上午上了统一建模语言以及体育课,统一建模语言讲了类和功能,老师也对我们的选题进行了修改,体育课,老师讲了蓝球的防守动作,以及三步上篮,最后二十分钟进行了比赛,最后我们以2:1拿下了比赛,很惊险,下午上了数据结构和离散数学,数据结构复习了二叉树的遍历,以及,前序,中序,后序遍历顺序的特点以及......
  • Codeforces 512D. Fox And Travelling 题解
    FoxAndTravelling题面翻译给定一张\(n\)个点\(m\)条边的无向图。一个点只有当与它直接相连的点中最多只有一个点未被选择过时才可被选择。询问对于每个\(k\in[0,n]\),有序选择\(k\)个点的方案数。\(n\le100\),\(m\le\frac{n(n-1)}2\),答案对\(10^9+9\)取模。......
  • P9120 [春季测试 2023] 密码锁
    第一个想法显然是二分答案,可以考虑二分\(C\)值后枚举每一个权值区间进行判定,时间复杂度为\(O(nk^2\min(a,nk)\loga)\)。这个已经有\(5\times(5+4+5)=70\)分了??写一下。好吧假假假,每个权值区间毙掉的每个位置的密码锁状态都不同,并不好直接处理。很好现在\(25\)分。可以设d......
  • Loadrunner12.5-录制http://www.gw.com.cn/网页时提示“SSL身份验证失败”错误
    问题:LR产品,录制http://www.gw.com.cn/网页时提示下图错误,这是为什么呢?请在如下recordingoptions中选择正确的SSL版本,再进行录制。注:如何确定那个SSL版本是正确的呢?答:需要与网站这边进行确认,问他们网站使用的SSL版本是多少? ......