Почему классы case без списка параметров устарели? - PullRequest
41 голосов
/ 12 февраля 2010

Почему классы падежей без списка параметров устарели в Scala? И почему компилятор предлагает использовать () вместо списка параметров?

РЕДАКТИРОВАТЬ:

Кто-нибудь, пожалуйста, ответьте на мой второй вопрос ...: |

Ответы [ 2 ]

31 голосов
/ 12 февраля 2010

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

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

ОБНОВЛЕНИЕ Надеюсь, приведенная ниже расшифровка покажет, почему пустой список параметров предпочтительнее устаревшего списка отсутствующих параметров.

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 обычно по-прежнему предпочтительнее пустого списка параметров.

17 голосов
/ 12 февраля 2010

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...