2015-07-02 10 views
39

Sto cercando di cogliere la differenza tra elenchi e Tuples in Elixir. Dalla sezione Basic Types di Elixir Guide, ho capito che:Elenchi contro tuple - Che cosa usare e quando?

  • liste vengono memorizzati come elementi collegati
  • Aggiornamento una lista è veloce (solo quando anteponendo)
  • Elenco Recupero articoli è lento
  • Lista Fetching informazioni (dimensione/lunghezza) è lento
  • elementi tuple sono memorizzati insieme
  • Ottenere informazioni tupla è veloce
  • elementi Recupero tupla è veloce
  • Modifica tuple è costoso

Va bene, questo è tutto bene, ma io non sono ancora sicuro di cosa usare quando. Vedo che la maggior parte dei metodi restituisce una tupla ma in qualsiasi altro elenco vengono utilizzati gli elenchi e molti metodi accettano gli elenchi come input, non come tuple. Con i punti indicati sopra, non si dovrebbero usare Tuple per trasmettere dati in giro, poiché la lettura di una tupla di valori dati dall'utente sarebbe veloce?

Ho anche notato che i tuple non sono enumerabili, che succede? Non utilizzare Enum su di essi essere più veloce di utilizzarlo su elenchi?

Se qualcuno potrebbe aiutarmi a capirli meglio, magari dando alcuni esempi di cosa usare quando, sarebbe fantastico.

risposta

28

Hai già fornito un sommario piuttosto buono delle differenze, quindi in tutte le condizioni in cui una di queste cose è importante dovrebbe aiutarti a decidere su quale utilizzare.

Il modo di pensarci è che gli elenchi sono strutture dati aperte e la loro dimensione può variare in fase di esecuzione mentre le tuple hanno una dimensione costante impostata in fase di compilazione.

Ad esempio, se si desidera memorizzare tutti i comandi che l'utente ha fornito durante una sessione iex, si desidera un elenco: la lunghezza di tale elenco dipenderà dal numero di comandi forniti in quella sessione. Confrontalo con un tipico caso d'uso per le tuple - restituendo {:ok, result} o {:error, reason} da un metodo - qui il numero di elementi è noto in anticipo e quindi non paghi un prezzo inaccettabile per il miglioramento delle prestazioni di Tuples.

Come per l'enumerazione - Le tuple concettualmente non sono raccolte e la posizione di ogni elemento dovrebbe anche denotare il suo ruolo. Si consideri una tupla {:ok, #PID<0.336.0>} - iterando su di essa per prima cosa si otterrà un :ok e quindi un #PID<0.336.0>, sarebbe molto strano scrivere una funzione che agisca in modo uniforme su quelle cose.

+2

Quindi, se l'ho fatto correttamente, l'iterazione sulle liste è normale (che suona per me completamente logica) e iterare su tuple è piuttosto strano? Potrei vedere come iterare su una tupla non avrebbe probabilmente alcun senso. – Novarac23

+2

Sì. Se si deve assolutamente iterare su una tupla per qualche motivo, si può provare 'Tuple.to_list' –

15

Non sono un esperto, ma questa è la mia comprensione:

Sotto il cofano, una lista è una lista collegata. Quindi ha le caratteristiche di prestazione di una lista collegata. Cioè, ottenere la lunghezza è O (n) perché devo percorrere l'intera lista. Allo stesso modo una lista ha anche i vantaggi di una lista collegata; cioè, è facile coltivarlo aggiungendo in primo piano.

Non sono sicuro di cosa sia una tupla sotto il cofano, ma so che non è un elenco collegato. Qualcuno ha chiesto di enumerare tuple sul linguaggio mailing list Elixir di nuovo nel 2013 e questo è parte della risposta:

"tuple, inoltre, non sono destinate ad essere iterata, non farsi confondere dal fatto che è possibile utilizzare elem/2 e size/1. Le tuple sono per che memorizzano più informazioni insieme, il che non implica che siano destinate alla memorizzazione di una raccolta ".

-. Peter Minten

"Un'altra spiegazione potrebbe essere che le tuple sono record del povero uomo in altre parole, una tupla rappresenta un singolo pezzo di dati, un singolo valore, anche se aggregato: non è possibile rimuovere un elemento da una tupla senza modificare il significato semantico di quel particolare valore di tupla.

"Questo è in contrasto con gli elenchi e le altre collezioni che memorizzano molti valori valori indipendenti. Prendendo un valore di distanza dalla lista semplicemente riduce la lunghezza della lista. Non influisce significato semantico di qualsiasi cosa."

- Alexei Sholik

In altre parole, solo perché c'è una somiglianza superficiale tra le tuple e liste non dovrebbero supporre il comportamento è lo stesso.

8

In aggiunta a quanto già detto, ciò che mi ha aiutato a differenziare una tupla dalla lista è l'analogia con una riga in un database. Se si pensa ad una tupla in questo modo, è facile vedere come le informazioni all'interno della tupla sono correlate tra loro e diventa anche ovvio perché non lo si utilizzerà come Enumerabile.

0

Dato che qualcuno ha detto che non sono sicuri di cosa sia una tupla simile sotto il cofano, una tupla sarebbe simile a un array poiché entrambi gli array e gli elementi di memoria tupla nella memoria contigua. Quindi, seguiranno le stesse regole quando usereste un array su un elenco collegato come farebbe con una tupla su un elenco in Elixir.

0

Se si ha familiarità con Java:

  • una lista è come un LinkedList.
  • Una tupla è come un ArrayList.
+0

Questo aiuta molto. Grazie! –

+0

Non sono d'accordo, 'ArrayList' sono simili ai vettori (array ridimensionabili),' tuple' non è pensato per essere ridimensionato o utilizzato come raccolta. –

+0

@AnuragPeshne hai ragione – tbodt

Problemi correlati