【问题标题】:Simple explanation of Erlang atomErlang atom的简单解释
【发布时间】:2015-02-24 09:16:48
【问题描述】:

我正在学习 Erlang,一直试图理解原子的概念。我知道 Python:用简单的术语或类似地用 Python 来解释这些“原子”的好方法是什么。到目前为止,我的理解是类型就像一个字符串但没有字符串操作?

【问题讨论】:

  • Python 没有类似的东西。
  • @rightføld 我明白了。我现在修改了我的问题。
  • 它更像整数,但没有算术。 1 的值为 1 :所见即所得。

标签: erlang


【解决方案1】:

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

服务器也使用原子作为返回值。 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 中键入:

io:format("asdf").
Variable = io.
Variable:format("asdf").

您不应该将原子用作字符串,因为它们不是垃圾收集器。如果您开始动态创建它们,您可能会耗尽内存。只有在选项数量固定的情况下,才应使用您手动输入代码的选项。当然,您可以根据需要多次使用同一个原子,因为它总是指向内存中的同一个点(原子表)。

它们比 C 枚举更好,因为值在运行时是已知的。因此,在调试 C 代码时,您会在调试器中看到 1 而不是 Tuesday。使用原子没有这个缺点,你会在你的代码和 Erlang shell 中看到tuesday

【讨论】:

    【解决方案2】:

    此外,它们通常用于标记元组以进行描述。例如:

    {年龄,42}

    不仅仅是

    42

    【讨论】:

      【解决方案3】:

      Atom 是一个字面常量。没有价值,但可以用作价值。例如:真、假、未定义。如果要将其用作字符串,则需要应用 atom_to_list(atom) 来获取要使用的字符串(列表)。模块名称也是原子。 看看http://www.erlang.org/doc/reference_manual/data_types.html

      【讨论】:

      • 严格来说,原子本身确实具有价值。所以 foo 的值是 foo,bar 是 bar 等等。erlang shell 是一个 REPL,当你输入一个原子时,它会评估它并打印结果,原子本身就是它的值。数字和其他原子数据类型也是如此,它们自己评估。
      • 感谢罗伯特的澄清!
      猜你喜欢
      • 2010-09-06
      • 2019-01-25
      • 2014-07-06
      • 1970-01-01
      • 1970-01-01
      • 2018-10-04
      • 2012-05-14
      • 2011-05-29
      • 2011-01-14
      相关资源
      最近更新 更多