我正在使用一个库,使用已有的密钥(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模型中定义,也不确定是否重要。任何帮助将不胜感激 - 提前感谢!
答案 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,我可能会修复它。