Warning: file_get_contents(/data/phpspider/zhask/data//catemap/7/elixir/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Elixir 将外部字符串转换为原子_Elixir_Phoenix Framework_Erlang - Fatal编程技术网

Elixir 将外部字符串转换为原子

Elixir 将外部字符串转换为原子,elixir,phoenix-framework,erlang,Elixir,Phoenix Framework,Erlang,在p。25在“编程凤凰1.4(电子书,beta版)”中,Chris McCord的旁白写道: 在控制器中的世界动作中,外部参数 字符串键,“name”=>name,而在内部我们使用name:name。 这是整个凤凰城的一个惯例。无法使用外部数据 可以安全地转换为原子,因为原子表不是 垃圾收集。相反,我们显式匹配字符串键, 然后,我们的应用程序边界(如控制器和通道)将 将它们转换为原子键,我们将在其他任何地方依赖它 凤凰城里面 引述如下: 外部数据无法安全地转换为原子…因此您需要转换 字符串键到原

在p。25在“编程凤凰1.4(电子书,beta版)”中,Chris McCord的旁白写道:

在控制器中的世界动作中,外部参数 字符串键,“name”=>name,而在内部我们使用name:name。 这是整个凤凰城的一个惯例。无法使用外部数据 可以安全地转换为原子,因为原子表不是 垃圾收集。相反,我们显式匹配字符串键, 然后,我们的应用程序边界(如控制器和通道)将 将它们转换为原子键,我们将在其他任何地方依赖它 凤凰城里面

引述如下:

外部数据无法安全地转换为原子…因此您需要转换 字符串键到原子键

嗯?我认为他想说的是,如果有人向您发送一些带有1亿(字符串)键的json数据,而您盲目地将整个json转换为带有原子键的长生不老药映射,那么您将面临原子表溢出的危险。另一方面,如果您使用模式匹配从json数据中挑选出您感兴趣的键/值,然后将它们插入到带有atom键的elixir映射中,那么您显然会在atom表中创建更少的原子。

这是正确的。垃圾收集器安全地处理除原子之外的所有进程未使用的数据。这是因为一旦创建了原子,它们就会永久存储在Erlang Atom表中(有固定的限制)

从:

原子不是垃圾收集的。一旦原子被创造出来,它就永远不会被移除。如果达到原子数限制(默认为1048576),仿真器将终止

这意味着,如果您对外部数据(例如从套接字或web请求期间接收的输入)使用类似于
String.to_atom/1
的东西,恶意用户(甚至是普通用户)可能会在不知不觉中拒绝您的符号表,使您的应用程序崩溃。如果出于某种原因,您确实需要将外部字符串转换为原子,那么您应该使用确保原子确实是在手动创建之前创建的


其他资源:

  • 博文:
  • 二郎:
  • 邮寄名单:

另一方面,正是因为这个原因,我实际上创建了一个应用程序,我想在Phoenix web请求中安全地使用atoms进行用户输入