2015-11-12 29 views
2

Elixir's intro to GenServer,客戶端API開始與:ok參數Elixir的GenServer示例中的ok init參數有什麼意義?

def start_link(opts \\ []) do 
    GenServer.start_link(__MODULE__, :ok, opts) 
end 

,並且服務器的init功能服務器需要它的參數是:ok

def init(:ok) do 
    {:ok, HashDict.new} 
end 

什麼是傳球和驗證:ok點?如果我們忽略這一點,它會有什麼不同嗎,而不是寫下類似的東西

def start_link(opts \\ []) do 
    GenServer.start_link(__MODULE__, nil, opts) 
end 

def init(_) do 
    {:ok, HashDict.new} 
end 

+0

我不認爲它很重要的測試,如果你使用仍然可以通過':ok'或'nil'。通過':ok'並使用'init(:ok)'可能只是通過模式匹配進行的附加檢查 – AbM

回答

3

其中重要的是要記住,傳遞給start_link的第二個參數將成爲init函數的參數。因爲這是一個簡單的例子,所以他們使用瞭如下的原子:ok並且可以用nil替換。你需要通過第二個參數,無論如何。

因此,回答你的問題,在這個例子中:ok可以被nil取代。我覺得他們用:ok,因爲必須有一個參數和:ok看起來像一個不錯的選擇(只是一個偏好)

在你必須利用這些信息來獲取一些重要數據或模式匹配

其他情況
defmodule ServerDrop do 
    use GenServer 

defmodule State do 
    defstruct count: 0 
end 

def start_link do 
    GenServer.start_link(__MODULE__,:ok,[{:name,__MODULE__}]) 
    #GenServer.start_link(__MODULE__,[],[{:name,__MODULE__}]) 
end 

def init(:ok) do 
    {:ok,%State{count: 10}} 
end 

def init([]) do 
    {:ok,%State{}} 
end 

#Code left out for brevity 

在其他情況下,您許多需要得到一些數據

def init(stash_pid) do 
    current_number = Stash.get_value stash_pid 
    {:ok,{current_number,stash_pid}} 
end 
相關問題