### 1. 標識符
-
變量名、函數名、類名等統稱為標識符,scala可以使用任何字符來作標識符,比如 `()!#%&×+-/:<>=?@\^|~` 等。
-
反引號中可以使用任何字符序列。
~~~
val √ = scala.math.sqrt _
√(2)
val `val` = 42
println(`val`)
~~~
### 2. 中置操作符
-
操作符要接兩個參數,分別位于操作符兩邊。
-
`a 標識符 b` 等價于 `a.標識符(b)` 。
~~~
1 to 10
等價于 1.to(10)
1 -> 10
等價于 1 .->(10)
~~~
### 3. 一元操作符
-
只有一個參數的操作符成為一元操作符,操作符的位置可能位于參數的前或后,所有有下面兩種情況。
-
`a 標識符` 等價于 `a.標識符()` ,`標識符 a` 等價于 `a.unary_標識符` 。
~~~
1 toString
等價于 1.toString()
val a = 42
-a
等價于 a.unary_-
~~~
### 4. 賦值操作符
- 賦值操作符的形式為 `操作符=`,表達式是 `a 操作符= b` ,等價于 `a = a 操作符 b` 。
~~~
a += 1
等價于 a = a + 1
~~~
- `<=、>=、!=、==、===、=/=` 等不是賦值操作符,
### 5. 優先級
-
后置操作符優先級低于中置操作符,`a 中置操作符 b 后置操作符` 等價于 `(a 中置操作符 b) 后置操作符` 。
-
符號優先級如下表所示:
| 操作符 | 優先級 |
|-----|-----|
| 除下面字符以外的操作符 | 1(最高) |
| * / % | 2 |
| + - | 3 |
| : | 4 |
| < > | 5 |
| != | 6 |
| & | 7 |
| ^ | 8 |
| | | 9 |
| 賦值操作符 | 10(最低) |
### 6. 結合性
- Scala除冒號操作符和賦值操作符是右結合,所有其他操作符都是左結合。
~~~
// 構造列表List
1 :: 2 :: Nil // :: 右結合
1 :: (2 :: Nil)
(1 :: 2) :: Nil // 錯誤
~~~
- 右結合的的第二個參數就是方法,比如 `2::Nil` 等價于 `Nil.::(2)`。
### 7. apply和update方法
- 函數或方法位于賦值語句的等號左側,調用的是update方法,否則調用的apply方法。
~~~
val scores = new scala.collection.mutable.HashMap[String, Int]
scores("Bob") = 100
等價于調用:scores.update("Bob", 100)
val bobsScore = scores("Bob")
等價于調用:scores.apply("Bob")
~~~
### 8. 提取器unapply
-
提取器:是一個帶有unapply方法的對象,可以當做是伴生對象apply的方法的反操作。
-
unapply接受一個對象,從中提取值。
~~~
class Fraction(n: Int, d: Int) {
private val num: Int = if (d == 0) 1 else n;
private val den: Int = if (d == 0) 0 else d;
def *(other: Fraction) = new Fraction(num * other.num, den * other.den)
}
// unapply返回的就是構造該對象的兩個值
object Fraction {
def apply(n: Int, d: Int) = new Fraction(n, d)
def unapply(input: Fraction) =
if (input.den == 0) None else Some((input.num, input.den))
}
object Main extends App {
var Fraction(a, b) = Fraction(3, 4) * Fraction(2, 5)
println(a)
println(b)
}
~~~
-
每個樣例類都會自動具備apply方法和unapply方法,樣例類后面章節會講解,這里只要了解就可以。
-
提取器可以只測試輸入而不真正將其值提取出來,只返回一個Boolean。
### 9. unapplySeq方法
- 使用unapplySeq方法可以提取任意長度的值序列,它返回一個Option[Seq[A]],A是被提取的類型。
~~~
// Name 提取器可以產生所有組成部分的序列
// 關于 Option,Some,None后面章節會詳細講解,這里只需了解upapplySeq的作用就可以。
object Name {
def unapplySeq(input: String): Option[Seq[String]] =
if (input.trim == "") None else Some(input.trim.split("\\s+"))
}
~~~
【待續】