学习Elixir并对原子感到困惑

时间:2016-11-15 23:50:14

标签: elixir

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

老实说,我正在阅读文档,而不是理解原子:(

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

由于

4 个答案:

答案 0 :(得分:5)

由于这个问题并不具体,我只是举例说明。

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

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

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

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

  case lines do
    nil ->
      {:error, "failed to process file"}
    lines ->
      {:ok, lines}
  end
end

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

{:ok, lines} = process('text.txt')

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

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

Elixir School

Stack overflow Question

答案 1 :(得分:5)

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

  

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

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

true / false是一个经典案例

:ok:error是您将看到的其他内容

如果这些概念是重要的代码(如2d游戏),您可能需要:red, :green, :blue:yes, :no, :maybe:up, :down, :left, :right

答案 2 :(得分:4)

你可能只是在思考它。原子只是一个值。就像from __future__ import absolute_import import os from celery import Celery # set the default Django settings module for the 'celery' program. os.environ.setdefault('DJANGO_SETTINGS_MODULE', 'framedatabase.settings') from django.conf import settings # noqa app = Celery('framedatabase', backend='redis://localhost:1717/1', broker="redis://localhost:1717/0", include=['framedatabase.tasks']) # Using a string here means the worker will not have to # pickle the object when using Windows. app.config_from_object('django.conf:settings', namespace='CELERY') app.autodiscover_tasks() @app.task(bind=True) def debug_task(self): print('Request: {0!r}'.format(self.request)) true只是值一样,您现在可以使用任何单词作为值。实际上falsetruefalse只是引擎盖下的原子。

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

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

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

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

答案 3 :(得分:4)

原子是:

  • 像Elixir中的所有内容一样不可变。
  • df[df.A > 0][df.B <= 10] :patryk等值(因为:true实际上是true
  • 类似于Ruby中的符号
  • 非常适合地图中的键,因为可以使用很好的语法来访问地图元素
  • 使您能够使用实际上是元组列表但更容易访问的关键字列表 - 列表
  • 消息沟通的基础,例如。与GenServer
地图中的

Atom

可以像这样创建没有原子的地图:

:true

并访问

map = %{"author" => "patNowak"}

可以更轻松地创建使用原子作为键的映射:

map["author"]
> "patNowak"

并访问:

map = %{author: "patNowak"} # but %{:author => "patNowak"} still works

关键字列表中的Atom

关键字列表实际上是元组列表:

map.author # as well as map[:author]
> "patNowak"

可以访问:

list = [author: "patNowak"]
list === [{:author, "patNowak"}]
> true

消息中的Atom

在某些情况下,GenServer默认使用list[:author] # no dot notation in this case :reply(GS函数:noreplycall将等待{{1}中的这些特定原子}} 功能)。您将收到的大多数消息(不是警告和错误)将是原子,例如。 IO.puts&#34; hi&#34;将打印cast并返回handle_