LoginSignup
7
2

More than 1 year has passed since last update.

簡単Elixirシリーズ ~ Agentについて知ろう ~

Posted at

簡単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を利用すると、状態を保持して扱えるので便利ですね。

7
2
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
7
2