Zoeken…


Invoering

Terwijl een Erlang-reeks een lijst van gehele getallen is, is een "iolist" een lijst waarvan de elementen gehele getallen, binaries of andere iolisten zijn, bijvoorbeeld ["foo", $b, $a, $r, <<"baz">>] . Die iolist vertegenwoordigt de string "foobarbaz" .

Hoewel je een iolist kunt converteren naar een binair bestand met iolist_to_binary/1 , hoef je dit vaak niet te doen, omdat Erlang bibliotheekfuncties zoals file:write_file/2 en gen_tcp:send/2 iolists accepteren, evenals strings en binaries.

Syntaxis

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

Opmerkingen

Wat is een iolist?

Het is elk binair getal. Of een lijst met gehele getallen tussen 0 en 255. Of een willekeurig geneste lijst met een van die twee dingen.

Origineel artikel

Gebruik diep geneste lijsten met gehele getallen en binaire bestanden om IO-gegevens weer te geven om kopiëren te voorkomen wanneer tekenreeksen of binaire gegevens aaneengeschakeld worden.

Ze zijn efficiënt, zelfs bij het combineren van grote hoeveelheden gegevens. Als u bijvoorbeeld twee binaire bestanden van vijftig kilobyte combineert met binaire syntaxis <<B1/binary, B2/binary>> , moet u beide doorgaans opnieuw toewijzen aan een nieuw binair bestanddeel van 100 kb. Met behulp van IO-lijsten [B1, B2] de lijst alleen toegewezen, in dit geval drie woorden. Een lijst gebruikt één woord en een ander woord per element, zie hier voor meer informatie.

Het gebruik van de operator ++ zou een hele nieuwe lijst hebben gemaakt, in plaats van alleen een nieuwe lijst met twee elementen. Lijsten opnieuw maken om elementen aan het einde toe te voegen, kan duur worden als de lijst lang is.

In gevallen waarin de binaire gegevens klein zijn, kan het toewijzen van IO-lijsten groter zijn dan het toevoegen van de binaire bestanden. Als de binaire gegevens klein of groot kunnen zijn, is het vaak beter om de consistente kosten van IO-lijsten te accepteren.

Merk op dat het toevoegen van binaire bestanden is geoptimaliseerd zoals hier beschreven. Kortom, een binary kan extra, verborgen ruimte toegewezen krijgen. Dit wordt ingevuld als er een ander binair getal aan wordt toegevoegd dat in de vrije ruimte past. Dit betekent dat niet elke binaire bijlage een volledig exemplaar van beide binaire bestanden veroorzaakt.

IO-lijsten worden meestal gebruikt om uitvoer naar een poort te bouwen, bijvoorbeeld een bestand of netwerksocket.

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

Voeg de toegestane gegevenstypen toe aan de voorkant van een IO-lijst en maak een nieuwe.

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

IO-gegevens kunnen efficiënt aan het einde van een lijst worden toegevoegd.

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

Wees voorzichtig met onjuiste lijsten

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

In de shell wordt dit afgedrukt als ["Guten tag "|<<"Hello">>] plaats van ["Guten tag ",<<"Hello">>] . De pijpexploitant maakt een onjuiste lijst als het laatste element aan de rechterkant geen lijst is. Hoewel een onjuiste lijst waarvan de "staart" een binair getal is, nog steeds een geldige iolist is, kunnen onjuiste lijsten problemen veroorzaken, omdat veel recursieve functies verwachten dat een lege lijst het laatste element is, en niet, zoals in dit geval een binair getal.

Krijg IO lijstgrootte

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

De grootte van een iolist kan worden berekend met behulp van de iolist_size/1 . Dit fragment berekent de grootte van een bericht en maakt het aan de voorkant als een binair getal van vier bytes. Dit is een typische bewerking in berichtprotocollen.

IO-lijst kan worden geconverteerd naar een binair getal

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

Een IO-lijst kan worden geconverteerd naar een binair bestand met de functie iolist_to_binary/1 . Als de gegevens voor een lange periode worden opgeslagen of als een bericht naar andere processen worden verzonden, kan het zinvol zijn om ze naar een binair bestand te converteren. De eenmalige kosten voor het converteren naar een binair getal kunnen goedkoper zijn dan het vaak kopiëren van de IO-lijst, bij het ophalen van afval van een enkel proces of bij het doorgeven van berichten aan anderen.



Modified text is an extract of the original Stack Overflow Documentation
Licentie onder CC BY-SA 3.0
Niet aangesloten bij Stack Overflow