Erlang原子的简单解释
我正在学习Erlang,一直在努力理解原子的概念。我了解Python:用简单的术语或类似的Python,对这些“原子”有什么好的解释。到目前为止,我的理解是,类型类似于字符串,但没有字符串操作?原子是一个文字常量。没有值,但可以用作值。例如:真、假、未定义。如果要将其用作字符串,则需要将atom_应用于_列表(atom),以获得要使用的字符串(列表)。模块名称也是原子。Erlang原子的简单解释,erlang,Erlang,我正在学习Erlang,一直在努力理解原子的概念。我了解Python:用简单的术语或类似的Python,对这些“原子”有什么好的解释。到目前为止,我的理解是,类型类似于字符串,但没有字符串操作?原子是一个文字常量。没有值,但可以用作值。例如:真、假、未定义。如果要将其用作字符串,则需要将atom_应用于_列表(atom),以获得要使用的字符串(列表)。模块名称也是原子。 看看另外,为了便于描述,它们通常用于标记元组。例如: {年龄,42} 而不仅仅是 42说: 原子是一个文字,一个带名称的常量
看看另外,为了便于描述,它们通常用于标记元组。例如: {年龄,42} 而不仅仅是 42说: 原子是一个文字,一个带名称的常量 有时你有两个选择,你想从中选择。例如,在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\u type\u 1
、request\u type\u 2
和stop
。这叫做模式匹配
服务器还使用原子作为返回值<代码>正常atom意味着一切正常<代码>\匹配所有内容,因此,万一简单服务器收到意外的消息,它会使用tuple{error,Reason}
退出,原因也是atom错误的请求
布尔值true
和false
也是原子。您可以使用如下函数子句构建逻辑函数:
and(true, true) ->
true;
and(_, _) ->
false.
or(false, false) ->
false;
or(_, _) ->
true.
(它有点过于简单,因为您可以这样调用它:或(atom1,atom2)
,它将返回true
,但它仅用于说明。)
Erlang中的模块名也是原子,因此您可以将模块名绑定到变量并调用它,例如,在Erlang shell中键入:
io:format("asdf").
Variable = io.
Variable:format("asdf").
您不应该将原子用作字符串,因为它们不是垃圾收集的。如果开始动态创建它们,可能会耗尽内存。只有当有固定数量的选项时,才应该使用它们,您可以手动键入代码。当然,可以根据需要多次使用同一个原子,因为它总是指向内存中的同一点(原子表)
它们比C枚举更好,因为该值在运行时是已知的。因此,在调试C代码时,您将在调试器中看到1
,而不是tuday
。使用atoms并没有那个缺点,您将在您的代码和Erlang shell中都看到tuesday
。Python没有类似之处。@rightføld我明白了。我现在修改了我的问题。它更像是整数,但没有算术。1
的值是1
:你看到的就是你得到的。严格来说,原子本身确实有一个值。所以foo的值是foo,bar是bar,等等。erlangshell是一个REPL,当您输入一个原子时,它会计算它并打印结果,原子本身就是它的值。数字和其他原子数据类型也是如此,它们自己进行评估。感谢您的澄清!