2

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

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 模型中定义的,也不确定这是否重要。任何帮助将不胜感激 - 在此先感谢!

4

2 回答 2

2

你会注意到 Erlang 文档说:

binary_to_existing_atom(二进制,编码)-> atom()

类型:

二进制 = binary() 编码 = latin1 | 统一码 | utf8 像 binary_to_atom/2 一样工作,但原子必须已经存在。

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

如果我是你,我会尝试找出为什么:first_name在调用运行之前原子不存在。

于 2015-09-17T20:09:40.987 回答
2

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

于 2017-07-27T15:45:15.843 回答