如何在jupyter笔记本中运行scala值类

时间:2017-05-11 08:04:54

标签: scala jupyter-notebook jupyter apache-toree

我试图在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 X 10.11.6,Scala 2.11.8,Jupyter 4.3.0,Apache Toree 0.2.0。

提前致谢!

1 个答案:

答案 0 :(得分:0)

如果您修改Wrapper类以使其不再扩展AnyVal,那么它不再是“值类”,您的问题就会消失。但是如果你这样做,你将不再继承AnyVal的print函数,而是从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())