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,断言执行失败,会抛出一个异常。
*/
}
网友评论