为什么使用模块常量:
defmodule A do
@tab :binary.compile_pattern("\t")
def run do
:binary.match("hello\tworld", @tab)
end
end
给出错误:
** (ArgumentError) argument error
(stdlib) :binary.match("hello\tworld", {:bm, ""})
iex:4: A.run/0
但将@tab
移到run/0
内的常规变量有效吗?
答案 0 :(得分:2)
编译的二进制模式是运行时值。因此,它们无法通过编译时(在模块属性中指定)和运行时屏障。这意味着它们不能存储在模块属性中。
特别是,二进制模式是作为NIF资源实现的 - 它们在Erlang中表示为空二进制文件,但下面通常是本机代码使用的一些原始数据。从编译时传递到运行时只剩下空二进制文件 - 所有其他数据(这里需要的)都会丢失。