Η Elixir χρησιμοποιεί Behaviours για να παρέχει κοινές, γενικές διεπαφές, διευκολύνοντας παράλληλα ειδικές υλοποιήσεις για κάθε άρθρωμα που τις υλοποιεί. Ένα τέτοιο συνηθισμένο παράδειγμα είναι το Access Behaviour.
Το Access Behaviour παρέχει μια κοινή διεπαφή για την ανάκτηση δεδομένων από μια δομή δεδομένων που βασίζεται σε κλειδιά. Το Access Behaviour είναι υλοποιημένο για map και keyword lists, αλλά ας δούμε τη χρήση του στα map για να πάρουμε μια ιδέα. Το Access Behaviour ορίζει ότι όταν έχεις ένα map, μπορείς να το ακολουθήσεις με αγκύλες και μετά να χρησιμοποιήσεις το κλειδί για να ανακτήσεις την τιμή που σχετίζεται με αυτό το κλειδί.
# 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 Behaviour και επιστρέφει πάντα nil για οποιοδήποτε κλειδί.
Συνεργάζεσαι με μια ομάδα ανάπτυξης ιστού για τη συντήρηση της ιστοσελίδας μιας τοπικής ομάδας μπάσκετ. Η ομάδα ανάπτυξης ιστού δεν είναι πολύ εξοικειωμένη με την Elixir και ζητάει μια συνάρτηση που να μπορεί να εξάγει δεδομένα από μια σειρά εμφωλευμένων maps, ώστε να διευκολυνθεί η γρήγορη ανάπτυξη.
Υλοποίησε τη συνάρτηση extract_from_path/2, η οποία δέχεται δύο ορίσματα:
data: μια εμφωλευμένη δομή από maps με δεδομένα για την ομάδα μπάσκετ.path: μια συμβολοσειρά που αποτελείται από κλειδιά χωρισμένα με τελείες, για να πάρεις την τιμή που σχετίζεται με το τελευταίο κλειδί.Αν η τιμή ή το κλειδί δεν υπάρχει σε οποιοδήποτε σημείο της διαδρομής, θα πρέπει να επιστρέφεται 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 Behaviour όταν υλοποιείς αυτή τη συνάρτηση.
Μη χρησιμοποιήσεις συναρτήσεις από τα module Map ή Kernel για να δουλέψεις με την εμφωλευμένη δομή από maps.
Ο συνάδελφός σου που ελέγχει τον κώδικά σου σου λέει για μια συνάρτηση του module Kernel που κάνει κάτι πολύ παρόμοιο με τη δική σου υλοποίηση.
Υλοποίησε τη get_in_path/2 ώστε να χρησιμοποιεί αυτή τη συνάρτηση του module Kernel.
Τα ορίσματα που περιμένει είναι τα ίδια με αυτά του μέρους 1.
BasketballWebsite.get_in_path(data, "team_mascot.actor.first_name")
# => "Noel"
Γράψου στο Exercism για να μάθεις και να κατακτήσεις Elixir με 58 έννοιες168 ασκήσεις και πραγματική καθοδήγηση από ανθρώπους, όλα δωρεάν.