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