生产药剂没有找到现有的原子

时间:2015-09-17 19:34:15

标签: erlang elixir ecto

我正在使用一个库,使用已有的密钥(Poison)将输入解析为地图。无论出于何种原因,在生产中,它认为密钥不存在,我无法弄清楚原因。我确实有一些信息,我希望不是新手的人愿意帮我弄清楚发生了什么:

1:

如果我进行IEX会话(iex -S mix),我可以运行:erlang.binary_to_existing_atom(“first_name”,:“utf8”)没有问题。但是在制作中,我得到了

** (ArgumentError) argument error
  :erlang.binary_to_existing_atom("first_name", :utf8)

2:

我可以在:first_name生产之前立即运行:erlang.binary_to_existing_atom,它可以正常工作,因为到那时,原子已经被创建了。 但是,我无法运行:first_name后跟库的方法:Poison.Parser.parse!(~s(#{body}), keys: :atoms!),因为它会抛出错误,我发现这很奇怪。

3:

我正在使用Heroku,不确定这是否重要。原子在Ecto模型中定义,也不确定是否重要。任何帮助将不胜感激 - 提前感谢!

2 个答案:

答案 0 :(得分:2)

您会注意到Erlang文档说:

  

binary_to_existing_atom(Binary,Encoding) - >原子()

     

类型:

     

二进制=二进制()编码= latin1 | unicode | utf8就像   binary_to_atom / 2,但原子必须已存在。

     

失败:如果原子不存在则为badarg。

如果我是你,我会在调用运行之前弄清楚为什么:first_name原子不存在。

答案 1 :(得分:2)

Erlang编译器优化已知的纯函数调用,并用调用结果替换它们。这省略了模块中的原始原子,从而使其不存在。这里的错误是https://bugs.erlang.org/browse/ERL-453,我可能会修复它。