静态类型
当我想要讲述这一要点的时候,才发现,对于静态类型语言的正反两面,我试图给予同样的关注。事实上,关于这一话题的争论总是没完没了,但我要作出两点总结,而这两点是大多数人讨论的热点:
◆使用静态类型语言编写的代码更加健壮(robust)
TDD 的存在,让许多关于动态类型语言和健壮代码的讨论失去了意义,虽然这是正确的,当我们仍然不能忽视这样一个事实:对于动态类型语言,你需要编写更多的测试代码来检查类型,而在静态类型语言中,你可以将这些问题交给编译器处理。此外,还有一些人认为,使用静态类型语言,你的代码将具有更好的自我记录。
◆使用静态类型语言编写的代码过于严格和冗长
像我这样的动态类型语言的粉丝,认为通过鸭子类型(duck typing)可以写出更具动态性的代码结构。但同时他们还会抱怨,静态类型语言导致代码冗长。
作为静态类型语言,Scala 具有第一条中提到的优点,但是,第二点呢?
Scala 具有一个灵活的类型系统,并且可能是这一类型中最好的。很多情况下,如果你没有指定类型,这一系统将能够对类型进行推断。
例如,你可以这样编写代码:
|
但你也可以这样编写代码:
|
非常好,无论如何,它解决了代码冗长的问题。但像鸭子类型(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)的事物进行匹配。
以下示例也来自上文提到的博客:
|