簡體   English   中英

在Scala REPL中`:load`有什么用,什么沒有用?

[英]What does `:load` do and what does it not do in 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下在這里 ,但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做什么,不做什么?

:help所說,

:加載
加載並解釋一個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>

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM