中置操作符(二元操作符),操作符位于两个参数之间。操作符包括字母,比如to,也可以包括操作符字符,比如1->10,等同于方法调用1.->(10)
a 标识符 b
其中的标识符是一个带有两个参数的方法(一个隐式参数和一个显式参数),例如: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)
}
一元操作符,只有一个参数的操作符,分为前置操作符(操作符出现在参数之前,包括+、-、!、~)和后置操作符(操作符出现在参数之后)
a 标识符
上述表达式等同于方法调用a.标识符()。例如:1 toString 等同于 1.toString
赋值操作符的名称形式为操作符=,以下表达式
a 操作符= b
等同于
a = a 操作符 b
例如 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接收一个对象,然后从中提取值——通常这些值就是当初构造对象的值。