En Scala, ¿hay alguna diferencia entre Nil
y List()
?
Si no, ¿cuál es el estilo de Scala más idiomático? Tanto para crear nuevas listas vacías como para la coincidencia de patrones en listas vacías.
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 es más idiomático y se puede preferir en la mayoría de los casos. Preguntas?
Nil
es más idiomático.List[A]()
(noNil
) necesario como valor acumulador para foldLeft? Ejemplo: elscala> Map(1 -> "hello", 2 -> "world").foldLeft(List[String]())( (acc, el) => acc :+ el._2) res1: List[String] = List(hello, world)
usoNil
como acumulador aquí no funcionaría.Map(1 -> "hello", 2 -> "world").foldLeft(Nil: List[String])( _ :+ _._2)
Usuario desconocido ha demostrado que el valor de tiempo de ejecución de ambos
Nil
yList()
son los mismos. Sin embargo, su tipo estático no es:Esto es de particular importancia cuando se usa para inferir un tipo, como en el acumulador de un pliegue:
fuente
y :: x
hace el trabajo. El problema es que el tipo que devuelve no es el tipo esperado. RegresaList[Int]
, mientras que el tipo esperado esList[Nothing]
oNil.type
(creo que el primero, pero tal vez el último).Como muestra la respuesta del usuario desconocido, son el mismo objeto.
Idiomáticamente, se debe preferir Nil porque es agradable y corto. Sin embargo, hay una excepción: si se necesita un tipo explícito por cualquier razón, creo
es mejor que
fuente
List.empty[Foo]
una tercera alternativa.