我是scala的新手,我不知道如何调用抽象类来创建所需的对象。任何帮助都会很棒
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。 感谢。
答案 0 :(得分:8)
您可以通过添加{}
来实例化Expr以指示空的classbody。所以如果你写了
val e = Expr() {};
val n = e.Number(1.0);
val sum = e.Sum(n, n);
println(e.eval(sum));
但我不明白为什么case类必须驻留在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)))
答案 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
}
答案 2 :(得分:1)
[更新]
BTW我更喜欢@JensEgholm Eval对象(使用apply方法),我建议在下面添加eval到main。我的观点是,您的eval代码应该是Scala对象的一部分,以便于访问,而不是任何Scala抽象类的一部分。
[原始]
看起来像是来自Odersky的Scala编程的样本/模板代码(顺便说一下,我强烈推荐)
如果是这样,您错误地复制了模板。在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”。
答案 3 :(得分:1)
根据Odersky的说法,如果你是scala的新手,你应该在大多数情况下使用特征,除非你知道为什么要使用特殊的抽象类。
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