快速业务通道

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

作者 佚名技术 来源 NET编程 浏览 发布时间 2012-06-20
达我的观点:Scala 的 for 实际上是一条管道,它在将元素传递给循环主体之前处理元素组成的集合,每次一个。此管道其中的一部分负责将更多的元素添加到管道中(生成器),一部分负责编辑管道中的元素(过滤器),还有一些负责处理中间的操作(比如记录)。无论如何,Scala 会带给您与 Java 5 中引入的 “增强的 for 循环” 不同的体验。

匹配

今天要了解的最后一个 Scala 控制结构是 match,它提供了许多 Scala 模式匹配功能。幸运的是,模式匹配会声明对某个值进行计算的代码块。首先,将执行代码块中最接近的匹配结果。因此,在 Scala 中可以包含以下代码:

清单 18. 一个简单的匹配

// This is Scala object App {   def main(args : Array[String]) =   {    for (arg <- args)     arg match {    case "Java" => println("Java is nice...")    case "Scala" => println("Scala is cool...")    case "Ruby" => println("Ruby is for wimps...")    case _ => println("What are you, a VB programmer?")     }   } }

刚开始您可能将 Scala 模式匹配设想为支持 String 的 “开关’,带有通常用作通配符的下划线字符,而这正是典型开关中的默认情况。但是,这样想会极大地低估该语言。模式匹配是许多(但不是大多数)函数语言中可以找到的另一个特性,它提供了一些有用的功能。

对于初学者(尽管这没什么好奇怪的),可能认为 match 表达式自身会产生一个值,该值可能出现在赋值语句的右边,正如 if 和 try 语句所做的那样。这一点本身也很有用,但匹配的真正威力体现在基于各种类型进行匹配时,而不是如上所述匹配单个类型的值,或者更多的时候,它是两种匹配的组合。

因此,假设您有一个声明返回 Object 的函数或方法 —— 在这里,Java 的 java.lang.reflect.Method.invoke() 方法的结果可能是一个好例子。通常,在使用 Java 语言计算结果时,首先应该确定其类型;但在 Scala 中,可以使用模式匹配简化该操作:

清单 19. 您是什么?

//This is Scala object App {   def main(args : Array[String]) =   {    // The Any type is exactly what it sounds like: a kind of wildcard that    // accepts any type    def describe(x: Any) = x match {     case 5 => "five"     case true => "truth"     case "hello" => "hi!"     case Nil => "the empty list"     case _ => "something else"    }    println describe(5)    println describe("hello")   } }

因为 match 的很容易简单明了地描述如何针对各种值和类型进行匹配的能力,模式匹配常用于解析器和解释器中,在那里,解析流中的当前标记是与一系列可能的匹配子句匹配的。然后,将针对另一系列子句应用下一个标记,依此类推(注意,这也是使用函数语言编写许多语言解析器、编译器和其他与代码有关的工具的部分原因,这些函数语言中包括 Haskell 或 ML)。

关于模式匹配,还有许多可说的东西,但这些会将我们直接引导至 Scala 的另一个特性 case 类,我想将它留到下次再介绍。

结束语

Scala 在许多方面看起来都非常类似于 Java,但实际上只有 for 结构存在一些相似性。核心语法元素的函数特性不仅提供了一些有用的特性(比如已经提到的赋值功能),还提供了使用新颖有趣的方式扩展语言的能力,不必修改核心 javac 编译器本身。这使该语言更加符合 DSL 的定义(这些 DSL 是在现有语言的语

凌众科技专业提供服务器租用、服务器托管、企业邮局、虚拟主机等服务,公司网站: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号