快速业务通道

面向Java开发人员的Scala指南 - Scala控制结构内部揭密 - 编程入门网

作者 佚名技术 来源 NET编程 浏览 发布时间 2012-06-20
  while (xs[a] < pivot) { a = a + 1; }    while (xs[b] > pivot) { b = b – 1; }    if (a <= b) {     swap(xs, a, b);     a = a + 1;     b = b – 1;    }   }   if (l < b) sort(xs, l, b);   if (b < r) sort(xs, a, r); } void swap(int[] arr, int i, int j) {   int t = arr[i]; arr[i] = arr[j]; arr[j] = t; }

面向Java开发人员的Scala指南 - Scala控制结构内部揭密(3)

时间:2011-01-30 Ted Neward

不必深入太多的细节,就可以了解 while 循环的用法,它是通过数组中的各种元素进行迭代的,先找到一个支点,然后依次对每个子元素进行排序。毫不令人奇怪的是,while 循环也需要一组可变本地变量,在这里,这些变量被命名为 a 和 b,其中存储的是当前支点。注意,此版本甚至可以在循环自身中使用递归,两次调用循环本身,一次用于对列表左手边的内容进行排序,另一次对列表右手边的内容进行排序。

这足以说明清单 5 中的 quicksort 真的不太容易读取,更不用说理解它。现在来考虑一下 Scala 中的直接 等同物(这意味着该版本与上述版本尽量接近):

清单 6. Quicksort(Scala 版)

//This is Scala def sort(xs: Array[Int]) {   def swap(i: Int, j: Int) {    val t = xs(i); xs(i) = xs(j); xs(j) = t   }   def sort1(l: Int, r: Int) {    val pivot = xs((l + r) / 2)    var i = l; var j = r    while (i <= j) {     while (xs(i) < pivot) i += 1     while (xs(j) > pivot) j -= 1     if (i <= j) {    swap(i, j)    i += 1    j -= 1     }    }    if (l < j) sort1(l, j)    if (j < r) sort1(i, r)   }   sort1(0, xs.length 1) }

清单 6 中的代码看起来非常接近于 Java 版。也就是说,该代码很长,很难看,并且难以理解(特别是并发性那一部分),明显不具备 Java 版的一些优点。

So, I''ll improve it ...

清单 7. Quicksort(更好的 Scala 版)

//This is Scala def sort(xs: Array[Int]): Array[Int] =   if (xs.length <= 1) xs   else {    val pivot = xs(xs.length / 2)    Array.concat(     sort(xs filter (pivot >)),       xs filter (pivot ==),     sort(xs filter (pivot <)))   }

显然,清单 7 中的 Scala 代码更简单一些。注意递归的使用,避免完全 while 循环。可以对 Array 类型使用 filter 函数,从而对其中的每个元素应用 “greater-than”、“equals” 和 “less-than” 函数。事实上,在引导装入程序之后,因为 if 表达式是返回某个值的表达式,所以从 sort() 返回的是 sort() 的定义中的(单个)表达式。

简言之,我已经将 while 循环的可变状态完全再次分解为传递给各种 sort() 调用的参数 —— 许多 Scala 狂热爱好者认为这是编写 Scala 代码的正确方式。

可能值得一提的是,Scala 本身并不介意您是否使用 while 代替迭代 —— 您会看到来自编译器的 “您在干什么,在做蠢事吗?” 的警告。Scala 也不会阻止您在可变状态下编写代码。但是,使用 while 或可变状态意味着牺牲 Scala 语言的另一个关键方面,即鼓励编写具有良好并行性的代码。只要有可能并且可行,“Scala 式作风” 会建议您优先在命令块上执行递归。

面向Java开发人员的Scala指南 - Scala控制结构内部揭密(4)

时间:2011-01-30 Ted Neward

编写自己的语言结构

我想走捷径来讨论一下 Scala 的控制结构,做一些大多数 Java 开发人员根本无法相信的事 —&md

凌众科技专业提供服务器租用、服务器托管、企业邮局、虚拟主机等服务,公司网站:http://www.lingzhong.cn 为了给广大客户了解更多的技术信息,本技术文章收集来源于网络,凌众科技尊重文章作者的版权,如果有涉及你的版权有必要删除你的文章,请和我们联系。以上信息与文章正文是不可分割的一部分,如果您要转载本文章,请保留以上信息,谢谢!

分享到: 更多

Copyright ©1999-2011 厦门凌众科技有限公司 厦门优通互联科技开发有限公司 All rights reserved

地址(ADD):厦门软件园二期望海路63号701E(东南融通旁) 邮编(ZIP):361008

电话:0592-5908028 传真:0592-5908039 咨询信箱:web@lingzhong.cn 咨询OICQ:173723134

《中华人民共和国增值电信业务经营许可证》闽B2-20100024  ICP备案:闽ICP备05037997号