Ruby高手点评Scala编程语言十大绝招

发表于:2011-3-01 10:57

字体: | 上一篇 | 下一篇 | 我要投稿

 作者:司马牵牛    来源:51Testing软件测试网采编

分享:

  静态类型

  当我想要讲述这一要点的时候,才发现,对于静态类型语言的正反两面,我试图给予同样的关注。事实上,关于这一话题的争论总是没完没了,但我要作出两点总结,而这两点是大多数人讨论的热点:

  ◆使用静态类型语言编写的代码更加健壮(robust)

  TDD 的存在,让许多关于动态类型语言和健壮代码的讨论失去了意义,虽然这是正确的,当我们仍然不能忽视这样一个事实:对于动态类型语言,你需要编写更多的测试代码来检查类型,而在静态类型语言中,你可以将这些问题交给编译器处理。此外,还有一些人认为,使用静态类型语言,你的代码将具有更好的自我记录。

  ◆使用静态类型语言编写的代码过于严格和冗长

  像我这样的动态类型语言的粉丝,认为通过鸭子类型(duck typing)可以写出更具动态性的代码结构。但同时他们还会抱怨,静态类型语言导致代码冗长。

  作为静态类型语言,Scala 具有第一条中提到的优点,但是,第二点呢?

  Scala 具有一个灵活的类型系统,并且可能是这一类型中最好的。很多情况下,如果你没有指定类型,这一系统将能够对类型进行推断。

  例如,你可以这样编写代码:

  • val list: List[String] = List("one""two""three")   
  • //list: List[String] = List(one, two, three)     
  • val s: String = "Hello World!"   
  • //s: java.lang.String = hello world!
  •   但你也可以这样编写代码:

  • val list = List("one""two""three")   
  • //list: List[String] = List(one, two, three)     
  • val s = "Hello World!"   
  • //s: java.lang.String = hello world!
  •   非常好,无论如何,它解决了代码冗长的问题。但像鸭子类型(duck typing)那样的问题,会怎样呢?

      答案还是:Scala 的类型系统具有的某些灵活性,可以让你编写如下的代码:

    def eat[T <: Animal](a: T) // whatever

      其中,我们将类型 T 定义为 Animal 的子类型。还可以更加灵活:

    def eat[T <: {def eat(): Unit}](a: T) // whatever

      其中,我们将类型 T 定义为一个具有非法  eat 的类型。

      事实上,Scala 的类型系统非常丰富,你可以在这里找到更多信息。

      模式匹配

      我必须坦白,在犹豫良久之后,我才决定写一写 Scala 的这一特点。事实上,我本来没有打算讨论 Scala 的函数功能,但看到一篇有关对象分支(switch)应用的文章后,我想,还是有必要聊聊这个特点。以下内容基本上都来自这篇博客文章:

      模式匹配究竟是用来做什么的?它让你可以将一个值对多种情况(case)进行匹配,有点类似 Java 中的分支(switch)语句。但它不是仅仅匹配数字(这是分支语句的作用),而是用户能够对本质上为对象创建形式(creation form)的事物进行匹配。

      以下示例也来自上文提到的博客:

  • x match {   
  • case Address(Name(first, last), street, city, state, zip) => println(last + ", " + zip)   
  • case _ => println("not an address"// 缺省情况   
  • }
  • 53/5<12345>
    价值398元的测试课程免费赠送,填问卷领取吧!

    关注51Testing

    联系我们

    快捷面板 站点地图 联系我们 广告服务 关于我们 站长统计

    法律顾问:上海漕溪律师事务所 项棋律师
    版权所有 上海博为峰软件技术股份有限公司 Copyright©51testing.com 2003-2022
    投诉及意见反馈:webmaster@51testing.com; 业务联系:service@51testing.com 021-64471599-8017

    沪ICP备05003035号

    沪公网安备 31010102002173号