【问题标题】:What is syntax for byte_size in pattern matching?模式匹配中 byte_size 的语法是什么?
【发布时间】:2015-10-27 04:50:26
【问题描述】:

如何匹配以及检查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

【问题讨论】:

    标签: pattern-matching elixir


    【解决方案1】:

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

    您可以使用不同的二进制模式来匹配 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 &lt;&lt;&gt;&gt; 来查找位串语法onlineiex 的文档。

    您还可以将保护子句与byte_size 一起使用:

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

    【讨论】:

    • 如何连接传入的字符串:elixir_serial 直到状态达到所需的 12 长度?目前不匹配,最后一个 handle_info() 中的数据包含不同长度的字符串。我试过>,但输出也是错误的。
    • 我将数据保存在我的代码 sn-p 中 Logger.debug 的位置,它是处理匹配数据的正确位置吗?
    • 是的,这是正确的地方。如果数据大小可变,我根本不会匹配长度。
    猜你喜欢
    • 1970-01-01
    • 2011-01-30
    • 2019-09-03
    • 2011-01-14
    • 2011-07-05
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多