1. 程式人生 > >scala基礎——控制結構和函式

scala基礎——控制結構和函式

這兩週專案提測與上線,好久沒寫Scala的筆記了

scala中幾乎構造的所有語法結構都有值

1、Scala中if表示式也是有值的

2、塊中最後一個達式的值就是該塊的值

3、scala中的unit等價於c/c++語言中常用的void

4、scala中每個表示式都有一個型別

5、if (a>0)"positive"  else -1    // 該語句是兩個分支型別的公告超型別(Any)

6、if (b>0) 1 等價於 if (b>0) 1 else ()  //這裡把()當做無有用值的佔位符。

7、scala沒有switch語句,而是用模式匹配機制

8、REPL同意時間是隻能解析一行程式碼,可以用黏貼模式(冒號:)把程式碼黏貼進去,鍵入Ctrl+D,REPL會把程式碼看做一個整體

9、運算子放在語句末尾表示這裡並不是語句的結束,也可以用{ 表示後面還有更多的內容。

10、由於scala中的賦值動作本身的值是unit,所以這樣的操作x = y = 1 是不正確的,因為y=1的值是(),把()賦值給x沒有意義。

11、for (i  <-  表示式) //變數 i 遍歷 <- 右邊表示式的所有值,其中一個 i 的型別不會提前指定,其型別是集合的元素型別。

12、遍歷字串時需要用0到n-1的區間,此時用until而不是to

13、如果for迴圈的迴圈體以yield開始,則該迴圈將構造一個集合,每次迭代生成集合中的一個值,此類迴圈成為推導式

14、def fac(n:nt):BigInt =  if(n <= 0) 1 else n*fac(n-1)  //帶名引數無需與引數列表的順序完全一致

15、變長引數 

def sum(args:Int*) = {

var ret = 0

for(arg <- args) ret += arg

ret

 }

16、val s = sum(1 to 100:_*)  // 用  :_*  將表示式轉化成一個seq

17、如果一個函式不是遞迴函式,則無需給出返回型別,遞迴函式一定要有返回函式

18、如果函式體包含在花括號中,但沒有前面的 = 號 ,則返回型別為unit,這樣的函式成為過程(procedure)例如

     def  box (s:String) { .. }    等價於 def box(s:String) :Unit = {...}

19、當val宣告為lazy時,其初始化被推遲,直到我們首次對它取值

20、懶值主要應用於開銷較大的初始化,其本身也有開銷,因為每次訪問懶值,都有一個方法被呼叫,而這個方法將以執行緒安全的方式檢查該值是否被初始化。