自拍偷在线精品自拍偷,亚洲欧美中文日韩v在线观看不卡

繼續(xù)領(lǐng)悟函數(shù)式:Scala指令式風(fēng)格代碼的重構(gòu)

開(kāi)發(fā) 后端
本文節(jié)選自Martin Odersky,Lex Spoon和Bill Venners所著,Regular翻譯的《Programming in Scala》的第七章。Scala是一種針對(duì) JVM 將函數(shù)和面向?qū)ο蠹夹g(shù)組合在一起的編程語(yǔ)言。

為了幫助你在函數(shù)式風(fēng)格上獲得更多的領(lǐng)悟,本節(jié)我們將重構(gòu)代碼7.18中以指令式風(fēng)格打印乘法表的方式。我們的函數(shù)式替代品展示在代碼7.19中。

51CTO編輯推薦:Scala編程語(yǔ)言專題

代碼7.18中的代碼在兩個(gè)方面顯示出了指令式風(fēng)格。首先,調(diào)用printMultiTable有副作用:在標(biāo)準(zhǔn)輸出上打印乘法表。代碼7.19中,我們重構(gòu)了函數(shù),讓它把乘法表作為字串返回。由于函數(shù)不再執(zhí)行打印,我們把它重命名為multiTable。正如前面提到過(guò)的,沒(méi)有副作用的函數(shù)的一個(gè)優(yōu)點(diǎn)是它們很容易進(jìn)行單元測(cè)試。要測(cè)試printMultiTable,你需要重定義print和println從而能夠檢查輸出的正確性。測(cè)試multiTable就簡(jiǎn)單多了,只要檢查結(jié)果即可。

  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 創(chuàng)建乘法表的函數(shù)式方法

printMultiTable里另一個(gè)揭露其指令式風(fēng)格的信號(hào)來(lái)自于它的while循環(huán)和var。與之相對(duì),multiTable函數(shù)使用了val,for表達(dá)式,幫助函數(shù):helper function,并調(diào)用了mkString。

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

multiTable方法首先使用一個(gè)for表達(dá)式的結(jié)果初始化tableSeq,這個(gè)for表達(dá)式從1到10枚舉行數(shù),對(duì)每行調(diào)用makeRow獲得該行的字串。因?yàn)樽执熬Yyield關(guān)鍵字,所以表達(dá)式的結(jié)果就是行字串的序列?,F(xiàn)在僅剩下的工作就是把字串序列轉(zhuǎn)變?yōu)閱我蛔执?。mkString的調(diào)用完成這個(gè)工作,并且由于我們傳遞進(jìn)去"\n",因此每個(gè)字串結(jié)尾插入了換行符。如果把multiTable返回的字串傳遞給println,你將看到與調(diào)用printMultiTable所生成的同樣的輸出結(jié)果。

【相關(guān)閱讀】

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

責(zé)任編輯:book05 來(lái)源: Artima
相關(guān)推薦

2009-06-09 13:18:56

Scala函數(shù)式命令式

2009-07-09 00:25:00

Scala函數(shù)式

2010-01-28 14:51:24

Scala后函數(shù)式

2009-12-11 10:44:00

Scala講座函數(shù) scala

2010-03-11 10:34:22

Scala

2019-09-09 11:40:18

編程函數(shù)開(kāi)發(fā)

2009-07-08 16:10:24

Scala簡(jiǎn)介面向?qū)ο?/a>函數(shù)式

2009-09-27 15:29:00

Scala講座面向?qū)ο?/a>Scala

2009-09-27 15:23:00

Scala講座函數(shù)式編程Scala

2011-06-02 09:47:11

C語(yǔ)言重構(gòu)

2010-07-09 14:12:00

ScalaF#C#

2010-07-07 13:11:20

ScalaF#C#

2020-12-17 07:59:46

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

2016-10-11 13:32:50

函數(shù)式TypeScriptJavascript

2009-07-21 13:54:55

Scala重載方法隱式轉(zhuǎn)換

2012-03-14 10:09:51

ibmdw

2015-09-01 15:00:50

七牛許式偉

2016-09-30 09:43:17

JavascriptTypeScript函數(shù)式編程

2013-09-09 09:41:34

2024-06-25 10:37:11

點(diǎn)贊
收藏

51CTO技術(shù)棧公眾號(hào)