Треки
/
Elixir
Elixir
/
Вправи
/
Баскетбольний сайт
Баскетбольний сайт

Баскетбольний сайт

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

Вступ

Поведінка Access

У коді Elixir поведінки задають спільні узагальнені інтерфейси, але при цьому кожен модуль, який її реалізує, може мати власну реалізацію. Один із таких поширених прикладів - це поведінка Access.

Поведінка Access надає спільний інтерфейс для отримання даних зі структури даних, побудованої на ключах. Її реалізовано для мап і списків ключових слів, але розглянемо її використання з мапами, щоб краще зрозуміти, як це працює. Поведінка Access визначає, що коли в нас є мапа, ми можемо поставити після неї квадратні дужки, а потім використати ключ, щоб отримати значення, повʼязане з цим ключем.

# Suppose we have these two maps defined (note the difference in the key type)
my_map = %{key: "my value"}
your_map = %{"key" => "your value"}

# Obtain the value using the Access Behaviour
my_map[:key] == "my value"
your_map[:key] == nil
your_map["key"] == "your value"

Якщо ключа немає в структурі даних, то повертається nil. Це може стати джерелом неочікуваної поведінки, бо помилка не виникає. Зазначимо, що nil сам реалізує поведінку Access і завжди повертає nil для будь-якого ключа.

Вказівки

Ми працюємо з командою веброзробників, щоб підтримувати сайт для місцевої баскетбольної команди. Команда веброзробників не дуже знайома з Elixir і просить функцію, яка дасть змогу витягувати дані з низки вкладених мап, щоб пришвидшити розробку.

1. Витягніть дані з вкладеної структури мап

Реалізуйте функцію extract_from_path/2, яка приймає два аргументи:

  • data: вкладена структура мап із даними про баскетбольну команду.
  • path: рядок тексту (англ. string), що складається з ключів, розділених крапками, щоб отримати значення, повʼязане з останнім ключем.

Якщо значення або ключ не існує в жодній точці шляху, поверніть nil.

data = %{
  "team_mascot" => %{
    "animal" => "bear",
    "actor" => %{
      "first_name" => "Noel"
    }
  }
}

BasketballWebsite.extract_from_path(data, "team_mascot.animal")
# => "bear"
BasketballWebsite.extract_from_path(data, "team_mascot.colors")
# => nil

Використайте поведінку Access під час реалізації цієї функції.

Не використовуйте жодних функцій модулів Map або Kernel для роботи з вкладеною структурою мап.

2. Відрефакторте за допомогою вбудованих функцій

Наш колега, який переглядає наш код, розповідає нам про функцію модуля Kernel, яка робить щось дуже схоже на нашу реалізацію.

Реалізуйте get_in_path/2, щоб використати цю функцію модуля Kernel.

Функція приймає ті самі аргументи, що й у частині 1.

BasketballWebsite.get_in_path(data, "team_mascot.actor.first_name")
# => "Noel"
Редагувати через GitHub Посилання відкривається в новому вікні або вкладці
Elixir Exercism

Час розпочати Баскетбольний сайт?

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