2017-05-25 37 views
0

我有一個elixir Genserver模塊,它被初始化爲defstruct但是我不知道如何從它自己的私有模塊中嚴格訪問數據。Elixir Genserver訪問它自己的結構數據

這是它獲取與初始化結構:

defstruct info: "test_data" 
    ... 

下面的代碼的一部分。如果一個不同的流程想從中獲取信息,它需要知道它是否爲pid。並且狀態自動傳入。

def get_info(pid), do: GenServer.call(pid, :get_info) 
    ... 
    def handle_call(:get_info, _from, state), do: {:reply, state.info, state} 

但是,模塊本身如何訪問它初始化的結構呢?

def do_test(pid), do: GenServer.info(pid, :print_your_own_data_test) 
    ... 
    def handle_info(:print_your_own_data_test, state) do 
    print_your_own_data_test() 
    {:noreply, state} 
    end 
    ... 
    defp print_your_own_data_test() do  #do I have to pass state here? from handle_info? 
    IO.put self.info  # what goes here? 
    end 
+1

是的,您需要手動傳遞狀態。你有沒有嘗試過,並遇到任何錯誤? – Dogbert

+0

不,我做了一些愚蠢的事情,直到我提出這個問題:我在做IO.puts get_info(pid),所以它試圖從句柄信息調用句柄調用,可笑,但我會試試看看是否它會給出錯誤。 –

回答

1

但是模塊本身如何可以訪問它初始化所用的結構?

函數不能直接訪問自身的狀態;你需要傳遞handle_*職能收取的,需要手動狀態的功能狀態:

def handle_info(:print_your_own_data_test, state) do 
    print_your_own_data_test(state) 
    {:noreply, state} 
end 

defp print_your_own_data_test(state) do 
    IO.inspect state 
end 

有一個:sys.get_state/{1,2}功能,可以返回GenServer過程的狀態,但你不能調用它從進程內部,因爲它是一個同步的GenServer調用,如果進程自己調用它,會造成死鎖。 (該功能還有一個說明,它應該只用於調試。)