天天看点

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