在线观看不卡亚洲电影_亚洲妓女99综合网_91青青青亚洲娱乐在线观看_日韩无码高清综合久久

鍍金池/ 教程/ Scala/ 創(chuàng)建新的控制結(jié)構(gòu)
包對象
Ordered Trait
組合和繼承–定義 final 成員
基本數(shù)據(jù)類型
Match 表達(dá)式
類和對象 (三)
操作基本數(shù)據(jù)類型
for 表達(dá)式
組合和繼承–重載成員函數(shù)和方法
類和對象 (二)
組合和繼承–定義 factory 對象
組合和繼承–多態(tài)和動(dòng)態(tài)綁定
Trait 的基本概念
if 表達(dá)式
組合和繼承–抽象類
函數(shù)–函數(shù)字面量的一些簡化寫法
while 循環(huán)
組合和繼承–使用組合還是繼承?
訪問控制修飾符
Trait 示例–Rectangular 對象
組合和繼承–定義參數(shù)化成員變量
組合和繼承–定義無參數(shù)方法
類和對象 (一)
函數(shù)–閉包
函數(shù)–類成員函數(shù)
Scala 基本數(shù)據(jù)類型的實(shí)現(xiàn)方法
try 表達(dá)式處理異常
選擇瘦接口還是胖接口設(shè)計(jì)?
組合和繼承–小結(jié)
創(chuàng)建新的控制結(jié)構(gòu)
使用 import
為訪問控制修飾符添加作用域
Scala 的類層次關(guān)系
類和對象 (五)
傳名參數(shù)
柯里化函數(shù)
函數(shù)–頭等公民
組合和組合和繼承–定義 heighten 和 widen 函數(shù)
使用 Package–將代碼放入包中
隱含的 import
所有類的公共子類–底層類型
進(jìn)一步 Scala
函數(shù)–局部函數(shù)
引用包中的代碼
組合和繼承–使用 override 修飾符
組合和繼承–實(shí)現(xiàn)類 Element 的 above,beside 和 toString()方法
類和對象 (四)
函數(shù)–尾遞歸
沒有“break”和“continue”的日子
組合和繼承–調(diào)用基類構(gòu)造函數(shù)
減低代碼重復(fù)
函數(shù)–函數(shù)–可變參數(shù),命名參數(shù),缺省參數(shù)
起步 Scala
組合和繼承–擴(kuò)展類
函數(shù)–部分應(yīng)用的函數(shù)
開始神奇的 Scala編程之旅
組合和繼承–概述
Trait 用來實(shí)現(xiàn)可疊加的修改操作

創(chuàng)建新的控制結(jié)構(gòu)

對于支持函數(shù)作為“頭等公民”的語言,你可以有效的創(chuàng)建新的控制結(jié)構(gòu)即使該語言語法上固定的。你所要做的事創(chuàng)建一個(gè)方法,該方法使用函數(shù)類型作為參數(shù)。

比如: 下面為一個(gè)“雙倍”的控制結(jié)構(gòu),這個(gè)“雙倍”控制結(jié)構(gòu)可以重復(fù)一個(gè)操作,然后返回結(jié)果。

scala> def twice (op:Double => Double, x:Double) =op(op(x))
twice: (op: Double => Double, x: Double)Double
scala> twice(_ + 1, 5)
res0: Double = 7.0

上面調(diào)用 twice ,其中 _+1 調(diào)用兩次,也就是 5 調(diào)用兩次 +1,結(jié)果為 7。

你在寫代碼時(shí),如果發(fā)現(xiàn)某些操作需要重復(fù)多次,你就可以試著將這個(gè)重復(fù)操作寫成新的控制結(jié)構(gòu),在前面我們定義過一個(gè) filesMatching 函數(shù)

def filesMatching(
    matcher: (String) => Boolean) = {
    for(file <- filesHere; if matcher(file.getName))
      yield file
   }

如果我們把這個(gè)函數(shù)進(jìn)一步通用化,可以定義一個(gè)通用操作如下:

打開一個(gè)資源,然后對資源進(jìn)行處理,最后釋放資源,你可以為這個(gè)“模式”定義一個(gè)通用的控制結(jié)構(gòu)如下:

def withPrintWriter (file: File, op: PrintWriter => Unit) {
  val writer=new PrintWriter(file)
  try{
    op(writer)
  }finally{
    writer.close()
  }
}

使用上面定義,我們使用如下調(diào)用:

withPrintWriter(
   new File("date.txt"),
   writer => writer.println(new java.util.Date)
)

使用這個(gè)方法的優(yōu)點(diǎn)在于 withPrintWriter,而不是用戶定義的代碼,withPrintWriter 可以保證文件在使用完成后被關(guān)閉,也就是不可能發(fā)生忘記關(guān)閉文件的事件。這種技術(shù)成為“租賃模式”,這是因?yàn)檫@種類型的控制結(jié)構(gòu),比如 withPrintWriter 將一個(gè) PrintWriter 對象“租”給 op 操作,當(dāng)這個(gè) op 操作完成后,它通知不再需要租用的資源,在 finally 中可以保證資源被釋放,而無論 op 是否出現(xiàn)異常。

這里調(diào)用語法還是使用函數(shù)通常的調(diào)用方法,使用()來列出參數(shù),在 Scala 中如果你調(diào)用函數(shù)只有一個(gè)參數(shù),你可以使用{}來替代().比如下面兩種語法是等價(jià)的:

scala> println ("Hello,World")
Hello,World
scala> println { "Hello,world" }
Hello,world

上面第二種用法,使用{}替代了(),但這只適用在使用一個(gè)參數(shù)的調(diào)用情況。 前面定義 withPrintWriter 函數(shù)使用了兩個(gè)參數(shù),因此不能使用{}來替代(),但如果我們使用柯里化重新定義下這個(gè)函數(shù)如下:

import scala.io._
import java.io._
def withPrintWriter (file: File)( op: PrintWriter => Unit) {
  val writer=new PrintWriter(file)
  try{
    op(writer)
  }finally{
    writer.close()
  }
}

將一個(gè)參數(shù)列表,變成兩個(gè)參數(shù)列表,每個(gè)列表含一個(gè)參數(shù),這樣我們就可以使用如下語法來調(diào)用

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

第一個(gè)參數(shù)我們還是使用()(我們也可以使用{}),第二個(gè)參數(shù)我們使用{}來替代(),這樣修改過的代碼使得 withPrintWriter 看起來和 Scala 內(nèi)置的控制結(jié)構(gòu)語法一樣。

上一篇:包對象下一篇:訪問控制修飾符