Case语句

另一个分支的方法是case语句。case语句是多分支:

  1. let name = readLine(stdin)
  2. case name
  3. of "":
  4. echo "Poor soul, you lost your name?"
  5. of "name":
  6. echo "Very funny, your name is name."
  7. of "Dave", "Frank":
  8. echo "Cool name!"
  9. else:
  10. echo "Hi, ", name, "!"

可以看出,对于分支允许使用逗号分隔的值列表。

case语句可以处理整型、其它序数类型和字符串。(序数类型后面会讲到) 对整型或序数类型值,也可以用范围:

  1. # 这段语句将会在后面解释:
  2. from strutils import parseInt
  3.  
  4. echo "A number please: "
  5. let n = parseInt(readLine(stdin))
  6. case n
  7. of 0..2, 4..7: echo "The number is in the set: {0, 1, 2, 4, 5, 6, 7}"
  8. of 3, 8: echo "The number is 3 or 8"

上面的代码不能编译: 原因是你必须覆盖每个 n 可能包含的值,但代码里只处理了 0..8 。 因为列出来每个可能的值不现实(尽管范围可以实现),我们通过告诉编译器不处理其它值来修复:

  1. ...
  2. case n
  3. of 0..2, 4..7: echo "The number is in the set: {0, 1, 2, 4, 5, 6, 7}"
  4. of 3, 8: echo "The number is 3 or 8"
  5. else: discard

discard语句 是一个 什么都不做 的语句。编译器知道带有else部分的case语句不会失败,因此错误消失。 请注意,不可能覆盖所有可能的字符串值:这就是字符串情况总是需要else分支的原因。

通常情况下,case语句用于枚举的子范围类型,其中编译器对检查您是否覆盖了任何可能的值有很大帮助。