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)
是的,您可以使用这两种模式,这是具有多个函数子句的目的.从上到下,将执行第一个匹配的函数子句.
您可以使用不同的二进制模式来匹配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)
| 归档时间: |
|
| 查看次数: |
1077 次 |
| 最近记录: |