Dans Scala, y a-t-il une différence entre Nil
et List()
?
Sinon, lequel est le plus idiomatique du style Scala? À la fois pour créer de nouvelles listes vides et pour faire correspondre des modèles sur des listes vides.
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 est plus idiomatique et peut être préféré dans la plupart des cas. Des questions?
Nil
c'est plus idiomatique.List[A]()
(pasNil
) nécessaire comme valeur d'accumulateur pour foldLeft? Exemple -scala> Map(1 -> "hello", 2 -> "world").foldLeft(List[String]())( (acc, el) => acc :+ el._2) res1: List[String] = List(hello, world)
UtiliserNil
ici comme accumulateur ne fonctionnerait pas.Map(1 -> "hello", 2 -> "world").foldLeft(Nil: List[String])( _ :+ _._2)
L'utilisateur inconnu a montré que la valeur d'exécution des deux
Nil
et étaitList()
la même. Cependant, leur type statique n'est pas:Ceci est particulièrement important lorsqu'il est utilisé pour déduire un type, comme dans l'accumulateur d'un repli:
la source
y :: x
ça marche. Le problème est que le type qu'il renvoie n'est pas le type attendu. Il revientList[Int]
, tandis que le type attendu est soitList[Nothing]
ouNil.type
(je pense que le premier, mais peut-être le second).Comme le montre la réponse de l'utilisateur inconnu, il s'agit du même objet.
Idiomatiquement Nil devrait être préféré car c'est joli et court. Il y a une exception cependant: si un type explicite est nécessaire pour une raison quelconque, je pense
est mieux que
la source
List.empty[Foo]
une troisième alternative.