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 STDLIB Reference Manual.
Модуль 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
Любой модуль, который не является частью приложений :kernel или :stdlib Erlang, должен иметь своё приложение явно указанное в вашем 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.16.3/erlang-libraries.html