【问题标题】:IntelliJ Scala worksheet - package names don't correspond to directoriesIntelliJ Scala 工作表 - 包名称与目录不对应
【发布时间】:2018-08-19 00:17:29
【问题描述】:

我在 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
}

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

这是截图:

【问题讨论】:

标签: scala intellij-idea


【解决方案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 包文件夹中)没有包语句。不过,它确实从该包中导入类。所以在代码中:

    // 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)
    }
    

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2023-02-20
    • 2014-12-13
    • 1970-01-01
    • 2014-06-07
    • 1970-01-01
    • 1970-01-01
    • 2020-06-05
    • 2017-01-22
    相关资源
    最近更新 更多