【发布时间】:2017-10-06 01:59:47
【问题描述】:
有没有办法在 Elixir 中动态声明原子?
像str = "aaa" 一样,我们想要创建一个名为:aaa 的原子。
【问题讨论】:
-
String.to_atom? -
如果您认为需要动态创建原子,请放心,您不需要。
有没有办法在 Elixir 中动态声明原子?
像str = "aaa" 一样,我们想要创建一个名为:aaa 的原子。
【问题讨论】:
String.to_atom?
是的,你可以。
但是,您需要小心,因为原子不会被垃圾收集,并且您可以拥有的原子数量是有限制的(默认限制为 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) 使进程崩溃。谢谢。