Erlang Language
iolists
Ricerca…
introduzione
Mentre una stringa di Erlang è una lista di numeri interi, un "iolist" è una lista i cui elementi sono numeri interi, binari o altri elementi iolistici, ad esempio ["foo", $b, $a, $r, <<"baz">>]
. Quel iolist rappresenta la stringa "foobarbaz"
.
Mentre è possibile convertire un iolist in un file binario con iolist_to_binary/1
, spesso non è necessario, poiché le funzioni della libreria di Erlang come file:write_file/2
e gen_tcp:send/2
accettano iolist, nonché stringhe e binari.
Sintassi
- -type iolist () :: maybe_improper_list (byte () | binary () | iolist (), binary () | []).
Osservazioni
Cos'è un iolist?
È un qualsiasi binario. O qualsiasi elenco contenente numeri interi compresi tra 0 e 255. O qualsiasi elenco arbitrariamente annidato contenente una di queste due cose.
Utilizzare elenchi di interi e binari profondamente annidati per rappresentare i dati I / O per evitare la copia durante la concatenazione di stringhe o binari.
Sono efficienti anche quando si combinano grandi quantità di dati. Ad esempio, combinando due binari cinquanta kilobyte usando la sintassi binaria <<B1/binary, B2/binary>>
genere è necessario riallocarli entrambi in un nuovo binario a 100 kb. Utilizzando gli elenchi di I / O [B1, B2]
si assegna solo l'elenco, in questo caso tre parole. Una lista usa una parola e un'altra parola per elemento, vedi qui per maggiori informazioni.
L'utilizzo dell'operatore ++
avrebbe creato un elenco completamente nuovo, anziché solo un nuovo elenco di due elementi. Ricreare gli elenchi per aggiungere elementi alla fine può diventare costoso quando l'elenco è lungo.
Nei casi in cui i dati binari sono piccoli, l'assegnazione degli elenchi di I / O può essere maggiore rispetto all'aggiunta dei file binari. Se i dati binari possono essere piccoli o grandi, spesso è meglio accettare il costo coerente degli elenchi di I / O.
Nota che i binari di accodamento sono ottimizzati come descritto qui . In breve, un file binario può disporre di uno spazio nascosto aggiuntivo. Questo sarà riempito se un altro binario viene aggiunto ad esso che si adatta allo spazio libero. Ciò significa che non tutte le append binarie causeranno una copia completa di entrambi i binari.
Gli elenchi di I / O vengono in genere utilizzati per creare output su una porta, ad esempio un file o un socket di rete.
file:write_file("myfile.txt", ["Hi " [<<"there">>], $\n]).
Aggiungi i tipi di dati consentiti all'inizio di un elenco IO, creando uno nuovo.
["Guten Tag " | [<<"Hello">>]].
[<<"Guten Tag ">> | [<<"Hello">>]].
[$G, $u, $t, $e, $n , $T, $a, $g | [<<"Hello">>]].
[71,117,116,101,110,84,97,103,<<"Hello">>].
I dati I / O possono essere aggiunti in modo efficiente alla fine di un elenco.
Data_1 = [<<"Hello">>].
Data_2 = [Data_1,<<" Guten Tag ">>].
Fai attenzione agli elenchi impropri
["Guten tag " | <<"Hello">>].
Nella shell questo verrà stampato come ["Guten tag "|<<"Hello">>]
invece di ["Guten tag ",<<"Hello">>]
. L'operatore di pipe creerà un elenco errato se l'ultimo elemento a destra non è un elenco. Mentre un elenco improprio la cui "coda" è un file binario è ancora un iolist valido, elenchi errati possono causare problemi perché molte funzioni ricorsive si aspettano che una lista vuota sia l'ultimo elemento e non, come in questo caso un binario.
Ottieni dimensioni elenco IO
Data = ["Guten tag ",<<"Hello">>],
Len = iolist_size(Data),
[<<Len:32>> | Data].
La dimensione di un iolist può essere calcolata usando iolist_size/1
. Questo snippet calcola la dimensione di un messaggio e lo crea e lo aggiunge in primo piano come un binario a quattro byte. Questa è una tipica operazione nei protocolli di messaggistica.
Lista I / O può essere convertita in un file binario
<<"Guten tag, Hello">> = iolist_to_binary(["Guten tag, ",<<"Hello">>]).
Un elenco IO può essere convertito in un binario usando la funzione iolist_to_binary/1
. Se i dati verranno archiviati per un lungo periodo o inviati come un messaggio ad altri processi, allora potrebbe avere senso convertirli in un binario. Il costo di una tantum di conversione in un binario può essere più economico rispetto alla copia dell'elenco di IO più volte, nella raccolta di dati inutili di un singolo processo o nel passaggio di messaggi ad altri.