Spec-Zone.ru › Elixir 1.18

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

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

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

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

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

Spec-Zone.ru

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