3

我是 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。谢谢。

4

4 回答 4

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)))
于 2012-11-23T15:33:04.077 回答
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
}
于 2012-11-23T15:56:17.877 回答
1

根据 Odersky 的说法,如果您是 scala 的新手,那么您应该在大多数情况下使用特征,除非您知道为什么要特别使用抽象类。

使用抽象类而不是特征有什么好处?

上面的例子对特征是合法的,然后可以“混合”在一起。

scala> trait Expr
defined trait Expr

scala> case class Number(n:Double) extends Expr
defined class Number
于 2013-03-19T00:39:13.823 回答
1

[更新]

顺便说一句,我更喜欢@JensEgholm Eval 对象(使用 apply 方法)而不是我将 eval 添加到下面的 main 的建议。我的观点是,您的 eval 代码应该是便于访问的 Scala 对象的一部分,而不是任何 Scala 抽象类的一部分。

[原来的]

这看起来像是 Odersky 的 Programming in 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”。

于 2012-11-23T15:32:42.013 回答