Erlang Language
iolists
Поиск…
Вступление
В то время как строка Erlang представляет собой список целых чисел, «iolist» представляет собой список, чьи элементы являются целыми, двоичными или другими iolists, например ["foo", $b, $a, $r, <<"baz">>]
. Этот иолит представляет собой строку "foobarbaz"
.
Хотя вы можете преобразовать iolist в двоичный файл с помощью iolist_to_binary/1
, вам часто не нужно, поскольку функции библиотеки Erlang, такие как file:write_file/2
и gen_tcp:send/2
принимают iolists, а также строки и двоичные файлы.
Синтаксис
- -type iolist () :: maybe_improper_list (byte () | binary () | iolist (), binary () | []).
замечания
Что такое иолит?
Это любой двоичный файл. Или любой список, содержащий целые числа от 0 до 255. Или любой произвольно вложенный список, содержащий любую из этих двух вещей.
Используйте глубоко вложенные списки целых чисел и двоичных файлов для представления данных ввода-вывода, чтобы избежать копирования при конкатенации строк или двоичных файлов.
Они эффективны даже при объединении большого количества данных. Например, объединение двух пятибуквенных двоичных файлов с использованием бинарного синтаксиса <<B1/binary, B2/binary>>
обычно требует перераспределения обоих в новый 100kb двоичный файл. Использование списков ввода-вывода [B1, B2]
присваивает только список, в данном случае три слова. В списке используется одно слово и другое слово для каждого элемента, см. Здесь для получения дополнительной информации.
Использование оператора ++
создало бы целый новый список, а не только новый список из двух элементов. Воспроизведение списков для добавления элементов в конец может стать дорогостоящим, когда список длинный.
В случаях, когда двоичные данные малы, распределение списков ввода-вывода может быть больше, чем добавление двоичных файлов. Если двоичные данные могут быть либо небольшими, либо большими, часто лучше принимать согласованную стоимость списков ввода-вывода.
Обратите внимание, что добавляемые двоичные файлы оптимизируются, как описано здесь . Короче говоря, двоичный файл может иметь дополнительное, скрытое пространство. Это будет заполнено, если к нему добавится другой бинар, который помещается в свободное пространство. Это означает, что не каждый бинарный append вызывает полную копию обоих двоичных файлов.
Списки IO обычно используются для создания вывода на порт, например, в файле или в сетевом сокете.
file:write_file("myfile.txt", ["Hi " [<<"there">>], $\n]).
Добавьте разрешенные типы данных в начало списка ввода-вывода, создав новый.
["Guten Tag " | [<<"Hello">>]].
[<<"Guten Tag ">> | [<<"Hello">>]].
[$G, $u, $t, $e, $n , $T, $a, $g | [<<"Hello">>]].
[71,117,116,101,110,84,97,103,<<"Hello">>].
Данные ввода-вывода могут быть эффективно добавлены в конец списка.
Data_1 = [<<"Hello">>].
Data_2 = [Data_1,<<" Guten Tag ">>].
Будьте осторожны с неправильными списками
["Guten tag " | <<"Hello">>].
В оболочке это будет напечатано как ["Guten tag "|<<"Hello">>]
вместо ["Guten tag ",<<"Hello">>]
. Оператор трубы создаст неправильный список, если последний элемент справа не является списком. Хотя неправильный список, чей «хвост» является двоичным, по-прежнему является достоверным iolist, неправильные списки могут вызывать проблемы, потому что многие рекурсивные функции ожидают, что пустой список будет последним элементом, а не, как в этом случае двоичным.
Получить размер списка ввода-вывода
Data = ["Guten tag ",<<"Hello">>],
Len = iolist_size(Data),
[<<Len:32>> | Data].
Размер iolist может быть рассчитан с использованием iolist_size/1
. Этот фрагмент вычисляет размер сообщения и создает и добавляет его к фронту в виде четырехбайтового двоичного кода. Это типичная операция в протоколах обмена сообщениями.
Список IO может быть преобразован в двоичный
<<"Guten tag, Hello">> = iolist_to_binary(["Guten tag, ",<<"Hello">>]).
Список IO может быть преобразован в двоичный файл с помощью функции iolist_to_binary/1
. Если данные будут храниться в течение длительного периода или отправляться в виде сообщений другим процессам, тогда имеет смысл преобразовать их в двоичный файл. Единственная стоимость конвертации в двоичную систему может быть дешевле, чем копирование списка IO много раз, в сборке мусора одного процесса или в передаче сообщений другим.