2015-10-26 18 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

是的,这是正确的地方。如果数据的大小是可变的,我就根本不会匹配长度。 –