В 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
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 .