Щоб ділитися кодом між різними модулями Elixir у межах одного проєкту, потрібно посилатися на зовнішній модуль за його повним імʼям. Але що робити, якщо це імʼя задовге або заплутане?
Спеціальна форма alias дає змогу скоротити чи змінити імʼя, за яким ми посилаємося на зовнішній модуль. Якщо використати її без аргументів, вона вкорочує імʼя модуля до останнього сегмента, наприклад MyApp.Logger.Settings стає Settings. Власне імʼя можна задати за допомогою опції :as.
Зазвичай псевдоніми додають на початку визначення модуля.
defmodule Square do
alias Integer, as: I
def area(a), do: I.pow(a, 2)
end
Спеціальна форма import дає змогу використовувати функції із зовнішнього модуля, не згадуючи імені цього модуля.
Імпортування цілого зовнішнього модуля може створити конфлікти з наявними локальними функціями. Щоб цього уникнути, є дві опції: :except і :only. Обидві приймають список ключових слів, де ключ - це назва функції, а значення - арність функції.
Зазвичай імпорти додають на початку визначення модуля.
defmodule Square do
import Integer, only: [pow: 2]
def area(a), do: pow(a, 2)
end
Та радіокерована машинка, яку ми нещодавно купили, перетворилася на ціле нове хобі. Ми організовували перегони радіокерованих машинок.
Ми майже дописали програму, яка дозволяла б запускати симуляції перегонів, коли кіт стрибнув на нашу клавіатуру і стер кілька рядків коду. Тепер наша програма більше не компілюється...
Race.__struct__/0 is undefined
Додайте псевдонім, щоб до модуля NeedForSpeed.Race можна було звертатися за коротшим іменем Race.
Car.__struct__/0 is undefined
Додайте псевдонім, щоб до модуля NeedForSpeed.RemoteControlCar можна було звертатися за коротшим іменем Car.
undefined function puts/1
Функція puts/1 походить з модуля IO. Імпортуйте її, щоб мати змогу використовувати без звернення до модуля.
undefined function default_color/0
Функції default_color/0, red/0, cyan/0 і green/0 усі походять з модуля IO.ANSI. Ми плануємо додати підтримку інших кольорів машинок, тож хочемо імпортувати весь модуль. На жаль, функція color/1 з модуля IO.ANSI конфліктує з однією з наших локальних функцій. Імпортуйте весь модуль IO.ANSI, крім цієї однієї функції.
Зареєструйтеся на Exercism, щоб вивчати й опановувати Elixir, а також 58 концепцій168 вправ та справжнє наставництво від людей, і все це безкоштовно.