Elixir usa i Behaviour per fornire interfacce generiche comuni, facilitando al contempo implementazioni specifiche per ogni modulo che li implementa. Un esempio comune di questo è l'Access Behaviour.
L'Access Behaviour fornisce un'interfaccia comune per recuperare dati da una struttura dati basata su chiavi. L'Access Behaviour è implementato per le mappe e le liste di parole chiave, ma vediamo come si usa con le mappe per capirne meglio il funzionamento. L'Access Behaviour stabilisce che, quando hai una mappa, puoi farla seguire da una coppia di parentesi quadre e poi usare la chiave per recuperare il valore associato a quella chiave.
# 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"
Se la chiave non esiste nella struttura dati, viene restituito nil. Questo può portare a comportamenti indesiderati, perché non viene sollevato alcun errore. Nota che nil stesso implementa l'Access Behaviour e restituisce sempre nil per qualsiasi chiave.
Lavori con un team di sviluppo web per mantenere un sito web per una squadra di basket locale. Il team di sviluppo web ha meno familiarità con Elixir e chiede una funzione per estrarre dati da una serie di mappe annidate, per facilitare lo sviluppo rapido.
Implementa la funzione extract_from_path/2 in modo che accetti due argomenti:
data: una struttura di mappe annidate con i dati sulla squadra di basket.path: una stringa composta da chiavi delimitate da punti per ottenere il valore associato all'ultima chiave.Se il valore o la chiave non esiste in qualsiasi punto del percorso, va restituito 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 l'Access Behaviour quando implementi questa funzione.
Non usare nessuna funzione dei moduli Map o Kernel per lavorare con la struttura di mappe annidate.
Un collega che revisiona il codice ti parla di una funzione del modulo Kernel che fa qualcosa di molto simile a quella appena implementata.
Implementa get_in_path/2 per usare questa funzione del modulo Kernel.
Gli argomenti attesi sono gli stessi della parte 1.
BasketballWebsite.get_in_path(data, "team_mascot.actor.first_name")
# => "Noel"
Iscriviti a Exercism per imparare e padroneggiare Elixir con 58 concetti168 esercizi e il mentoring di persone reali, tutto gratis.