我在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。
答案 0 :(得分:1)
我正在上相同的课程和相同的课程。
只是摆了些摆弄。在工作表中定义时,似乎IntelliJ在类和对象定义以及包方面存在一些问题。
我发现了两种解决此错误的方法。第一个快速解决了上述问题:
不要将运行时代码包装在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视频(引入软件包时),您可能会遇到类似的问题。在那里,我通过以下方式解决了问题:
将所有类和对象从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