Case语句

示例:

  1. case readline(stdin)
  2. of "delete-everything", "restart-computer":
  3. echo "permission denied"
  4. of "go-for-a-walk": echo "please yourself"
  5. else: echo "unknown command"
  6.  
  7. # 允许分支缩进; 冒号也是可选的
  8. # 在选择表达式后:
  9. case readline(stdin):
  10. of "delete-everything", "restart-computer":
  11. echo "permission denied"
  12. of "go-for-a-walk": echo "please yourself"
  13. else: echo "unknown command"

case 语句类似于if语句,但它表示多分支选择。

评估关键字 case 之后的表达式,如果它的值在 slicelist 中,则执行在 of 关键字之后的相应语句。

如果该值不在任何给定的 slicelist 中,则执行 else 部分。 如果没有 else 部分而且 expr 可以保持在 slicelist 中的所有可能值,则会发生静态错误。 这仅适用于序数类型的表达式。 expr 的“所有可能的值”由 expr 的类型决定。 为了阻止静态错误,应该使用带有空 discard 语句的 else 部分。

对于非序数类型,不可能列出每个可能的值,因此这些值总是需要 else 部分。

因为在语义分析期间检查case语句的详尽性,所以每个 of 分支中的值必须是常量表达式。 此限制还允许编译器生成更高性能的代码。

作为一种特殊的语义扩展,case语句的 of 分支中的表达式可以计算为集合或数组构造函数;然后将集合或数组扩展为其元素列表:

  1. const
  2. SymChars: set[char] = {'a'..'z', 'A'..'Z', '\x80'..'\xFF'}
  3.  
  4. proc classify(s: string) =
  5. case s[0]
  6. of SymChars, '_': echo "an identifier"
  7. of '0'..'9': echo "a number"
  8. else: echo "other"
  9.  
  10. # is equivalent to:
  11. proc classify(s: string) =
  12. case s[0]
  13. of 'a'..'z', 'A'..'Z', '\x80'..'\xFF', '_': echo "an identifier"
  14. of '0'..'9': echo "a number"
  15. else: echo "other"