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

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

沒(méi)有“break”和“continue”的日子

你也許注意到到目前為止,我們介紹 Scala 的內(nèi)置的控制結(jié)構(gòu)時(shí),沒(méi)有提到使用 break,和 continue。Scala 特地沒(méi)有在內(nèi)置控制結(jié)構(gòu)中包含 break 和 continue 是因?yàn)檫@兩個(gè)控制結(jié)構(gòu)和函數(shù)字面量有點(diǎn)格格不入,函數(shù)字面量我們將在后面介紹,函數(shù)字面量和其它類型字面量,比如數(shù)值字面量 4,5.6 相比,他們?cè)?Scala 的地位相同。

我們很清楚 break 和 continue 在循環(huán)控制結(jié)構(gòu)中的作用,Scala 內(nèi)置控制結(jié)構(gòu)特地去掉了 break 和 continue,是為了更好的適應(yīng)函數(shù)化編程。不同你不用擔(dān)心,Scala 提供了多種方法來(lái)替代 break 和 continue 的作用。

一個(gè)簡(jiǎn)單的方法是使用一個(gè) if 語(yǔ)句來(lái)代替一個(gè) continue,使用一個(gè)布爾控制量來(lái)去除一個(gè) break。比如下面的 Java 代碼使用 continue 和 break 在循環(huán)結(jié)構(gòu)中:

int i=0;
boolean foundIt=false;
while(i <args.length) {
  if (args[i].startWith("-")) {
    i=i+1;
    continue;
  }
  if(args[i].endsWith(".scala")){
    foundIt=true;
    break;
  }
  i=i+1;
 }

這段 Java 代碼實(shí)現(xiàn)的功能是從一組字符串中尋找以“ .scala ”結(jié)尾的字符串,但跳過(guò)以“-”開(kāi)頭的字符串。

下面我們使用 if 和 boolean 變量,逐句將這段實(shí)現(xiàn)使用 Scala 來(lái)實(shí)現(xiàn)(不使用 break 和continue)如下:

var i=0
var foundIt=false
while (i < args.length && !foundIt) {
  if (!args(i).startsWith("-")) {
    if(args(i).endsWith(".scala"))
      foundIt=true
  }
  i=i+1
}

可以看到,我們使用 if(于前面 continue 條件相反)去掉了 continue,而重用了 foundIt 布爾變量,去掉了 break。這段代碼和前面 Java 實(shí)現(xiàn)非常類似,并且使用了兩個(gè) var 變量,使用純函數(shù)化編程的一個(gè)方法是去掉 var 變量的使用,遞歸函數(shù)(回溯函數(shù))的使用是通常使用的一個(gè)方法來(lái)去除循環(huán)結(jié)構(gòu)中使用 var 變量。

使用遞歸函數(shù)重新實(shí)現(xiàn)上面代碼實(shí)現(xiàn)的查詢功能:

def searchFrom(i:Int) : Int =
  if( i >= args.length) -1
  else if (args(i).startsWith("-")) searchFrom (i+1)
  else if (args(i).endsWith(".scala")) i
  else searchFrom(i+1)
val i = searchFrom(0)

在函數(shù)化編程中使用遞歸函數(shù)來(lái)實(shí)現(xiàn)循環(huán)是非常常見(jiàn)的一種方法,我們應(yīng)用熟悉使用遞歸函數(shù)的用法。

如果你實(shí)在還是希望使用 break,Scala 在 scala.util.control 包中定義了 break 控制結(jié)構(gòu),它的實(shí)現(xiàn)是通過(guò)拋出異常給上級(jí)調(diào)用函數(shù),有希望的可以參考 Scala 源碼,下面給出使用 break 的一個(gè)例子,不停的從屏幕讀取一個(gè)非空行,如果用戶輸入一個(gè)空行,則退出循環(huán)。

import scala.util.control.Breaks._
import java.io._
val in = new BufferedReader(new InputStreamReader(System.in))
breakable {
  while(true) {
    println("? ")
    if(in.readLine()=="") break
  }
}