天天看點

Scala by Example: 第一個例子

1: // Java風格的代碼      
2: def oldSchoolSort(xs: Array[Int]) {      
3:   //Scala支援嵌套函數      
4:   def sort1(l: Int, r: Int) {      
5:     val pivot = xs((l + r) / 2)      
6:     var i = l      
7:     var j = r      
8:     while(i <= j) {      
9:       while(xs(i) < pivot) i += 1      
10:       while(xs(j) > pivot) j -= 1      
11:       if(i < j && xs(i) != xs(j)) swap(i, j)      
12:       if(i <= j) {      
13:         i += 1      
14:         j -= 1      
15:       }      
16:     }      
17:     if(l < j) sort1(l, j)      
18:     if(r > i) sort1(i, r)      
19:   }      
20:        
21:   // Scala是種“面向表達式”的語言,每個函數都會傳回值。如果沒有東西可以傳回,那麼預設傳回 ()      
22:   // () 屬于Unit類。傳回Unit的函數也被稱為procedures。如果函數不是傳回Unit,那麼,函數體前      
23:   // 面必須加上 "="      
24:   def swap(i: Int, j: Int) {      
25:     val t = xs(i); xs(i) = xs(j); xs(j) = t      
26:     () // 可以省略,加上則明确表明傳回Unit      
27:   }      
28:        
29:   sort1(0, xs.length - 1)      
30: }      
31:        
32: // 更具函數風格的sort,注意filter為“partially applied function”,即部分實作函數(有譯作      
33: // 偏應用函數的,不敢苟同),另外,pivot > 的完整形式為:x => pivot > x      
34: def sort(xs: Array[Int]): Array[Int] = {      
35:   if(xs.length <= 1) xs else {      
36:     val pivot = xs(xs.length / 2)      
37:     Array.concat(sort(xs filter (pivot >)), xs filter (pivot ==),      
38:       sort(xs filter (pivot <)))      
39:   }      
40: }      
41:        
42: val xs = Array(23, 3, 0, -3, 3, 12)      
43: println(sort(xs).mkString(", "))      

以上代碼中的oldSchoolSort已經小小的修改了下,原書的例子有些小小的界樁錯誤,雖然不影響結果,但是卻幾乎降低了一半的效能。另外,說到效能,不能不提一下記憶體的問題。不像舊式風格的代碼隻是在原有的對象上進行修改,函數風格的代碼(sort)會生成不變對象來進行傳遞,運作時需要臨時占用更多的記憶體。

Scala by Example PDF下載下傳,原書為Scala官網上的示例。

PS. 昨天在Groovy和Android項目上遇到的IDEA故障今天出現在了Scala上,我英明神武的斷言此乃檔案系統權限問題,并一舉命中selinux。關閉Selinux後,一切恢複了和諧……

PS II. 和諧了沒多久,發現Scala支援的配置機制有bug,遂将Scala運作時從Global級别降級到Project Level,順利“繞過”問題。

PS III. 然後就發現ibus在IDEA中不斷的丢失焦點……也就是說在IDEA裡打中文從此隻能“偶爾為之”。

PS IV. 最後想用Ctrl+Alt+L格式化代碼,結果熱鍵沖突,導緻作業系統鎖定,隻好悲憤的重敲一遍十幾位的密碼……

Technorati 标簽: Scala