vida tutorial también sinonimo programación lenguaje inmortal framework buscó elixir

elixir - tutorial - Listas vs. Tuplas: ¿qué usar y cuándo?



elixir también se buscó (5)

Estoy tratando de comprender la diferencia entre Listas y Tuplas en Elixir . Desde la sección Tipos básicos de Elixir Guides, entiendo que:

  • Las listas se almacenan como elementos vinculados
  • La actualización de una lista es rápida (solo cuando se antepone)
  • Recuperar elementos de la lista es lento
  • La información de la lista de obtención (tamaño / longitud) es lenta
  • Tuple Elements se almacenan juntos
  • Obtener información de Tuple es rápido
  • La recuperación de elementos Tuple es rápida
  • La modificación de Tuples es costosa

Está bien, está bien, pero todavía no estoy seguro de qué usar cuando . Veo que la mayoría de los métodos devuelven una tupla, pero en todas partes se usan Listas, y muchos métodos aceptan Listas como entrada, no como tuplas. Por los puntos indicados anteriormente, ¿no deberían usarse Tuples para pasar datos, ya que la lectura de una tupla de valores dados por el usuario sería rápida?

También noté que las tuplas no son enumerables, ¿qué pasa con eso? ¿No sería más rápido usar el Enum sobre ellos que usarlo en las listas?

Si alguien pudiera ayudarme a entenderlos mejor, posiblemente dando algunos ejemplos de qué usar cuando sea, sería increíble.


Además de lo que ya se había dicho, lo que me ayudó a diferenciar una tupla de la lista es la analogía de una fila en una base de datos. Si piensas en una tupla de esta manera, es fácil ver cómo la información dentro de la tupla está relacionada entre sí y también resulta obvio por qué no la usarías como Enumerable.


Como alguien mencionó que no están seguros de qué se asemeja a una tupla debajo del capó, una tupla sería similar a una matriz, ya que tanto una matriz como una tupla almacenan elementos en la memoria contigua. Entonces, seguirían las mismas reglas con las que usarías una matriz sobre una lista enlazada que con una tupla sobre una lista en Elixir.


No soy un experto pero este es mi entendimiento:

Debajo del capó, una lista es una lista vinculada. Por lo tanto, tiene las características de rendimiento de una lista vinculada. Es decir, obtener la longitud es O (n) porque tengo que recorrer toda la lista. Del mismo modo, una lista también tiene las ventajas de una lista vinculada; es decir, es fácil cultivarlo agregándolo al frente.

No estoy seguro de qué es una tupla bajo el capó, pero sé que no es una lista vinculada. Alguien preguntó acerca de enumerar tuplas en la lista de correo del idioma Elixir en 2013 y esta es parte de la respuesta:

"Las tuplas tampoco deben repetirse, no te confundas por el hecho de que podrías usar elem / 2 y size / 1. Las tuplas son para almacenar varias piezas de información juntas, lo que no implica que estén destinadas para almacenar una colección ".

- Peter Minten

"Otra explicación sería que las tuplas son registros de pobres. En otras palabras, una tupla representa una sola pieza de datos, un solo valor, aunque agregado. No se puede quitar un elemento de una tupla sin cambiar el significado semántico de esa tupla en particular valor.

"Esto es contrario a las listas y otras colecciones que almacenan valores independientes de muchos valores. Eliminar un valor de la lista simplemente reduce la longitud de la lista. No afecta el significado semántico de nada".

- Alexei Sholik

En otras palabras, solo porque hay un parecido superficial entre las tuplas y las listas, no se debe asumir que el comportamiento es el mismo.


Si estás familiarizado con Java:

  • Una lista es como una LinkedList .
  • Una tupla es como una ArrayList .

Ya has dado un buen resumen de las diferencias, por lo que, en cualquier condición en que una de esas cosas sea importante, debería ayudarte a decidir qué usar.

La forma de pensarlo es que las Listas son estructuras de datos abiertas y su tamaño puede variar en el tiempo de ejecución mientras que las Tuplas tienen un tamaño constante establecido en tiempo de compilación.

Por ejemplo, si quiere almacenar todos los comandos que el usuario le ha dado durante una sesión iex , le gustaría tener una lista; la duración de esa lista dependerá de la cantidad de comandos que se den en esa sesión. Contraste esto con un típico caso de uso para tuplas - devolviendo {:ok, result} o {:error, reason} de un método - aquí el número de elementos se conoce por adelantado y por lo tanto no paga un precio inaceptable por las mejoras de rendimiento de Tuples.

En cuanto a la enumeración, las tuplas conceptualmente no son colecciones y se supone que la posición de cada elemento también denota su rol. Considere un {:ok, #PID<0.336.0>} Tuple - iterar sobre él primero le daría un :ok y luego un #PID<0.336.0> , sería muy extraño escribir una función que actúe de manera uniforme camino en esas cosas.