2010-02-12 6 views

ответ

31

Действительно легко случайно использовать класс аргументов no-arg как шаблон.

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 

Вместо:

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

Или лучше:

scala> case object Bar            
defined module Bar 

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

UPDATE Будем надеяться, что ниже транскрипт продемонстрирует, почему пустой список параметров предпочтительнее устаревшего отсутствующего списка параметров.

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

Объект case обычно будет по-прежнему предпочтительнее пустого списка параметров.

+3

Вместо 'case _: Foo' вы можете написать' case Foo() '. – sepp2k

+0

Я все еще не понимаю. Почему я должен ожидать, что конструкция «Bar» создаст новый экземпляр класса «Bar»? – missingfaktor

+0

** "Bar() // Это вызывает Bar.apply(), но не является симметричным с определением класса." ** - Этот аргумент применим и к нормальным (не случайным) классам. Тогда почему компилятор не показывает предупреждение, когда я определяю такой класс без списка параметров? (например, 'класс Bar') – missingfaktor

15

Без параметров каждый экземпляр класса case неотличим и, следовательно, по существу является константой. Используйте объект для этого случая.