我有以下代码:
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 here下工作正常但在我将其加载到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 {
^
但是相同的代码在2.10 REPL下的:paste
模式下工作正常。这里发生了什么? :load
做了什么,做了什么?
答案 0 :(得分:3)
正如:help
所说,
:加载
加载并解释Scala文件
它加载文件,解释 逐行,就像它会解释你提供给REPL的各行一样,而:粘贴解释整个代码块作为一个原子单位。
您可以预测的错误是repl看到了
abstract class AExp {
def eval : Int = this match {
case Num(n) => n
case Add(e1, e2) => e1.eval + e2.eval
}
}
但对Num和Add类型一无所知 - 它们尚未定义。要做的诀窍:以你想要的方式加载工作是将你的所有代码包装在一些超级对象中,例如:
object InterpretAsUnit {
// all your code goes there
}
P.S。
有趣的是,scala -i <your path>
几乎与scala
相同,然后是:load <your path>