2017-05-11 93 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