Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/database/9.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Erlang原子的简单解释_Erlang - Fatal编程技术网

Erlang原子的简单解释

Erlang原子的简单解释,erlang,Erlang,我正在学习Erlang,一直在努力理解原子的概念。我了解Python:用简单的术语或类似的Python,对这些“原子”有什么好的解释。到目前为止,我的理解是,类型类似于字符串,但没有字符串操作?原子是一个文字常量。没有值,但可以用作值。例如:真、假、未定义。如果要将其用作字符串,则需要将atom_应用于_列表(atom),以获得要使用的字符串(列表)。模块名称也是原子。 看看另外,为了便于描述,它们通常用于标记元组。例如: {年龄,42} 而不仅仅是 42说: 原子是一个文字,一个带名称的常量

我正在学习Erlang,一直在努力理解原子的概念。我了解Python:用简单的术语或类似的Python,对这些“原子”有什么好的解释。到目前为止,我的理解是,类型类似于字符串,但没有字符串操作?

原子是一个文字常量。没有值,但可以用作值。例如:真、假、未定义。如果要将其用作字符串,则需要将atom_应用于_列表(atom),以获得要使用的字符串(列表)。模块名称也是原子。
看看

另外,为了便于描述,它们通常用于标记元组。例如:

{年龄,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,当您输入一个原子时,它会计算它并打印结果,原子本身就是它的值。数字和其他原子数据类型也是如此,它们自己进行评估。感谢您的澄清!