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

Scala的本地函數:將私有方法轉換為本地方法

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

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

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

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

  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,轉換為本地方法,processFile,重構了展示在代碼8.1中原本的LongLines版本。為了做到這點我們去掉了private修飾符,它僅能應用于方法(并且僅被方法需要),然后把processLine的定義放在processFile的定義里。作為本地函數,processLine的范圍局限于processFile之內,外部無法訪問。

既然processLine被定義在processFile里,另一個改善變為可能了。請注意filename和width是怎樣不改變地傳入到幫助函數中。這不是必須的,因為本地函數可以訪問包含它們的函數的參數。你可以直接使用外部processLine函數的參數,如代碼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

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

【相關閱讀】

  1. Scala中定義函數的方法:method
  2. 繼續領悟函數式:Scala指令式風格代碼的重構
  3. 學習Scala的變量范圍
  4. Scala:match表達式、break和continue
  5. 學習Scala:使用try-catch表達式處理異常

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

2022-03-17 08:30:28

Python私有屬性私有方法

2023-07-27 06:59:30

Native線程數據結構

2012-03-13 16:14:09

JavaJUnit

2009-07-21 17:21:57

Scala定義函數

2009-07-21 13:54:55

Scala重載方法隱式轉換

2022-08-28 23:48:20

機器學習線性回歸數據

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數據導入

2020-11-16 15:51:54

Kubernetes

2010-09-30 09:42:06

2011-03-31 13:34:45

Cactibit

2009-10-29 09:50:32

2009-07-21 12:18:37

ScalaRational對象toString

2009-09-24 09:41:00

Scala講座Scala

2024-03-07 09:37:45

C#表達式(樹)動態方法

2010-09-06 16:07:21

SQL函數

2024-03-12 07:35:39

Python字符串列表

2024-04-18 15:51:57

點贊
收藏

51CTO技術棧公眾號

主站蜘蛛池模板: 欧美日韩高清在线一区 | 久久极品 | 久久久久久久久久久久久久av | 欧美一区二区在线 | 日韩在线免费 | 国产在线高清 | 久久精品免费 | 国产精品久久久久一区二区 | 99国产视频 | 精品成人 | 中文字幕视频一区 | 综合久久综合久久 | 狠狠操狠狠操 | 一区二区影院 | 日本 欧美 三级 高清 视频 | 国产片淫级awww | 国产亚洲人成a在线v网站 | 久操伊人 | 九九热精 | 黄网站免费在线 | 国产农村妇女精品一二区 | 亚洲视频在线免费 | 亚洲国产精品久久久 | 亚洲乱码国产乱码精品精98午夜 | 一级a性色生活片久久毛片波多野 | 久久久精品一区 | 日韩精品视频中文字幕 | 色婷婷综合久久久久中文一区二区 | 亚洲自拍偷拍av | 亚洲高清在线观看 | 一二三在线视频 | 操皮视频 | 一级毛片免费 | 亚洲国产精品日韩av不卡在线 | 亚洲美女视频 | 国产精品美女久久久久 | 久久久久久久一区二区三区 | 国产精品亚洲综合 | 国产一区亚洲 | 作爱视频免费看 | 毛片免费视频 |