【发布时间】:2016-11-19 04:37:22
【问题描述】:
我对原子以及如何使用它们感到困惑。
说实话,我正在阅读文档,只是不了解原子:(
有人可以提供一些例子或其他东西来解释这一点吗?
谢谢
【问题讨论】:
-
你来自什么语言?用与您以前的经验相关的术语向您解释这个概念可能会更容易。
-
我知道 javascript
标签: elixir
我对原子以及如何使用它们感到困惑。
说实话,我正在阅读文档,只是不了解原子:(
有人可以提供一些例子或其他东西来解释这一点吗?
谢谢
【问题讨论】:
标签: elixir
由于这个问题不是那么具体,所以我只是给出一个示例用法。
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),那么它将返回一个错误。因此,这允许我们对此结果进行模式匹配。
{:ok, lines} = process('text.txt')
因此,我们可以确定我们将始终将这些行返回给我们,而不是一个 nil 值(因为它会抛出一个错误)。这在将多个方法连接在一起时非常有用。
有关原子的更多一般信息,请查看以下链接:
【讨论】:
来自http://elixir-lang.org/getting-started/basic-types.html#atoms
原子是常量,它们的名字就是它们自己的值。其他 语言称这些符号
因此,如果您来自主流语言,它们最类似于常量。但更类似于(ish)使用中的全局枚举(即,它们的行为类似于独立的数据类型)。您通常将它们作为要匹配的目标引入,因此它们会命名您的代码需要一些概念的事物
真/假是经典案例
:ok, :error 是你会看到的其他东西
你可能想要:red, :green, :blue,或:yes, :no, :maybe,或:up, :down, :left, :right,如果这些概念在代码方面很重要(如二维游戏)
【讨论】:
你可能只是想多了。原子只是一个值。就像true 和false 只是值一样,您现在可以将任何单词用作值。事实上true、false 和nil 只是引擎盖下的原子。
您可以传递原子,而不是将字符串作为内部消息传递给您的应用程序。而不是使用字符串作为映射或关键字列表的键,您可以使用原子。
Atom 有一个非常重要的警告,它们永远不会被垃圾收集,所以你不应该通过用户输入或其他方式以编程方式生成 atom,否则如果创建太多,你可能会溢出 VM。
您可以创建的最大原子数默认为 1,048,576。 http://erlang.org/doc/efficiency_guide/advanced.html
这里有一些例子:https://github.com/itsgreggreg/elixir_quick_reference#atom
【讨论】:
原子是:
:patryk 或:true 这样的值(因为true 实际上是:true)没有原子的地图可以这样创建:
map = %{"author" => "patNowak"}
并访问
map["author"]
> "patNowak"
可以更轻松地创建以 atom 为键的映射:
map = %{author: "patNowak"} # but %{:author => "patNowak"} still works
并访问:
map.author # as well as map[:author]
> "patNowak"
关键字列表实际上是元组列表:
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。
【讨论】: