【问题标题】:Why is useful to have a atom type (like in elixir, erlang)?为什么拥有 atom 类型(如在 elixir、erlang 中)很有用?
【发布时间】:2015-11-22 13:14:18
【问题描述】:

根据http://elixir-lang.org/getting-started/basic-types.html#atoms

原子是常量,它们的名字就是它们自己的值。其他 语言称这些符号

我想知道有一个 atom 类型有什么意义。可能是为了帮助构建解析器或宏?但是在日常使用中它对程序员有什么帮助呢?

顺便说一句:永远不要使用 elixir 或 erlang,只要注意它存在(也在 kdb 中)

【问题讨论】:

  • 为什么在许多其他语言中使用枚举类型很有用?当你需要一个符号来表示一个的值时,因为符号本身的语义很重要——那么你需要原子。枚举是实现它的一种方式,Erlang 原子是另一种方式。它们更简洁,受到的实施限制要少得多,并且不会因“在 C 中一切都是整数”这一事实而受到攻击。

标签: syntax erlang elixir


【解决方案1】:

我认为 erlang 中最常见的用法之一是标记变量和消息,正如 mipadi 所说,具有快速比较(模式匹配)的好处。

例如,您编写的函数可能会失败,具体取决于提供的参数、与服务器的连接状态或任何原因。一个非常常见的用法是在成功的情况下返回一个元组 {ok,Value},在出错的情况下返回 {error,Reason}。调用函数可以选择仅管理成功案例编码{ok,Value} = yourModule:yourFunction(Param...)。这样做很明显,您只考虑成功案例,直接从函数返回中提取 Value,速度很快,并且您不必与 yourModule 共享任何标头来解码 ok atom。

在消息中,您经常会看到{add,Key,Value}{delete,Key}{delete_all}{replace,Key,Value}{append,Key,Value}... 这些是明确的消息,具有与前面提到的相同的优点:快速、明智、没有标题...

【讨论】:

  • 好的,我认为这个答案看起来更有用:所以,使用原子有助于避免为简单概念创建新类型/变量,就像 returnCodes 但自动可读.. 这种理解可以吗?
  • 是的,没错。虽然您将使用 erlang(或 elixir),但您会发现许多用例,其中 atom 的自动可读、自动共享和超快特性确实是您所需要的。 一个警告:它应该是静态信息,因为您应该避免动态创建新原子。
【解决方案2】:

原子是常数,其自身为值。 这是一个在分布式系统中非常有用的概念,其中常量可以在每个系统上以不同方式定义,而原子是自包含的,无需定义。

【讨论】:

  • 我想你可以在分布式系统的位置表达更抽象的概念。但是“自包含”的手段是什么,又会保存怎样的“定义”呢?
【解决方案3】:

它们基本上是可以轻松测试相等性的字符串。

考虑一个字符串。从概念上讲,如果字符串具有相同的内容,我们通常会认为它们是相等的。例如,“狗”==“狗”但“狗”!=“猫”。但是,要检查字符串的相等性,我们必须检查一个字符串中的每个字母是否等于另一个字符串中相同位置的字母,这意味着我们必须遍历字符串的每个元素并检查每个平等的性格。如果处理 Unicode 字符串并且必须考虑组合相同字符的不同方式(例如,字符 é 在 UTF-8 中有两种表示形式),这会变得更加麻烦。

如果我们将相同的字符串存储在内存中的相同位置会简单得多。然后,检查相等性将是一个简单的指针或索引比较。

由于将相同的字符串存储在内存中的同一位置,我们还可以将每种唯一类型的字符串存储一份副本,无论它在程序中使用了多少次,从而为常用字符串节省了一些内存也是。

在更高的层次上,使用原子还可以让我们以与其他原始数据类型(如整数)相同的方式来考虑字符串。

【讨论】:

  • 你回答得最好。其他答案都没有指出明显的问题“为什么不使用字符串?”
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2021-04-30
  • 1970-01-01
  • 2018-03-01
  • 2020-06-12
  • 2023-03-02
  • 2021-02-25
相关资源
最近更新 更多