IntelliJ Scala工作表 - 包名称与目录

时间:2017-04-07 19:14:45

标签: scala intellij-idea

我在coursera.com上做Martin Odersky的课程,他在Scala工作表中定义了一个类,如下所示:

object intsets {
  println("Welcome to Scala WS")
}

abstract class IntSet {
  def incl(x: Int): IntSet
  def contains(x: Int): Boolean
}

当我在工作表中执行此操作时,我收到一条警告:“程序包名称与目录结构不对应,这可能会导致从此文件解析类的问题”。 项目是使用新项目新创建的 - > Scala - > SBT。 IntelliJ 2017。

以下是截图:enter image description here

1 个答案:

答案 0 :(得分:1)

我正在上相同的课程和相同的课程。

只是摆了些摆弄。在工作表中定义时,似乎IntelliJ在类和对象定义以及包方面存在一些问题。

我发现了两种解决此错误的方法。第一个快速解决了上述问题:

  1. 不要将运行时代码包装在intsets对象中,而是将其直接放在抽象类的下面,像这样:

    abstract class IntSet {
      def incl(x: Int): IntSet
      def contains(x: Int): Boolean
      def union(other: IntSet): IntSet
    }
    
    println("Welcome to the Scala worksheet")
    

对于Lecture 3.2视频(引入软件包时),您可能会遇到类似的问题。在那里,我通过以下方式解决了问题:

  1. 在/ src / main / scala下创建week3程序包
  2. 将所有类和对象从scala工作表中移至week3包下的单独的类和对象文件中。只有运行时代码应保留在scala工作表文件中,并且该文件(尽管位于week3软件包文件夹中)没有package语句。但是,它确实从该包中导入类。因此在代码中:

    // week3/intsets.sc
    import week3.{Empty, NonEmpty}
    println("Welcome to the Scala worksheet")
    val t1 = new NonEmpty(3, Empty, Empty)
    val t2 = t1.incl(4)
    
    // week3/IntSet.scala    
    package week3
    
    abstract class IntSet {
      def incl(x: Int): IntSet
      def contains(x: Int): Boolean
      def union(other: IntSet): IntSet
    }
    
    // week3/Empty.scala
    package week3
    
    object Empty extends IntSet {
      def incl(x: Int) = new NonEmpty(x, Empty, Empty)
      def contains(x: Int) = false
    
      override def toString: String = "."
    
      def union(other: IntSet): IntSet = other
    }
    
    // week3/NonEmpty.scala
    package week3
    import week3.IntSet
    
    class NonEmpty(elem: Int, left: week3.IntSet, right: IntSet) extends IntSet {
      def incl(x: Int) =
        if(x < elem) new NonEmpty(elem, left.incl(x), right)
        else if(x > elem) new NonEmpty(elem, left, right.incl(x))
        else this
    
      def contains(x: Int) =
        if (x < elem) left.contains(x)
        else if (x > elem) right.contains(x)
        else true
    
      override def toString: String = "{" + left + elem + right + "}"
    
      def union(other: IntSet) =
        left.union(right).union(other).incl(elem)
    }
    

更新:如果上述重构在运行工作表时出现构建错误。从终端(source)运行sbt clean compile