您好,登錄后才能下訂單哦!
這篇文章主要講解了“怎么實現Scala的above,beside和toString”,文中的講解內容簡單清晰,易于學習與理解,下面請大家跟著小編的思路慢慢深入,一起來研究和學習“怎么實現Scala的above,beside和toString”吧!
接下來一步,我們將在類Element中實現方法above。把一個元素放在另一個上面是指串連這兩個元素的contents值。因此方法above的***個草案看上去可能是這樣的:
def above(that: Element): Element = new ArrayElement(this.contents ++ that.contents)
++操作符串連兩個數組。Scala里的數組被表示為Java數組,但是支持更多的方法。特別是,Scala里的數組繼承自類scala.Seq,能夠表現象序列這樣的結構并包含許多訪問和轉換序列的方法。本章會解釋某些數組方法,更全面的討論將在第17章。
實際上,前面展示的代碼并不完全足夠,因為它不允許你把不同長度的元素堆疊在一起。然而本節為了讓事情保持簡單,我們會任由其狀態并僅僅把相同長度的元素傳遞給above。10.14節里,我們會給above做個改良,這樣客戶就能用它組合不同長度的元素了。
下一個要實現的方法是beside。把兩個元素靠在一起,我們將創造一個新的元素,其中的每一行都來自于兩個元素的相應行的串連。如前所述,為了保持事情簡單我們會一開始假設兩個元素高度相同。這產生了方法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) }
beside方法首先分配了一個新數組,contents,并串連this.contents和that.contents中相應的數組元素來填充。最終產生了新的ArrayElement包含了新的contents。
盡管beside的這個實現可以工作,但它是指令式風格,馬腳露在我們索引數組的循環。這個方法可以替代縮減成一個表達式:
new ArrayElement( for ( (line1, line2) < - this.contents zip that.contents ) yield line1 + line2 )
這里,this.contents和that.contents兩個數組被使用zip操作符轉換為一個對子的數組(可以稱為Tupele2)。zip方法從它的兩個參數中揀出相應的元素并組織成對子數組。
例如,表達式:
Array(1, 2, 3) zip Array("a", "b")
將生成:
Array((1, "a"), (2, "b"))
如果兩個操作數組的其中一個比另一個長,zip將舍棄余下的元素。在上面的表達式中,左操作數的第三個元素,3,沒有組成結果的部分,因為它在右操作數中沒有相對的元素。
結果數組然后通過for表達式被枚舉遍歷。這里,表達式“for ((line1, line2) < - ...”允許你在一個模式:pattern中命名對子的兩個元素,也就是說,line1現在代表對子的***個元素,line2代表第二個。Scala的模式匹配系統將在第15章描述。現在,你可以就把這當作在每次枚舉中定義兩個val,line1和line2的方式。
for表達式有個yield部分能產生結果。結果與枚舉遍歷的表達式類型一致,也就是說,是數組。數組的每個元素都是相應行,line1和line2串連的結果。因此這段代碼的最終結果與前一個版本的beside一樣,不過因為它避免了顯示的數組索引,結果用一種更少犯錯的方式實現了。
你還需要一個顯示元素的方式。通常,可以通過定義toString方法返回元素格式化成的字串做到。下面是它的定義:
override def toString = contents mkString "\n"
toString的實現使用了mkString,它被定義在所有序列中,包括數組。正如你在7.8節中看到的,像“arr mkString sep”這樣的表達式能返回數組arr所有元素組成的字串。通過調用toString方法每個元素被映射為字串。分隔符字串seq被插入到連續的元素字串當中。因此表達式“contents mkstring "\n"”格式化contents數組為字串,其中每個數組元素占據一行。
請注意toString沒有帶空參數列表。這個遵循了統一訪問原則的建議,因為toString是一個純的不帶任何參數的方法。
附加了這三個方法,類Element現在看上去如代碼10.9所展示的。
abstract class Element { def contents: Array[String] def width: Int = if (height == 0) 0 else contents(0).length def height: Int = contents.length def above(that: Element): Element = new ArrayElement(this.contents ++ that.contents) def beside(that: Element): Element = new ArrayElement( for ( (line1, line2) < - this.contents zip that.contents ) yield line1 + line2 ) override def toString = contents mkString "\n" }
代碼 10.9 帶有above,beside和toString的類Element
感謝各位的閱讀,以上就是“怎么實現Scala的above,beside和toString”的內容了,經過本文的學習后,相信大家對怎么實現Scala的above,beside和toString這一問題有了更深刻的體會,具體使用情況還需要大家實踐驗證。這里是億速云,小編將為大家推送更多相關知識點的文章,歡迎關注!
免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。