第七章 内建控制结构

Scala中的内建控制结构只有:if, while, for, try, match 和函数调用而已。 之所以没有更高级的内建控制结构,是因为Scala从语法层面上支持函数字面量,可以在基本语法上添加高级的内建控制结构。

  • if表达式

  • 同其他语言的if语法结构类似

  • if是可以返回值的,这里展示一个函数式风格编写的例子:
    val filename = if(!args.isEmpty) args(0); else "default.txt";
  • while循环

  • 与其他语言中的while循环完全一致

  • while和do-while之所以被称为“循环”,而不是表达式,是因为他们不能产生有意义的 结果。其结果类型是Unit

  • for表达式

  • for能做的最简单的事情就是把集合中的所有元素都枚举一遍

  • 例举一个采用发生器语法的例子,file <- filesHere
    val filesHere = (new java.io.File(".")).listsFiles;
    for(file <- filesHere) println(file);
  • 使用 “ 1 to n ” 可以创建Range类型,如果不想包含上边界则可以使用 “ 1 until n ”
  • 守卫,在for中增加if判断条件
val filesHere = (new java.io.File(".")).listsFiles;
for(file <- filesHere if file.getName.endsWith(".scala")) println(file);
  • 还可以在for循环中加入多个 <- 子句
  • 可以进行流间变量绑定,绑定的变量被当作val引入和使用,但不带关键字val
  • 制造新集合,用关键字 yield 使for表达式产生的结果存放在数组中
def scalaFiles = for (file <- filesHere if file.getName.endsWith(".scala")) yield file
  • 使用try表达式处理异常

  1. 抛出异常
    Scala中,throw也是有结果类型的表达式
    val half = 
        if (n % 2 == 0) 
           n / 2;
        else
           throw new RuntimeException("n must be even");
  2. 捕获异常
     Scala选择catch子句这种语法的原因是为了与模式匹配保持一致
    try {
     ...
    }
    catch {
     case ex: ... => ...
     case ex: ... => ...
     case ex: ... => ...
    }
  3. finally子句
     如果需要让某些代码无论如何终止都要执行时,可以将其放在finally子句里
  4. 生成值
     和大多数Scala控制结构一样,try-catch-finally也产生值
  • match表达式

  • 类似其他语言的switch

  • 可以让你使用任意的模式做选择
  • 每个备选项后面并没有break,break是隐含的

  • 不再使用break和continue

  • 变量范围

  • Scala允许在内部范围内创建与外部范围变量同名的变量

  • 脱离所在大括号范围时,变量失效
文章导航