Source Библиотеки Erlang
Elixir обеспечивает отличную межплатформенную работу с библиотеками Erlang. На самом деле, Elixir не рекомендует просто оборачивать библиотеки Erlang, а предпочитает непосредственное взаимодействие с кодом Erlang. В этом разделе мы представим некоторые из наиболее распространенных и полезных функций Erlang, которых нет в Elixir.
Модули Erlang имеют другую систему именования, чем в Elixir, и начинаются с маленькой буквы. В обоих случаях имена модулей являются атомами, и мы вызываем функции, отправляя запрос модулю:
iex> is_atom(String)
true
iex> String.first("hello")
"h"
iex> is_atom(:binary)
true
iex> :binary.first("hello")
104
По мере того, как вы станете более опытным в Elixir, вы можете более подробно изучить Справочное руководство STDLIB Erlang.
Модуль binary
Встроенный модуль Elixir String обрабатывает двоичные данные, закодированные в UTF-8. Модуль :binary полезен, когда вы работаете с двоичными данными, которые не обязательно закодированы в UTF-8.
iex> String.to_charlist("Ø")
[216]
iex> :binary.bin_to_list("Ø")
[195, 152]
Приведенный выше пример демонстрирует разницу; модуль String возвращает кодовые точки Юникода, в то время как :binary обрабатывает сырые байты данных.
Форматированный вывод текста
Elixir не содержит функции, аналогичной printf, которая есть в C и других языках. К счастью, функции стандартной библиотеки Erlang :io.format/2 и :io_lib.format/2 могут быть использованы. Первая форматирует вывод в терминал, а вторая — в iolist. Форматные спецификаторы отличаются от printf, подробности см. в документации Erlang.
iex> :io.format("Pi is approximately given by:~10.3f~n", [:math.pi])
Pi is approximately given by: 3.142
:ok
iex> to_string(:io_lib.format("Pi is approximately given by:~10.3f~n", [:math.pi]))
"Pi is approximately given by: 3.142\n"
Модуль crypto
Модуль :crypto содержит функции хэширования, цифровых подписей, шифрования и многое другое:
iex> Base.encode16(:crypto.hash(:sha256, "Elixir")) "3315715A7A3AD57428298676C5AE465DADA38D951BDFAC9348A8A31E9C7401CB"
Модуль :crypto является частью приложения :crypto, которое поставляется с Erlang. Это означает, что вы должны указать приложение :crypto в качестве дополнительного приложения в вашей конфигурации проекта. Для этого отредактируйте файл mix.exs, чтобы добавить:
def application do [extra_applications: [:crypto]] end
Любой модуль, который не является частью приложений Erlang :kernel или :stdlib, должен иметь своё приложение явно указанным в вашем файле mix.exs. Имя приложения любого модуля Erlang можно найти в документации Erlang, сразу под логотипом Erlang в боковой панели.
Модуль digraph
Модули :digraph и :digraph_utils содержат функции для работы с ориентированными графами, состоящими из вершин и рёбер. После построения графа алгоритмы в них помогут найти, например, кратчайший путь между двумя вершинами или циклы в графе.
Найдите кратчайший путь от первой к последней из трёх вершин.
iex> digraph = :digraph.new()
iex> coords = [{0.0, 0.0}, {1.0, 0.0}, {1.0, 1.0}]
iex> [v0, v1, v2] = (for c <- coords, do: :digraph.add_vertex(digraph, c))
iex> :digraph.add_edge(digraph, v0, v1)
iex> :digraph.add_edge(digraph, v1, v2)
iex> :digraph.get_short_path(digraph, v0, v2)
[{0.0, 0.0}, {1.0, 0.0}, {1.0, 1.0}]
Обратите внимание, что функции в :digraph изменяют структуру графа на месте, что возможно, потому что они реализованы как таблицы ETS, о которых рассказывается далее.
Хранилище терминов Erlang
Модули :ets и :dets обрабатывают хранение больших структур данных в памяти или на диске соответственно.
ETS позволяет создавать таблицу, содержащую кортежи. По умолчанию таблицы ETS защищены, что означает, что только процесс-владелец может записывать в таблицу, но любой другой процесс может читать. ETS имеет некоторые функции, позволяющие использовать таблицу как простую базу данных, хранилище ключ-значение или механизм кэширования.
Функции в модуле ets изменят состояние таблицы как побочный эффект.
iex> table = :ets.new(:ets_test, [])
# Store as tuples with {name, population}
iex> :ets.insert(table, {"China", 1_374_000_000})
iex> :ets.insert(table, {"India", 1_284_000_000})
iex> :ets.insert(table, {"USA", 322_000_000})
iex> :ets.i(table)
<1 > {<<"India">>,1284000000}
<2 > {<<"USA">>,322000000}
<3 > {<<"China">>,1374000000}
Модуль math
Модуль :math содержит распространённые математические операции, охватывающие тригонометрию, экспоненциальные и логарифмические функции.
iex> angle_45_deg = :math.pi() * 45.0 / 180.0 iex> :math.sin(angle_45_deg) 0.7071067811865475 iex> :math.exp(55.0) 7.694785265142018e23 iex> :math.log(7.694785265142018e23) 55.0
Модуль queue
Модуль :queue предоставляет структуру данных, которая эффективно реализует очереди FIFO (первым вошел — первым вышел):
iex> q = :queue.new
iex> q = :queue.in("A", q)
iex> q = :queue.in("B", q)
iex> {value, q} = :queue.out(q)
iex> value
{:value, "A"}
iex> {value, q} = :queue.out(q)
iex> value
{:value, "B"}
iex> {value, q} = :queue.out(q)
iex> value
:empty
Модуль rand
Модуль :rand содержит функции для возвращения случайных значений и установки случайного начального значения.
iex> :rand.uniform()
0.8175669086010815
iex> _ = :rand.seed(:exs1024, {123, 123534, 345345})
iex> :rand.uniform()
0.5820506340260994
iex> :rand.uniform(6)
6
Модули zip и zlib
Модуль :zip позволяет читать и записывать ZIP-файлы на диск или в память, а также извлекать информацию о файлах.
Этот код подсчитывает количество файлов в ZIP-архиве:
iex> :zip.foldl(fn _, _, _, acc -> acc + 1 end, 0, :binary.bin_to_list("file.zip"))
{:ok, 633}
Модуль :zlib обрабатывает сжатие данных в формате zlib, как в утилите командной строки gzip в системах Unix.
iex> song = " ...> Mary had a little lamb, ...> His fleece was white as snow, ...> And everywhere that Mary went, ...> The lamb was sure to go." iex> compressed = :zlib.compress(song) iex> byte_size(song) 110 iex> byte_size(compressed) 99 iex> :zlib.uncompress(compressed) "\nMary had a little lamb,\nHis fleece was white as snow,\nAnd everywhere that Mary went,\nThe lamb was sure to go."
Изучение Erlang
Если вы хотите углубиться в Erlang, вот список онлайн-ресурсов, которые охватывают основы Erlang и его более продвинутые функции:
Этот Erlang Syntax: A Crash Course предоставляет краткое введение в синтаксис Erlang. Каждый фрагмент кода сопровождается эквивалентным кодом на Elixir. Это возможность не только ознакомиться с синтаксисом Erlang, но и пересмотреть изученное о Elixir.
Официальный сайт Erlang содержит краткий учебник. Есть глава с изображениями, кратко описывающими примитивы Erlang для конкурентного программирования.
Learn You Some Erlang for Great Good! — отличное введение в Erlang, его принципы проектирования, стандартную библиотеку, лучшие практики и многое другое. После прочтения упомянутого выше краткого курса вы сможете безопасно пропустить первые несколько глав книги, которые в основном посвящены синтаксису. Когда дойдёте до главы The Hitchhiker's Guide to Concurrency, настоящее веселье начнётся.
Наш последний шаг — ознакомиться с существующими библиотеками Elixir (и Erlang), которые вы можете использовать при отладке.
© 2012-2024 The Elixir Team
Licensed under the Apache License, Version 2.0.
https://hexdocs.pm/elixir/1.18.1/erlang-libraries.html