Suche…


Einführung

Während eine Erlang-Zeichenfolge eine Liste von Ganzzahlen ist, ist eine "Iolist" eine Liste, deren Elemente entweder Ganzzahlen, Binärdateien oder andere Iolisten sind, z. B. ["foo", $b, $a, $r, <<"baz">>] . Dieser Iolist repräsentiert die Zeichenfolge "foobarbaz" .

Während Sie eine iolist mit iolist_to_binary/1 in eine Binärdatei konvertieren können, ist dies häufig nicht erforderlich, da Erlang-Bibliotheksfunktionen wie file:write_file/2 und gen_tcp:send/2 Iolisten sowie Strings und Binaries akzeptieren.

Syntax

  • -Typ iolist () :: maybe_improper_list (byte () | binary () | iolist (), binary () | []).

Bemerkungen

Was ist ein Iolist?

Es ist irgendein binäres. Oder eine Liste, die ganze Zahlen zwischen 0 und 255 enthält. Oder eine beliebig verschachtelte Liste, die eines dieser beiden Dinge enthält.

Originaler Artikel

Verwenden Sie tief verschachtelte Listen von Ganzzahlen und Binärdateien, um E / A-Daten darzustellen, um beim Verketten von Zeichenfolgen oder Binärdateien das Kopieren zu vermeiden.

Sie sind effizient, selbst wenn große Datenmengen kombiniert werden. Beispielsweise würde das Kombinieren von zwei 50-Kilobyte-Binärdateien unter Verwendung der Binärsyntax <<B1/binary, B2/binary>> normalerweise erfordern, beide in eine neue 100-KB-Binärzuordnung zuzuweisen. Bei Verwendung von IO-Listen [B1, B2] nur die Liste zugeordnet, in diesem Fall drei Wörter. Eine Liste verwendet ein Wort und ein anderes Wort pro Element finden Sie hier für weitere Informationen.

Die Verwendung des ++ Operators hätte eine ganze neue Liste erstellt, anstatt nur eine neue Liste mit zwei Elementen. Das erneute Erstellen von Listen zum Hinzufügen von Elementen am Ende kann teuer werden, wenn die Liste lang ist.

In Fällen, in denen die binären Daten klein sind, kann das Zuordnen von E / A-Listen größer sein als das Anhängen der Binärdateien. Wenn die binären Daten entweder klein oder groß sein können, ist es oft besser, die konsistenten Kosten von E / A-Listen zu akzeptieren.

Beachten Sie, dass das Anhängen von Binärdateien wie hier beschrieben optimiert wird. Kurz gesagt, einem Binärcode kann zusätzlicher, verborgener Speicherplatz zugewiesen werden. Dies wird gefüllt, wenn eine andere Binärdatei angehängt wird, die in den freien Speicherplatz passt. Das bedeutet, dass nicht jedes binäre Anfügen eine vollständige Kopie beider Binärdateien verursacht.

E / A-Listen werden normalerweise verwendet, um eine Ausgabe für einen Port zu erstellen, z. B. eine Datei oder einen Netzwerk-Socket.

file:write_file("myfile.txt", ["Hi " [<<"there">>], $\n]).

Fügen Sie die zulässigen Datentypen vor einer E / A-Liste hinzu und erstellen Sie eine neue.

["Guten Tag " | [<<"Hello">>]].
[<<"Guten Tag ">> | [<<"Hello">>]].
[$G, $u, $t, $e, $n , $T, $a, $g | [<<"Hello">>]].
[71,117,116,101,110,84,97,103,<<"Hello">>].

E / A-Daten können effizient am Ende einer Liste hinzugefügt werden.

Data_1 = [<<"Hello">>].
Data_2 = [Data_1,<<" Guten Tag ">>].

Seien Sie vorsichtig mit falschen Listen

["Guten tag " | <<"Hello">>].

In der Shell wird dies als ["Guten tag "|<<"Hello">>] anstelle von ["Guten tag ",<<"Hello">>] gedruckt. Der Pipe-Operator erstellt eine falsche Liste, wenn das letzte Element auf der rechten Seite keine Liste ist. Während eine unzulässige Liste, deren "Endpunkt" eine Binärdatei ist, noch eine gültige Iolist ist, können unzulässige Listen Probleme verursachen, da viele rekursive Funktionen erwarten, dass eine leere Liste das letzte Element ist und nicht wie in diesem Fall eine Binärdatei.

IO-Listengröße abrufen

Data = ["Guten tag ",<<"Hello">>],
Len = iolist_size(Data),
[<<Len:32>> | Data].

Die Größe eines Iolisten kann mit iolist_size/1 berechnet werden. Dieses Snippet berechnet die Größe einer Nachricht und erstellt und hängt sie als Vier-Byte-Binärzeichen an der Vorderseite an. Dies ist eine typische Operation in Messaging-Protokollen.

E / A-Liste kann in eine Binärdatei konvertiert werden

<<"Guten tag, Hello">> = iolist_to_binary(["Guten tag, ",<<"Hello">>]).

Eine iolist_to_binary/1 Liste kann mit der Funktion iolist_to_binary/1 in eine Binärdatei umgewandelt werden. Wenn die Daten über einen längeren Zeitraum gespeichert oder als Nachricht an andere Prozesse gesendet werden, kann es sinnvoll sein, sie in eine Binärdatei zu konvertieren. Die einmaligen Kosten für die Konvertierung in eine Binärdatei können günstiger sein als das häufige Kopieren der E / A-Liste, bei der Garbage Collection eines einzelnen Prozesses oder bei der Weitergabe von Nachrichten an andere.



Modified text is an extract of the original Stack Overflow Documentation
Lizenziert unter CC BY-SA 3.0
Nicht angeschlossen an Stack Overflow