在Scala中,yield是一个保留字,但你可能须要访问Java中一个一样命名的方法。反引号来拯救你:Thread.`yield`()。数组
你能够这样写app
a 标识符 bspa
例如:scala
1 to 10 等同于 1.to(10)code
1 -> 10 等同于 1.->(10)orm
中置操做符是二元的,它有两个参数(一个显示参数一个隐式参数),只有一个操做符的参数称为一元操做符。若是它出如今参数以后,那么他就是一个后置操做符。例如:对象
a 标识符get
又如:input
1 toString 等同于 1.toString()it
以下四个操做符+、-、!、~能够做为前置操做符,出如今参数以前。它们被转换成名为 unary_操做符 的方法调用。例如:
a 等同于 a.unary_-同样
赋值名称的操做符名称形式为 操做符= 如下表达式:
a 操做符= b 等同于 a = a 操做符 b 例如:
a += b 等同于 a = a + b
关于赋值操做符,有些细节要注意:
当你一次性使用两个或更多操做符,有没有给出括号的话,首先执行的是最好优先级的操做符。
除赋值操做外,优先级由操做符的首字符决定。
出如今同一行字符所产生的操做符优先级相同。举例来讲,+和→有着相同的优先级。
后置操做符的优先级低于中置操做符:
a 中置操做符 b 后置操做符
上述代码等同于:
(a 中置操做符 b) 后置操做符
当你有一系列相同优先级的操做符时,操做符的结合性决定了它们是从左到右求值仍是从右到左求值。
在Scala当中,全部操做符都是左结合的,除了:
尤为值得一提的是,用于狗仔列表的::操做符时右结合的。例如:
1 :: 2 :: Nil 等同于 1 :: (2 :: Nil)
右结合的二元操做符是其第二个参数的方法。例如:
2 :: Nil 等同于 Nil.::(2)
注:Nil的做用是构造一个空的集合(List)
以前咱们提到过的apply方法也是一种操做符。
update方法被用于数组和映射的赋值操做。
在数组或映射当中,apply方法至关于get,update方法至关于set。例如:
Array(100) //Array.apply(100) Array(100) = 200 //Array.apply(200)
所谓的提取器就是一个带有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
在Scala中,并无只带一个组件的元组。若是unapply方法要提取单值,则她应该返回一个目标类型的Option。例如:
object Number{ def unapply(input: String): Option[Int] = { try{ Some(Integer.parseInt(input.trim)) } catch{ case ex: UnmberFormatException => None } } }
要提取任意长度的值得序列,咱们应该用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与模式匹配器一块儿使用,效果奇佳。