2016-05-02 14 views
1

私はElixirの初心者です。私はGenServerの使い方を理解しようとしています。私にとって魔法とは何ですか:GenServerのコールバック関数

defmodule Stack do 
    use GenServer 

    # Callbacks 

    def handle_call(:pop, _from, [h|t]) do 
    {:reply, h, t} 
    end 

    def handle_cast({:push, item}, state) do 
    {:noreply, [item|state]} 
    end 
end 

コードはGenServerのドキュメントから抜粋したものです。 call関数は、コールバック関数が{:reply, h, t}を返したときに1つの値を返すのはなぜですか?

#Start the server 
{:ok, pid} = GenServer.start_link(Stack, [:hello]) 

# This is the client 
GenServer.call(pid, :pop) 
#=> :hello #<<<<Why? 

{:reply, h, t}は戻り値ではありませんか?

答えて

3

{:reply, h, t}は戻り値ではありませんか?

{:reply, h, t}の戻り値はhandle_callですが、その関数は呼び出されていません。 handle_callを内部的に呼び出すGenServer.callを呼び出し、メッセージ、呼び出し元、および現在の状態を渡します。handle_callが3タプル{:reply, a, b}を返す場合は、2番目のパラメータ、この場合はaを呼び出し側に返し、変更しますその状態はbになります。