2017-06-13 34 views
0

我剛剛開始使用Scala,所以請原諒,如果事實證明這很愚蠢。在Scala程序中找不到值

我想在Scala中實現一個鏈表。所以,我創建了一個包含MYLIST類和其他文件中MyList.scala

abstract class MyList[+A] { 
    def head : A 
    def tail : MyList[A] 
    def isEmpty : Boolean 
    def add[B>:A](element: B) : MyList[B] = new MyNonEmptyList[B](element,this) 
} 

object MyEmptyList extends MyList[Nothing]{ 
    override def head: Nothing = throw new NoSuchElementException("Head of an Empty list : ") 

    override def tail: MyList[Nothing] = throw new NoSuchElementException("Tail of an Empty list!") 

    override def isEmpty: Boolean = true 

    override def toString : String = "" 
} 

case class MyNonEmptyList[A] (head: A, tail:MyList[A]) extends MyList[A]{ 
    override def isEmpty: Boolean = false 
    override def toString : String = head + ", " + tail.toString 
} 

雕刻出的基本功能後,是時候對其進行測試。所以,我創建了一個階工作test.sc

object test{ 
    val list = MyNonEmptyList(1,MyEmptyList) 
    val b = list.head 
} 

現在,當我嘗試運行的代碼(上的IntelliJ),我收到以下錯誤:

Error:(1, 18) not found: value MyNonEmptyList 
lazy val list = MyNonEmptyList(1,MyEmptyList) 
       ^

我不明白背後的原因這個錯誤。當我按Ctrl +單擊時,我被重定向到MyList.scala文件中的源代碼。

+0

可以分享.scala文件的位置和test.sc –

回答

0

正確的方法是:

  1. 在測試目錄中創建測試文件
  2. ,也才能正確導入文件到您正在執行測試,而不是與工作表做。

工作表的目的是做REPL操作而不是測試你的src文件。

+0

不起作用。 我不認爲改變類的順序有什麼作用。 – Amita

1

我沒有看到您的代碼有任何問題。嘗試在斯卡拉REPL代碼:

scala> :paste 
// Entering paste mode (ctrl-D to finish) 

abstract class MyList[+A] { 
    def head : A 
    def tail : MyList[A] 
    def isEmpty : Boolean 
    def add[B>:A](element: B) : MyList[B] = new MyNonEmptyList[B](element,this) 
} 

object MyEmptyList extends MyList[Nothing]{ 
    override def head: Nothing = throw new NoSuchElementException("Head of an Empty list : ") 

    override def tail: MyList[Nothing] = throw new NoSuchElementException("Tail of an Empty list!") 

    override def isEmpty: Boolean = true 

    override def toString : String = "" 
} 

case class MyNonEmptyList[A] (head: A, tail:MyList[A]) extends MyList[A]{ 
    override def isEmpty: Boolean = false 
    override def toString : String = head + ", " + tail.toString 
} 

// Exiting paste mode, now interpreting. 

defined class MyList 
defined object MyEmptyList 
defined class MyNonEmptyList 

scala> val x = MyNonEmptyList(1, MyEmptyList) 
x: MyNonEmptyList[Int] = 1, 

scala> x.head 
res0: Int = 1 

因此,對於這個錯誤,我能想到的唯一理由可能是你test.sc不會導入MyList.scala正常。你可以仔細檢查你的#import

+0

我需要使用scala工作表,以便將代碼保存在git上。我試過導入,但那不起作用。 – Amita

0

您的課程可能在默認包中。您應該創建一個新包並將該類移至新包。 和進口類中使用它

import com.testpackage.{MyEmptyList, MyNonEmptyList} 

val list = MyNonEmptyList(1, MyEmptyList) 

val b = list.head 

您不能導入在默認包中的類。

希望這會有所幫助!

+0

我希望這有助於。我測試以及工作得很好。 –

+0

我得到了一個錯誤: 錯誤:對象MyEmptyList不是包com.testpackage的成員 import com.testpackage。{MyEmptyList,MyNonEmptyList}' – Amita

+0

'你是否創建了com.testpackage並在該包內移動MyEmptyList? –