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差不多