2010-02-12 12 views

risposta

31

È davvero facile utilizzare accidentalmente una classe di case no-arg in modo errato come un modello.

scala> case class Foo            
warning: there were deprecation warnings; re-run with -deprecation for details 
defined class Foo 

scala> (new Foo: Any) match { case Foo => true; case _ => false } 
res10: Boolean = false 

Invece di:

scala> (new Foo: Any) match { case _: Foo => true; case _ => false } 
res11: Boolean = true 

O meglio:

scala> case object Bar            
defined module Bar 

scala> (Bar: Any) match { case Bar => true; case _ => false }   
res12: Boolean = true 

UPDATE Speriamo che la trascrizione di seguito sarà dimostrare perché un elenco di parametri vuoto si preferisce l'elenco dei parametri mancante deprecato.

scala> case class Foo() // Using an empty parameter list rather than zero parameter lists. 
defined class Foo 

scala> Foo // Access the companion object Foo 
res0: Foo.type = <function0> 

scala> Foo() // Call Foo.apply() to construct an instance of class Foo 
res1: Foo = Foo() 

scala> case class Bar 
warning: there were deprecation warnings; re-run with -deprecation for details 
defined class Bar 

scala> Bar // You may expect this to construct a new instance of class Bar, but instead 
      // it references the companion object Bar 
res2: Bar.type = <function0> 

scala> Bar() // This calls Bar.apply(), but is not symmetrical with the class definition. 
res3: Bar = Bar() 

scala> Bar.apply // Another way to call Bar.apply 
res4: Bar = Bar() 

Un oggetto caso di solito sarebbe ancora preferito su un elenco di parametri vuoto.

+3

Invece di 'caso _: Foo' puoi scrivere' caso Foo() '. – sepp2k

+0

Ancora non capisco. Perché dovrei aspettarmi che il costrutto 'Bar' crei una nuova istanza di classe' Bar'? – missingfaktor

+0

** "Bar() // Questo chiama Bar.apply(), ma non è simmetrico con la definizione della classe." ** - Questo argomento si applica anche alle classi normali (non case). Allora perché il compilatore non mostra avviso quando definisco una classe di questo tipo senza lista parametri? (ad esempio, 'class Bar') – missingfaktor

15

Senza parametri, ogni istanza della classe case è indistinguibile e quindi è essenzialmente una costante. Usa un oggetto per quel caso.

Problemi correlati