簡単Elixirシリーズ
Agentについて知ろう
東京にいるけどfukuokaexのYOSUKEです。
最近、エリクサーちゃんで学ぶ Elixirの動画を作成し始めてるので良かったらチャンネル登録お願いします。本格的に始動するのは年明けからの予定です。
簡単 Elixirシリーズでは小ネタをサクッと書いていこう。というコンセプトで作っていきます。
さて、Agentを理解する上で先にプロセスについて知って欲しいので、プロセスについてまだ知らない方は是非以下コラムを先に読んでください。
さて、準備ができたところで本題に入りたいと思います。
Agentを知ろう!
Agentとは、プロセスに状態を保存するためのシンプルなラッパーのようなもので、簡単Elixirシリーズ ~ プロセスを知ろう③ ~ では、プロセスに状態を持たせたままに永続的に状態を追加していく例を書きました。
このような、状態を保持する仕組みをAgentを利用して作成する所からAgentを理解していきたいと思います。
まずは、プロセスを生成すると同じようにAgentを利用して状態を保持できるプロセスを生成します。
そして、Agentに用意された update関数とget関数で状態を更新し、その状態を確認する事ができます。
# Agentを利用したプロセス生成
iex()> {:ok, pid} = Agent.start_link(fn -> 42 end)
# Agentを利用した値の更新
iex()> Agent.update(pid, fn state -> state + 1 end)
:ok
# Agentを利用した値を取得する方法
iex()> Agent.get(pid, fn state -> state end)
43
Agentの仕組みがわかったので、上記のカウントを保持するコードをリファクタリングしてみます。
defmodule Count do
use Agent
def start_link(initial_value) do
Agent.start_link(fn -> initial_value end, name: __MODULE__)
end
def value do
Agent.get(__MODULE__, & &1)
end
def increment do
Agent.update(__MODULE__, &(&1 + 1))
end
end
これを使って、カウントを更新していきましょう。
iex()> Count.start_link(2)
{:ok, #PID<0.187.0>}
iex()> Count.value
2
iex()> Count.increment
:ok
iex()> Count.value
3
iex()> Count.increment
:ok
iex()> Count.increment
:ok
iex()> Count.value
5
こんな感じで、Agentを利用すると、状態を保持して扱えるので便利ですね。