Scala 組合和繼承–實(shí)現(xiàn)類 Element 的 above,beside 和 toString()方法

2018-09-28 18:21 更新

組合和繼承–實(shí)現(xiàn)類 Element 的 above,beside 和 toString()方法

我們接著實(shí)現(xiàn)類 Element 的其它方法,如 above, beside 和 toString 方法。

above 方法,意味著把一個布局元素放在另外一個布局元素的上方,也就是把這兩個元素的 contents 的內(nèi)容連接起來。我們首先實(shí)現(xiàn) above 函數(shù)的第一個版本:

def above(that: Element) :Element =
    new ArrayElement(this.contents ++ that.contents)

Scala 中 Array 使用 Java Array 來實(shí)現(xiàn),但添加很多其它方法,尤其是 Scala 中 Array 可以轉(zhuǎn)換為 scala.Seq 類的實(shí)例對象,scala.Seq 為一個序列結(jié)構(gòu)并提供了許多方法來訪問和轉(zhuǎn)換這個序列。

實(shí)際上上面 above 的實(shí)現(xiàn)不是十分有效,因?yàn)樗辉试S你把不同長度的布局元素疊加到另外一個布局元素上面,但就目前來說,我們還是暫時使用這個實(shí)現(xiàn),只使用同樣長度的布局元素,后面再提供這個版本的增強(qiáng)版本。

下面我們再實(shí)現(xiàn)類 Element 的另外一個 beside 方法,把兩個布局元素并排放置,和前面一樣,為簡單起見,我們暫時只考慮相同高度的兩個布局元素:

def beside(that: Element) :Element = {
    val contents = new Array[String](this.contents.length)
    for(i <- 0 until this.contents.length)
      contents(i)=this.contents(i) + that.contents(i)
    new ArrayElement(contents)
  }

盡管上面的實(shí)現(xiàn)滿足 beside 要求,但采用的還是指令式編程,我們使用函數(shù)說編程可以實(shí)現(xiàn)下面簡化代碼:

def beside(that: Element) :Element = {
    new ArrayElement(
      for(
        (line1,line2) <- this.contents zip that.contents
      ) yield line1+line2
    )
  } 

這里我們使用了 Array 的 zip 操作符,可以用來將兩個數(shù)組轉(zhuǎn)換成二元組的數(shù)組,zip 分別取兩個數(shù)組對應(yīng)的元素組成一個新的二元祖,比如:

scala> Array( 1,2,3) zip Array("a","b")
res0: Array[(Int, String)] = Array((1,a), (2,b))

如果一個數(shù)組長度大于另外一個數(shù)組,多余的元素被忽略。 for 的 yield 部分用來構(gòu)成一個新元素。

最后我們實(shí)現(xiàn) Element 的 toString 方法用來顯示布局元素的內(nèi)容:

override def toString = contents mkString "\n"

這里使用 mkString 函數(shù),這個函數(shù)可以應(yīng)用到任何序列數(shù)據(jù)結(jié)構(gòu)(包括數(shù)組),也就是把 contents 的每個元素調(diào)用 toString,然后使用“\n”分隔。

以上內(nèi)容是否對您有幫助:
在線筆記
App下載
App下載

掃描二維碼

下載編程獅App

公眾號
微信公眾號

編程獅公眾號