【问题标题】:How to run a scala value class in a jupyter notebook如何在 jupyter 笔记本中运行 scala 值类
【发布时间】:2017-05-11 08:04:53
【问题描述】:

我正在尝试在 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。

提前致谢!

【问题讨论】:

    标签: scala jupyter-notebook jupyter apache-toree


    【解决方案1】:

    如果您修改 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())
    

    【讨论】:

    • 谢谢!这解决了我的问题。 scala 语法是否要求人们使用“扩展 Printable”而不是“扩展 AnyVal with Printable”?还是仅在这种情况下才需要这样做,因为 scala 正在 Jupyter 笔记本环境中使用?
    • 很高兴听到这个消息。 :-) 我已经编辑了我的答案,试图更清楚地说明为什么这可以解决问题。如果您对“扩展”和“与”感到困惑,请看这里:stackoverflow.com/questions/41031166/scala-extends-vs-with
    猜你喜欢
    • 2016-10-26
    • 2020-05-17
    • 1970-01-01
    • 2016-11-04
    • 1970-01-01
    • 2018-09-23
    • 1970-01-01
    • 2020-11-18
    • 2021-07-12
    相关资源
    最近更新 更多