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允許在內部范圍內創建與外部范圍變量同名的變量
- 脫離所在大括號范圍時,變量失效