2016年12月2日金曜日

Elixirでプロセスに状態を保持できる「Agent」

Elixirでプロセスに状態を保持できる「Agent」です。軽量プロセスとは、こういうことなのかなと思いました。最近、苦痛の日々を過ごしていましたが、ようやく、Elixirプログラミングの光が見えてきたような?(笑)

$iex -S mix

iex(1)> {:ok, agent} = Agent.start_link fn -> [] end
{:ok, #PID<0 .123.0="">}

iex(2)> Agent.update(agent, fn list -> ["eggs" | list] end)
:ok

iex(3)> Agent.update(agent, fn list -> ["hams" | list] end)
:ok

iex(4)> Agent.update(agent, fn list -> ["potatoes" | list] end)
:ok

iex(5)> Agent.get(agent, fn list -> list end)
["potatoes", "hams", "eggs"]

iex(6)> Agent.stop(agent)
:ok

iex(7)> Agent.get(agent, fn list -> list end)
** (EXIT) no process

  1. 空のリスト(list)の初期状態のAgentを開始。
  2. Agentの状態を更新し、新しい項目をリスト(list)の先頭に追加。
  3. Agent.update/3の第2引数は、エージェントの現在の状態を入力として受け取り、その新しい状態を返す関数。
  4. Agent.get/3の第2引数は、状態を入力として受け取り、Agent.get/3自身が返す値を返す関数。
  5. Agentプロセスを終了するためにはAgent.stop/3を呼び出す。

$iex -S mix

iex(1)> {:ok, bucket} = KV.Bucket.start_link
{:ok, #PID<0 .123.0="">}

iex(2)> KV.Bucket.get(bucket, "milk") == nil
true

iex(3)> KV.Bucket.put(bucket, "milk", 3)
:ok

iex(4)> KV.Bucket.get(bucket, "milk")
3

iex(5)> KV.Bucket.put(bucket, "milk", 333)
:ok

iex(6)> KV.Bucket.get(bucket, "milk")
333

iex(7)> KV.Bucket.put(bucket, "milk", 0)
:ok

iex(8)> KV.Bucket.get(bucket, "milk")
0

iex(9)> KV.Bucket.put(bucket, "milk", nil)
:ok

iex(10)> KV.Bucket.get(bucket, "milk")
nil

参考サイト
プロセス(Elixir)
Agent(Elixir)

0 件のコメント:

コメントを投稿