2012-03-13 22 views

Odpowiedz

30

Po pierwsze, new List() nie będzie działać, ponieważ klasa List jest abstrakcyjna. Pozostałe dwie opcje są zdefiniowane w następujący sposób the List object:

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

Znaczy to, że są zasadniczo równoważne, więc jest to głównie kwestia stylu. Wolę używać empty, ponieważ uważam, że jest jaśniejszy i ogranicza się do nawiasów.

12

z kodu źródłowego List mamy:

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] {...} 

Widzimy więc, że jest to dokładnie to samo

Dla kompletności, można również użyć Nil.

4

Dla twórców pustej listy, jak powiedzieli inni, można użyć tego, który wygląda najlepiej.

Jednak za wzór pasujący przed pustą listę, można użyć tylko Nil

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

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

EDIT: Korekta: case List() działa zbyt, ale case List.empty nie kompiluje