Η μονάδα Agent παρέχει μια αφαίρεση για τη δημιουργία διεργασιών και για τον βρόχο λήψης-αποστολής. Από εδώ και πέρα, θα ονομάζουμε τις διεργασίες που ξεκινούν χρησιμοποιώντας τη μονάδα Agent 'διεργασίες Agent'. Μπορεί να επιλέξεις μια διεργασία Agent για να αναπαραστήσει μια κεντρική κοινόχρηστη κατάσταση.
Για να ξεκινήσεις μια διεργασία Agent, η μονάδα Agent παρέχει τη συνάρτηση start/2. Η συνάρτηση που παρέχεται όταν ξεκινάς τη διεργασία Agent μέσω της start επιστρέφει την αρχική κατάσταση της διεργασίας:
# Start an agent process with an initial value of an empty list
{:ok, agent_pid} = Agent.start(fn -> [] end)
Όπως ακριβώς το Map ή το List, η μονάδα Agent παρέχει πολλές συναρτήσεις για να δουλεύεις με διεργασίες Agent.
Συνηθίζεται να οργανώνεις και να ενθυλακώνεις όλη τη λειτουργικότητα που σχετίζεται με το Agent σε μια μονάδα για τον τομέα που μοντελοποιείς.
Ο σύλλογος της κοινότητάς σου σου ζήτησε να υλοποιήσεις μια απλή εφαρμογή μητρώου για τη διαχείριση των εγγραφών στον κοινοτικό κήπο. Η δομή Plot σου έχει ήδη δοθεί.
Υλοποίησε τη συνάρτηση CommunityGarden.start/1. Θα πρέπει να δέχεται μια προαιρετική λίστα λέξεων-κλειδιών με επιλογές που θα προωθούνται στη διεργασία agent. Η αρχική κατάσταση του κήπου θα πρέπει να αρχικοποιείται ώστε να αναπαριστά μια κενή συλλογή παρτεριών. Θα πρέπει να επιστρέφει μια πλειάδα :ok με το pid του κήπου.
{:ok, pid} = CommunityGarden.start()
# => {:ok, #PID<0.112.0>}
Υλοποίησε τη συνάρτηση CommunityGarden.list_registrations/1. Θα πρέπει να δέχεται το pid του κοινοτικού κήπου. Θα πρέπει να επιστρέφει μια λίστα με τα αποθηκευμένα παρτέρια που είναι καταχωρισμένα.
CommunityGarden.list_registrations(pid)
# => []
Σε αυτό το σημείο, δεν έχουμε προσθέσει τη δυνατότητα καταχώρισης παρτεριού, οπότε αυτή η λίστα θα πρέπει να είναι κενή
Υλοποίησε τη συνάρτηση CommunityGarden.register/2. Θα πρέπει να δέχεται το pid του κοινοτικού κήπου και ένα όνομα για να καταχωρίσει το παρτέρι. Όταν πετυχαίνει, θα πρέπει να επιστρέφει τη δομή Plot με το id του παρτεριού και το άτομο στο οποίο έχει καταχωριστεί.
Τα id θα πρέπει να είναι αύξοντα και μοναδικά. Μπορείς να κρατάς έναν μετρητή id στην κατάσταση του agent.
CommunityGarden.register(pid, "Emma Balan")
# => %Plot{plot_id: 1, registered_to: "Emma Balan"}
CommunityGarden.list_registrations(pid)
# => [%Plot{plot_id: 1, registered_to: "Emma Balan"}]
Υλοποίησε τη συνάρτηση CommunityGarden.release/2. Θα πρέπει να δέχεται το pid και το id του παρτεριού που θα απελευθερωθεί. Θα πρέπει να επιστρέφει :ok όταν πετυχαίνει. Όταν ένα παρτέρι απελευθερώνεται, το id δεν επαναχρησιμοποιείται, χρησιμοποιείται μόνο ως μοναδικό αναγνωριστικό.
CommunityGarden.release(pid, 1)
# => :ok
CommunityGarden.list_registrations(pid)
# => []
Υλοποίησε τη συνάρτηση CommunityGarden.get_registration/2. Θα πρέπει να δέχεται το pid και το id του παρτεριού που θα ελεγχθεί. Θα πρέπει να επιστρέφει το παρτέρι αν είναι καταχωρισμένο, και :not_found αν δεν είναι καταχωρισμένο.
CommunityGarden.get_registration(pid, 1)
# => %Plot{plot_id: 1, registered_to: "Emma Balan"}
CommunityGarden.get_registration(pid, 7)
# => {:not_found, "plot is unregistered"}
Γράψου στο Exercism για να μάθεις και να κατακτήσεις Elixir με 58 έννοιες168 ασκήσεις και πραγματική καθοδήγηση από ανθρώπους, όλα δωρεάν.