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 回答