对erlang原子的简单解释

时间:2014-12-27 13:21:31

标签: erlang

我正在学习二郎并试图理解原子的概念。我知道python,对这些"原子"有什么好的解释。简单来说,或类似于python。到目前为止,我的理解是它就像一个字符串,但没有字符串操作?

3 个答案:

答案 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_1request_type_2stop。它被称为模式匹配。

服务器还使用atoms作为返回值。 ok atom表示一切正常。 _匹配所有内容,因此,如果该简单服务器收到意外的内容,它会退出元组{error, Reason},其中原因也是原子bad_request

布尔值truefalse也是原子。您可以使用如下函数子句构建逻辑函数:

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