2017-10-24 7 views
0

最初に複数の状態を必要とするGenServerを作成したいとします。特に、init関数は、初期状態のいくつかの部分を知る必要があるタイマーを起動します。 GenServer.start_linkの2番目の引数がinit(arg)に直接渡されることを理解しています。2つ以上のものでGenServer状態を初期化する

しかし、initに初期化用に複数の状態引数を渡す方法を示す例は見つかりません。例えば、望ましい何かが次のようになります。

defmodule Application.Test do 
    require GenServer 

    def start_link(state1, state2) do 
    GenServer.start_link(__MODULE__, [state1, state2], []) 
    end 

    def init(state) do 
    # Use the state to launch timer 
    end 
end 

私は「 はトンの例を見つけることができる、と私は万能薬には本当に新しいですので、このdoesntのは私には慣用的なようです。これを行うためのより良い/より効率的な方法がありますか、これが最善の方法ですか?

答えて

3

ただ、このようなTupleまたはStructにあなたの状態をラップ:

start_link(state1, state2) do 
    Genserver.start_link(__MODULE__, {state1, state2}, []) 
end 

# use pattern matching to extract the states 
def init({state1, state2}) do 
    # use state1 and state2 
end 
+1

を私はマップを使用することを好む - あなたが構造も、それを編集したい場合は、新しいを追加することはできませんので、タプルは、最良の選択ではありませんキー。 – PatNowak

+1

状況に最も適したものを使用することができます。ここではタプルを使用しました。この例では、ラップする変数は2つしかないからです。 – Pfitz

関連する問題