在Scala中,yield是一个保留字,但你可能需要访问Java中一个同样命名的方法。反引号来拯救你:Thread.`yield`()。
1.中置操作符
你可以这样写
a 标识符 b
例如:
1 to 10 等同于 1.to(10)
1 -> 10 等同于 1.->(10)
2.一元操作符
中置操作符是二元的,它有两个参数(一个显示参数一个隐式参数),只有一个操作符的参数称为一元操作符。如果它出现在参数之后,那么他就是一个后置操作符。例如:
a 标识符
又如:
1 toString 等同于 1.toString()
如下四个操作符+、-、!、~可以作为前置操作符,出现在参数之前。它们被转换成名为 unary_操作符 的方法调用。例如:
a 等同于 a.unary_-一样
3.赋值操作符
赋值名称的操作符名称形式为 操作符= 以下表达式:
a 操作符= b 等同于 a = a 操作符 b 例如:
a += b 等同于 a = a + b
关于赋值操作符,有些细节要注意:
- <=、>=和!=不是赋值操作符
- 以=开头的操作符不是赋值操作符(==、===、=/=等)。
- 如果a有一个名为操作符=的方法,那么该方法会被直接调用。
4.优先级
当你一次性使用两个或更多操作符,有没有给出括号的话,首先执行的是最好优先级的操作符。
除赋值操作外,优先级由操作符的首字符决定。
出现在同一行字符所产生的操作符优先级相同。举例来说,+和→有着相同的优先级。
后置操作符的优先级低于中置操作符:
a 中置操作符 b 后置操作符
上述代码等同于:
(a 中置操作符 b) 后置操作符
5.结合性
当你有一系列相同优先级的操作符时,操作符的结合性决定了它们是从左到右求值还是从右到左求值。
在Scala当中,所有操作符都是左结合的,除了:
- 以冒号(:)结尾的操作符
- 赋值操作符(=)
尤其值得一提的是,用于狗仔列表的::操作符时右结合的。例如:
1 :: 2 :: Nil 等同于 1 :: (2 :: Nil)
右结合的二元操作符是其第二个参数的方法。例如:
2 :: Nil 等同于 Nil.::(2)
注:Nil的作用是构造一个空的集合(List)
6.apply和update方法
之前我们提到过的apply方法也是一种操作符。
update方法被用于数组和映射的赋值操作。
在数组或映射当中,apply方法相当于get,update方法相当于set。例如:
Array(100) //Array.apply(100)
Array(100) = 200 //Array.apply(200)
7.提取器
所谓的提取器就是一个带有unapply方法的对象。你可以把unapply方法当做是伴生对象中apply的反向操作。
apply方法接收构造参数,然后将他们变成对象。而unapply方法接受一个对象,然后从中提取值。
我们说apply和unapply互为反向。单着并不是必须的,你可以用提取器从任何类型的对象中提取任何信息。
例如:
class Fraction(val n:Int, val d:Int){
}
object Fraction{
def apply(n:Int, d:Int) = new Fraction(n, d)
def unapply(f:Fraction) = Some(f.n, f.d);
}
apply调用:
val f = Fraction(1, 2)
unapply调用:
val Fraction(a,b) = f
输出:
a: Int = 1
b: Int = 2
8.待单个参数或无参数的提取器
在Scala中,并没有只带一个组件的元组。如果unapply方法要提取单值,则她应该返回一个目标类型的Option。例如:
object Number{
def unapply(input: String): Option[Int] = {
try{
Some(Integer.parseInt(input.trim))
} catch{
case ex: UnmberFormatException => None
}
}
}
9.unapplySeq方法
要提取任意长度的值得序列,我们应该用unapplySeq来命名我们的方法。它返回一个Option[Seq[A]],其中A是被提取的值得类型。例如:
object Name{
def unapplySeq(input: String): Option[Seq[String]] = {
if(inout.trim == "" ) None else Some(input.trim.split("\\s+"))
}
}
说明:unapply和unapplySeq与模式匹配器一起使用,效果奇佳。