在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與模式匹配器一塊兒使用,效果奇佳。