List.empty против List () против нового List () - PullRequest
27 голосов
/ 13 марта 2012

Какая разница между List.empty, List() и new List()?Когда я должен использовать какой?

Ответы [ 3 ]

33 голосов
/ 13 марта 2012

Прежде всего, new List() не будет работать, поскольку класс List является абстрактным.Два других параметра определены следующим образом в объекте List :

override def empty[A]: List[A] = Nil
override def apply[A](xs: A*): List[A] = xs.toList

Т.е. они по существу эквивалентны, так что в основном это вопрос стиля.Я предпочитаю использовать empty, потому что я нахожу это более понятным, и это сокращает скобки.

12 голосов
/ 13 марта 2012

Из исходного кода Список мы имеем:

object List extends SeqFactory[List] {
  ...
  override def empty[A]: List[A] = Nil
  override def apply[A](xs: A*): List[A] = xs.toList
  ... 
}

case object Nil extends List[Nothing] {...}

Таким образом, мы можем видеть, что он точно такой же

Для полноты вы также можете использоватьNil.

4 голосов
/ 13 марта 2012

Для создания пустого списка, как уже говорили другие, вы можете использовать тот, который вам больше нравится.

Однако для сопоставления с шаблоном по пустому списку вы можете использовать только Nil

scala> List()
res1: List[Nothing] = List()

scala> res1 match {
     | case Nil => "empty"
     | case head::_ => "head is " + head
     | }
res2: java.lang.String = empty

РЕДАКТИРОВАТЬ : Исправление: case List() тоже работает, но case List.empty не компилируется

...