ControlFlowStatements(流程控制语句) of

2019-10-08  本文已影响0人  Kidnight
void main(List<String> args) {

 /**
 * Control flow statements (流程控制语句)
 * 可以使用下面的语句来控制Dart代码的流程:
 *      if and else
 *      for loops
 *      while and dow-while loops
 *      break and continue
 *      switch and case
 *      assert
 * 使用 try-catch 和 throw 还能影响控制流程的 跳转。
 */
 
/**
 * ============================================================================
 */

/**
 * if and else
 * Dart支持 if 语句以及可选的 else,例如下面的实例。
 *      if (isRaining){
 *        you.bringRainCoat();
 *      } else if (isSnowing){
 *        you.wearJacket();
 *      } else {
 *        car.putTopDown();
 *      }
 */

/**
 * ============================================================================
 */

/**
 * For loops
 * 可以使用标准的 for 循环
 */
var message = new StringBuffer('Dart is fun');
for (var i = 0; i < 5; i++) {
  message.write('!');
}
/**
 * Dart for 循环中的闭包会捕获循环的 index 索引值,来避免 JavaScript 中常见的问题。例如:
 */
var callbacks = [];
for (var i = 0; i < 2; i++) {
  callbacks.add(() => print(i));
}
callbacks.forEach((c) => c());  // c 是callbacks里的元素,是个函数,主要功能是打印索引
/**
 * 如果要遍历的对象实现了 Iterable 接口, 则可以使用 forEach() 方法。如果不需要当前的索引,则使用
 * forEach() 方法是个非常好的选择:
 *      candidates.forEach((candidate) => candidate.interview());
 */
/**
 * List 和 Set 等实现了 Iterable 接口的类还支持 for-in 形式的遍历:
 */
var collection = [0,1,2];
for (var x in collection) {
  print(x);
}

/**
 * ============================================================================
 */

/**
 * Whilte and do-while
 * while 循环在执行循环之前先判断条件是否满足
 * 
 *      while (!isDone){
 *        doSomething();
 *      }
 */

/**
 * 而 do-while 循环是先执行循环代码再判断条件
 * 
 *      do {
 *        printLine();
 *      } while (!atEndOfPage());
 */

/**
 * ============================================================================
 */

/**
 * Break and continue
 * 
 * 使用 break 来终止循环
 * 
 *      while (true) {
 *        if (shutDownRequested()) break;
 *          processIncomingRequests();
 *      }
 * 
 * 使用 continue 来开始下一次循环:
 * 
 *      for (int i = 0; i < candidates.length; i++){
 *        var candidate = candidates[i];
 *        if (candidate.yearsExperience < 5){
 *            continue;
 *          }
 *        candidate.interview();
 *      }
 * 
 * 上面的代码在实现 Iterable 接口对象上 可以使用下面的写法:
 * 
 *      candidates.where((c) => c.yearsExperience >= 5).forEach((c) => c.interview());
 */

/**
 * ============================================================================
 */

/**
 * Switch and case
 * 
 * Dart 中的 Switch 语句使用 == 比较 integer、string、或者编译时常量。比较的对象必须都是同一个类的实例,
 * class 必须没有覆写 == 操作符。Enumerated types 非常适合在 switch 语句中使用。
 * 注意:Dart 中的 Switch语句仅适用于有限的情况,例如在解释器或者扫描器中使用。
 * 
 * 每个非空的 case 语句都必须有一个 break 语句。另外还可以通过 continue、throw、或者return来结束非空 case语句。
 * 当没有 case语句匹配的时候,可以使用 defaut 语句来匹配这种默认情况。
 * 
 *      var command = 'OPEN';
 *      switch (command) {
 *        case 'CLOSED':
 *          executeClosed();
 *          break;
 *        case 'PENDING':
 *          executePending();
 *          break;
 *        defaut:
 *          executeUnknown();
 *      }
 *      
 * 下面的实例代码在 case 中省略了break 语句,编译的时候将会出现一个错误:
 *      var command = 'CLOSED';
 *      switch (command) {
 *        case 'CLOSED':
 *          executeClosed();  // ERROR:Missing break causes an exception!!
 *        case 'PENDING':
 *          executePending();
 *          break;
 *        defaut:
 *          executeUnknown();
 *      }
 * 
 * 但是,在Dart中的空case语句中可以不要 break 语句:
 *      var command = 'CLOSED';
 *      switch (command) {
 *        case 'CLOSED':  // Empty case falls through.
 *        case 'PENDING':
 *          // runs for both CLOSED and PENDING
 *          executePending();
 *          break;
 *        defaut:
 *          executeUnknown();
 *      }
 * 
 * 如果你需要实现这种继续到下一个 case 语句中继续执行,则可以使用 continue 语句跳转到对应的标签(label)处继续执行:
 * 
 *      var command = 'OPEN';
 *      switch (command) {
 *        case 'CLOSED':
 *          executeClosed();
 *          continue nowClosed; // Continues executing at the nowClosed label.
 *      nowClosed:
 *        case 'PENDING':
 *          executePending();
 *          break;
 *        defaut:
 *          executeUnknown();
 *      }
 * 
 * 每个 case 语句可以有局部变量,局部变量只有在这个语句内可见。
 */

/**
 * ============================================================================
 */

/**
 * Assert (断言)
 * 如果条件表达式结果不满足需要,则可以使用 assert 语句来打断代码的执行。下面是实例代码:
 *      assert(text != null);
 *      assert(number < 100);
 *      assert(urlString.startsWith('https));
 * 注意:断言只在检查模式下运行有效,如果在生产模式运行,则断言不会执行。
 * 
 * assert 方法的参数 可以为任何返回布尔值的表达式或者方法。
 * 如果返回的值为true,则断言通过,执行结束,
 * 如果返回的值为false,断言执行失败,会抛出一个异常。
 */


}
上一篇下一篇

猜你喜欢

热点阅读