将二进制模式匹配存储在变量中

时间:2017-02-13 23:49:45

标签: elixir

我有一个与某个二进制值匹配的函数:

  def parse(<<timestamp::binary-size(4)>>) do
    IO.inspect timestamp
  end

不幸的是,我的真实&#34;模式&#34;比这更长。是否可以存储该模式并在以后匹配?

@pattern <<timestamp::binary-size(4)>>
def parse(@pattern) do
  IO.inspect timestamp
end

显然,这并没有像我写的那样奏效。而且,无论我使用quoteunquote做什么,我似乎都无法使其发挥作用。

1 个答案:

答案 0 :(得分:2)

您无法将模式存储在变量中,但可以创建宏:

HASHBYTES

输出:

defmodule A do
  defmacro pattern do
    quote do
      <<var!(timestamp)::binary-size(4)>>
    end
  end

  def parse(pattern()) do
    IO.inspect timestamp
  end
end

A.parse("abcd")
A.parse("abcde")

请注意,我必须在模式中使用"abcd" ** (FunctionClauseError) no function clause matching in A.parse/1 a.exs:8: A.parse("abcde") (elixir) lib/code.ex:370: Code.require_file/2 。这是为了禁用Elixir的Macro Hygiene功能,以便您可以在调用者中访问具有相同名称的变量。您必须在模式中的每个变量名称周围添加var!(timestamp)

编辑:您可以在模块属性中存储引用的模式,然后在函数参数中取消引用它:

var!()

输出与上面的宏代码相同。