Στην Elixir, οι χάρτες είναι η δομή δεδομένων για την αποθήκευση πληροφοριών σε ζεύγη κλειδιού-τιμής. Σε άλλες γλώσσες, αυτοί μπορεί να είναι γνωστοί και ως συσχετιστικοί πίνακες (PHP), hashes (Perl 5, Raku) ή λεξικά (Python).
Τα κλειδιά και οι τιμές μπορούν να είναι οποιουδήποτε τύπου δεδομένων, αλλά αν το κλειδί είναι άτομο, μπορούμε να χρησιμοποιήσουμε μια συντομευμένη σύνταξη. Οι χάρτες δεν εγγυώνται τη σειρά των καταχωρήσεών τους όταν προσπελαύνονται ή επιστρέφονται.
Ένας κενός χάρτης δηλώνεται απλά με %{}. Αν θέλουμε να προσθέσουμε στοιχεία σε ένα literal χάρτη, μπορούμε να χρησιμοποιήσουμε δύο μορφές:
# If the key is an atom:
%{atom_key: 1}
# If the key is a different type:
%{1 => :atom_value}
# You can even mix these if the atom form comes second:
%{"first_form" => :a, atom_form: :b}
Αν και δεν υπάρχει καθιερωμένη μορφή, διάλεξε έναν συνεπή τρόπο για να αναπαριστάς τα ζεύγη κλειδιού-τιμής.
Η Elixir παρέχει πολλές συναρτήσεις για την εργασία με χάρτες στο module Map. Κάποιες συναρτήσεις του module Map απαιτούν να περαστεί μια ανώνυμη συνάρτηση στη συνάρτηση για να βοηθήσει στον μετασχηματισμό του χάρτη.
Στην Elixir, μπορούμε να ορίσουμε χαρακτηριστικά module που μπορούν να χρησιμοποιηθούν ως σταθερές στις συναρτήσεις μας.
defmodule Example do
# Defines the attribute as the value 1
@constant_number 1
def example_value() do
# Returns the value 1
@constant_number
end
end
Όταν χρησιμοποιούνται για τον ορισμό σταθερών module, τα χαρακτηριστικά μπορούν να είναι οποιαδήποτε έκφραση που μπορεί να αξιολογηθεί κατά τη μεταγλώττιση. Μετά τη μεταγλώττιση, τα χαρακτηριστικά module δεν είναι προσπελάσιμα, καθώς επεκτείνονται κατά τη μεταγλώττιση, παρόμοια με τα macros που ορίζονται σε γλώσσες όπως η C.
Σε αυτή την άσκηση, υλοποιείς έναν τρόπο να κρατάς τα υψηλά σκορ για το πιο δημοφιλές παιχνίδι στην τοπική αίθουσα παιχνιδιών.
Για να φτιάξεις έναν νέο map υψηλών σκορ, όρισε τη συνάρτηση HighScore.new/0, η οποία δεν παίρνει κανένα όρισμα και επιστρέφει έναν νέο, κενό map υψηλών σκορ.
HighScore.new()
# => %{}
Για να προσθέσεις έναν παίκτη στον map υψηλών σκορ, όρισε τη συνάρτηση HighScore.add_player/3, η οποία παίρνει 3 ορίσματα:
Αποθήκευσε το προεπιλεγμένο αρχικό σκορ σε ένα χαρακτηριστικό ενότητας. Θα το χρειαστείς ξανά.
score_map = HighScore.new()
# => %{}
score_map = HighScore.add_player(score_map, "Dave Thomas")
# => %{"Dave Thomas" => 0}
score_map = HighScore.add_player(score_map, "José Valim", 486_373)
# => %{"Dave Thomas" => 0, "José Valim"=> 486_373}
Για να αφαιρέσεις έναν παίκτη από τον map υψηλών σκορ, όρισε τη συνάρτηση HighScore.remove_player/2, η οποία παίρνει 2 ορίσματα:
score_map = HighScore.new()
# => %{}
score_map = HighScore.add_player(score_map, "Dave Thomas")
# => %{"Dave Thomas" => 0}
score_map = HighScore.remove_player(score_map, "Dave Thomas")
# => %{}
Για να επαναφέρεις το σκορ ενός παίκτη, όρισε τη συνάρτηση HighScore.reset_score/2, η οποία παίρνει 2 ορίσματα:
Η συνάρτηση θα πρέπει να δουλεύει και αν ο παίκτης δεν έχει σκορ.
score_map = HighScore.new()
# => %{}
score_map = HighScore.add_player(score_map, "José Valim", 486_373)
# => %{"José Valim"=> 486_373}
score_map = HighScore.reset_score(score_map, "José Valim")
# => %{"José Valim"=> 0}
Για να ενημερώσεις το σκορ ενός παίκτη προσθέτοντας στο προηγούμενο σκορ, όρισε τη συνάρτηση HighScore.update_score/3, η οποία παίρνει 3 ορίσματα:
Η συνάρτηση θα πρέπει να δουλεύει και αν ο παίκτης δεν έχει προηγούμενο σκορ - υπέθεσε ότι το προηγούμενο σκορ είναι 0.
score_map = HighScore.new()
# => %{}
score_map = HighScore.add_player(score_map, "José Valim", 486_373)
# => %{"José Valim"=> 486_373}
score_map = HighScore.update_score(score_map, "José Valim", 5)
# => %{"José Valim"=> 486_378}
Για να πάρεις μια λίστα με παίκτες, όρισε τη συνάρτηση HighScore.get_players/1, η οποία παίρνει 1 όρισμα:
score_map = HighScore.new()
# => %{}
score_map = HighScore.add_player(score_map, "Dave Thomas", 2_374)
# => %{"Dave Thomas" => 2_374}
score_map = HighScore.add_player(score_map, "José Valim", 486_373)
# => %{"Dave Thomas" => 2_374, "José Valim"=> 486_373}
HighScore.get_players(score_map)
# => ["Dave Thomas", "José Valim"]
Γράψου στο Exercism για να μάθεις και να κατακτήσεις Elixir με 58 έννοιες168 ασκήσεις και πραγματική καθοδήγηση από ανθρώπους, όλα δωρεάν.