scala 重點語法總結
阿新 • • 發佈:2018-12-25
我們可以通過一個簡單的例子來說明一些基本概念。我們設計一個函式庫,這個函式庫可以用來計算算術表示式,為簡單起見,我們設計的算術表示式只側重於變數,數字,單操作符,和雙操作符。我們可以採用如下的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