第七章 内建控制结构

最后更新于:2022-04-01 20:15:47

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允许在内部范围内创建与外部范围变量同名的变量 - 脱离所在大括号范围时,变量失效
';