操作符
标识符
变量,函数,类等的名称统称为标识符。
中置操作符
如下:
a 标识符 b
这种标识符代表一个带有两个参数的方法。
比如:
1 to 10
//等价于
1.to(10)
1 -> 10
//等价于
1.->(10)
这种表达式叫做中置表达式。
一元操作符
中置操作符是二元的,因为它有两个参数。
只有一个参数叫做一元操作符。
比如:
1.toString()
//等价于:
1 toString
标识符出现在前面的,叫做前置操作符
标识符出现在后面的,叫做后置操作符
比如:
-a +a !=a :前置操作符
a toString :后置操作符
赋值操作符
a 操作符= b
举例:
a += b
//等价于:
a = a + b
注意:<=、>=、和!=不是赋值操作符
以=开头的操作符不是赋值操作符(==,===,=/=等)
如果a有一个名为操作符=的方法,那么该方法会被直接调用。
优先级
优先级(高->低) | 优先级(高->低) |
---|---|
1 | * / % |
2 | +- |
3 | : |
4 | <> |
5 | != |
6 | & |
7 | ^ |
8 | | |
9 | 非操作符 |
10 | 最低优先级:赋值操作符 |
结合性
Scala中所有操作符都是左结合,即从左向右运算,除了:
1.以冒号(:)结尾的操作符;
2.赋值操作符。
例子:
1 :: 2 :: Nil
//等价于:
1 :: (2 :: Nil)
apply方法和update方法
Scala允许你将如下的函数调用语法:
f(arg1, arg2, ...)
扩展到可以应用于函数之外的值。如果f不是函数或者方法,那么这个表达式就等同于调用:
f.apply(arg1, arg2, ...)
除非它出现在赋值语句的等号的左侧。比如:
f(arg1, arg2, ...) = value
那么,它对应的调用就是:
f.update(arg1, arg2, ...)
这个机制被用于数组和映射。
val scores = new scala.collection.mutable.HashMap(String, Int)
scores("Bob") = 100 //调用update
val bobScore = scores("Bob") //调用apply
提取器
所谓提取器就是:一个带有unapply方法的对象。
class Fraction(n: Int, d: Int) {
...
}
objcet 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))
}
带单个参数或无参的提取器
Scala中,并没有只带有一个组件的元组。
如果unapply方法要提取单值,则它应该返回一个目标类型的Option。
object Number {
def unapply(input: String): Option[Int] =
try {
Some(Integer.parseInt(input.trim))
}catch {
case ex: NumberFormatException => None
}
}
调用:
val Number(n) = "1729"
unapplySeq方法
要提取任意长度的值的序列,要使用unapplySeq来命名我们的方法。
它返回一个Option[Seq[A]],其中A是被提取的值的类型。
object Name {
def unapplySeq(input: String): Option[Seq[String]] =
if (input.trim == "") None else Some(input.trim.split("\\s+"))
}
这样,你就能匹配并取到任意数量的变量了:
author match {
case Name(first, last) => ...
case Name(first, middle, last) => ...
case Name(first, "van", "der", last) => ...
...
}