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

luz*_*zny 5 elixir pattern-matching

如何匹配和使用什么语法检查byte_size相等的12长度模式handle_info()?我可以同时使用这两种模式吗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
Run Code Online (Sandbox Code Playgroud)

Pat*_*ity 5

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

您可以使用不同的二进制模式来匹配12个字节,具体取决于您需要的输出:

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

iex> <<data::size(96)>> = "abcdefghijkl"
"abcdefghijkl"
iex> data
30138990049255557934854335340
Run Code Online (Sandbox Code Playgroud)

这些模式当然可以在你的函数子句中使用:

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
Run Code Online (Sandbox Code Playgroud)

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

您还可以使用保护条款byte_size:

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