software - scala tutorial
Scala: Nil vs List() (3)
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.
Como muestra la respuesta del usuario desconocido, son el mismo objeto.
Idiomáticamente, Nil debería ser preferido porque es bueno y corto. Sin embargo, hay una excepción: si se necesita un tipo explícito por cualquier razón, creo
List[Foo]()
es mejor que
Nil : List[Foo]
ha demostrado que el valor de tiempo de ejecución de Nil
y List()
es el mismo. Sin embargo, su tipo estático no es:
scala> val x = List()
x: List[Nothing] = List()
scala> val y = Nil
y: scala.collection.immutable.Nil.type = List()
scala> def cmpTypes[A, B](a: A, b: B)(implicit ev: A =:= B = null) = if (ev eq null) false else true
cmpTypes: [A, B](a: A, b: B)(implicit ev: =:=[A,B])Boolean
scala> cmpTypes(x, y)
res0: Boolean = false
scala> cmpTypes(x, x)
res1: Boolean = true
scala> cmpTypes(y, y)
res2: Boolean = true
Esto es de particular importancia cuando se usa para inferir un tipo, como en un acumulador de pliegue:
scala> List(1, 2, 3).foldLeft(List[Int]())((x, y) => y :: x)
res6: List[Int] = List(3, 2, 1)
scala> List(1, 2, 3).foldLeft(Nil)((x, y) => y :: x)
<console>:10: error: type mismatch;
found : List[Int]
required: scala.collection.immutable.Nil.type
List(1, 2, 3).foldLeft(Nil)((x, y) => y :: x)
^
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
Nada es más idiomático y puede preferirse en la mayoría de los casos. ¿Preguntas?