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())

別の方法として、 define two constructorsを使用することもできますが、特定のケースでは、デフォルト値を使用します。

 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 に答える