1. 程式人生 > >Scala入門隨筆二

Scala入門隨筆二

1.Scala的程式控制結構同其他語言一樣包括順序、選擇和迴圈結構。後兩種結構分別對應Scala中的if選擇語句,while、do while和for迴圈語句。

2.if選擇語句包括if…else…、if…else if…else、if巢狀語句,使用方法同java等高階程式設計語言相同。與其他高階語言不同的一點就是Scala中的if語句可以作為表示式使用,如果其具有返回值,那可以將返回值直接賦值給變數。

scala>val x = if("hello"=="hell") 1 else 0
x: Int = 0
scala>val x = if("hello"=="hell") println("1"
) else println("0") x: Unit = ()

3.Scala不推薦使用while迴圈,而是推崇使用for迴圈來代替while迴圈,while迴圈語句也可以作為一個表示式,但是它與if語句作為表示式時有一個區別,即while迴圈語句作為表示式時返回值的型別只能是Unit。這是因為函式式語言喜歡使用val型別的變數,但while迴圈需要與var型別的變數一起使用,所以從嚴格意義上講,scala並不是純函數語言程式設計語言(如果不明白val和var型別變數的區別可移步至博主的《Scala入門隨筆一》)

4.Scala中的for迴圈與其他高階程式設計語言不同,區別:

//其他程式設計語言的for
迴圈語句格式 for(初始化變數;條件判斷;更新變數){} //scala中for迴圈語句格式 for(變數<-更新變數的集合){}

在scala的for迴圈語句中“<-“符號叫做生成器(generator),並且for迴圈語句是通過遍歷集合達到迴圈效果。

for(i<- 1 to 5){
  println("i="+i)
}

//結果
i=1
i=2
i=3
i=4
i=5

這裡的to實際上是RichInt型別中的to方法,1 to 5在執行時會將Int型別隱式轉換成scala.runtime.RichInt型別。然後去呼叫1.to(5)。to方法在scala中的定義:

def to(end: Int): Range.Inclusive = Range.inclusive(self,end)

迴圈的時候就會將scala.collection.immutable.Range.Inclusive集合中的每個元素賦值給變數i,達到迴圈效果。除了to方法還有until方法可以使用,它和to方法的區別在於1 to 5的結果是[1,5](1到5的閉區間:1,2,3,4,5)而1 until 5的結果是[1,5)(1到5的左閉右開區間:1,2,3,4)。當然,還可以有1 to (10,2),1 until (10,2)這種形式,括號裡面的2是設定的步長。

def until(end: Int, step: Int): Range = Range(self,end,step)
def to(end: Int, step: Int): Range.inclusive = Range.inclusive(self,end,step)

for迴圈還可以新增過濾條件,語法格式:

for(x <- 表示式 if 條件判斷1; if 條件判斷2...){
  //滿足所有條件判斷時執行迴圈中的語句;
}

栗子

scala>for(i<- 1 to 40 if(i%4==0);if(i%5==0)){
      println("i="+i)
      }

//結果
i=20
i=40

此外for迴圈可以和yield關鍵字一起使用作為表示式,這樣的表示式具有返回值。下面栗子:

scala>var x = for(i<- 1 to 5) yield i
x: scala.collection.immutable.IndexedSeq[Int] = Vector(1,2,3,4,5) 

yield會將每迴圈一次生成的值儲存在快取中,迴圈結束後它會將所有的值生成一個集合返回。yield後面除了變數還可以跟表示式。下面栗子:

scala> var x=for(i<-1 to 5) yield i/2
x: scala.collection.immutable.IndexedSeq[Int] = Vector(0,1,1,2,2) 

5.Scala裡面沒有像其他高階程式設計語言一樣提供break、continue關鍵字。如果在while或者是for迴圈中冒然使用這兩個關鍵字會報錯的。但是如果需要使用break語句的功能可以由兩種替代辦法來實現:
一、定義Boolean型別的變數,在for或while迴圈中進行條件判斷;
二、在程式中引入scala.util.control.Breaks類,然後呼叫Breaks類中定義的breakable方法。

//引入Breaks類及其所有方法的語句
import scala.util.control.Breaks._

//呼叫Breaks中定義的breakable方法
breakable{
    //for迴圈語句,可在其中使用break關鍵字,break為Breaks中定義的方法
}

Breaks類中breakable方法的定義如下:

def breakable(op: => Unit){
    try{
      op
    }catch{
      case ex: BreakControl =>
        if(ex ne breakException) throw ex
    }
}

Breaks類中break方法定義如下:

def break(): Nothing = { throw breakException }