Elixir належить до мов із динамічною типізацією: тип змінної перевіряється лише під час виконання. За допомогою оператора зіставлення = ми можемо привʼязати значення будь-якого типу до імені змінної:
# Bound an integer value of 1
count = 1
# You may re-bind variables
count = 2
# You may re-bind any type to a variable
count = false
# Strings can be created by enclosing characters within double quotes
message = "Success!"
Elixir належить до мов функційного програмування, тому всі іменовані функції мають бути визначені в модулі. Ключове слово defmodule використовується для визначення модуля. Усі модулі доступні всім іншим модулям під час виконання і не потребують модифікатора доступу, щоб бути видимими для інших частин програми. Модуль аналогічний до класу в інших мовах програмування.
defmodule Calculator do
# ...
end
Іменовані функції потрібно визначати в модулі. Ключове слово def використовується для визначення публічної іменованої функції.
Кожна функція може мати нуль або більше аргументів. Значення останнього виразу у функції завжди неявно повертається.
defmodule Calculator do
def add(x, y) do
x + y
end
end
Щоб викликати функцію, потрібно вказати її модуль та імʼя функції й передати аргументи для кожного з аргументів функції.
sum = Calculator.add(1, 2)
# => 3
Замість def можна використати ключове слово defp, щоб визначити приватну функцію. Приватні функції можна використовувати лише з того самого модуля, який їх визначив.
Коли ми викликаємо функцію в тому самому модулі, де її визначено, імʼя модуля можна опустити.
Також можна писати короткі функції в однорядковому синтаксисі (звернімо увагу на кому , та двокрапку : навколо ключового слова do).
defmodule Calculator do
def subtract(x, y) do
private_subtract(x, y)
end
defp private_subtract(x, y), do: x - y
end
difference = Calculator.subtract(7, 2)
# => 5
difference = Calculator.private_subtract(7, 2)
# => ** (UndefinedFunctionError) function Calculator.private_subtract/2 is undefined or private
# Calculator.private_subtract(7, 2)
Прийнято називати функції разом з їхньою арністю. Арність функції - це кількість аргументів, які вона приймає.
# add/3 because this function has three arguments, thus an arity of 3
def add(x, y, z) do
x + y + z
end
Для назв модулів слід використовувати PascalCase. Назва модуля має починатися з великої літери A-Z і може містити літери a-zA-Z, цифри 0-9 та підкреслення _.
Для назв змінних і функцій слід використовувати snake_case. Назва змінної або функції має починатися з малої літери a-z або підкреслення _, може містити літери a-zA-Z, цифри 0-9 та підкреслення _, а також може закінчуватися знаком питання ? або знаком оклику !.
Elixir має дуже багату й добре задокументовану стандартну бібліотеку. Документація доступна онлайн на hexdocs.pm/elixir. Збережімо це посилання десь, воно нам знадобиться ще не раз!
Більшість вбудованих типів даних мають відповідний модуль із функціями для роботи з цим типом даних, наприклад, для цілих чисел є модуль Integer, для рядків тексту (англ. string) - модуль String, для масивів - модуль List і так далі.
Окремо варто згадати модуль Kernel. Він надає базові можливості, на яких побудована решта стандартної бібліотеки, як-от арифметичні оператори, макроси керування потоком та багато іншого. Функції модуля Kernel імпортуються автоматично, тож їх можна використовувати без префікса Kernel..
Коментарі можна використовувати, щоб залишати примітки для інших розробників, які читають вихідний код. Однорядкові коментарі в Elixir починаються з #.
У цій вправі ми напишемо трохи коду, який допоможе приготувати чудову лазанью з улюбленої кулінарної книги.
На нас чекає пʼять завдань, і всі вони повʼязані з часом, витраченим на приготування лазаньї.
Визначте функцію Lasagna.expected_minutes_in_oven/0, яка не приймає жодних аргументів і повертає, скільки хвилин лазанья має перебувати в печі. Згідно з кулінарною книгою, очікуваний час у печі становить 40 хвилин:
Lasagna.expected_minutes_in_oven()
# => 40
Визначте функцію Lasagna.remaining_minutes_in_oven/1, яка приймає як аргумент фактичну кількість хвилин, які лазанья вже провела в печі, і повертає, скільки хвилин їй ще залишилося перебувати в печі, виходячи з очікуваного часу в печі в хвилинах із попереднього завдання.
Lasagna.remaining_minutes_in_oven(30)
# => 10
Визначте функцію Lasagna.preparation_time_in_minutes/1, яка приймає як аргумент кількість шарів, які ми додали до лазаньї, і повертає, скільки хвилин ми витратили на підготовку лазаньї, якщо припустити, що на кожен шар потрібно 2 хвилини.
Lasagna.preparation_time_in_minutes(2)
# => 4
Визначте функцію Lasagna.total_time_in_minutes/2, яка приймає два аргументи: перший аргумент - це кількість шарів, які ми додали до лазаньї, а другий аргумент - це кількість хвилин, які лазанья вже провела в печі. Функція має повернути загальну кількість хвилин, витрачених на приготування лазаньї, тобто суму часу підготовки в хвилинах і часу в хвилинах, який лазанья провела в печі на цей момент.
Lasagna.total_time_in_minutes(3, 20)
# => 26
Визначте функцію Lasagna.alarm/0, яка не приймає аргументів і повертає повідомлення про те, що лазанью вже можна їсти.
Lasagna.alarm()
# => "Ding!"
Зареєструйтеся на Exercism, щоб вивчати й опановувати Elixir, а також 58 концепцій168 вправ та справжнє наставництво від людей, і все це безкоштовно.