1. 程式人生 > >scala 重點語法總結

scala 重點語法總結

case class

我們可以通過一個簡單的例子來說明一些基本概念。我們設計一個函式庫,這個函式庫可以用來計算算術表示式,為簡單起見,我們設計的算術表示式只側重於變數,數字,單操作符,和雙操作符。我們可以採用如下的Scala類定義:

abstract class Expr
case class Var(name:String) extends Expr
case class Number(num:Double) extends Expr
case class UnOp(operator:String, arg:Expr) extends Expr
case class BinOp(operator
:String,left:Expr,right:Expr) extends Expr

這裡我們定義了一個抽象類Expr和四個子類(分別代表變數,數值,單操作符,雙操作符),Scala允許我們不定義類的實現,實際我們是class C 和 class C {}是等價的。

case classes 
我們可以看到上面的四個子類定義前面我們使用了case關鍵字,使用了case關鍵字的類定義就是case classes。使用這個關鍵字,Scala編譯器會自動為你定義的類生成一些成員。 
首先,編譯器為case class生成一個同名的物件構造器(Factory Method),也就是你可以使用 Var(“x”) 來建立一個類的例項,而無需使用new Var(“x”).

scala> val x = Var("x")
x: Var = Var(x)

這個構造器在巢狀使用時顯得非常簡潔明瞭,比如 我們構建如下的表示式,這種寫法避免了很多new 的使用。

scala> val op=BinOp("+",Number(1),x)
op: BinOp = BinOp(+,Number(1.0),Var(x))

其次,Scala編譯器為case class的建構函式的引數建立以引數名為名稱的屬性,比如Val的類的引數name:String 可以直接通過 .name訪問,比如:

scala> x.name
res1: String = x

第三,編譯器為case class 構造了更自然的toString,hashCode和equals實現,它們會遞迴列印,比較case class的引數屬性。比如:

scala> println(op)
BinOp(+,Number(1.0),Var(x))

scala> op.right == Var("x")
res3: Boolean = true

其實感覺case class最重要的特性應該就是支援模式匹配。

scala <wbr>重點語法總結