成人免费xxxxx在线视频软件_久久精品久久久_亚洲国产精品久久久_天天色天天色_亚洲人成一区_欧美一级欧美三级在线观看

如何實現Scala的above,beside和toString

開發 后端
本文節選自Martin Odersky,Lex Spoon和Bill Venners所著,Regular翻譯的《Programming in Scala》的第十章。Scala是一種針對 JVM 將函數和面向對象技術組合在一起的編程語言。

接下來一步,我們將在類Element中實現方法above。把一個元素放在另一個上面是指串連這兩個元素的contents值。因此方法above的***個草案看上去可能是這樣的:

  1. def above(that: Element): Element =  
  2.  new ArrayElement(this.contents ++ that.contents)  
++操作符串連兩個數組。Scala里的數組被表示為Java數組,但是支持更多的方法。特別是,Scala里的數組繼承自類scala.Seq,能夠表現象序列這樣的結構并包含許多訪問和轉換序列的方法。本章會解釋某些數組方法,更全面的討論將在第17章。

51CTO編輯推薦:Scala編程語言專題

實際上,前面展示的代碼并不完全足夠,因為它不允許你把不同長度的元素堆疊在一起。然而本節為了讓事情保持簡單,我們會任由其狀態并僅僅把相同長度的元素傳遞給above。10.14節里,我們會給above做個改良,這樣客戶就能用它組合不同長度的元素了。

下一個要實現的方法是beside。把兩個元素靠在一起,我們將創造一個新的元素,其中的每一行都來自于兩個元素的相應行的串連。如前所述,為了保持事情簡單我們會一開始假設兩個元素高度相同。這產生了方法beside的下列設計:

  1. def beside(that: Element): Element = {  
  2.  val contents = new Array[String](this.contents.length)  
  3.  for (i < - 0 until this.contents.length)  
  4.   contents(i) = this.contents(i) + that.contents(i)  
  5.  new ArrayElement(contents)  
  6. }  
beside方法首先分配了一個新數組,contents,并串連this.contents和that.contents中相應的數組元素來填充。最終產生了新的ArrayElement包含了新的contents。

盡管beside的這個實現可以工作,但它是指令式風格,馬腳露在我們索引數組的循環。這個方法可以替代縮減成一個表達式:

  1. new ArrayElement(  
  2.  for (  
  3.   (line1, line2) < - this.contents zip that.contents  
  4. ) yield line1 + line2  
  5. )  
這里,this.contents和that.contents兩個數組被使用zip操作符轉換為一個對子的數組(可以稱為Tupele2)。zip方法從它的兩個參數中揀出相應的元素并組織成對子數組。

例如,表達式:

  1. Array(123) zip Array("a""b")  
將生成:
  1. 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方法返回元素格式化成的字串做到。下面是它的定義:

  1. 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所展示的。

  1. abstract class Element {  
  2.  def contents: Array[String]  
  3.  def width: Int =  
  4.   if (height == 00 else contents(0).length  
  5.  def height: Int = contents.length  
  6.  def above(that: Element): Element =  
  7.   new ArrayElement(this.contents ++ that.contents)  
  8.  def beside(that: Element): Element =  
  9.   new ArrayElement(  
  10.    for (  
  11.     (line1, line2) < - this.contents zip that.contents  
  12.    ) yield line1 + line2  
  13.   )  
  14.  override def toString = contents mkString "\n" 
  15. }  

代碼 10.9 帶有above,beside和toString的類Element

【相關閱讀】

  1. Scala學習:使用組合與繼承
  2. 在Scala中定義final成員
  3. Scala程序中如何實現多態和動態綁定
  4. Scala學習:調用超類構造器和override修飾符的使用
  5. Scala:重載方法和字段及定義參數化字段

責任編輯:book05 來源: Artima
相關推薦

2009-07-21 12:18:37

ScalaRational對象toString

2009-07-22 08:52:05

Scala動態綁定

2009-07-22 09:43:30

Scala類型

2011-03-14 10:47:30

HashMap

2009-07-22 09:27:04

Scala變高變寬

2009-08-13 10:35:05

Scala數組排序

2009-06-16 17:54:38

Scala類語法語義

2009-09-09 10:50:55

Scala例子Scala與Java

2009-09-09 11:37:08

Scala的模式匹配

2009-07-22 07:49:00

Scala控制結構

2009-07-08 12:43:59

Scala ServlScala語言

2020-10-31 17:33:18

Scala語言函數

2010-09-14 15:34:41

Scala

2009-07-20 16:56:51

Scala類的定義

2012-12-03 10:26:51

Scala

2009-07-30 10:59:44

Scala和Erlan多核

2009-09-15 18:27:59

equals實現canEqualScala

2011-03-18 19:37:38

Eventable接口QtWidget

2011-06-28 11:05:19

Qt QWidget Eventable

2009-02-05 17:28:01

ScalaFriendFeedXML
點贊
收藏

51CTO技術棧公眾號

主站蜘蛛池模板: 国产极品车模吞精高潮呻吟 | 亚洲国产成人精品女人久久久 | 欧美激情一区 | 黄色一级大片在线免费看产 | 亚洲视频一区在线 | 日韩一区二区三区在线视频 | 日本黄色影片在线观看 | 毛片国产 | 亚洲欧美精品 | 免费av观看 | 久久精品国产一区二区电影 | 亚洲视频在线看 | 在线午夜| 日本一区二区三区四区 | av一二三区 | 91精品无人区卡一卡二卡三 | 一级二级三级在线观看 | 久久久成人一区二区免费影院 | 日韩欧美在线观看 | 欧美一区二区三区久久精品视 | 国产一区二区在线观看视频 | 亚洲欧美综合精品久久成人 | 亚洲欧洲精品一区 | 99久久婷婷国产综合精品电影 | 欧美男人天堂 | 久久在线视频 | www.免费看片.com | 一级黄色影片在线观看 | 久久专区 | 91精品久久久久久久久久入口 | 欧美成人激情视频 | 国产中的精品av涩差av | 草草草草视频 | www日本高清 | 亚洲欧美一区在线 | 中文字幕在线视频一区二区三区 | 久久久青草婷婷精品综合日韩 | 欧美日韩免费在线 | 精品久久久久久亚洲国产800 | 欧美日韩国产免费 | 精品久久久久久久人人人人传媒 |