1. 程式人生 > >Scala坑二(控制結構和函式)

Scala坑二(控制結構和函式)

在Scala中幾乎所有構造出了的語法結構都有值

1.條件表示式

不同java,Scala的if/else語法結構有值,值是跟在if或者else後面的表示式的值

if(x > 0) 1 else 0    把值賦給變數  val s = if(x >0) 1 else 0 也可以 if(x >0) s = 1 else s = 0

        if( x >0 ) "haha" else 0 混合型別表示式, (String)和(Int)公共超型別叫做 Any

表示式都有值,void 型別相當於 Unit 類 寫做 ()。所有不帶else的if語句等同於 if( x > 0 ) 1 else ()

2.語句終止

可以不使用分號

3.塊表示式和賦值

{  }塊包含一系列的表示式,結果也是一個表示式,塊中最後一個表示式的值就是塊的值。

如val  distanc= { val dx = x - x0 ; val dy = y - y0; sqrt(dx * dx + dy * dy)}

注意::在Scala中賦值動作本身是沒有值得或者說他們的值是Unit型別 { r = r * n; n-=1}表示式的值是Unit

         同樣的 x=y=-1 也是Unit型別 y=-1的值是()

4.輸入輸出

用print和println

5.迴圈

while( n > 0 ){

r = r * n;

n-=1

}

for(i <- 1 to n)

r = r * 1

for( i <- 表示式) 表示讓變數 i 遍歷 <- 右邊的表示式的所有值

如果型別是數值 用 to ;如果型別是字串或陣列是用 until方法  i <- 0 util str.length

6.高階的for迴圈和for推導式

多個生成器 for(i <- 1 to 3;j <- 1 to 3)print ((10 * i +j ) + " ") 11 12 13 21 22 23 31 32 33

每個生成器帶一個守衛,以if開頭的Boolean表示式 for( i <- 1 to 3; j <- 1 to 3 if i != j ) print ((10 * i +j ) + " ")  12 13 21 23 31 32 if之前沒有分號

任意多的定義,for( i <- 1 to 3 ; from = 4 - i; j <- from to 3) print ((10 * i +j ) + " ")  13 22 23 31 32 33

        for推導式

for迴圈體以yieid 開始,該迴圈會構造出一個集合,每次迭代生成集合中的一個值

for(i <- 1 to 10)yieid i % 3  生成 Vector(1,2,0,1,2,0,1,2,0,1)

for推導式生成的集合與它第一個生成器是型別相容的

如 for(c< - "hello"; i<- 0 to 1)yieid (c+1).toChar 生成 "HIeflmlmop"

for( i<  - 0 t o 1;c< - "hello")yieid (c+1).toChar 生成Vector('H','I','e','f','l','m','l','m','o',p')   ;

7.函式

方法是物件進行操作的,函式不是,在java中只能用靜態方法模擬函式

函式的定義,需要函式的名稱,引數,和函式體

def abs(x : Double) = if (x > 0 ) x  else -x 

必須要指定所有引數的型別,如果函式不是遞迴的,就不需要指定返回型別

如果函式體需要多個表示式完成,可以用程式碼塊,塊中最後一個表示式的值就是函式的返回值

def fac(n : Int) = {

var r = 2

for(i <- 1 to n) r = r * 2

r //函式的值

}

對於遞迴函式必須指定返回值

def fac(n : Int) : Int = if (n <= 0 ) 1 else n * fac( n - 1)

8.預設引數和帶名引數

def deco(str : String, left : String ="[",right="]")={ left + str + right}  呼叫deco("hello")得到 "[hello]" 也可以 呼叫 deco("hello","<<",">>") 得到 “<<hello>>”

在呼叫時指定引數名,順序沒有規定 deco(left="<<",str = "hello",right=">>")

9.變長引數

一個接收可變長度引數

def sum (args: Int*)= {

var reult = 0

for (arg -> args) reult +=arg

reult

}

val s = sum(1,2,3,4)

val s = sum(1 to 10:_*)    :_* 將引數序列處理

10.過程

對於沒有返回值得函式,成為過程

函式體有花括號但是前面沒有 = 號的,那麼返回型別是Unit

def bos(s : String) {

print(s)

}

或者

def bos(s : String):Unit = {

print(s)

}

11.懶值

當val 被宣告為lazy時,初始化會被推遲,直到首次對其取值

lazy val words = scala.io.Source.fromFile("...").mkString

當words被首次使用時取值

12.異常

異常機制個java差不多