2016-11-15 69 views
0

我对原子以及如何使用它们感到困惑。学习药剂和对原子感到困惑

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

有人可以提供一些例子或东西会解释一下吗?

感谢

+0

你来自哪种语言?根据您之前的经验,向您解释这个概念可能会更容易一些。 –

+0

我知道javascript – user1354934

回答

4

你可能只是过度思考原子只是一个数值,就像truefalse只是数值,你现在有任何可以用作数值的单词,实际上true,falsenil只不过是原子底下的原子。

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

原子有一个非常大的警告,他们从来没有垃圾收集,所以你不应该从编程的方式,从用户输入或其他方式产生原子,否则你冒着溢出虚拟机如果太多创建。

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

下面是一些例子:https://github.com/itsgreggreg/elixir_quick_reference#atom

+0

那你能解释一下吗?既然他们从来没有收集过垃圾,那么你如何处理一个你得到大量原子的情况呢?就像我正在做消息流并使用原子作为密钥?谢谢 – user1354934

+0

Elixir/Erlang永远不会自动生成原子,你必须自己动手。如果您正在接受输入并将其转换为原子,则有可能导致虚拟机崩溃,这就是为什么您不会将输入转换为原子的原因。 – greggreg

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 

这里我们说的方法,process/1将返回一个二元组应答。如果我们处理的结果是成功的,它将返回{:ok, lines},但是如果失败(例如返回nil),那么它将返回一个错误。这因此允许我们对这个结果进行模式匹配。因此,我们可以肯定,我们将始终有返回给我们的行,并且从来没有一个零值(因为它会引发错误)。将多种方法连接在一起时,这变得非常有用。

有关原子的一般信息,结帐以下链接:

Elixir School

Stack overflow Question

5

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

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

因此,如果您来自主流语言,它们最像常量。但更类似于全球使用的枚举(即,它们像独立数据类型一样)。通常你介绍他们作为对要匹配的目标,所以他们的名字的东西,你的代码需要的一些概念

真/假是一个经典案例

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

你可能想:red, :green, :blue,或:yes, :no, :maybe:up, :down, :left, :right如果这些概念是很重要的代码明智的(像2D游戏)

4

原子是:

  • 不可改变像在药剂
  • 值等: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的函数callcast将等待您的handle_函数中的这些特定原子)。你将收到的大多数消息(不是警告和错误)将是原子,例如。 IO.puts“hi”将打印hi并返回:ok