### 1. 條件表達式
-
Scala表達式中if/else有值。
~~~
if (x > 0) 1 else -1
等同于C++中:x>0 ? 1 : -1
~~~
-
else 部分缺失,引入`Unit類`,寫成(),不帶else的語句等同于:
~~~
if (x > 0) 1 else ()
~~~
這里Unit相當于C++中void。
-
Scala沒有switch語句。
-
在REPL(Read-Eval-Print Loop)中輸入代碼塊,可以鍵入`:paste`,然后按`Ctrl+D`結束。
### 2. 語句終止
-
Scala語言中行尾不需要分號,只要上下文能明確判斷出終止即可。
-
要想在單行中寫多個語句,就需要分號隔開。(不推薦使用)
~~~
if(n > 0) {r += 1; n += 1}
~~~
-
較長語句以不能用做語句結尾的符號結尾。
~~~
s = 4 + 3 * s0 - 8 + //這里的+號就告訴編譯器,這不是行結尾
0.5 * 4.3 -2.3
~~~
### 3. 塊表達式和賦值
-
`{}`塊包含一系列表達式,塊的值就是最后一個表達式的值。
-
賦值語句塊的值返回的是`Unit類型`,寫做`()`。
~~~
x = y = 2 //不要這么做,y=2返回的是一個Unit類型
~~~
### 4. 輸入和輸出
-
`print`和`println`不同之處是,`println`多輸出一個換行符。還有一個帶有C風格格式化的`printf`。
-
`readLine`從控制臺讀入一行(唯一可以帶一個參數作為提示符字符串),readInt、readDouble、readBoolean、readChar、readLong、readByte等都是用于輸入。
### 5. 循環
-
while和do循環與C++相同。
-
for循環結構如下。
~~~
//1 to n返回數字1到n的一個區間
//讓變量遍歷<-右邊的表達式所有值
for(i <- 1 to n)
r = r * i
~~~
- 遍歷字符串或數組時,用`until方法`,util方法返回一個并不包含上屆的區間。
~~~
val s = "Hello"
var sum = 0
for(i <- 0 until s.length)//i的最后一個值為s.length-1
sum += s(i)
//上面等價于下面
for(ch <- "Hello") sum += ch
~~~
-
Scala沒有提供break或continue
-
如果要用break可以使用下面三種方法:

### 6. 高級for循環和for推導式
- for可以提供多個生成器,用分號隔開。
~~~
for(i <- 1 to 3; j <- 1 to 3)
print(((i * 10) + j) + " ")
~~~
- 每個生成器可以帶一個守衛,以if開頭的Boolean表達式。(if前沒有分號)
~~~
for(i <- 1 to 3; j <- 1 to 3 if i != j)
print(((i * 10) + j) + " ")
~~~
-
for循環中可以使用變量。
-
for推導式:for循環體以`yeild`開始,會構造一個集合,每次迭代生成集合中的一個值。
~~~
for(i <- 1 to 3)
i % 3//最后生成Vector(1,2,0,1,2,0,1,2,0,1)
~~~
- for推導式生成的集合與第一個生成式的類型兼容。
### 7. 函數
- 基本函數定義如下。
~~~
def fac(n : Int) = {//等號右邊表達式的類型推出函數返回類型
var r = 1
for (i <- 1 to n) r = r * i
r//可以用return,但不常見
}
~~~
- 函數不是遞歸的,就不需要指定返回值。對于遞歸函數,必須指明返回類型。
~~~
def fac(n : Int) : Int= {//等號右邊表達式的類型推出函數返回類型
if (n <= 0)
1
else
n * fac(n - 1)
}
~~~
### 8. 默認參數和帶名參數
- 定義如下:
~~~
def f(str: String, left: String = "[", right: String = "]") = {
left + str + right
}
~~~
-
調用
~~~
f("Hello", right = "}") // 這里混合使用了未帶名參數和帶名參數
~~~
### 9. 變長參數
- 定義如下:
~~~
def sum(args: Int*) = {
var result = 0
for (arg <- args)
result += arg
result
~~~
- 調用
~~~
val s = sum(1, 3, 8, 9)
val s = sum(1 to 5: _*)//要使用一個值得序列,把1 to 5當成一個序列必須追加:_*
~~~
### 10. 過程
- 定義:有的函數不返回值,只需要去掉花括號前面的=號,它的返回類型是Unit。
~~~
def box(s: String) {
println("hello world" + s "\n")
}
等價于:
def box(s: String): Unit = {
println("hello world" + s "\n")
}
~~~
### 11. 懶值
-
當val被聲明為`lazy`時,它的初始化將被推遲,直到我們首次取值。
~~~
lazy val words = "hello scala"
~~~
### 12. 異常
-
Scala異常工作機制跟Java和C++一樣,拋出異常時,比如(throw表示式的類型為Nothing)。
~~~
throw new IllegalArgumentException("x should not be negative")
~~~
-
在if/else中,如果一個分支是Nothing類型,則if/else表達式的類型就是另一個分支的類型。
-
異常捕獲用`try/catch`或`try/finally`或`try/catch/finally`。
【待續】