Che differenza c'è tra List.empty
, List()
e new List()
? Quando dovrei usare quale?List.empty vs. List() vs. new List()
24
A
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
È possibile aggiungere 'quelle negative per quella lista. – Jesper