Erlang Language
iolists
Sök…
Introduktion
Medan en Erlang-sträng är en lista med heltal, är en "iolist" en lista vars element är antingen heltal, binärer eller andra iolistor, t.ex. ["foo", $b, $a, $r, <<"baz">>]
. Den iolisten representerar strängen "foobarbaz"
.
Medan du kan konvertera en iolist till en binär med iolist_to_binary/1
, behöver du ofta inte, eftersom Erlang-biblioteksfunktioner som file:write_file/2
och gen_tcp:send/2
acceptera iolistor samt strängar och binärer.
Syntax
- -typ iolist () :: miskien_improper_list (byte () | binär () | iolist (), binär () | []).
Anmärkningar
Vad är en iolist?
Det är valfri binär. Eller vilken lista som innehåller heltal mellan 0 och 255. Eller valfri list som innehåller någon av dessa två saker.
Använd djupt kapslade listor över heltal och binära filer för att representera IO-data för att undvika kopiering vid sammanlänkning av strängar eller binärer.
De är effektiva även när man kombinerar stora mängder data. Till exempel att kombinera två femtio kilobyte binärer med binär syntax <<B1/binary, B2/binary>>
kräver vanligtvis omfördelning båda till en ny binär 100kb. Att använda IO-listor [B1, B2]
fördelar bara listan, i detta fall tre ord. En lista använder ett ord och ett annat ord per element, se här för mer information.
Att använda operatören ++
skulle ha skapat en helt ny lista istället för bara en ny tvåelementslista. Att återskapa listor för att lägga till element i slutet kan bli dyrt när listan är lång.
I de fall där binära data är små kan allokering av IO-listor vara större än att lägga till binärerna. Om binära data antingen kan vara små eller stora är det ofta bättre att acceptera de konsekventa kostnaderna för IO-listor.
Observera att bifogade binärer optimeras som beskrivs här . Kort sagt kan en binär tilldela extra, dold utrymme. Detta kommer att fyllas om en annan binär bifogas till den som passar i det fria utrymmet. Detta innebär att inte varje binär tillägg kommer att orsaka en fullständig kopia av båda binärerna.
IO-listor används vanligtvis för att bygga utdata till en port, t.ex. en fil eller nätverksuttag.
file:write_file("myfile.txt", ["Hi " [<<"there">>], $\n]).
Lägg till tillåtna datatyper på framsidan av en IO-lista och skapa en ny.
["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-data kan läggas till effektivt i slutet av en lista.
Data_1 = [<<"Hello">>].
Data_2 = [Data_1,<<" Guten Tag ">>].
Var försiktig med felaktiga listor
["Guten tag " | <<"Hello">>].
I skalet kommer detta att skrivas ut som ["Guten tag "|<<"Hello">>]
istället för ["Guten tag ",<<"Hello">>]
. Röroperatören skapar en felaktig lista om det sista elementet till höger inte är en lista. Medan en felaktig lista vars "svans" är en binär fortfarande är en giltig iolist, kan felaktiga listor orsaka problem eftersom många rekursiva funktioner förväntar sig att en tom lista ska vara det sista elementet, och inte, som i detta fall en binär.
Få IO-liststorlek
Data = ["Guten tag ",<<"Hello">>],
Len = iolist_size(Data),
[<<Len:32>> | Data].
Storleken på en iolist kan beräknas med iolist_size/1
. Detta utdrag beräknar storleken på ett meddelande och skapar och lägger till det på fronten som en fyra byte-binär. Detta är en typisk operation i meddelandeprotokoll.
IO-listan kan konverteras till en binär
<<"Guten tag, Hello">> = iolist_to_binary(["Guten tag, ",<<"Hello">>]).
En IO-lista kan konverteras till en binär med iolist_to_binary/1
. Om data kommer att lagras under en lång period eller skickas som ett meddelande till andra processer kan det vara meningsfullt att konvertera den till en binär. Engångskostnaden för att konvertera till en binär kan vara billigare än att kopiera IO-listan många gånger, i skrämsamling av en enda process eller i meddelanden som skickas till andra.