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

繼續領悟函數式:Scala指令式風格代碼的重構

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

為了幫助你在函數式風格上獲得更多的領悟,本節我們將重構代碼7.18中以指令式風格打印乘法表的方式。我們的函數式替代品展示在代碼7.19中。

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

代碼7.18中的代碼在兩個方面顯示出了指令式風格。首先,調用printMultiTable有副作用:在標準輸出上打印乘法表。代碼7.19中,我們重構了函數,讓它把乘法表作為字串返回。由于函數不再執行打印,我們把它重命名為multiTable。正如前面提到過的,沒有副作用的函數的一個優點是它們很容易進行單元測試。要測試printMultiTable,你需要重定義print和println從而能夠檢查輸出的正確性。測試multiTable就簡單多了,只要檢查結果即可。

  1. // 以序列形式返回一行乘法表  
  2. def makeRowSeq(row: Int) =  
  3.  for (col < - 1 to 10) yield {  
  4.   val prod = (row * col).toString  
  5.   val padding = " " * (4 - prod.length)  
  6.   padding + prod  
  7.  }  
  8. // 以字串形式返回一行乘法表  
  9. def makeRow(row: Int) = makeRowSeq(row).mkString  
  10. // 以字串形式返回乘法表,每行記錄占一行字串  
  11. def multiTable() = {  
  12.  val tableSeq = // 行記錄字串的序列  
  13.   for (row < - 1 to 10)  
  14.    yield makeRow(row)  
  15.  tableSeq.mkString("\n")  
  16. }  
代碼 7.19 創建乘法表的函數式方法

printMultiTable里另一個揭露其指令式風格的信號來自于它的while循環和var。與之相對,multiTable函數使用了val,for表達式,幫助函數:helper function,并調用了mkString。

我們提煉出兩個幫助函數,makeRow和makeRowSeq,使代碼容易閱讀。函數makeRowSeq使用for表達式從1到10枚舉列數。這個for函數體計算行和列的乘積,決定乘積前占位的空格,并生成由占位空格,乘積字串疊加成的結果。for表達式的結果是一個包含了這些生成字串作為元素的序列(scala.Seq的某個子類)。另一個幫助函數,makeRow,僅僅調用了makeRowSeq返回結果的mkString函數。疊加序列中的字串把它們作為一個字串返回。

multiTable方法首先使用一個for表達式的結果初始化tableSeq,這個for表達式從1到10枚舉行數,對每行調用makeRow獲得該行的字串。因為字串前綴yield關鍵字,所以表達式的結果就是行字串的序列。現在僅剩下的工作就是把字串序列轉變為單一字串。mkString的調用完成這個工作,并且由于我們傳遞進去"\n",因此每個字串結尾插入了換行符。如果把multiTable返回的字串傳遞給println,你將看到與調用printMultiTable所生成的同樣的輸出結果。

【相關閱讀】

  1. 學習Scala的變量范圍
  2. Scala:match表達式、break和continue
  3. 學習Scala:使用try-catch表達式處理異常
  4. Scala中的for表達式:枚舉的“瑞士軍刀”
  5. Scala中的if表達式和while循環

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

2009-06-09 13:18:56

Scala函數式命令式

2009-07-09 00:25:00

Scala函數式

2010-01-28 14:51:24

Scala后函數式

2009-12-11 10:44:00

Scala講座函數 scala

2010-03-11 10:34:22

Scala

2019-09-09 11:40:18

編程函數開發

2009-07-08 16:10:24

Scala簡介面向對象函數式

2009-09-27 15:29:00

Scala講座面向對象Scala

2009-09-27 15:23:00

Scala講座函數式編程Scala

2011-06-02 09:47:11

C語言重構

2020-12-17 07:59:46

聲明式代碼命令式代碼代碼

2016-10-11 13:32:50

函數式TypeScriptJavascript

2009-07-21 13:54:55

Scala重載方法隱式轉換

2010-07-09 14:12:00

ScalaF#C#

2010-07-07 13:11:20

ScalaF#C#

2012-03-14 10:09:51

ibmdw

2015-09-01 15:00:50

七牛許式偉

2016-09-30 09:43:17

JavascriptTypeScript函數式編程

2013-09-09 09:41:34

2016-10-19 14:35:20

JavaScript函數式編程
點贊
收藏

51CTO技術棧公眾號

主站蜘蛛池模板: 日韩欧美三级电影在线观看 | 欧美中文字幕一区二区三区亚洲 | 三级国产三级在线 | 久久大| 日本不卡免费新一二三区 | 极品粉嫩国产48尤物在线播放 | 国产精品色 | 亚洲综合成人网 | 一级做a爰片性色毛片16美国 | 涩爱av一区二区三区 | 国产伦精品一区二区三区照片91 | 国产一区二区三区在线视频 | 成人精品在线视频 | 中文字幕 在线观看 | 狠狠干美女 | 91色综合| 日韩中文一区 | 免费av观看| 日韩三级免费网站 | 正在播放国产精品 | 亚洲高清在线免费观看 | 91国在线 | 国产一区2区 | 久久99精品久久久 | 日韩精品在线看 | 久久亚洲综合 | 91在线看| 国产精品久久久久免费 | 国产在线一区观看 | 国产精彩视频在线观看 | 国产区在线 | 欧美成人精品一区二区三区 | 亚洲精品久久 | 特a毛片| 精品国产一二三区 | 午夜精品久久久久久久久久久久久 | 久久精品欧美一区二区三区不卡 | 欧美精品一区二区在线观看 | 黄色片免费看 | 久久精品视频免费看 | 国内在线视频 |