【问题标题】:Is there a way to generate atoms dynamically in Elixir?有没有办法在 Elixir 中动态生成原子?
【发布时间】:2017-10-06 01:59:47
【问题描述】:

有没有办法在 Elixir 中动态声明原子?

str = "aaa" 一样,我们想要创建一个名为:aaa 的原子。

【问题讨论】:

  • String.to_atom?
  • 如果您认为需要动态创建原子,请放心,您不需要。

标签: erlang elixir


【解决方案1】:

是的,你可以。

但是,您需要小心,因为原子不会被垃圾收集,并且您可以拥有的原子数量是有限制的(默认限制为 1,048,576)。可能看起来很多,但如果你的应用运行了很长时间并且动态生成原子,你最终会达到极限。

一般认为动态生成它们是个坏主意。

但是,回答您的问题。是的。

示例:

iex(1)> str = "aaa"
"aaa"

iex(2)> String.to_atom(str)
:aaa

iex(3)> :foo
:foo

iex(4)> String.to_existing_atom("foo")
:foo

iex(5)> String.to_existing_atom("bar")
** (ArgumentError) argument error
    :erlang.binary_to_existing_atom("bar", :utf8)

【讨论】:

  • 因此您可以使用for x <- 1..1050000, do: String.to_atom Integer.to_string(x) 使进程崩溃。谢谢。
  • @Shih-MinLee 不仅处理整个虚拟机。这就是为什么在 Phoenix 中参数是字符串而不是原子的原因,因为它会使您的应用容易受到 DoS 攻击。
  • 知道了。谢谢,这是有道理的!
猜你喜欢
  • 2019-03-08
  • 2011-10-01
  • 1970-01-01
  • 2020-11-03
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多