2012-11-23 136 views
3

我是新來的斯卡拉,我不知道如何調用抽象類來創建所需的對象。任何幫助將是偉大的斯卡拉抽象類

abstract class Expr{ 
    case class Number(n:Double) extends Expr 
    case class Sum(e1:Expr, e2: Expr) extends Expr 
    case class Subtract(e1: Expr, e2: Expr) extends Expr 
    case class Divide(e1: Expr, e2: Expr) extends Expr 
    case class Abs(e1: Expr) extends Expr 
    case class Mod(e1: Expr, e2: Expr) extends Expr 
    def eval(e:Expr): Double = e match{ 
     case Number(n) => n; 
     case Sum(e1,e2) => eval(e1) + eval(e2); 
    } 
} 
object main{ 
    def main(args: Array[String]) { 
     val e = Expr(); 
     println("hello"); 
    } 
} 

所以我想能夠創建Expr對象和使用它的eval。 謝謝。

+1

它看起來像作業。你的問題到底是什麼? –

回答

1

[更新]

順便說一句,我更喜歡@JensEgholm評估和演示對象(應用方法)到我加入EVAL到低於主的建議。我的觀點是,你的eval代碼應該是Scala對象的一部分,以方便訪問,而不是任何Scala抽象類的一部分。

[原創]

這看起來像Odersky的的編程在斯卡拉採樣/模板代碼(我強烈的方式推薦)

如果是這樣,你不正確地複製的模板。 abstract class Expr之後沒有大括號那一行是一個完整的抽象類聲明。此外,eval方法應該放在主對象中。試試這個:

abstract class Expr 
case class Number(n:Double) extends Expr 
case class Sum(e1:Expr, e2: Expr) extends Expr 
case class Subtract(e1: Expr, e2: Expr) extends Expr 
case class Divide(e1: Expr, e2: Expr) extends Expr 
case class Abs(e1: Expr) extends Expr 
case class Mod(e1: Expr, e2: Expr) extends Expr 

object main{ 
    def eval(e:Expr): Double = e match{ 
     case Number(n) => n; 
     case Sum(e1,e2) => eval(e1) + eval(e2); 
    } 
    def main(args: Array[String]) { 
     val n = Number(1.0); 
     val m = Number(2.0); 
     println(eval(Sum(n,m))); 
    } 
} 

該程序應打印「3.0」。

8

您可以通過添加{}來實例化Expr以指示空的類體。所以你的代碼將工作,如果你寫

val e = Expr() {}; 
val n = e.Number(1.0); 
val sum = e.Sum(n, n); 
println(e.eval(sum)); 

但我不明白爲什麼案例類必須駐留在Expr類。爲什麼不寫這樣的:

abstract class Expr {} 

object Eval { 
    def apply(e : Expr) = e match{ 
    case Number(n) => n; 
    case Sum(e1,e2) => Eval(e1) + Eval(e2); 
    } 
} 

case class Sum(e1 : Expr, e2 : Expr) extends Expr 

然後你可以參考他們好得多:

Eval(Sum(Number(1), Number(1))) 
+2

對於Eval對象+1 –

4

什麼有關:

abstract class Expr { 
    def eval: Double 
} 
case class Number(n:Double) extends Expr { 
    def eval = n 
} 
case class Sum(e1:Expr, e2: Expr) extends Expr { 
    def eval = e1.eval + e2.eval 
} 
case class Subtract(e1: Expr, e2: Expr) extends Expr { 
    def eval = e1.eval - e2.eval 
} 

object Eval { 
    def apply(e : Expr) = e.eval 
} 
1

按Odersky的,如果你是新來斯卡拉在大多數情況下,你應該使用特徵,除非你知道爲什麼要使用抽象類的方法。上述

What is the advantage of using abstract classes instead of traits?

實例將是合法與性狀,然後可以「在混合」在一起。

scala> trait Expr 
defined trait Expr 

scala> case class Number(n:Double) extends Expr 
defined class Number