我有一个与某个二进制值匹配的函数:
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
显然,这并没有像我写的那样奏效。而且,无论我使用quote
和unquote
做什么,我似乎都无法使其发挥作用。
答案 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!()
输出与上面的宏代码相同。