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

Scala:如何編寫新的控制結構

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

擁有第一類函數的語言中,即使語言的語法是固定的,你也可以有效地制作新的控制結構。所有你需要做的就是創建帶函數做參數的方法。例如,下面是“雙倍”控制結構,能夠重復一個操作兩次并返回結果:

  1. scala> def twice(op: Double => Double, x: Double) = op(op(x))  
  2. twice: ((Double) => Double,Double)Double  
  3. scala> twice(_ + 15)  
  4. res9: Double = 7.0 

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

這個例子里op的類型是Double => Double,就是說它是帶一個Double做參數并返回另一個Double的函數。

任何時候你發現你的代碼中多個地方有重復的控制模式,你就應該考慮把它實現為一個新的控制結構。本章早些時候你看到了filesMatching,一個極度特化了的控制模式?,F在考慮一個更寬泛使用的代碼模式:打開一個資源,對它進行操作,然后關閉資源。你可以使用如下的方法將其捕獲并放入控制抽象:

  1. def withPrintWriter(file: File, op: PrintWriter => Unit) {  
  2.  val writer = new PrintWriter(file)  
  3.  try {  
  4.   op(writer)  
  5.  } finally {  
  6.   writer.close()  
  7.  }  
  8. }  
有了這個方法,你就可以這樣使用:

  1. withPrintWriter(  
  2.  new File("date.txt"),  
  3.  writer => writer.println(new java.util.Date)  
  4. )  
使用這個方法的好處是,由withPrintWriter而不是用戶的代碼,確認文件在結尾被關閉。因此忘記關閉文件是不可能的。這個技巧被稱為貸出模式:loan pattern,因為控制抽象函數,如withPrintWriter,打開了資源并“貸出”給函數。例如,前面例子里的withPrintWriter把PrintWriter借給函數op。當函數完成的時候,它發出信號說明它不再需要“借”的資源。于是資源被關閉在finally塊中,以確信其確實被關閉,而忽略函數是正常結束返回還是拋出了異常。

讓客戶代碼看上去更像內建控制結構的一種方式是使用大括號代替小括號包圍參數列表。Scala的任何方法調用,如果你確實只傳入一個參數,就能可選地使用大括號替代小括號包圍參數。例如,代之以:

  1. scala> println("Hello, world!")  
  2. Hello, world!  
你可以寫成:

  1. scala> println { "Hello, world!" }  
  2. Hello, world!  
在第二個例子里,你使用了大括號替代小括號包圍println的參數。然而,這個大括號技巧僅在你傳入一個參數時有效。下面是破壞這個規則的嘗試:

  1. scala> val g = "Hello, world!" 
  2. g: java.lang.String = Hello, world!  
  3. scala> g.substring { 79 }  
  4. < console>:1: error: ';' expected but ',' found.  
  5.  g.substring { 79 }  
  6.  ˆ  
因為你正打算把兩個參數傳入substring,當你嘗試用大括號保衛這些參數的時候產生了錯誤。為了糾正錯誤,你需要使用小括號:

  1. scala> g.substring(79)  
  2. res12: java.lang.String = wo  
在傳入一個參數時可以用大括號替代小括號的機制的目的是讓客戶程序員能寫出包圍在大括號內的函數文本。這可以讓方法調用感覺更像控制抽象。以前面例子里定義的withPrintWriter方法舉例。在它最近的形式里,withPrintWriter帶了兩個參數,因此你不能使用大括號。雖然如此,因為傳遞給withPrintWriter的函數是列表的最后一個參數,你可以使用curry化把第一個參數,File拖入分離的參數列表。這將使函數僅剩下列表的第二個參數作為唯一的參數。代碼9.4展示了你要怎樣重新定義withPrintWriter。

  1. def withPrintWriter(file: File)(op: PrintWriter => Unit) {  
  2.  val writer = new PrintWriter(file)  
  3.  try {  
  4.   op(writer)  
  5.  } finally {  
  6.   writer.close()  
  7.  }  
  8. }  
代碼 9.4 使用貸出模式寫文件

新的版本不同于舊版本的地方僅在于現在它有兩個參數列表每個里面有一個參數替代了原來的一個參數列表里面有兩個參數。僅比較這兩個參數的差異。展示在第130頁的withPrintWriter的前一個版本里,你看到了...File, op...。但在這個版本里,你看到了...File)(op...。有了上述的定義,你就可以用更賞心悅目的語法格式調用這個方法:

  1. val file = new File("date.txt")  
  2. withPrintWriter(file) {  
  3.  writer => writer.println(new java.util.Date)  
  4. }  

這個例子里,第一個參數列表,包含了一個File參數,被寫成包圍在小括號中。第二個參數列表,包含了一個函數參數,被包圍在大括號中。

【相關閱讀】

  1. Scala學習:Curry化的函數
  2. Scala學習:簡化客戶代碼
  3. 減少Scala中的代碼重復
  4. Scala:尾遞歸的跟蹤調用及其局限
  5. Scala允許的重復參數

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

2009-06-17 11:44:22

Scala控制結構

2010-01-26 15:32:43

Scala用法錯誤

2009-07-08 17:40:28

ScalaScala腳本

2009-07-08 09:47:49

Scala 2.8Scala

2009-09-09 10:50:55

Scala例子Scala與Java

2009-07-08 12:43:59

Scala ServlScala語言

2009-07-22 09:43:30

Scala類型

2010-07-13 13:56:43

Perl foreac

2013-08-20 10:19:38

2013-08-22 09:55:14

2020-10-31 17:33:18

Scala語言函數

2010-09-14 15:34:41

Scala

2012-07-11 10:51:37

編程

2009-07-22 09:08:09

Scalaabove方法

2009-09-27 15:23:00

Scala講座函數式編程Scala

2009-02-05 17:28:01

ScalaFriendFeedXML

2012-03-08 09:44:41

編程

2022-06-07 09:30:35

JavaScript變量名參數

2019-11-05 15:10:36

RPMspec文件Linux

2024-06-24 14:19:48

點贊
收藏

51CTO技術棧公眾號

主站蜘蛛池模板: 欧美激情国产日韩精品一区18 | 久久久久黑人 | 中文字幕一区二区三区在线乱码 | 国产精品一区二区三区久久 | 一区二区精品电影 | 国产精品成人一区二区三区夜夜夜 | 91视频网址 | 日韩欧美一区二区三区免费观看 | 国内自拍偷拍视频 | 国产一区免费 | 中文字幕在线一区 | 久久伊人精品 | 激情一区二区三区 | 狠狠热视频 | 国产视频观看 | 日韩有码一区二区三区 | 欧美激情在线播放 | 99这里只有精品视频 | 欧美三级视频 | 亚洲一区二区视频 | 亚洲第一视频网 | 国产成人精品免费视频大全最热 | 亚洲女人的天堂 | 一区中文字幕 | 精品一区二区三区在线视频 | 午夜久久久久久久久久一区二区 | 亚洲高清在线观看 | 亚洲一区二区三区在线视频 | 欧美精品三区 | 日本黄色不卡视频 | 国产精品99久久久久久宅男 | xxx视频| 国产激情91久久精品导航 | a视频在线 | 欧美一级二级在线观看 | 中文字幕第十一页 | 久久99精品国产自在现线小黄鸭 | 黄色日批视频 | 国产精品黄色 | 亚洲天堂av在线 | 给我免费的视频在线观看 |