Erlang Language
iolistas
Buscar..
Introducción
Mientras que una cadena Erlang es una lista de enteros, un "iolist" es una lista cuyos elementos son enteros, binarios u otros iolists, por ejemplo, ["foo", $b, $a, $r, <<"baz">>]
. Ese iolist representa la cadena "foobarbaz"
.
Si bien puede convertir un iolist a un binario con iolist_to_binary/1
, a menudo no lo necesita, ya que las funciones de la biblioteca Erlang como el file:write_file/2
y gen_tcp:send/2
aceptan iolists, así como cadenas y archivos binarios.
Sintaxis
- -type iolist () :: maybe_improper_list (byte () | binary () | iolist (), binary () | []).
Observaciones
¿Qué es un iolist?
Es cualquier binario. O cualquier lista que contenga enteros entre 0 y 255. O cualquier lista anidada arbitrariamente que contenga cualquiera de esas dos cosas.
Utilice listas profundamente anidadas de enteros y binarios para representar datos de IO para evitar copiarlos al concatenar cadenas o binarios.
Son eficientes incluso cuando se combinan grandes cantidades de datos. Por ejemplo, combinar dos binarios de cincuenta kilobytes utilizando la sintaxis binaria <<B1/binary, B2/binary>>
normalmente requeriría la reasignación de ambos en un nuevo binario de 100kb. El uso de listas de IO [B1, B2]
solo asigna la lista, en este caso tres palabras. Una lista utiliza una palabra y otra palabra por elemento, consulte aquí para obtener más información.
El uso del operador ++
habría creado una lista completamente nueva, en lugar de una lista de dos elementos nuevos. Volver a crear listas para agregar elementos al final puede resultar costoso cuando la lista es larga.
En los casos en que los datos binarios son pequeños, la asignación de listas de E / S puede ser mayor que agregar los binarios. Si los datos binarios pueden ser pequeños o grandes, a menudo es mejor aceptar el costo constante de las listas de IO.
Tenga en cuenta que los binarios agregados se optimizan como se describe aquí . En resumen, un binario puede tener espacio extra oculto asignado. Se llenará si se le agrega otro binario que se ajuste al espacio libre. Esto significa que no todos los apéndices binarios causarán una copia completa de ambos binarios.
Las listas de E / S se utilizan normalmente para generar la salida a un puerto, por ejemplo, un archivo o un socket de red.
file:write_file("myfile.txt", ["Hi " [<<"there">>], $\n]).
Agregue los tipos de datos permitidos al frente de una lista de IO, creando una nueva.
["Guten Tag " | [<<"Hello">>]].
[<<"Guten Tag ">> | [<<"Hello">>]].
[$G, $u, $t, $e, $n , $T, $a, $g | [<<"Hello">>]].
[71,117,116,101,110,84,97,103,<<"Hello">>].
Los datos de IO se pueden agregar de manera eficiente al final de una lista.
Data_1 = [<<"Hello">>].
Data_2 = [Data_1,<<" Guten Tag ">>].
Tenga cuidado con las listas impropias
["Guten tag " | <<"Hello">>].
En el shell se imprimirá como ["Guten tag "|<<"Hello">>]
lugar de ["Guten tag ",<<"Hello">>]
. El operador de tubería creará una lista incorrecta si el último elemento a la derecha no es una lista. Si bien una lista inadecuada cuya "cola" es un binario sigue siendo un iolist válido, las listas inadecuadas pueden causar problemas porque muchas funciones recursivas esperan que una lista vacía sea el último elemento, y no, como en este caso un binario.
Obtener el tamaño de la lista IO
Data = ["Guten tag ",<<"Hello">>],
Len = iolist_size(Data),
[<<Len:32>> | Data].
El tamaño de un iolist se puede calcular utilizando iolist_size/1
. Este fragmento calcula el tamaño de un mensaje y lo crea y lo agrega al frente como un binario de cuatro bytes. Esta es una operación típica en los protocolos de mensajería.
La lista IO se puede convertir a un binario
<<"Guten tag, Hello">> = iolist_to_binary(["Guten tag, ",<<"Hello">>]).
Una lista de E / S puede convertirse en un binario utilizando la función iolist_to_binary/1
. Si los datos se almacenarán durante un período prolongado o se enviarán como un mensaje a otros procesos, entonces puede tener sentido convertirlos a un binario. El costo único de convertir a un binario puede ser más barato que copiar la lista de IO muchas veces, en la recolección de basura de un solo proceso o en el paso de mensajes a otros.