2017-05-11 130 views
0

我試圖運行在一個Jupyter筆記本下面的代碼:當電池執行一條錯誤消息如何在jupyter筆記本運行階值類

trait Printable extends Any { 
    def print(): Unit = println(this) 
} 

class Wrapper(val underlying: Int) extends AnyVal with Printable 

object Demo { 
    def main(args: Array[String]) { 
     val w = new Wrapper(3) 
     w.print() // actually requires instantiating a Wrapper instance 
    } 
} 

Demo.main(Array()) 

出現:

Name: Compile Error 
Message: <console>:15: error: value class may not be a member of another class 
     class Wrapper(val underlying: Int) extends AnyVal with Printable 
      ^
StackTrace: 

我認爲這是因爲Jupyter可能正在運行scala命令而不是scalac命令,並且顯然scala將所有內容都封裝到頂級類中以啓用腳本。值類不能是內部類,因此也是錯誤的原因。有關於這個主題相關的問題:

scala: how to define a value class

是否有可能解決這個問題?

我使用Jupyter筆記本運行Apache Toree Scala。
OS:OS X 10.11.6,Scala 2.11.8,Jupyter 4.3.0,Apache Toree 0.2.0。

在此先感謝!

回答

0

如果您修改Wrapper類以使其不再延伸AnyVal,那麼它不再是「值類」,您的問題就會消失。但是如果你這樣做了,你將不再繼承AnyVal的打印函數,而是從Any中獲取它(Any是所有類的超類,比如Java中的Object)。因此,要保留相同的功能,您必須重寫打印功能:

trait Printable extends Any { 
    def print(): Unit = println(this) 
} 

class Wrapper(val underlying: Int) extends Printable { 
    override def print(): Unit = println(underlying) 
} 

object Demo { 
    def main(args: Array[String]) { 
     val w = new Wrapper(3) 
     w.print() // actually requires instantiating a Wrapper instance 
    } 
} 

Demo.main(Array()) 
+0

謝謝!這解決了我的問題。 scala語法是否需要一個人使用「extends Printable」而不是「使用Printable擴展AnyVal」?或者這只是在這種情況下才需要,因爲Scala正在Jupyter筆記本電腦環境中使用? – ecampana

+0

很高興聽到這一點。 :-)我編輯了我的答案,試圖使其更清楚,爲什麼這能解決問題。如果您對「擴展」和「與」感到困惑,請查看此處:https://stackoverflow.com/questions/41031166/scala-extends-vs-with – Paul