2010-07-28 6 views
10

Cosa fa questo codice? Perché ci sono due serie di parametri del costruttore?Due set di parametri del costruttore in una classe di scala

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

posso inizializzare un oggetto e utilizzare entrambi i campi:

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

Se faccio una classe caso, posso abbinare solo la prima serie di parametri.

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

Non è possibile creare 3 set di parametri. Non viene compilato. Quindi qual è il significato dei due set di parametri del costruttore?

+1

Non è qualcosa che ho inventato. Ho trovato questa costruzione nella libreria scala swing: https://lampsvn.epfl.ch/trac/scala/browser/scala/trunk/src/swing/scala/swing/event/MouseEvent.scala – PeWu

risposta

7

In base allo scala specification (vedere la sezione 5.3), il secondo set di parametri è dedicato ai parametri impliciti. La divisione dei parametri in due set consente di definire solo il paametro non implicito e di definire l'altro contestualmente.

È piuttosto strano che il compilatore accetti i parametri non impliciti nel secondo set.

+2

Grazie. Se aggiungo la parola chiave _implicit_ nel secondo set, inizia a essere implicita, ma non è implicitamente implicita senza la parola chiave _implicit_. Ad ogni modo, la specifica scala non consente parametri non impliciti nel secondo set. – PeWu

+0

Beh ... questa sezione delle specifiche sembra molto strana: l'esempio dato sotto la grammatica non sembra corrispondere al gramar. E "class Test (a: Int) (b: Int) (c: Int)" è una definizione di classe valida. – Nicolas

+1

@PeWu +1 per avere la frase "non è implicitamente implicito senza la parola chiave implicita" :) – I82Much

Problemi correlati