我是Erlang的新手,我一直在阅读一些声称原子不是垃圾收集的文档。这一切都很好,但随后又提出了一个更大的问题:将它们用作"元组标签"是一个好主意。用于模式匹配?如果我有一个使用相对较多的Erlang应用程序,以及这样的函数:
-module(geometry).
-export([area/1]).
area({rectangle, Width, Ht}) -> Width * Ht;
area({square, X}) -> X * X;
area({circle, R}) -> 3.14159 * R * R.
这会让我的VM崩溃吗?如果area
函数运行了300万次,那么因为矩形,正方形和圆形是原子,我的Erlang VM不会崩溃吗?
答案 0 :(得分:5)
只要您不动态创建原子,这不是问题,因为编译器/ VM将在内部使用相同的原子对象来表示原子rectangle
的所有用途 - 使用中只有一个rectangle
,circle
等原子。
此规则的例外情况是使用list_to_atom/1
函数动态创建原子以从列表/字符串创建原子。这通常被认为是一个非常糟糕的主意。