Elixir usa los comportamientos en el código para proporcionar interfaces genéricas comunes y, al mismo tiempo, facilitar implementaciones específicas para cada módulo que los implemente. Un ejemplo común de esto es el comportamiento Access.
El comportamiento Access proporciona una interfaz común para obtener datos de una estructura de datos basada en claves. El comportamiento Access está implementado para mapas y listas de palabras clave, pero veamos su uso con los mapas para que te hagas una idea. El comportamiento Access especifica que cuando tienes un mapa, puedes escribir corchetes ([]) después de él y luego usar la clave para obtener el valor asociado a esa clave.
# 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"
Si la clave no existe en la estructura de datos, se devuelve nil. Esto puede ser una fuente de comportamiento no deseado, porque no lanza un error. Ten en cuenta que nil en sí mismo implementa el comportamiento Access y siempre devuelve nil para cualquier clave.
Trabajas con un equipo de desarrollo web para mantener un sitio web de un equipo de básquetbol local. El equipo de desarrollo web no está muy familiarizado con Elixir y te pide una función que permita extraer datos de una serie de mapas anidados para facilitar el desarrollo rápido.
Implementa la función extract_from_path/2 para que reciba dos argumentos:
data: una estructura de mapas anidados con datos sobre el equipo de básquetbol.path: un string formado por claves separadas por puntos para obtener el valor asociado con la última clave.Si el valor o la clave no existen en ningún punto de la ruta, se debe devolver 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
Usa el Access Behaviour al implementar esta función.
No uses ninguna función de los módulos Map o Kernel para trabajar con la estructura de mapas anidados.
Tu compañero de trabajo, que revisa tu código, te habla de una función del módulo Kernel que hace algo muy similar a tu implementación.
Implementa get_in_path/2 para usar esta función del módulo Kernel.
Los argumentos esperados son los mismos que en la parte 1.
BasketballWebsite.get_in_path(data, "team_mascot.actor.first_name")
# => "Noel"
Regístrate en Exercism para aprender y dominar Elixir con 58 conceptos168 ejercicios y mentoría humana real, todo gratis.