中置操做符(二元操做符),操做符位于两个参数之间。操做符包括字母,好比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接收一个对象,而后从中提取值——一般这些值就是当初构造对象的值。