Elixir模块属性导致ArgumentError

时间:2017-02-27 09:31:40

标签: module elixir constants

为什么使用模块常量:

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内的常规变量有效吗?

1 个答案:

答案 0 :(得分:2)

编译的二进制模式是运行时值。因此,它们无法通过编译时(在模块属性中指定)和运行时屏障。这意味着它们不能存储在模块属性中。

特别是,二进制模式是作为NIF资源实现的 - 它们在Erlang中表示为空二进制文件,但下面通常是本机代码使用的一些原始数据。从编译时传递到运行时只剩下空二进制文件 - 所有其他数据(这里需要的)都会丢失。