1

当我在工作表中运行以下内容时,一切都按预期进行。

case class P(x: Int, xs: Set[Int]) {
  def this(x: Int) = this(x, Set[Int]())
}
P(1, Set())                   //> res0: worksheet.P = P(1,Set())
new P(1)                      //> res0: worksheet.P = P(1,Set())

当我离开的时,我得到一个编译器诊断,上面写着:

  - not enough arguments for method apply: (x: Int, xs: Set[Int])worksheet.P in object P. Unspecified value parameter xs.

相同的诊断出现在常规的 .scala 文件中。

这是编译器错误,还是我误解了什么?

4

2 回答 2

2

如果没有 new,您调用的不是构造函数,而是由编译器为案例类自动生成的工厂方法。您可以定义一个新的:

case class P(x: Int, xs: Set[Int])
object P { 
  def apply(x: Int): P = P(x, Set[Int]())
}

scala> P(1, Set()) 
res2: P = P(1,Set())

scala> P(1)
res3: P = P(1,Set())

或者,您可以使用定义两个构造函数,但在您的特定情况下,我会使用默认值:

 case class P(x: Int, xs: Set[Int] = Set[Int]())

另请参阅此答案,它展示了类似的情况案例课程之旅

于 2013-10-14T20:12:38.967 回答
1

new定义案例类也会创建类名的工厂方法,所以创建实例时不必使用。所以下面的代码工作文件:

P(1, Set())

您的类也有构造函数,以下代码也可以正常工作:

new P(1, Set())
new P(1)

在 的情况下P(1),没有这样的方法,所以会发生错误。

于 2013-10-14T19:59:00.590 回答