Scala 沒有“break”和“continue”的日子

2018-09-28 18:23 更新

沒有“break”和“continue”的日子

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

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

一個簡單的方法是使用一個 if 語句來代替一個 continue,使用一個布爾控制量來去除一個 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 代碼實現(xiàn)的功能是從一組字符串中尋找以“ .scala ”結(jié)尾的字符串,但跳過以“-”開頭的字符串。

下面我們使用 if 和 boolean 變量,逐句將這段實現(xiàn)使用 Scala 來實現(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 實現(xiàn)非常類似,并且使用了兩個 var 變量,使用純函數(shù)化編程的一個方法是去掉 var 變量的使用,遞歸函數(shù)(回溯函數(shù))的使用是通常使用的一個方法來去除循環(huán)結(jié)構(gòu)中使用 var 變量。

使用遞歸函數(shù)重新實現(xiàn)上面代碼實現(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ù)來實現(xiàn)循環(huán)是非常常見的一種方法,我們應(yīng)用熟悉使用遞歸函數(shù)的用法。

如果你實在還是希望使用 break,Scala 在 scala.util.control 包中定義了 break 控制結(jié)構(gòu),它的實現(xiàn)是通過拋出異常給上級調(diào)用函數(shù),有希望的可以參考 Scala 源碼,下面給出使用 break 的一個例子,不停的從屏幕讀取一個非空行,如果用戶輸入一個空行,則退出循環(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
  }
}
以上內(nèi)容是否對您有幫助:
在線筆記
App下載
App下載

掃描二維碼

下載編程獅App

公眾號
微信公眾號

編程獅公眾號