String.to_atom导致和带有双引号的atom隐藏在其中

时间:2017-08-28 16:56:06

标签: elixir

我有这个代码,我使用一对列表来获取一个列表,其中一个列表是键,另一个列表是值。非常简单的代码:

defp create_data_map(columns, row) do
  Enum.zip(columns, row)
  |> Enum.into(%{}, fn {k, v} ->
    {String.to_atom(k), v}
  end)
end

我从csv文件中获取这些列表,其中列是第一行,即标题列表,第二行是之后的任何一行。这是标题的样子:

["action", "source_application", "partner_name", "detail", "college_name",
 "ipeds_id", "deleted", "deleted_at", "athlete_id", "athlete_email",
 "athlete_first_name", "athlete_last_name", "athlete_sport_id",
 "athlete_sport_name", "pass_uuid", "coach_id", "coach_id", 
 "coach_email",
 "coach_first_name", "coach_last_name", "coach_position", "coach_sport_id",
 "coach_sport_name", "occurred_at"]

出于某种原因,调用String.to_atom / 1后的'action'键最终为:"action"。没有其他键具有该问题。它们都是正确形成的原子。

除了它在列表的开头之外,我没有看到来自其他键的操作键有什么不同。

2 个答案:

答案 0 :(得分:1)

使用Atom

转换时,String.to_atom()有三种不同的显示方式
  1. :"原子 - "或:" atom - "
  2. :Atom或:atom
  3. 原子
  4. 以上所有3都是原子。它们的唯一区别在于字符串的格式化方式。

    1. 第一个获得的任何常用字符串也包含特殊字符,如#$% - ...
      iex> "Atom-" |> String.to_atom
      :"Atom-"
    2. 然后类似于在elixir中巧妙地格式化functions名称的方式。即字符串以字母开头,剩下的字符串只能包含字母,数字或三个特殊字符_!@。
      iex> "Atom" |> String.to_atom
      :Atom

    3. 再次以与Modules相同的方式在Elixir中巧妙地命名。从内部来看,模块名称也只是原子。字符串应以Elixir.开头,后跟大写字母,并且只能包含字母。
      iex> "Elixir.Atom" |> String.to_atom
      Atom​​​

    4. Module Names: Elixir, Erlang, and Atoms

      Understanding Aliases

答案 1 :(得分:0)

When inspect/1 renders your atom as :"hello world", the name of the atom contains characters like whitespace, dots or uppercase letters.

See how you would not be able to reference the above atom as :hello world, because it would interpret world as a variable.

They are still valid atoms, though it might be harder to use them in your code.