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

Scala的本地函數(shù):將私有方法轉(zhuǎn)換為本地方法

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

上節(jié)中processFile方法的建立演示了函數(shù)式編程風(fēng)格的一個重要設(shè)計(jì)原則:程序應(yīng)該被解構(gòu)成若干小的函數(shù),每個完成一個定義良好的任務(wù)。單個函數(shù)經(jīng)常很小。這種風(fēng)格的好處是它給了程序員許多可以靈活組裝成更復(fù)雜事物的建造模塊。每個小塊應(yīng)該充分簡化到足以單獨(dú)理解。

這種方式的一個問題是所有這些幫助函數(shù)的名稱會污染程序的命名空間。在解釋器里這不太成問題,但是一旦函數(shù)被打包成可復(fù)用的類和對象,就最好對類的客戶隱藏幫助函數(shù)。它們經(jīng)常不能獨(dú)立表達(dá)什么意思,并且如果之后用其它方式重寫類的話,也常會想保持能刪掉幫助方法的足夠的靈活度。

Java里,達(dá)成這個目的的主要工具是private方法。這種私有方法的方式在Scala里同樣有效,如代碼8.1里描述的,但是Scala提供了另一種方式:你可以把函數(shù)定義在另一個函數(shù)中。就好象本地變量那樣,這種本地函數(shù)僅在包含它的代碼塊中可見。以下是一個例子:

  1. def processFile(filename: String, width: Int) {  
  2.  def processLine(filename:String, width:Int, line:String) {  
  3.   if (line.length > width) print(filename+": "+line)  
  4.  }  
  5.  val source = Source.fromFile(filename)  
  6.  for (line < - source.getLines) {  
  7.   processLine(filename, width, line)  
  8.  }  
  9. }  
在這個例子中,我們通過把私有方法,processLine,轉(zhuǎn)換為本地方法,processFile,重構(gòu)了展示在代碼8.1中原本的LongLines版本。為了做到這點(diǎn)我們?nèi)サ袅藀rivate修飾符,它僅能應(yīng)用于方法(并且僅被方法需要),然后把processLine的定義放在processFile的定義里。作為本地函數(shù),processLine的范圍局限于processFile之內(nèi),外部無法訪問。

既然processLine被定義在processFile里,另一個改善變?yōu)榭赡芰恕U堊⒁鈌ilename和width是怎樣不改變地傳入到幫助函數(shù)中。這不是必須的,因?yàn)楸镜睾瘮?shù)可以訪問包含它們的函數(shù)的參數(shù)。你可以直接使用外部processLine函數(shù)的參數(shù),如代碼8.2所示:

  1. import scala.io.Source  
  2. object LongLines {  
  3.  def processFile(filename: String, width: Int) {  
  4.   def processLine(line: String) {  
  5.    if (line.length > width)  
  6.     print(filename +": "+ line)  
  7.   }  
  8.   val source = Source.fromFile(filename)  
  9.   for (line < - source.getLines)  
  10.    processLine(line)  
  11.  }  
  12. }  
代碼 8.2 帶本地processLine方法的LongLines

更簡單了,不是嗎?這種對外層函數(shù)的參數(shù)的使用是Scala提供的通用嵌套的很平常也很有用的例子。7.7節(jié)描述的嵌套和作用域應(yīng)用于所有的Scala架構(gòu),包括函數(shù)。這是一個簡單的原則,不過非常強(qiáng)大,尤其在擁有函數(shù)作為第一類值的語言中。

【相關(guān)閱讀】

  1. Scala中定義函數(shù)的方法:method
  2. 繼續(xù)領(lǐng)悟函數(shù)式:Scala指令式風(fēng)格代碼的重構(gòu)
  3. 學(xué)習(xí)Scala的變量范圍
  4. Scala:match表達(dá)式、break和continue
  5. 學(xué)習(xí)Scala:使用try-catch表達(dá)式處理異常

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

2022-03-17 08:30:28

Python私有屬性私有方法

2023-07-27 06:59:30

Native線程數(shù)據(jù)結(jié)構(gòu)

2012-03-13 16:14:09

JavaJUnit

2009-07-21 17:21:57

Scala定義函數(shù)

2009-07-21 13:54:55

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

2022-08-28 23:48:20

機(jī)器學(xué)習(xí)線性回歸數(shù)據(jù)

2023-09-16 19:38:17

Python私有屬性私有方法

2011-08-16 10:35:59

Objective_C私有方法

2020-07-22 14:10:17

Chrome 84空閑檢測前端

2010-10-28 11:48:38

ORACLE數(shù)據(jù)導(dǎo)入

2020-11-16 15:51:54

Kubernetes

2011-03-31 13:34:45

Cactibit

2010-09-30 09:42:06

2009-10-29 09:50:32

2009-07-21 12:18:37

ScalaRational對象toString

2009-09-24 09:41:00

Scala講座Scala

2024-03-12 07:35:39

Python字符串列表

2010-09-06 16:07:21

SQL函數(shù)

2024-03-07 09:37:45

C#表達(dá)式(樹)動態(tài)方法

2024-04-18 15:51:57

點(diǎn)贊
收藏

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