Лазанья

Лазанья

Навчальна вправа

Вступ

Основи

Змінні

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 починаються з #.

Вказівки

У цій вправі ми напишемо трохи коду, який допоможе приготувати чудову лазанью з улюбленої кулінарної книги.

На нас чекає пʼять завдань, і всі вони повʼязані з часом, витраченим на приготування лазаньї.

1. Визначте очікуваний час у печі в хвилинах

Визначте функцію Lasagna.expected_minutes_in_oven/0, яка не приймає жодних аргументів і повертає, скільки хвилин лазанья має перебувати в печі. Згідно з кулінарною книгою, очікуваний час у печі становить 40 хвилин:

Lasagna.expected_minutes_in_oven()
# => 40

2. Обчисліть час, що залишився в печі, у хвилинах

Визначте функцію Lasagna.remaining_minutes_in_oven/1, яка приймає як аргумент фактичну кількість хвилин, які лазанья вже провела в печі, і повертає, скільки хвилин їй ще залишилося перебувати в печі, виходячи з очікуваного часу в печі в хвилинах із попереднього завдання.

Lasagna.remaining_minutes_in_oven(30)
# => 10

3. Обчисліть час підготовки в хвилинах

Визначте функцію Lasagna.preparation_time_in_minutes/1, яка приймає як аргумент кількість шарів, які ми додали до лазаньї, і повертає, скільки хвилин ми витратили на підготовку лазаньї, якщо припустити, що на кожен шар потрібно 2 хвилини.

Lasagna.preparation_time_in_minutes(2)
# => 4

4. Обчисліть загальний час роботи в хвилинах

Визначте функцію Lasagna.total_time_in_minutes/2, яка приймає два аргументи: перший аргумент - це кількість шарів, які ми додали до лазаньї, а другий аргумент - це кількість хвилин, які лазанья вже провела в печі. Функція має повернути загальну кількість хвилин, витрачених на приготування лазаньї, тобто суму часу підготовки в хвилинах і часу в хвилинах, який лазанья провела в печі на цей момент.

Lasagna.total_time_in_minutes(3, 20)
# => 26

5. Створіть повідомлення про те, що лазанья готова

Визначте функцію Lasagna.alarm/0, яка не приймає аргументів і повертає повідомлення про те, що лазанью вже можна їсти.

Lasagna.alarm()
# => "Ding!"
Редагувати через GitHub Посилання відкривається в новому вікні або вкладці
Elixir Exercism

Час розпочати Лазанья?

Зареєструйтеся на Exercism, щоб вивчати й опановувати Elixir, а також 58 концепцій168 вправ та справжнє наставництво від людей, і все це безкоштовно.