模式匹配中byte_size的语法是什么?

时间:2015-10-26 17:50:42

标签: pattern-matching elixir

如何匹配以及在byte_size中检查handle_info()等于12长度模式的语法是什么?我可以在handle_info()中使用这两种模式,例如。首先是检查新行的字符串,第二个是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

1 个答案:

答案 0 :(得分:5)

是的,您可以使用这两种模式,这是具有多个函数子句的目的。从上到下,将执行第一个匹配的函数子句。

您可以使用不同的二进制模式匹配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

有关可用类型和修饰符的更多信息,您可以通过键入iex来查找bitstring语法onlineh <<>>中的文档。

你也可以使用一个保护条款和byte_size

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