根据http://elixir-lang.org/getting-started/basic-types.html#atoms:
原子是常数,它们的名字就是它们自己的值。其他 语言称这些符号为
我想知道原子类型有什么意义。可能是为了帮助构建解析器或宏?但在日常使用中它对程序员有什么帮助呢?
顺便说一句:我从未使用过 Elixir 或 erlang,只需注意它的存在(也在 kdb 中)
它们基本上是可以轻松测试相等性的字符串。
考虑一个字符串。从概念上讲,如果字符串具有相同的内容,我们通常认为它们是相等的。例如,“dog”==“dog”,但“dog”!=“cat”。但是,要检查字符串的相等性,我们必须检查一个字符串中的每个字母是否等于另一个字符串中相同位置的字母,这意味着我们必须遍历字符串的每个元素并检查每个元素性格平等。如果处理 Unicode 字符串并且必须考虑组成相同字符的不同方式(例如,字符 é 在 UTF-8 中有两种表示形式),这会变得有点麻烦。
如果我们将相同的字符串存储在内存中的同一位置,那就简单多了。然后,检查相等性将是简单的指针或索引比较。
由于将相同的字符串存储在内存中的同一位置,我们还可以为每种唯一类型的字符串存储一份副本,无论它在程序中使用多少次,从而也为常用字符串节省了一些内存.
在更高的层面上,使用原子还可以让我们像考虑整数等其他基本数据类型一样来考虑字符串。
我认为 erlang 中最常见的用法之一是标记变量和消息,如 mipadi 所说,具有快速比较(模式匹配)的好处。
例如,您编写的函数可能会失败,具体取决于提供的参数、服务器连接状态或任何原因。一个非常频繁的用法是在成功的情况下返回一个元组 {ok,Value},在错误的情况下返回 {error,Reason}。调用函数可以选择仅管理成功案例编码
{ok,Value} = yourModule:yourFunction(Param...)
。这样做很明显,您只考虑成功的情况,直接从函数返回中提取值,速度很快,并且您不必与您的模块共享任何标头来解码 ok 原子。
在消息中你经常会看到诸如
{add,Key,Value}
、{delete,Key}
、{delete_all}
、{replace,Key,Value}
、{append,Key,Value}
...这些都是明确的消息,具有前面提到的相同优点:快速、明智、不分享标题...
原子是以自身为值的常数。 这是一个在分布式系统中非常有用的概念,其中常量可以在每个系统上以不同的方式定义,而原子是自包含的,不需要定义。