Gibt es in Scala überhaupt einen Unterschied zwischen Nil
und List()
?
Wenn nicht, welcher ist der idiomatischere Scala-Stil? Sowohl zum Erstellen neuer leerer Listen als auch zum Mustervergleich für leere Listen.
scala> println (Nil == List())
true
scala> println (Nil eq List())
true
scala> println (Nil equals List())
true
scala> System.identityHashCode(Nil)
374527572
scala> System.identityHashCode(List())
374527572
Nil ist idiomatischer und kann in den meisten Fällen bevorzugt werden. Fragen?
Nil
das idiomatischer ist.List[A]()
(nichtNil
) erforderlich? Beispiel - Diescala> Map(1 -> "hello", 2 -> "world").foldLeft(List[String]())( (acc, el) => acc :+ el._2) res1: List[String] = List(hello, world)
VerwendungNil
als Akkumulator hier würde nicht funktionieren.Map(1 -> "hello", 2 -> "world").foldLeft(Nil: List[String])( _ :+ _._2)
Unbekannter Benutzer hat gezeigt, dass der Laufzeitwert von beiden
Nil
undList()
gleich ist. Ihr statischer Typ ist jedoch nicht:Dies ist von besonderer Bedeutung, wenn es verwendet wird, um auf einen Typ zu schließen, z. B. im Akkumulator einer Falte:
quelle
y :: x
funktioniert . Das Problem ist, dass der zurückgegebene Typ nicht der erwartete Typ ist. Es kehrt zurückList[Int]
, während der erwartete Typ entwederList[Nothing]
oder istNil.type
(ich denke der erstere, aber vielleicht der letztere).Wie die Antwort des unbekannten Benutzers zeigt, handelt es sich um dasselbe Objekt.
Idiomatisch sollte Nil bevorzugt werden, weil es schön und kurz ist. Es gibt jedoch eine Ausnahme: Wenn aus irgendeinem Grund ein expliziter Typ benötigt wird, denke ich
ist schöner als
quelle
List.empty[Foo]
eine dritte Alternative.