Учебники

Эликсир — Модули

В Elixir мы группируем несколько функций в модули. Мы уже использовали различные модули в предыдущих главах, такие как модуль String, модуль Bitwise, модуль Tuple и т. Д.

Для создания собственных модулей в Elixir мы используем макрос defmodule . Мы используем макрос def для определения функций в этом модуле —

defmodule Math do
   def sum(a, b) do
      a + b
   end
end

В следующих разделах наши примеры будут длиннее по размеру, и будет сложно ввести их все в оболочку. Нам нужно научиться компилировать код Elixir, а также запускать скрипты Elixir.

компиляция

Модули всегда удобно записывать в файлы, чтобы их можно было скомпилировать и использовать повторно. Предположим, у нас есть файл с именем math.ex со следующим содержимым:

defmodule Math do
   def sum(a, b) do
      a + b
   end
end

Мы можем скомпилировать файлы с помощью команды — elixirc :

$ elixirc math.ex

Это создаст файл с именем Elixir.Math.beam, содержащий байт-код для определенного модуля. Если мы снова запустим iex , наше определение модуля будет доступно (при условии, что iex запущен в том же каталоге, в котором находится файл байт-кода). Например,

IO.puts(Math.sum(1, 2))

Вышеуказанная программа сгенерирует следующий результат —

3

Скриптовый режим

В дополнение к расширению файла Elixir .ex , Elixir также поддерживает файлы .exs для сценариев. Эликсир обрабатывает оба файла одинаково, единственное отличие — в цели. Файлы .ex предназначены для компиляции, а файлы .exs используются для сценариев . При выполнении оба расширения компилируют и загружают свои модули в память, хотя только файлы .ex записывают свой байт-код на диск в формате файлов .beam.

Например, если мы хотим запустить Math.sum в том же файле, мы можем использовать .exs следующим образом —

Math.exs

Live Demo

defmodule Math do
   def sum(a, b) do
      a + b
   end
end
IO.puts(Math.sum(1, 2))

Мы можем запустить его с помощью команды Elixir —

$ elixir math.exs

Вышеуказанная программа сгенерирует следующий результат —

3

Файл будет скомпилирован в памяти и выполнен с выводом «3». Файл байт-кода не будет создан.

Вложение модуля

Модули могут быть вложены в эликсир. Эта особенность языка помогает нам лучше организовать наш код. Для создания вложенных модулей мы используем следующий синтаксис —

defmodule Foo do
   #Foo module code here
   defmodule Bar do
      #Bar module code here
   end
end

В приведенном выше примере будут определены два модуля: Foo и Foo.Bar . Второй может быть доступен как Bar внутри Foo, если они находятся в той же лексической области. Если позже модуль Bar перемещается за пределы определения модуля Foo, на него должно ссылаться его полное имя (Foo.Bar), или псевдоним должен быть установлен с использованием директивы псевдонима, описанной в главе о псевдонимах.

Примечание. В Elixir нет необходимости определять модуль Foo для определения модуля Foo.Bar, поскольку язык переводит все имена модулей в атомы. Вы можете определить произвольно заданные модули без определения какого-либо модуля в цепочке. Например, вы можете определить Foo.Bar.Baz без определения Foo или Foo.Bar .