回答
你可能只是过度思考原子只是一个数值,就像true
和false
只是数值,你现在有任何可以用作数值的单词,实际上true
,false
和nil
只不过是原子底下的原子。
而不是作为内部消息在应用程序周围传递字符串,可以传递原子。而不是使用字符串作为地图或关键字列表的键,你可以使用原子。
原子有一个非常大的警告,他们从来没有垃圾收集,所以你不应该从编程的方式,从用户输入或其他方式产生原子,否则你冒着溢出虚拟机如果太多创建。
您可以创建的最大原子数量默认为1,048,576。 http://erlang.org/doc/efficiency_guide/advanced.html
下面是一些例子:https://github.com/itsgreggreg/elixir_quick_reference#atom
那你能解释一下吗?既然他们从来没有收集过垃圾,那么你如何处理一个你得到大量原子的情况呢?就像我正在做消息流并使用原子作为密钥?谢谢 – user1354934
Elixir/Erlang永远不会自动生成原子,你必须自己动手。如果您正在接受输入并将其转换为原子,则有可能导致虚拟机崩溃,这就是为什么您不会将输入转换为原子的原因。 – greggreg
因为这个问题不是具体的,我就举一个例子使用。
Elixir中一个流行的原子使用方法是将它们用作模式匹配的消息。例如,你可以使用某种处理http请求的函数。这个处理的结果要么是成功的过程,要么是失败的过程。
因此,您可以使用原子来指示此处理是否成功。例如。
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),那么它将返回一个错误。这因此允许我们对这个结果进行模式匹配。因此,我们可以肯定,我们将始终有返回给我们的行,并且从来没有一个零值(因为它会引发错误)。将多种方法连接在一起时,这变得非常有用。
有关原子的一般信息,结帐以下链接:
从http://elixir-lang.org/getting-started/basic-types.html#atoms
原子是常量,他们的名字是自己的价值。其他一些 语言称为这些符号
因此,如果您来自主流语言,它们最像常量。但更类似于全球使用的枚举(即,它们像独立数据类型一样)。通常你介绍他们作为对要匹配的目标,所以他们的名字的东西,你的代码需要的一些概念
真/假是一个经典案例
:ok
,:error
是别的东西,你会看到
你可能想:red, :green, :blue
,或:yes, :no, :maybe
或:up, :down, :left, :right
如果这些概念是很重要的代码明智的(像2D游戏)
原子是:
- 不可改变像在药剂
- 值等
:patryk
或:true
(因为true
实际上是:true
) - 在红宝石
- 非常适合在地图键类似的符号,因为使很好的语法来访问地图元素 一切
- 使您能够使用关键字列表 - 列表,这些列表实际上是元组列表,但更容易访问消息通信的基础。与GenServer
原子在地图
地图而不原子可以像创建:
map = %{"author" => "patNowak"}
和访问
map["author"]
> "patNowak"
地图与原子作为键可以创建更容易:
map = %{author: "patNowak"} # but %{:author => "patNowak"} still works
和访问:在关键字列表
map.author # as well as map[:author]
> "patNowak"
凌
关键字列表实际上是元组的列表(S):
list = [author: "patNowak"]
list === [{:author, "patNowak"}]
> true
而且可以访问:
list[:author] # no dot notation in this case
消息中的原子
GenServer在某些情况下默认使用:reply
或:noreply
(GS的函数call
和cast
将等待您的handle_
函数中的这些特定原子)。你将收到的大多数消息(不是警告和错误)将是原子,例如。 IO.puts“hi”将打印hi
并返回:ok
。
- 1. 对Frustum Culling感到困惑
- 2. 对OAuth感到困惑
- 3. Rails学习的困惑
- 4. 感到困惑EKEventStatus
- 5. 对ES6对象语法感到困惑
- 6. 我对C++入门(流程执行)练习感到困惑
- 7. 初学者对目标c,作业,属性等感到困惑
- 8. 学习Python困难的方法,练习20,困惑功能
- 9. 学习C#和方法内的对象令我困惑
- 10. 在Spring Boot中对ThymeleafConfig感到困惑
- 11. 对Firebase查询执行感到困惑
- 12. 我对Hibernate感到困惑吗?
- 13. 对DocumentDB访问键感到困惑
- 14. 对Ruby长度属性感到困惑
- 15. 对箭头功能感到困惑
- 16. ServiceStack:对路线感到困惑
- 17. 对返回类型感到困惑
- 18. 对类方法语法感到困惑
- 19. 我对Hibernate Spring感到困惑
- 20. 对JTable的setDefaultRenderer方法感到困惑
- 21. 对条纹降级感到困惑
- 22. 对linq这个查询感到困惑
- 23. 对Java8中的HashMap感到困惑
- 24. 对ios触摸代码感到困惑
- 25. 对使用XPath感到困惑
- 26. 我对java代码感到困惑吗?
- 27. 对米勒拉宾感到困惑
- 28. 对AngularUI模态文档感到困惑
- 29. 对UIView框架属性感到困惑
- 30. 对Silverlight导航感到困惑
你来自哪种语言?根据您之前的经验,向您解释这个概念可能会更容易一些。 –
我知道javascript – user1354934