У коді 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 і просить функцію, яка дасть змогу витягувати дані з низки вкладених мап, щоб пришвидшити розробку.
Реалізуйте функцію 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 для роботи з вкладеною структурою мап.
Наш колега, який переглядає наш код, розповідає нам про функцію модуля Kernel, яка робить щось дуже схоже на нашу реалізацію.
Реалізуйте get_in_path/2, щоб використати цю функцію модуля Kernel.
Функція приймає ті самі аргументи, що й у частині 1.
BasketballWebsite.get_in_path(data, "team_mascot.actor.first_name")
# => "Noel"
Зареєструйтеся на Exercism, щоб вивчати й опановувати Elixir, а також 58 концепцій168 вправ та справжнє наставництво від людей, і все це безкоштовно.