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

鍍金池/ 教程/ Scala/ 概述和例子說明
信息隱藏
類型上界
Variance(類型變體)標(biāo)識
概述和例子說明
類型下界

概述和例子說明

本專題介紹 Scala 的參數(shù)化類型,在介紹的過程中同時演示了信息隱藏的技術(shù),這里我們通過實現(xiàn)一個純函數(shù)化實現(xiàn)的隊列來舉例說明。

參數(shù)化類型幫助你實現(xiàn)通用的類型和 Trait。比如通用的集合類 Set,該通用集合類可以通過制定類型參數(shù) T,Set[T],它通過實例化參數(shù)類型,可以定義 Set[String],Set[Int] 等等。

此外,一般來說 String 是 AnyRef,但在其它一些語言中,Set[String] 并一定是 Set[AnyRef] 的子類。在 Scala 中可以通過制定參數(shù)化類型之間的繼承屬性的 Variance 特性,來說明該參數(shù)化類型中使用不同的參數(shù)類型后的類型之間是否也存在繼承關(guān)系。

首先我們定義一些我們要實現(xiàn)的這個簡單的對象的一些基本需求:
這個函數(shù)化隊列要求支持下面三個基本操作:

  • head 返回隊列的首元素
  • tail 返回隊列的除首元素之外的其余元素(也是一個隊列)
  • enqueue 把新元素添加到隊列尾部后返回一個新隊列。

和一般隊列實現(xiàn)不同的是,函數(shù)化隊列實現(xiàn)時不改變隊列的內(nèi)容,當(dāng)需要修改隊列時構(gòu)造一個新隊列。

如何構(gòu)造一個效率高的隊列呢?也就是 head,tail,enqueue所花費(fèi)的時間不應(yīng)當(dāng)隨隊列的大小而改變,一個簡單的實現(xiàn)可以使用 List 類來實現(xiàn),但 enqueue 操作的時間和隊列的長度成正比,這里給出一個使用兩個 List 對象的隊列實現(xiàn),具體算法不解釋了(本專題側(cè)重點不在算法本身)可以實現(xiàn)一個高效的隊列操作。

class Queue[T](
  private val leading:List[T],
  private val trailing:List[T]
 ){
  private def mirror =
    if(leading.isEmpty)
      new Queue(trailing.reverse,Nil)
    else
       this
  def head=mirror.leading.head
  def tail={
    val q= mirror
      new Queue(q.leading.tail,q.trailing)
  }
  def enqueue(x:T)=
    new Queue(leading,x::trailing)
}

使用這個實現(xiàn),進(jìn)行一些基本的隊列操作:

scala> val q = new Queue(List(1,2,3),Nil)
q: Queue[Int] = Queue@24cc40b6
scala> val q1 = q enqueue 4
q1: Queue[Int] = Queue@67825189
scala> q
res0: Queue[Int] = Queue@24cc40b6
scala> val p = q1 head
p: Int = 1
scala> q1
res1: Queue[Int] = Queue@67825189

這個實現(xiàn)滿足功能需求,但我們希望可以實現(xiàn)如下的形式:

scala> val q = Queue(1,2,3)
q: Queue[Int] = Queue(1,2,3)
scala> val q1 = q enqueue 4
q1: Queue[Int] = Queue(1,2,3,4)
scala> q
q: Queue[Int] = Queue(1,2,3)

在之后的文章我們逐步的優(yōu)化這個實現(xiàn)。