2013-10-14 76 views
1

當我在工作表中運行以下內容時,一切都如預期。調用Scala輔助構造函數時需要新增嗎?

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文件相同的診斷出現。

這是一個編譯器錯誤,還是我誤解了一些東西?

回答

1

定義案例類還將創建類名稱的工廠方法,因此創建實例時不必使用new。所以,下面的代碼工作文件:

P(1, Set()) 

你的類也有構造,下面的代碼將正常工作,太:

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

P(1)的情況下,有沒有這樣的方法,所以錯誤發生。

+0

我希望Scala能夠從第一次遇到它時變得直觀和易於理解。文件中說明(據我所知,案件類別不需要「新」)。這個答案似乎告訴我說文檔是錯誤的。更糟糕的是,它似乎告訴我,我必須瞭解Scala是如何實現的,才能知道如何使用它。這不好。 – RussAbbott

+0

「文檔中說明了(據我所知,案例類不要求」新「)」哪些文檔? –

2

沒有新的,你打電話不是構造函數,而是工廠方法這是由編譯器自動生成的案例類。您可以定義新的:

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

參見this answer which showcases similar situationtour on case classes

+0

請參閱ntalbs的回答。 – RussAbbott

相關問題