2015-10-26 17 views
5

如何匹配和檢查什麼語法byte_size等於12的長度模式handle_info()?我可以在handle_info()中使用這兩種模式,例如。首先會檢查新行的字符串,其次是byte_size模式匹配中byte_size的語法是什麼?

實施例的代碼,而不byte_size圖案:

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

def handle_info({:elixir_serial, serial, "\n"}, state) do 
    {:noreply, Enum.reverse(state)} 
end 

def handle_info({:elixir_serial, serial, data}, state) do 
    Logger.debug "data: #{data}" 
    {:noreply, [data | state]} 
end 

回答

4

是的,可以使用這兩種模式,這是具有多個功能的條款的目的。從上到下,第一個匹配函數子句將被執行。

您可以使用不同的二進制模式來匹配12個字節,這取決於輸出需要:

iex> <<data::bytes-size(12)>> = "abcdefghijkl" 
"abcdefghijkl" 
iex> data 
"abcdefghijkl" 

iex> <<data::size(96)>> = "abcdefghijkl" 
"abcdefghijkl" 
iex> data 
30138990049255557934854335340 

這些模式當然可以在你的函數子句中使用:

def handle_info({:elixir_serial, serial, <<data::bytes-size(12)>>}, state) do 
    # ... 
end 

def handle_info({:elixir_serial, serial, <<data::size(96)>>}, state) do 
    # ... 
end 

更多有關可用類型和修飾符的信息,可以通過鍵入h <<>>來查找bitstring語法的文檔onlineiex

您也可以與byte_size一起使用保護條款:

def handle_info({:elixir_serial, serial, data}, state) when byte_size(data) == 12 do 
    # ... 
end 
+0

我如何Concat的傳入字符串來自:elixir_serial直到狀態達到所需的12長?目前它不匹配,最後一個handle_info()中的數據包含不同長度的字符串。我已經嘗試了<< state :: bytes-size(12)>>,但輸出也是錯誤的。 – luzny

+0

我正在將數據保存在我的代碼片段中的Logger.debug的位置,它是處理匹配數據的正確位置嗎? – luzny

+0

是的,這是正確的地方。如果數據的大小是可變的,我就根本不會匹配長度。 –