流程控制

河图中包含大多数常见的流程控制语句。需要注意的是河图用 when 取代了 switch。

fun main {
  var i = 0
  for (;;) {
    ++i
    when (i % 2) {
      0 -> print('even:', i)
      1 -> print('odd:', i)
      else -> print('never going to happen.')
    }
    if (i > 5) {
      break
    }
  }
}

条件判断语句(if)

if (condition) {
  ...
} else {
  ...
}

if 语句的分支可以是一个表达式,也可以是一个 '{}' 语句块。

if 语句本身也可以直接作为一个表达式使用,等同于三目表达式。此时不能忽略 else 分支。

循环语句(while, do, for)

这三个语句的用法和大多数 C++/Java 类的语言保持一致。

在这三种循环中,都可以使用 break 和 continue。

while

while (condition) {
  ...
}

do

do {
  ...
} while (condition)

do 循环的 while 语句可以省略,此时这个语句块类似于一个立即执行的匿名函数。

for

C++ 的传统三段式 for,以 ';' 分隔,并且每个表达式都可以省略。'for ( ; ; )' 等同于 'while (true)'。

for (init; condition; increment) {
  ...
}

for...in, 遍历查询某个 Iterable 的成员。

for (var item in list) {
  ...
}

for...of, 遍历查询某个 struct/Map 的 values。

for (var item of obj) {
  ...
}

when

when 是用来取代 switch 的关键字,这个语法主要参考自 kotlin。

when 关键字之后,可以跟随一个可选的圆括号内的 condition 表达式。

如果提供了这个表达式,则会将这个表达式的值和各个分支的值进行匹配。并且跳转到第一个匹配的分支。

每个分支的语句,可以只是一个单独的表达式,也可以是一个 '{}' 语句块。

else 是一个可选的特殊的分支,当其他所有分支都匹配失败,并且提供了 else 分支时,将会进入 else 分支。

使用逗号表达式来匹配多个可能的值。

使用 in 表达式来匹配一个 Iterable 中的值;使用 of 表达式来匹配一个 struct/Map 的 values 中的值

for (final i in range(0, 10)) {
  when (i) {
    0 -> {
      print('number: 0')
    }
    2, 3, 5, 7 -> {
      print('prime: ${i}')
    }
    in [4, 9] -> {
      print('square: ${i}')
    }
    else -> {
      print('other: ${i}')
    }
  }
}
Last Updated:
Contributors: 邵燃