Docs 这么说:
原子是一个字面量,一个有名字的常数。
有时您有几个选项可供您选择。例如,在 C 中,您有 enum:
enum Weekday { Monday, Tuesday, Wednesday, Thursday, Friday, Saturday, Sunday };
在 C 中,它实际上是一个整数,但您可以在代码中将它用作选项之一。 Erlang 中的原子在模式匹配中非常有用。让我们考虑一个非常简单的服务器:
loop() ->
receive
{request_type_1, Request} ->
handle_request_1(Request),
loop();
{request_type_2, Request} ->
handle_request_2(Request),
loop();
{stop, Reason} ->
{ok, Reason};
_ ->
{error, bad_request}
end.
您的服务器接收消息,它们是两个元素元组,并使用原子来区分不同类型的请求:request_type_1、request_type_2 和 stop。它被称为模式匹配。
服务器也使用原子作为返回值。 ok atom 表示一切正常。 _ 匹配所有内容,所以如果那个简单的服务器收到意外的东西,它会以元组{error, Reason} 退出,原因也是原子bad_request。
布尔值true 和false 也是原子。您可以使用这样的函数子句构建逻辑函数:
and(true, true) ->
true;
and(_, _) ->
false.
or(false, false) ->
false;
or(_, _) ->
true.
(有点过于简单了,因为你可以这样称呼它:or(atom1, atom2),它会返回true,但这只是为了说明。)
Erlang 中的模块名称也是原子,因此您可以将模块名称绑定到变量并调用它,例如在 Erlang shell 中键入:
io:format("asdf").
Variable = io.
Variable:format("asdf").
您不应该将原子用作字符串,因为它们不是垃圾收集器。如果您开始动态创建它们,您可能会耗尽内存。只有在选项数量固定的情况下,才应使用您手动输入代码的选项。当然,您可以根据需要多次使用同一个原子,因为它总是指向内存中的同一个点(原子表)。
它们比 C 枚举更好,因为值在运行时是已知的。因此,在调试 C 代码时,您会在调试器中看到 1 而不是 Tuesday。使用原子没有这个缺点,你会在你的代码和 Erlang shell 中看到tuesday。