Scala學習(十一)操做符

在Scala中,yield是一個保留字,但你可能須要訪問Java中一個一樣命名的方法。反引號來拯救你:Thread.`yield`()。數組

1.中置操做符

你能夠這樣寫app

a 標識符 bspa

例如:scala

1 to 10  等同於 1.to(10)code

1 -> 10  等同於 1.->(10)orm

2.一元操做符

中置操做符是二元的,它有兩個參數(一個顯示參數一個隱式參數),只有一個操做符的參數稱爲一元操做符。若是它出如今參數以後,那麼他就是一個後置操做符。例如:對象

a 標識符get

又如:input

1 toString 等同於 1.toString()it

以下四個操做符+、-、!、~能夠做爲前置操做符,出如今參數以前。它們被轉換成名爲 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與模式匹配器一塊兒使用,效果奇佳。

相關文章
相關標籤/搜索