2012-03-13 16 views

risposta

30

Prima di tutto, new List() non funziona, poiché la classe List è astratta. Le altre due opzioni sono definite come segue in the List object:

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

Vale a dire, sono sostanzialmente equivalenti, quindi è soprattutto una questione di stile. Preferisco usare empty perché lo trovo più chiaro e riduce le parentesi.

12

dal codice sorgente di List abbiamo:

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

modo che possiamo vedere che è esattamente la stessa

Per completezza, si può anche utilizzare Nil.

4

Per le creazioni di una lista vuota, come altri hanno detto, è possibile utilizzare quello che ti sembra più adatto.

Tuttavia, per il pattern matching contro un elenco vuoto, è possibile utilizzare solo Nil

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

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

EDIT: Correzione: case List() funziona anche, ma case List.empty non compila

Problemi correlati