2017-02-27 60 views
0

爲什麼使用一個模塊常量:藥劑模塊財產造成引發ArgumentError

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作品?

回答

2

編譯的二進制模式是運行時的值。因此,它們無法通過編譯時(如模塊屬性中指定的)和運行時障礙。這意味着它們不能存儲在模塊屬性中。

特別是,二進制模式實現爲NIF資源 - 它們在Erlang中表示爲空二進制文件,但下面通常是本機代碼使用的一些原始數據。當從編譯時傳遞到運行時時,只剩下空的二進制文件 - 所有其他數據(這裏需要的)都會丟失。