2017-05-11 10 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 명령을 실행할 수 있고 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 구문을 사용하면 사람이 "Printable로 AnyVal을 확장"하는 대신 "extends Printable"을 사용해야합니까? 또는 Jupyter 노트북 환경에서 scala가 사용되고 있기 때문에이 경우에만 필요합니까? – ecampana

+0

잘 듣고 싶습니다. :-) 나는 이것이 문제를 해결하는 이유를 명확하게하려고 나의 대답을 편집했다. "확장"과 "함께"에 대해 혼란 스러우면 여기를보십시오. https://stackoverflow.com/questions/41031166/scala-extends-vs-with – Paul