W3Cschool
恭喜您成為首批注冊用戶
獲得88經(jīng)驗(yàn)值獎勵
我們接著實(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”分隔。
Copyright©2021 w3cschool編程獅|閩ICP備15016281號-3|閩公網(wǎng)安備35020302033924號
違法和不良信息舉報(bào)電話:173-0602-2364|舉報(bào)郵箱:jubao@eeedong.com
掃描二維碼
下載編程獅App
編程獅公眾號
聯(lián)系方式:
更多建議: