学习Elixir并对原子感到困惑

use*_*934 0 elixir

我对原子以及如何使用原子感到困惑.

说实话,我正在阅读文档,只是不了解原子:(

有人可以提供一些可以解释这个问题的例子吗?

谢谢

gre*_*reg 6

你可能想多了。原子只是一个值。就像truefalse都是值一样,您现在可以将任何单词用作值。事实上truefalsenil只是底层的原子。

您可以传递原子,而不是作为内部消息在应用程序中传递字符串。您可以使用原子,而不是使用字符串作为映射或关键字列表的键。

原子有一个非常大的警告,它们永远不会被垃圾收集,因此您永远不应该通过用户输入或其他方式以编程方式生成原子,否则如果创建太多,您将面临虚拟机溢出的风险。

您可以创建的最大原子数默认为 1,048,576。http://erlang.org/doc/efficiency_guide/advanced.html

以下是一些示例:https://github.com/itsgreggreg/elixir_quick_reference#atom


Har*_*cas 5

由于这个问题不是那么具体,我只想举例说明一下.

Elixir中原子的一种常见用途是将它们用作模式匹配的消息.

例如,假设您具有对http请求进行某种处理的功能.此处理的结果要么是成功的过程,要么是失败的过程.

因此,您可以使用原子来指示此处理是否成功.例如

def process(file) do
  lines = file |> split_lines

  case lines do
    nil ->
      {:error, "failed to process file"}
    lines ->
      {:ok, lines}
  end
end
Run Code Online (Sandbox Code Playgroud)

这里我们说的是,该方法process/1将返回两个元组的响应.如果我们的处理结果成功,它将返回{:ok, lines},但是如果它失败(例如返回nil),那么它将返回错误.因此,这允许我们对此结果进行模式匹配.

{:ok, lines} = process('text.txt')
Run Code Online (Sandbox Code Playgroud)

因此,我们可以确定我们将始终返回给我们的行,而不是一个零值(因为它会抛出错误).当将多个方法一起管道时,这变得非常有用.

有关原子的更多一般信息,请查看以下链接:

Elixir学校

堆栈溢出问题


Kei*_*las 5

来自http://elixir-lang.org/getting-started/basic-types.html#atoms

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

因此,如果你来自主流语言,它们就像常量一样.但是与使用中的全局枚举更相似(ish)(即,它们表现为独立的数据类型).您通常将它们作为要匹配的目标引入,因此它们将您的代码需要的一些概念命名为

true/false是一个经典案例

:ok,:error你会看到别的东西

你可能想要:red, :green, :blue,或者:yes, :no, :maybe,或者:up, :down, :left, :right 这些概念是否是重要的代码(如2d游戏)