Поиск…


Вступление

В то время как строка 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 много раз, в сборке мусора одного процесса или в передаче сообщений другим.



Modified text is an extract of the original Stack Overflow Documentation
Лицензировано согласно CC BY-SA 3.0
Не связан с Stack Overflow