IO
Функции, обрабатывающие ввод/вывод (IO).
Многие функции в этом модуле ожидают в качестве аргумента устройство ввода/вывода. Устройство ввода/вывода должно быть PID или атомом, представляющим процесс. Для удобства Elixir предоставляет :stdio и :stderr в качестве сокращений для :standard_io и :standard_error Erlang.
Большинство функций ожидают chardata, т.е. строки или списки символов и строк. В случае передачи другого типа функции преобразуют его в строку с помощью протокола String.Chars (как показано в типах).
Функции, начинающиеся с bin, ожидают iodata в качестве аргумента, т.е. двоичные данные или списки байтов и двоичных данных.
Устройства ввода/вывода
Устройство ввода/вывода может быть атомом или PID. Если это атом, то атом должен быть именем зарегистрированного процесса. Кроме того, Elixir предоставляет два сокращения:
-
:stdio- сокращение для:standard_io, которое отображается на текущийProcess.group_leader/0в Erlang -
:stderr- сокращение для именованного процесса:standard_errorв Erlang
Устройства ввода/вывода сохраняют свою позицию, то есть последующие вызовы функций чтения или записи будут начинаться с места, где устройство было в последний раз обработано. Позицию файлов можно изменить с помощью функции :file.position/2.
Резюме
Типы
- chardata()
- device()
- nodata()
Функции
- binread(device \\ :stdio, line_or_chars)
-
Читает из устройства ввода/вывода
device. Операция не безопасна для Unicode. - binstream(device, line_or_bytes)
-
Преобразует устройство ввода/вывода
deviceвIO.Stream. Операция не безопасна для Unicode. - binwrite(device \\ :stdio, item)
-
Записывает
itemкак двоичные данные в заданное устройствоdevice. Преобразования Unicode не происходит. Операция не безопасна для Unicode. - chardata_to_string(string)
-
Преобразует chardata (список целых чисел, представляющих кодовые точки, списки и строки) в строку.
- getn(prompt, count \\ 1)
-
Получает заданное количество байтов с устройства ввода/вывода
:stdio. - getn(device, prompt, count)
-
Получает заданное количество байтов с устройства ввода/вывода
device. - gets(device \\ :stdio, prompt)
-
Считывает строку с устройства ввода/вывода
device. - inspect(item, opts \\ [])
-
Просматривает и записывает заданный
itemв устройство. - inspect(device, item, opts)
-
Просматривает
itemв соответствии с заданными параметрами с помощью устройства ввода/выводаdevice. - iodata_length(item)
-
Возвращает размер iodata.
- iodata_to_binary(item)
-
Преобразует iodata (список целых чисел, представляющих байты, списки и двоичные данные) в двоичные данные. Операция не безопасна для Unicode.
- puts(device \\ :stdio, item)
-
Записывает
itemв указанное устройствоdevice, аналогичноwrite/2, но добавляет символ новой строки в конце. - read(device \\ :stdio, line_or_chars)
-
Считывает с устройства ввода/вывода
device. - stream(device, line_or_codepoints)
-
Преобразует устройство ввода/вывода
deviceвIO.Stream. - warn(message)
-
Записывает
messageв stderr вместе со текущей трассировкой стека. - warn(message, stacktrace)
-
Записывает
messageв stderr вместе с указаннойstacktraceтрассировкой стека. - write(device \\ :stdio, item)
-
Записывает
itemв заданное устройствоdevice.
Типы
chardata()
chardata() :: :unicode.chardata()
device()
device() :: atom() | pid()
nodata()
nodata() :: {:error, term()} | :eof Функции
binread(device \\ :stdio, line_or_chars)
binread(device(), :all | :line | non_neg_integer()) :: iodata() | nodata()
Читает из устройства ввода/вывода device. Операция не безопасна для Unicode.
device итерируется указанным количеством байтов или построчно, если задано :line. В противном случае, если задано :all, возвращается весь device.
Возвращает:
-
data- выходные байты -
:eof- достигнут конец файла -
{:error, reason}- другая (редкая) ошибка; например,{:error, :estale}при чтении с NFS-тома
Если задано :all, :eof никогда не возвращается, а возвращается пустая строка в случае достижения устройствами EOF.
Примечание: не используйте эту функцию для устройств ввода/вывода в режиме Unicode, так как она вернёт неверный результат.
binstream(device, line_or_bytes)
binstream(device(), :line | pos_integer()) :: Enumerable.t()
Преобразует устройство ввода/вывода device в IO.Stream. Операция не безопасна для Unicode.
IO.Stream реализует как Enumerable, так и Collectable, что позволяет использовать его для чтения и записи.
device итерируется указанным количеством байтов или построчно, если задано :line. Это считывает из устройства ввода/вывода как сырой двоичный файл.
Обратите внимание, что поток ввода/вывода имеет побочные эффекты, и каждый раз, когда вы проходите по потоку, вы можете получить разные результаты.
Наконец, не используйте эту функцию для устройств ввода/вывода в режиме Unicode, так как она вернёт неверный результат.
binwrite(device \\ :stdio, item)
binwrite(device(), iodata()) :: :ok | {:error, term()} Записывает item в виде двоичных данных в заданное устройство device. Преобразования Unicode не происходит. Операция не безопасна для Unicode.
Дополнительная информация в write/2.
Примечание: не используйте эту функцию для устройств ввода/вывода в режиме Unicode, так как она вернёт неверный результат.
chardata_to_string(string)
chardata_to_string(chardata()) :: String.t() | no_return()
Преобразует chardata (список целых чисел, представляющих кодовые точки, списки и строки) в строку.
В случае неудачи преобразования возбуждается UnicodeConversionError. Если в качестве аргумента передана строка, то возвращается сама строка.
Примеры
iex> IO.chardata_to_string([0x00E6, 0x00DF])
"æß"
iex> IO.chardata_to_string([0x0061, "bc"])
"abc"
iex> IO.chardata_to_string("string")
"string" getn(prompt, count \\ 1)
getn(chardata() | String.Chars.t(), pos_integer()) :: chardata() | nodata()
getn(device(), chardata() | String.Chars.t()) :: chardata() | nodata()
Получает заданное количество байтов с устройства ввода/вывода :stdio.
Если :stdio является устройством Unicode, count подразумевает количество кодовых точек Unicode для извлечения. В противном случае, count представляет количество извлекаемых байтов.
См. IO.getn/3 для описания возвращаемых значений.
getn(device, prompt, count)
getn(device(), chardata() | String.Chars.t(), pos_integer()) :: chardata() | nodata()
Получает заданное количество байтов с устройства ввода/вывода device.
Если устройство ввода/вывода device является устройством Unicode, count подразумевает количество кодовых точек Unicode для извлечения. В противном случае, count представляет количество извлекаемых байтов.
Возвращает:
-
data- введённые символы -
:eof- достигнут конец файла -
{:error, reason}- другая (редкая) ошибка; например,{:error, :estale}при чтении с NFS-тома
gets(device \\ :stdio, prompt)
gets(device(), chardata() | String.Chars.t()) :: chardata() | nodata()
Считывает строку с устройства ввода/вывода device.
Возвращает:
-
data- символы в строке, завершённые символом новой строки (LF) или концом файла (EOF) -
:eof- достигнут конец файла -
{:error, reason}- другая (редкая) ошибка; например,{:error, :estale}при чтении с NFS-тома
Примеры
Для отображения «Как вас зовут?» в качестве приглашения и ожидания ввода пользователя:
IO.gets "What is your name?\n"
inspect(item, opts \\ [])
inspect(item, keyword()) :: item when item: var
Просматривает и записывает заданный item в устройство.
Важно отметить, что он возвращает исходный item без изменений. Это позволяет «просматривать» значения, вставляя вызов IO.inspect/2 практически в любом месте кода, например, в середине конвейера.
По умолчанию он включает красивую распечатку с шириной 80 символов. Ширину можно изменить, явно указав параметр :width.
Вывод может быть оформлен с меткой, передав параметр :label, чтобы легко отличить его от других вызовов IO.inspect/2. Метка будет выведена перед просматриваемым item.
Полный список дополнительных параметров форматирования см. в Inspect.Opts.
Примеры
IO.inspect <<0, 1, 2>>, width: 40
Выводит:
<<0, 1, 2>>
Мы можем использовать параметр :label для оформления вывода:
IO.inspect 1..100, label: "a wonderful range"
Выводит:
a wonderful range: 1..100
Опция :label особенно полезна при использовании конвейеров:
[1, 2, 3] |> IO.inspect(label: "before") |> Enum.map(&(&1 * 2)) |> IO.inspect(label: "after") |> Enum.sum
Выводит:
before: [1, 2, 3] after: [2, 4, 6]
inspect(device, item, opts)
inspect(device(), item, keyword()) :: item when item: var
Проверяет item в соответствии с заданными параметрами, используя ввод/вывод device.
Полный список параметров см. в inspect/2.
iodata_length(item)
iodata_length(iodata()) :: non_neg_integer()
Возвращает размер iodata.
Встроенная функция компилятора.
Примеры
iex> IO.iodata_length([1, 2 | <<3, 4>>]) 4
iodata_to_binary(item)
iodata_to_binary(iodata()) :: binary()
Преобразует iodata (список целых чисел, представляющих байты, списки и бинарные данные) в бинарные данные. Операция небезопасна для Unicode.
Обратите внимание, что эта функция обрабатывает списки целых чисел как сырые байты и не выполняет никаких преобразований кодировки. Если вы хотите преобразовать список символов в строку (кодировка UTF-8), используйте chardata_to_string/1.
Если функция получает бинарные данные, возвращаются те же бинарные данные.
Встроенная функция компилятора.
Примеры
iex> bin1 = <<1, 2, 3>> iex> bin2 = <<4, 5>> iex> bin3 = <<6>> iex> IO.iodata_to_binary([bin1, 1, [2, 3, bin2], 4 | bin3]) <<1, 2, 3, 1, 2, 3, 4, 5, 4, 6>> iex> bin = <<1, 2, 3>> iex> IO.iodata_to_binary(bin) <<1, 2, 3>>
puts(device \\ :stdio, item)
puts(device(), chardata() | String.Chars.t()) :: :ok
Записывает item в указанный device, подобно write/2, но добавляет перевод строки в конце.
read(device \\ :stdio, line_or_chars)
read(device(), :all | :line | non_neg_integer()) :: chardata() | nodata()
Считывает данные из ввода/вывода device.
Итерация по device выполняется по заданному количеству символов или строкам по строкам, если указано :line. В качестве альтернативы, если указано :all, возвращается весь device.
Возвращает:
-
data- символы вывода -
:eof- достигнут конец файла -
{:error, reason}- другая (редкая) ошибка; например,{:error, :estale}, если чтение происходит из NFS-тома
Если задан :all, :eof никогда не возвращается, но возвращается пустая строка, если устройство достигло конца файла.
stream(device, line_or_codepoints)
stream(device(), :line | pos_integer()) :: Enumerable.t()
Преобразует ввод/вывод device в IO.Stream.
IO.Stream реализует как Enumerable, так и Collectable, что позволяет использовать его для чтения и записи.
Итерация по device выполняется по заданному количеству символов или строкам по строкам, если указано :line.
Данные считываются как UTF-8. Обратитесь к IO.binstream/2 для обработки ввода/вывода как сырых бинарных данных.
Обратите внимание, что поток ввода/вывода имеет побочные эффекты, и при каждом проходе по потоку вы можете получить разные результаты.
Примеры
Вот пример эмуляции эхо-сервера из командной строки:
Enum.each IO.stream(:stdio, :line), &IO.write(&1)
warn(message)
warn(chardata() | String.Chars.t()) :: :ok
Записывает message в stderr вместе со стеком вызовов.
Возвращает :ok в случае успеха.
Примеры
IO.warn "variable bar is unused" #=> warning: variable bar is unused #=> (iex) evaluator.ex:108: IEx.Evaluator.eval/4
warn(message, stacktrace)
warn(chardata() | String.Chars.t(), Exception.stacktrace()) :: :ok
Записывает message в stderr вместе с указанным stacktrace.
Эта функция также уведомляет компилятор о выводе предупреждения (в случае включения —warnings-as-errors). Возвращает :ok в случае успеха.
Для предотвращения вывода стека вызовов можно передать пустой список.
Примеры
stacktrace = [{MyApp, :main, 1, [file: 'my_app.ex', line: 4]}]
IO.warn "variable bar is unused", stacktrace
#=> warning: variable bar is unused
#=> my_app.ex:4: MyApp.main/1 write(device \\ :stdio, item)
write(device(), chardata() | String.Chars.t()) :: :ok
Записывает item в указанный device.
По умолчанию device — стандартный вывод. Возвращает :ok в случае успеха.
Примеры
IO.write "sample" #=> sample IO.write :stderr, "error" #=> error
© 2012 Plataformatec
Licensed under the Apache License, Version 2.0.
https://hexdocs.pm/elixir/1.5.3/IO.html