Spec-Zone.ru › Elixir 1.16

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), которые вы можете использовать при отладке.

← Предыдущая страница Дополнительный лист синтаксиса
Следующая страница → Отладка

Скачать версию ePub

Создано с помощью ExDoc (v0.32.2) для языка программирования Elixir

© 2012-2024 The Elixir Team
Licensed under the Apache License, Version 2.0.
https://hexdocs.pm/elixir/1.16.3/erlang-libraries.html

Spec-Zone.ru

Настройки Оффлайн Что нового Помощь О нас
Spec-Zone .ru
спецификации, руководства, описания, API