我对原子以及如何使用原子感到困惑。
老实说,我正在阅读文档,而不是理解原子:(
有人可以提供一些可以解释这个问题的例子吗?
由于
答案 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')
因此,我们可以确定我们将始终返回给我们的行,而不是一个零值(因为它会抛出错误)。当将多个方法组合在一起时,这变得非常有用。
有关原子的更多一般信息,请查看以下链接:
答案 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
只是值一样,您现在可以使用任何单词作为值。实际上false
,true
和false
只是引擎盖下的原子。
您可以传递原子,而不是将应用程序作为内部消息传递给应用程序。而不是使用字符串作为地图或关键字列表的键,您可以使用原子。
Atoms有一个非常大的警告,它们永远不会被垃圾收集,因此您不应该以编程方式从用户输入或其他方式生成原子,否则如果创建的太多,则存在溢出VM的风险。
您可以创建的最大原子数默认为1,048,576。 http://erlang.org/doc/efficiency_guide/advanced.html
以下是一些示例:https://github.com/itsgreggreg/elixir_quick_reference#atom
答案 3 :(得分:4)
原子是:
df[df.A > 0][df.B <= 10]
或:patryk
等值(因为:true
实际上是true
)可以像这样创建没有原子的地图:
:true
并访问
map = %{"author" => "patNowak"}
可以更轻松地创建使用原子作为键的映射:
map["author"]
> "patNowak"
并访问:
map = %{author: "patNowak"} # but %{:author => "patNowak"} still works
关键字列表实际上是元组列表:
map.author # as well as map[:author]
> "patNowak"
可以访问:
list = [author: "patNowak"]
list === [{:author, "patNowak"}]
> true
在某些情况下,GenServer默认使用list[:author] # no dot notation in this case
或:reply
(GS函数:noreply
和call
将等待{{1}中的这些特定原子}} 功能)。您将收到的大多数消息(不是警告和错误)将是原子,例如。 IO.puts&#34; hi&#34;将打印cast
并返回handle_
。