Scala by Example: 第一个例子

来源:互联网 发布:阿里云支持子域名吗 编辑:程序博客网 时间:2024/04/29 18:19
   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
原创粉丝点击