中国领先的IT技术网站
|
|

Scala 2.8新特性之命名参数概览

原定于6月发布的Scala 2.8跳票了,不过这并不妨碍我们预先看一看其中的新特性。Scala 2.8中一个重要的新特性就是命名参数的加入。

作者:EastSun 译来源:JavaEye博客|2009-07-08 09:47

Tech Neo技术沙龙 | 11月25号,九州云/ZStack与您一起探讨云时代网络边界管理实践


51CTO编辑推荐:Scala编程语言专题

Scala 2.8引入了新的特性——命名参数——这意味着我们可以通过使用参数名来指定参数。命名参数可以避免在参数类型相同的情况下混淆各个参数的含义,增强了代码的可读性。

  1. def resize(width: Int, height: Int) = { ... }  
  2. resize(width = 120, height = 42

并且,Scala 2.8支持在方法中使用默认参数。在当前的版本的Scala中(指2.8之前的版本),只能通过方法重载来实现参数默认值。这在一定程度上导致代码冗余,而默认参数可以避免这一点。

  1. def f(elems: List[Int], x: Int = 0, cond: Boolean = true)  
  2. f(List(1))  
  3. f(Nil, cond = false

上面的示例同时示范了命名参数允许选择性使用默认参数:在f方法的第二个调用中,f使用了参数x的默认值,而没有使用cond的默认值。

编译器生成copy方法

命名参数和默认参数一个非常有用的运用是编译器自动为case类生成copy方法。这个方法采取一种轻量级的语法来创建一个原始实例的修改拷贝。copy方法具有和被拷贝的case类的基本构造方法同样类型和参数,并且每个参数都使用基本构造方法中相应值作为默认值。

  1. case class A[T](a: T, b: Int) {  
  2. // def copy[T'](a: T' = this.a, b: Int = this.b): A[T'] = new A[T'](a, b)  
  3. }  
  4. val a1: A[Int] = A(12)  
  5. val a2: A[String] = a1.copy(a = "someString"

Scala 2.8还未正式发布,但是其nightly build中已经实现了上述功能。想提前体验下么,点击此处下载。需要了解更多关于命名参数与默认参数的内容,请阅读相应的SID

Scala 2.8的所有新特性概述如下:

1.重新设计的集合框架。

Scala的集合类的层次结构被重新设计,以更加规范,易用,高效。将会有一份白皮书阐述该设计。用户大部分已有的代码不会受到影响,但是那些对集合类的实现代码,比如sequence,set,map,etc.需要修改以适应新的集合框架。

2.命名参数与默认参数。

方法的参数能够通过参数名传递,并且参数能具有默认值。

3.Package object

现在不仅可以在源文件中定义package,而且可以使用一些特殊的object来定义package,该object内列出的成员属于该package。譬如,你可以在这样的object中添加一些类型别名(type alias),这些类型别名将作为该package的成员从而可见。新的集合框架中使用该功能以保证向后兼容性。比如,List类在新的库中位于scala.collection.immutable package中,而之前是位于scala package中。通过定义如下的package object使得之前使用List的代码在新的集合框架中任然可用:

  1. package object scala {  
  2.   type List[+A] = scala.collection.immutable.List[A]  
  3.   val List = scala.collection.immutable.List  
  4.     ...  

4. 增强的Scala Swing库

scala.swing包中将增添一些新的功能,并且将具有更好的文档说明。

5. continuations的支持

一个编译器插件将做为Scala的附属特性来支持continuations。这是通过一个类型引导的continuation传递转换来完成的。Continuation对于诸如异步I/O,UI事件处理以及数据流并发之类的高级控制建造十分有帮助。

6.类型特殊化。
引入一个使用于类型参数的annotation:@specialize。该annotation能够针对泛型代码中的基本类型生成特殊的代码,这样可以避免昂贵的boxing 和 unboxing操作,以显著提高代码的执行速度。

7.改善的REPL。
Scala的交互命令控制台添加了一些新的功能,特别的命令完成功能将可以使用。

8.Packrat解析合并器(parser combinators)

Scala的解析合并器库将升级至“packrat解析”。这对于效率有很大帮助,并且允许更多语法格式被表达为解析子(parser)。

之前版本中大部分被标为deprecated的类与方法在2.8中将被去除,并且不再支持Java1.4。class文件的格式会发生改变,因此Scala2.8与之前版本二进制文件不兼容。但很大程度上保持了源代码兼容性。

【相关阅读】

  1. Scala 2.7.5发布 解决actor相关内存泄露问题
  2. Scala的类型系统:取代复杂的通配符
  3. Scala的类型系统 比Java更灵活
  4. Java程序员,你为什么要关注Scala
  5. Scala编程语言
【责任编辑:杨赛 TEL:(010)68476606】

点赞 0
分享:
大家都在看
猜你喜欢

读 书 +更多

一目了然——Web软件显性设计之路

本书阐述了为什么以及如何设计出简单易用的基于Web的软件,让用户单凭常识即可有效地使用它。主要内容包括:显性设计的概念、如何理解用户...

订阅51CTO邮刊

点击这里查看样刊

订阅51CTO邮刊
× CTO训练营(深圳站)