Elisir - Elenchi e tuple
Elenchi (collegati)
Un elenco collegato è un elenco eterogeneo di elementi archiviati in posizioni diverse della memoria e di cui si tiene traccia utilizzando i riferimenti. Gli elenchi collegati sono strutture di dati utilizzate soprattutto nella programmazione funzionale.
Elixir utilizza le parentesi quadre per specificare un elenco di valori. I valori possono essere di qualsiasi tipo -
[1, 2, true, 3]
Quando Elixir vede un elenco di numeri ASCII stampabili, Elixir lo stamperà come un elenco di caratteri (letteralmente un elenco di caratteri). Ogni volta che vedi un valore in IEx e non sei sicuro di cosa sia, puoi usare ili funzione per recuperare informazioni su di esso.
IO.puts([104, 101, 108, 108, 111])
I caratteri sopra nell'elenco sono tutti stampabili. Quando il programma di cui sopra viene eseguito, produce il seguente risultato:
hello
Puoi anche definire elenchi al contrario, usando virgolette singole -
IO.puts(is_list('Hello'))
Quando il programma di cui sopra viene eseguito, produce il seguente risultato:
true
Tieni presente che le rappresentazioni tra virgolette singole e doppie non sono equivalenti in Elixir in quanto sono rappresentate da tipi diversi.
Lunghezza di un elenco
Per trovare la lunghezza di una lista, usiamo la funzione di lunghezza come nel seguente programma:
IO.puts(length([1, 2, :true, "str"]))
Il programma di cui sopra genera il seguente risultato:
4
Concatenazione e sottrazione
Due elenchi possono essere concatenati e sottratti utilizzando il ++ e --operatori. Considera il seguente esempio per comprendere le funzioni.
IO.puts([1, 2, 3] ++ [4, 5, 6])
IO.puts([1, true, 2, false, 3, true] -- [true, false])
Questo ti darà una stringa concatenata nel primo caso e una stringa sottratta nel secondo. Il programma di cui sopra genera il seguente risultato:
[1, 2, 3, 4, 5, 6]
[1, 2, 3, true]
Testa e coda di una lista
La testa è il primo elemento di una lista e la coda è il resto di una lista. Possono essere recuperati con le funzionihd e tl. Assegniamo una lista a una variabile e recuperiamo la sua testa e la sua coda.
list = [1, 2, 3]
IO.puts(hd(list))
IO.puts(tl(list))
Questo ci darà la testa e la coda della lista come output. Il programma di cui sopra genera il seguente risultato:
1
[2, 3]
Note - Ottenere la testa o la coda di una lista vuota è un errore.
Altre funzioni di elenco
La libreria standard Elixir fornisce molte funzioni per gestire gli elenchi. Daremo uno sguardo ad alcuni di quelli qui. Puoi controllare il resto qui Elenco .
S.no. | Nome e descrizione della funzione |
---|---|
1 | delete(list, item) Elimina l'elemento specificato dall'elenco. Restituisce un elenco senza l'elemento. Se l'elemento compare più di una volta nell'elenco, viene rimossa solo la prima occorrenza. |
2 | delete_at(list, index) Produce un nuovo elenco rimuovendo il valore in corrispondenza dell'indice specificato. Gli indici negativi indicano uno scostamento dalla fine dell'elenco. Se l'indice è fuori dai limiti, viene restituito l'elenco originale. |
3 | first(list) Restituisce il primo elemento in elenco o nil se l'elenco è vuoto. |
4 | flatten(list) Appiattisce l'elenco fornito di elenchi annidati. |
5 | insert_at(list, index, value) Restituisce un elenco con un valore inserito all'indice specificato. Nota che l'indice è limitato alla lunghezza dell'elenco. Gli indici negativi indicano uno scostamento dalla fine dell'elenco. |
6 | last(list) Restituisce l'ultimo elemento della lista o nullo se la lista è vuota. |
Tuple
Le tuple sono anche strutture di dati che memorizzano una serie di altre strutture al loro interno. A differenza degli elenchi, memorizzano gli elementi in un blocco di memoria contiguo. Ciò significa che accedere a un elemento tupla per indice o ottenere la dimensione della tupla è un'operazione rapida. Gli indici iniziano da zero.
Elixir utilizza le parentesi graffe per definire le tuple. Come le liste, le tuple possono contenere qualsiasi valore -
{:ok, "hello"}
Lunghezza di una tupla
Per ottenere la lunghezza di una tupla, usa tuple_size funziona come nel seguente programma -
IO.puts(tuple_size({:ok, "hello"}))
Il programma di cui sopra genera il seguente risultato:
2
Aggiunta di un valore
Per aggiungere un valore alla tupla, utilizzare la funzione Tuple.append -
tuple = {:ok, "Hello"}
Tuple.append(tuple, :world)
Questo creerà e restituirà una nuova tupla: {: ok, "Hello",: world}
Inserimento di un valore
Per inserire un valore in una data posizione, possiamo utilizzare il Tuple.insert_at funzione o il put_elemfunzione. Considera il seguente esempio per capire lo stesso:
tuple = {:bar, :baz}
new_tuple_1 = Tuple.insert_at(tuple, 0, :foo)
new_tuple_2 = put_elem(tuple, 1, :foobar)
Notare che put_elem e insert_atha restituito nuove tuple. La tupla originale memorizzata nella variabile tupla non è stata modificata perché i tipi di dati Elixir non sono modificabili. Essendo immutabile, il codice Elixir è più facile da ragionare poiché non devi mai preoccuparti se un particolare codice sta modificando la tua struttura dati.
Tuple e liste
Qual è la differenza tra liste e tuple?
Gli elenchi vengono archiviati in memoria come elenchi collegati, il che significa che ogni elemento in un elenco mantiene il proprio valore e punta all'elemento successivo fino al raggiungimento della fine dell'elenco. Chiamiamo ogni coppia di valore e puntatore una cella contro. Ciò significa che accedere alla lunghezza di una lista è un'operazione lineare: dobbiamo attraversare l'intera lista per calcolarne le dimensioni. L'aggiornamento di un elenco è veloce finché anteponiamo gli elementi.
Le tuple, d'altra parte, vengono archiviate in memoria in modo contiguo. Ciò significa che ottenere la dimensione della tupla o accedere a un elemento tramite indice è veloce. Tuttavia, l'aggiornamento o l'aggiunta di elementi alle tuple è costoso perché richiede la copia dell'intera tupla in memoria.