W3Cschool
恭喜您成為首批注冊(cè)用戶
獲得88經(jīng)驗(yàn)值獎(jiǎng)勵(lì)
我們接著實(shí)現(xiàn)類 Element 的其它方法,如 above, beside 和 toString 方法。
above 方法,意味著把一個(gè)布局元素放在另外一個(gè)布局元素的上方,也就是把這兩個(gè)元素的 contents 的內(nèi)容連接起來。我們首先實(shí)現(xiàn) above 函數(shù)的第一個(gè)版本:
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í)例對(duì)象,scala.Seq 為一個(gè)序列結(jié)構(gòu)并提供了許多方法來訪問和轉(zhuǎn)換這個(gè)序列。
實(shí)際上上面 above 的實(shí)現(xiàn)不是十分有效,因?yàn)樗辉试S你把不同長(zhǎng)度的布局元素疊加到另外一個(gè)布局元素上面,但就目前來說,我們還是暫時(shí)使用這個(gè)實(shí)現(xiàn),只使用同樣長(zhǎng)度的布局元素,后面再提供這個(gè)版本的增強(qiáng)版本。
下面我們?cè)賹?shí)現(xiàn)類 Element 的另外一個(gè) beside 方法,把兩個(gè)布局元素并排放置,和前面一樣,為簡(jiǎn)單起見,我們暫時(shí)只考慮相同高度的兩個(gè)布局元素:
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)下面簡(jiǎn)化代碼:
def beside(that: Element) :Element = {
new ArrayElement(
for(
(line1,line2) <- this.contents zip that.contents
) yield line1+line2
)
}
這里我們使用了 Array 的 zip 操作符,可以用來將兩個(gè)數(shù)組轉(zhuǎn)換成二元組的數(shù)組,zip 分別取兩個(gè)數(shù)組對(duì)應(yīng)的元素組成一個(gè)新的二元祖,比如:
scala> Array( 1,2,3) zip Array("a","b")
res0: Array[(Int, String)] = Array((1,a), (2,b))
如果一個(gè)數(shù)組長(zhǎng)度大于另外一個(gè)數(shù)組,多余的元素被忽略。 for 的 yield 部分用來構(gòu)成一個(gè)新元素。
最后我們實(shí)現(xiàn) Element 的 toString 方法用來顯示布局元素的內(nèi)容:
override def toString = contents mkString "\n"
這里使用 mkString 函數(shù),這個(gè)函數(shù)可以應(yīng)用到任何序列數(shù)據(jù)結(jié)構(gòu)(包括數(shù)組),也就是把 contents 的每個(gè)元素調(diào)用 toString,然后使用“\n”分隔。
Copyright©2021 w3cschool編程獅|閩ICP備15016281號(hào)-3|閩公網(wǎng)安備35020302033924號(hào)
違法和不良信息舉報(bào)電話:173-0602-2364|舉報(bào)郵箱:jubao@eeedong.com
掃描二維碼
下載編程獅App
編程獅公眾號(hào)
聯(lián)系方式:
更多建議: