在线观看不卡亚洲电影_亚洲妓女99综合网_91青青青亚洲娱乐在线观看_日韩无码高清综合久久

鍍金池/ 教程/ Scala/ 隱含參數(shù)(二)
轉(zhuǎn)換被方法調(diào)用的對(duì)象
View 限定
概述
當(dāng)有多個(gè)隱含轉(zhuǎn)換可以選擇時(shí)
隱含參數(shù)(二)
隱含參數(shù)(一)
使用 implicits 的一些規(guī)則
隱含類型轉(zhuǎn)換

隱含參數(shù)(二)

隱含參數(shù)的另外一個(gè)用法是給前面明確定義的參數(shù)補(bǔ)充說(shuō)明一些信息。 我們先給出一個(gè)沒(méi)有使用隱含參數(shù)的例子:

def maxListUpBound[T <:Ordered[T]](element:List[T]):T =
    element match {
      case List() =>
        throw new IllegalArgumentException("empty list!")
      case List(x) => x
      case x::rest =>
        val maxRest=maxListUpBound(rest)
        if(x > maxRest) x
        else maxRest
    }

這個(gè)函數(shù)是求取一個(gè)順序列表的最大值。但這個(gè)函數(shù)有個(gè)局限,它要求類型 T 是 Ordered[T]的一個(gè)子類,因此這個(gè)函數(shù)無(wú)法求一個(gè)整數(shù)列表的最大值。

下面我們使用隱含參數(shù)來(lái)解決這個(gè)問(wèn)題。 我們可以再定義一個(gè)隱含參數(shù),其類型為一函數(shù)類型,可以把一個(gè)類型T轉(zhuǎn)換成 Ordered[T]。

def maxListImpParam[T](element:List[T])
                    (implicit orderer:T => Ordered[T]):T =
    element match {
      case List() =>
        throw new IllegalArgumentException("empty list!")
      case List(x) => x
      case x::rest =>
        val maxRest=maxListImpParam(rest)(orderer)
        if(orderer(x) > maxRest) x
        else maxRest
    }

在這個(gè)函數(shù)中,隱含參數(shù)使用中兩個(gè)地方,一個(gè)遞歸調(diào)用時(shí)傳入,第二個(gè)是檢查列表的表頭是否大于列表其余部分的最大值。這個(gè)例子的隱含參數(shù)給前面定義的類型T補(bǔ)充了一些信息,也就是如果比較兩個(gè)類型 T 對(duì)象。

這種用法非常普遍以至于 Scala 的庫(kù)缺省定義很多類型隱含的到 Ordered 類型的變換。例如我們調(diào)用這個(gè)函數(shù):

scala> maxListImpParam(List(1,5,10,34,23))
res2: Int = 34
scala> maxListImpParam(List(3.4,5.6,23,1.2))
res3: Double = 23.0
scala> maxListImpParam(List("one","two","three"))
res4: String = two

在這幾個(gè)調(diào)用中,編譯器自動(dòng)為函數(shù)添加了對(duì)應(yīng)的 orderer 參數(shù)。