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

[アップデート]

ところで、私は以下のメインに eval を追加するという私の推奨事項よりも @JensEgholm Eval オブジェクト (apply メソッドを使用) を好みます。私のポイントは、簡単にアクセスできるように、eval コードは Scala オブジェクトの一部であるべきであり、Scala 抽象クラスの一部ではないということです。

[オリジナル]

これは、Odersky の Programming in Scala のサンプル/テンプレート コードのように見えます (ちなみに、これを強くお勧めします)。

その場合、テンプレートを正しくコピーしていません。後に中括弧はありませんabstract class Expr 。その 1 行が完全な抽象クラス宣言です。また、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 に答える
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 に答える