中置操做符(二元操做符),操做符位於兩個參數之間。操做符包括字母,好比to,也能夠包括操做符字符,好比1->10,等同於方法調用1.->(10)數組
a 標識符 bapp
其中的標識符是一個帶有兩個參數的方法(一個隱式參數和一個顯式參數),例如:1 to 10,其實是一個方法調用1.to(10)函數
class Fraction(n: Int, d: Int) { val num: Int = n val den: Int = d //使用操做符的名稱來定義一個方法 def *(other: Fraction) = new Fraction(num* other.num, den* other.den) }
一元操做符,只有一個參數的操做符,分爲前置操做符(操做符出如今參數以前,包括+、-、!、~)和後置操做符(操做符出如今參數以後)spa
a 標識符scala
上述表達式等同於方法調用a.標識符()。例如:1 toString 等同於 1.toStringcode
賦值操做符的名稱形式爲操做符=,如下表達式
對象
a 操做符= bblog
等同於io
a = a 操做符 btable
例如 a += b 等同於 a = a+b
注意:
1)<=、>=和!=不是賦值運算符
2)以=開頭的操做符不是賦值操做符(==、===、=/=等)
3)若是a有一個名爲操做符=的方法,那麼該方法會被直接調用
操做符優先級
出如今同一行字符所產生的操做符相同優先級。
結合性
apply和update方法
scala容許以下的函數調用方法
f(arg1,arg2,arg3,...)
擴展到能夠應用於函數外的值,若是f不是函數或方法,那麼這個表達式就等同於調用
f.apply(arg1,arg2,arg3,...)
除非上述表達書出如今賦值語句的等號左側。表達式
f(arg1,arg2,arg3,...) = value
對應以下調用
f.update(arg1,arg2,arg3,...,value)
這個機制被應用於數組和映射,例如
import scala.collection.mutable val scores = new mutable.HashMap[String,Int]() scores("Bob") = 100 // 調用scores.update("Bob",100) val bobsScore = scores("Bob") // 調用scores.apply("Bob")
apply方法還常被應用到伴生對象中,用來構造對象而不用顯式的使用new。例如
class Fraction(n: Int, d: Int) { val num: Int = n val den: Int = d //使用操做符的名稱來定義一個方法 def *(other: Fraction) = new Fraction(num* other.num, den* other.den) } object Fraction extends App{ def apply(n: Int, d: Int) = new Fraction(n, d) }
有了這個apply方法,能夠直接用Fraction(3,4)來構造一個分數,而不是new Fraction(3,4)。這樣在須要大量的Fraction對象須要構造的時候,會很方便,例如
val result = Fraction(3,4) * Fraction(2,5)
提取器
所謂提取器,就是一個帶有unapply方法的對象,能夠把unapply當作是伴生對象中apply方法的反操做。apply方法接收構造參數,把它們變成對象。unapply接收一個對象,而後從中提取值——一般這些值就是當初構造對象的值。