scala隱式詳解

定義

使用implicit 關鍵字

			implicit val rate: Float = 0.05F
			
            implicit def float2Int(float: Float) = {
                float.toInt
            }

隱式參數

調用方法時,如果未輸入隱式參數且代碼所處作用域中存在類型兼容的隱式值,該值會從作用域中調出並被使用,反之,系統將會拋出編譯器錯誤。

def calcTax(amount: Float)(implicit rate: Float): Float = amount * rate


調用該方法時,系統會將代碼所在局部作用域中的某一隱式值傳入此方法:
implicit val currentTaxRate = 0.08F
...
val tax = calcTax(50000F) // 4000.0

implicitly

在下面的代碼裏,我們定義了一個樣例類,然後定義兩個排序方法sortBy1sortBy2,從作用上講兩者是一樣的:將list中的A對象映射成B對象,然後對按Ordering[B]規則對list排序。

import math.Ordering
case class MyList[A](list: List[A]) {
    def sortBy1[B](f: A => B)(implicit ord: Ordering[B]): List[A] =
        list.sortBy(f)(ord)
    
    
    def sortBy2[B : Ordering](f: A => B): List[A] =
        list.sortBy(f)(implicitly[Ordering[B]])
}

sortBy2是對sortBy1的簡寫。在sortBy1中要傳入一個隱式參數,然後在方法體內要調用。然後sortBy2中省略了參數的傳入,但是要對B類型進行約束。因爲不是所有的B類型可以生成Ordering[B]。然後由於沒有顯示的參數定義,所以不能在調用的時候向sortBy1一樣傳一個ord參數。但是可以用implicitly關鍵字來搜索和轉換一個。

scala> implicitly[Ordering[String]]
res5: Ordering[String] = scala.math.Ordering$String$@7ba93755
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章