2010-07-28 92 views
10

這段代碼做了什麼?爲什麼有兩組構造函數參數?scala類中的兩組構造函數參數

class A(val x: Int)(val y: Int) 

我可以初始化一個對象,並用這兩個領域:

val a = new A(5)(7) 
println(a.x + ", " + a.y) 

如果我讓一個案例類,我只能通過第一組參數相匹配。

case class A(x: Int)(y: Int) 
val a = A(5)(7) 
a match { 
    A(x) => println(x) 
} 

無法創建3組參數。它不會編譯。那麼這兩組構造函數參數的含義是什麼?

+1

這不是我編造的東西。我在scala swing庫中發現了這個構造:https://lampsvn.epfl.ch/trac/scala/browser/scala/trunk/src/swing/scala/swing/event/MouseEvent.scala – PeWu 2010-07-28 10:16:50

回答

7

根據scala specification(請參閱第5.3節),第二組參數專用於隱式參數。將參數分成兩組,可以讓您只定義非隱式參數,並讓其他參數按上下文定義。

實際上,編譯器在第二組中設置非隱式參數是非常奇怪的。

+2

謝謝。如果我將_implicit_關鍵字添加到第二個集合中,它開始是隱式的,但不隱式沒有_implicit_關鍵字。 無論如何,scala規範不允許第二個集合中的非隱式參數。 – PeWu 2010-07-28 10:15:42

+0

那麼...這部分規範看起來很奇怪:在語法下面給出的例子似乎並不符合Gramar。而「class Test(a:Int)(b:Int)(c:Int)」是一個有效的類定義。 – Nicolas 2010-07-28 10:37:47

+1

@PeWu +1因爲沒有隱式關鍵字而沒有隱式隱含的話「:) – I82Much 2010-07-30 12:31:32