【问题标题】:Learning Elixir and confused about atoms学习灵药,对原子感到困惑
【发布时间】:2016-11-19 04:37:22
【问题描述】:

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

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

有人可以提供一些例子或其他东西来解释这一点吗?

谢谢

【问题讨论】:

  • 你来自什么语言?用与您以前的经验相关的术语向您解释这个概念可能会更容易。
  • 我知道 javascript

标签: elixir


【解决方案1】:

由于这个问题不是那么具体,所以我只是给出一个示例用法。

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 值(因为它会抛出一个错误)。这在将多个方法连接在一起时非常有用。

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

Elixir School

Stack overflow Question

【讨论】:

    【解决方案2】:

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

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

    因此,如果您来自主流语言,它们最类似于常量。但更类似于(ish)使用中的全局枚举(即,它们的行为类似于独立的数据类型)。您通常将它们作为要匹配的目标引入,因此它们会命名您的代码需要一些概念的事物

    真/假是经典案例

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

    你可能想要:red, :green, :blue,或:yes, :no, :maybe,或:up, :down, :left, :right,如果这些概念在代码方面很重要(如二维游戏)

    【讨论】:

      【解决方案3】:

      你可能只是想多了。原子只是一个值。就像truefalse 只是值一样,您现在可以将任何单词用作值。事实上truefalsenil 只是引擎盖下的原子。

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

      Atom 有一个非常重要的警告,它们永远不会被垃圾收集,所以你不应该通过用户输入或其他方式以编程方式生成 atom,否则如果创建太多,你可能会溢出 VM。

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

      这里有一些例子:https://github.com/itsgreggreg/elixir_quick_reference#atom

      【讨论】:

      • 你能解释一下警告吗?由于它们从不被垃圾收集,你如何处理你得到大量原子的情况?就像我在做消息流并且我使用 atom 作为键一样?谢谢
      • Elixir/Erlang 永远不会自动生成原子,你必须自己做。如果你正在接受输入并将其转换为原子,那么你就有可能导致 VM 崩溃,这就是为什么你永远不会将输入转换为原子的原因。
      【解决方案4】:

      原子是:

      • 像 Elixir 中的一切一样不可变
      • :patryk:true 这样的值(因为true 实际上是:true
      • 类似于 Ruby 中的符号
      • 非常适合地图中的键,因为启用了访问地图元素的良好语法
      • 使您能够使用关键字列表 - 列表实际上是元组列表,但更容易访问
      • 消息通信的基础,例如。使用 GenServer

      地图中的原子

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

      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 的函数callcast 将等待来自handle_ 函数的这些特定原子)。您将收到的大多数消息(不是警告和错误)将是原子,例如。 IO.puts "hi" 将打印 hi 并返回 :ok

      【讨论】:

        猜你喜欢
        • 2016-05-20
        • 1970-01-01
        • 2012-01-04
        • 2011-05-12
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多