標籤:scala操作符 提取器 scala update 優先順序
1. 標識符
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. 一元操作符
1 toString 等價於 1.toString() val a = 42 -a 等價於 a.unary_-
4. 賦值操作符
- 賦值操作符的形式為
操作符=,運算式是 a 操作符= b ,等價於 a = a 操作符 b 。
a += 1 等價於 a = a + 1
<=、>=、!=、==、===、=/= 等不是賦值操作符,
5. 優先順序
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
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) }
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+")) }
【待續】
著作權聲明:本文為博主原創文章,未經博主允許不得轉載。
Chapter12 Scala操作符