2012-03-13 2 views

ответ

30

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

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

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

12

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

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

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

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

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

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

EDIT: Коррекция: case List() тоже работает, но case List.empty не компилирует