在上一期 文章 中,您只是稍微了解了一些 Scala 語法,這些是運行 Scala 程序和了解其簡單特性的最基本要求。通過上一篇文章中的 Hello World 和 Timer 示例程序,您了解了 Scala 的 Application 類、方法定義和匿名函數的語法,還稍微了解了 Array[] 和一些類型推斷方面的知識。Scala 還提供了很多其他特性,本文將研究 Scala 編程中的一些較復雜方面。
關于本系列
Ted Neward 潛心研究 Scala 編程語言,并帶您跟他一起徜徉。在這個新的 developerWorks 系列 中,您將深入了解 Scala,并在實踐中看到 Scala 的語言功能。在進行相關比較時,Scala 代碼和 Java 代碼將放在一起展示,但(您將發現)Scala 中的許多內容與您在 Java 編程中發現的任何內容都沒有直接關聯,而這正是 Scala 的魅力所在!畢竟,如果 Java 代碼可以做到的話,又何必學習 Scala 呢?
Scala 的函數編程特性非常引人注目,但這并非 Java 開發人員應該對這門語言感興趣的惟一原因。實際上,Scala 融合了函數概念和面向對象概念。為了讓 Java 和 Scala 程序員感到得心應手,可以了解一下 Scala 的對象特性,看看它們是如何在語言方面與 Java 對應的。記住,其中的一些特性并不是直接對應,或者說,在某些情況下,“對應” 更像是一種類比,而不是直接的對應。不過,遇到重要區別時,我會指出來。
Scala 和 Java 一樣使用類
我們不對 Scala 支持的類特性作冗長而抽象的討論,而是著眼于一個類的定義,這個類可用于為 Scala 平臺引入對有理數的支持(主要借鑒自 “Scala By Example”,參見 參考資料):
清單 1. rational.scala
class Rational(n:Int, d:Int)
{
private def gcd(x:Int, y:Int): Int =
{
if (x==0) y
else if (x<0) gcd(-x, y)
else if (y<0) -gcd(x, -y)
else gcd(y%x, x)
}
private val g = gcd(n,d)
val numer:Int = n/g
val denom:Int = d/g
def +(that:Rational) =
new Rational(numer*that.denom + that.numer*denom, denom * that.denom)
def -(that:Rational) =
new Rational(numer * that.denom - that.numer * denom, denom * that.denom)
def *(that:Rational) =
new Rational(numer * that.numer, denom * that.denom)
def /(that:Rational) =
new Rational(numer * that.denom, denom * that.numer)
override def toString() =
"Rational: [" + numer + " / " + denom + "]"
}
從詞匯上看,清單 1 的整體結構與 Java 代碼類似,但是,這里顯然還有一些新的元素。在詳細討論這個定義之前,先看一段使用這個新 Rational 類的代碼: