2013-10-20 74 views
0

我有以下代码:`:load`做什么,它在Scala REPL中不做什么?

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下,但2.10下不工作时,我将其加载到REPL。我得到吨的错误:

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做什么,它不做什么?

回答

3

作为:help说,

:负载
负荷和解释斯卡拉文件

它加载文件和解释行由行,就像它会解释您提供给REPL的各行,而:粘贴将整个代码块解释为原子单元。

的错误,因为你可以预测的是,REPL看到

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

可是一窍不通Num和添加类型 - 他们还没有定义。诀窍使:负荷工作,你想要的方式是包装所有的代码在一些超级对象,例如:

object InterpretAsUnit { 
    // all your code goes there 
} 

附: 有趣的事实,是scala -i <your path>几乎相同scala然后:load <your path>

+0

哦,我的。这不应该在':help'中明确记录吗?非常感谢。拯救了我的噩梦。 – day

+0

@plmday我不能说这个答案是否说:在2.11中,:paste文件做你想要的。 :help说:':粘贴[-raw] [path]进入粘贴模式或粘贴文件'。 –

+0

@ som-snytt yep,[其他更改有增强功能:粘贴模式](http://docs.scala-lang.org/scala/2.11/) –