Scala學習筆記(4):關於String

Scala並無定義本身的String類型,而是直接借用了Java中的String,因此若是你定義一個String類型的值: html

val str = "hello"
返回的值的類型直接就是java.lang.String。然而,咱們知道在Scala中能夠像使用List同樣來操做String值,例如:
str.reverse  //String = olleh
str.map(_.toUpper)  //String = HELLO
str drop 3  //String = lo
str slice (1, 4)  //String = ell
val s: Seq[Char] = str

可是,map, drop,slice等操做並無在java.lang.String中定義,爲何能夠直接在這裏使用? java

熟悉C#的同窗應該都知道C#提供了extends method來擴展已有的類庫,來給外部類型定義新的方法。Scala不支持extends method,可是提供了implicit conversion(隱式轉換),它能夠實現一樣的效果並且更加靈活。感興趣的同窗能夠看看這個視頻編程

究竟什麼是implicit conversions?其實就是進行從一個類型到另外一個類型的隱式轉換。例以下面這個例子把一個Float值賦給一個Int變量,默認是出錯的: app

scala> val i: Int = 3.5
<console>:4: error: type mismatch;
found : Double(3.5)
required: Int
val i: Int = 3.5
可是若是定義一個implicit轉換函數,就能夠作到隱式轉換。
implicit def doubleToInt(x: Double) = x.toInt

scala> val i: Int = 3.5
i: Int = 3

上面說的是implicit函數,在Scala 2.10中又新增了implicit class這個功能,能夠更加方便地進行類型轉換。具體能夠看這個文檔函數

回到String類型,實際上Scala在java.lang.String上定義了兩個不一樣優先級的implicit conversion,按須要編譯器會自動選擇使用: ui

  1. 優先級低的轉換,把String類型被轉成WrappedString類型,該類型是immutable.IndexedSeq的一個子類。在下面這個例子中就用到了這個隱式轉換
    val s: Seq[Char] = str
  2. 優先級高的轉換,把String類型轉換成StringOps,其中包括了全部immutable sequence的方法。在碰到reverse, map, drop和slice方法時編譯器會自動插入這個轉換。

這種基於隱式轉換的類型擴展,值得在實際Scala編程中實踐。 scala

相關文章
相關標籤/搜索