0

次のコードがあります。

abstract class AExp {
  def eval : Int = this match {
    case Num(n) => n
    case Add(e1, e2) => e1.eval + e2.eval
  }
}

case class Num(n : Int) extends AExp
case class Add(e1 : AExp, e2 : AExp) extends AExp

case class Prd(e1 : AExp, e2 : AExp) extends AExp {
  override def eval : Int = e1.eval * e2.eval
}

ここではScala 2.8 では正常に動作しますが、REPL にロードすると 2.10 では動作しません。大量のエラーが発生します:

scala> :l aexp.scala
Loading aexp.scala...
<console>:9: error: not found: value Num
           case Num(n) => n
                ^
<console>:9: error: not found: value n
           case Num(n) => n
                          ^
<console>:10: error: not found: value Add
           case Add(e1, e2) => e1.eval + e2.eval
                ^
<console>:10: error: not found: value e1
           case Add(e1, e2) => e1.eval + e2.eval
                               ^
<console>:7: error: not found: type AExp
       case class Num(n : Int) extends AExp
                                       ^
<console>:7: error: not found: type AExp
       case class Add(e1 : AExp, e2 : AExp) extends AExp
                                                    ^
<console>:7: error: not found: type AExp
       case class Add(e1 : AExp, e2 : AExp) extends AExp
                           ^
<console>:7: error: not found: type AExp
       case class Add(e1 : AExp, e2 : AExp) extends AExp
                                      ^
<console>:7: error: not found: type AExp
       case class Prd(e1 : AExp, e2 : AExp) extends AExp {
                                                    ^
<console>:7: error: not found: type AExp
       case class Prd(e1 : AExp, e2 : AExp) extends AExp {
                           ^
<console>:7: error: not found: type AExp
       case class Prd(e1 : AExp, e2 : AExp) extends AExp {
                                      ^

しかし、同じコード:pasteは 2.10 REPL のモードで正常に動作します。ここで何が起こっているのですか?何が:loadできて、何ができないのですか?

4

1 に答える 1

3

:help言うように、

:load
Scala ファイルを読み込んで解釈する

REPL にフィードする個々の行を解釈するのと同じように、ファイルをロードして行ごとに解釈しますが、 :paste はコードのチャンク全体を原子単位として解釈します。

あなたが予測できるように、エラーは repl が見ることです

abstract class AExp {
  def eval : Int = this match {
    case Num(n) => n
    case Add(e1, e2) => e1.eval + e2.eval
  }
}

しかし、Num 型と Add 型については何も知りません。まだ定義されていません。:load を思い通りに動作させる秘訣は、すべてのコードを何らかのスーパー オブジェクトでラップすることです。たとえば、次のようになります。

object InterpretAsUnit {
  // all your code goes there
}

PS面白い事実は、scala -i <your path>ほぼ同じでscalaあり、その後:load <your path>

于 2013-10-20T22:04:26.267 に答える