中文字幕av专区_日韩电影在线播放_精品国产精品久久一区免费式_av在线免费观看网站

溫馨提示×

溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊×
其他方式登錄
點擊 登錄注冊 即表示同意《億速云用戶服務條款》

怎么實現Scala的above,beside和toString

發布時間:2021-07-15 09:42:51 來源:億速云 閱讀:178 作者:chen 欄目:編程語言

這篇文章主要講解了“怎么實現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這一問題有了更深刻的體會,具體使用情況還需要大家實踐驗證。這里是億速云,小編將為大家推送更多相關知識點的文章,歡迎關注!

向AI問一下細節

免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。

AI

灌南县| 徐汇区| 花莲县| 称多县| 辽宁省| 尉氏县| 张家界市| 共和县| 盐津县| 大港区| 高雄县| 永济市| 东港市| 濮阳市| 东阳市| 龙泉市| 盐城市| 青海省| 尼玛县| 永福县| 鲁山县| 长治市| 玉门市| 新乡县| 岢岚县| 宜川县| 梧州市| 从江县| 文登市| 白水县| 上饶县| 蕉岭县| 三原县| 绥棱县| 永顺县| 西乡县| 融水| 侯马市| 准格尔旗| 三河市| 长子县|