Das Modul Agent bietet eine Abstraktion zum Erzeugen von Prozessen und der Receive-Send-Schleife. Von hier an nennen wir Prozesse, die mit dem Modul Agent gestartet wurden, „Agent-Prozesse“. Ein Agent-Prozess kann gewählt werden, um einen zentralen gemeinsamen Zustand darzustellen.
Zum Starten eines Agent-Prozesses bietet Agent die Funktion start/2. Die übergebene Funktion gibt beim Aufruf von start den Anfangszustand des Agent-Prozesses zurück:
# Start an agent process with an initial value of an empty list
{:ok, agent_pid} = Agent.start(fn -> [] end)
So wie Map oder List bietet Agent viele Funktionen für die Arbeit mit Agent-Prozessen.
Es ist üblich, die gesamte Agent-bezogene Funktionalität in einem Modul für die zu modellierende Domäne zu organisieren und zu kapseln.
Dein Nachbarschaftsverein hat dich gebeten, eine einfache Registrierungsanwendung zu implementieren, mit der du die Anmeldungen für den Gemeinschaftsgarten verwalten kannst. Das Plot-Struct wurde dir bereits zur Verfügung gestellt.
Implementiere die Funktion CommunityGarden.start/1. Sie sollte eine optionale Keyword-Liste mit Optionen entgegennehmen, die an den Agent-Prozess weitergegeben werden. Der Anfangszustand des Gartens sollte als leere Sammlung von Beeten initialisiert werden. Sie sollte ein :ok-Tupel mit der pid des Gartens zurückgeben.
{:ok, pid} = CommunityGarden.start()
# => {:ok, #PID<0.112.0>}
Implementiere die Funktion CommunityGarden.list_registrations/1. Sie sollte die pid des Gemeinschaftsgartens entgegennehmen. Sie sollte eine Liste der gespeicherten Beete zurückgeben, die registriert sind.
CommunityGarden.list_registrations(pid)
# => []
An diesem Punkt haben wir noch nicht die Möglichkeit hinzugefügt, ein Beet zu registrieren, also sollte diese Liste leer sein
Implementiere die Funktion CommunityGarden.register/2. Sie sollte die pid des Gemeinschaftsgartens und einen Namen entgegennehmen, um das Beet zu registrieren. Bei Erfolg sollte sie das Plot-Struct mit der id des Beets und der registrierten Person zurückgeben.
Die ids sollten fortlaufend und eindeutig sein. Du kannst einen id-Zähler im Zustand des Agenten führen.
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"}]
Implementiere die Funktion CommunityGarden.release/2. Sie sollte die pid und die id des freizugebenden Beets entgegennehmen. Bei Erfolg sollte sie :ok zurückgeben. Wenn ein Beet freigegeben wird, wird die id nicht wiederverwendet, sie dient nur als eindeutiger Bezeichner.
CommunityGarden.release(pid, 1)
# => :ok
CommunityGarden.list_registrations(pid)
# => []
Implementiere die Funktion CommunityGarden.get_registration/2. Sie sollte die pid und die id des zu prüfenden Beets entgegennehmen. Wenn das Beet registriert ist, sollte sie es zurückgeben, und :not_found, wenn es nicht registriert ist.
CommunityGarden.get_registration(pid, 1)
# => %Plot{plot_id: 1, registered_to: "Emma Balan"}
CommunityGarden.get_registration(pid, 7)
# => {:not_found, "plot is unregistered"}
Melde dich bei Exercism an, um Elixir mit 58 Konzepte168 Übungen und echtem menschlichen Mentoring zu lernen und zu meistern, alles kostenlos.