我正在学习二郎并试图理解原子的概念。我知道python,对这些"原子"有什么好的解释。简单来说,或类似于python。到目前为止,我的理解是它就像一个字符串,但没有字符串操作?
答案 0 :(得分:3)
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.
您的服务器接收消息,这是两个元素元组,并使用atoms来区分不同类型的请求:request_type_1
,request_type_2
和stop
。它被称为模式匹配。
服务器还使用atoms作为返回值。 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中键入this:
io:format("asdf").
Variable = io.
Variable:format("asdf").
你不应该将原子用作字符串,因为它们不是垃圾收集的。如果您开始动态创建它们,则可能会耗尽内存。只有在有固定数量的选项时,才能使用它们手动输入代码。当然,您可以根据需要多次使用相同的原子,因为它总是指向内存中的相同点(原子表)。
它们比C枚举更好,因为该值在运行时已知。因此,在调试C代码时,您会在调试器中看到1
而不是Tuesday
。使用原子并没有这个缺点,你会在代码和Erlang shell中看到tuesday
。
答案 1 :(得分:1)
Atom是一个字面常量。没有价值但可以用作价值。例如:true,false,undefined。如果要将其用作字符串,则需要应用atom_to_list(atom)来获取要使用的字符串(列表)。模块名称也是原子。 看看http://www.erlang.org/doc/reference_manual/data_types.html
答案 2 :(得分:1)
此外,为了描述性,它们经常用于标记元组。例如:
{age,42}
而不仅仅是
42