Scala 2.8新特性之命名參數概覽
51CTO編輯推薦:Scala編程語言專題
Scala 2.8引入了新的特性——命名參數——這意味著我們可以通過使用參數名來指定參數。命名參數可以避免在參數類型相同的情況下混淆各個參數的含義,增強了代碼的可讀性。
- def resize(width: Int, height: Int) = { ... }
- resize(width = 120, height = 42)
并且,Scala 2.8支持在方法中使用默認參數。在當前的版本的Scala中(指2.8之前的版本),只能通過方法重載來實現參數默認值。這在一定程度上導致代碼冗余,而默認參數可以避免這一點。
- def f(elems: List[Int], x: Int = 0, cond: Boolean = true)
- f(List(1))
- f(Nil, cond = false)
上面的示例同時示范了命名參數允許選擇性使用默認參數:在f方法的第二個調用中,f使用了參數x的默認值,而沒有使用cond的默認值。
編譯器生成copy方法
命名參數和默認參數一個非常有用的運用是編譯器自動為case類生成copy方法。這個方法采取一種輕量級的語法來創建一個原始實例的修改拷貝。copy方法具有和被拷貝的case類的基本構造方法同樣類型和參數,并且每個參數都使用基本構造方法中相應值作為默認值。
- case class A[T](a: T, b: Int) {
- // def copy[T'](a: T' = this.a, b: Int = this.b): A[T'] = new A[T'](a, b)
- }
- val a1: A[Int] = A(1, 2)
- 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的代碼在新的集合框架中任然可用:
- package object scala {
- type List[+A] = scala.collection.immutable.List[A]
- val List = scala.collection.immutable.List
- ...
- }
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與之前版本二進制文件不兼容。但很大程度上保持了源代碼兼容性。
【相關閱讀】





















