为什么值的前缀是“Elixir”?

问题描述 投票:0回答:3

使用地图为我提供了 VSCode 中意想不到的结果。 从地图中选择一个比例时,预期结果的前缀是 长生不老药。其次是预期的结果。 VSCode 和 Elixir 下载的版本是最近 20 天前的。 操作系统是 Windows 11。 我不喜欢 iex 的快捷方式。就像在“交互模式”中一样,我没有正确的语法和理解。

我更改了地图的名称,将键和值更改为数字并重新键入地图以及说明。 前缀“Elixir.”仍然存在。

Screen shot

module elixir alias
3个回答
1
投票

来自docs

注意:Elixir 中定义的所有模块都在主 Elixir 中定义 命名空间,例如 Elixir.String。但是,为了方便,您可以 省略“长生不老药”。引用它们时。

第32、“Elixir in Action”介绍了原子。创建原子的第一种方法是这样的:

:dog

创建原子时不能只使用任何字符,但如果使用引号,则可以使用任何字符,为您提供第二种创建原子的方法:

:"wag the dog!"

创建原子的第三种方法是以大写字母开头的名称:

AnAtom

在 iex:

iex(3)> is_atom(AnAtom)   
true

“Elixir in Action”说

AnAtom
实际上是一个
alias
(您可以在这个答案顶部第一句的链接中阅读别名)。
AnAtom
被认为是别名,因为当您编译代码时,
AnAtom
被替换为
:"Elixir.AnAtom"
。在 iex:

iex(4)> AnAtom == :"Elixir.AnAtom"
true

这意味着模块名称是原子,例如

defmodule MyFunctions do
  def do_stuff
    IO.puts "hello"
  end
end

无论您是否知道,您创建了一个具有原子值的地图:

person = %{
   :Daughter => Judith
   
   ...
   ...
}

Judith
创建一个原子。而且,正如“Elixir in Action”所说,
Judith
是原子
:"Elixir.Judith"
的别名。

实际上,我建议你永远不要写这样的代码:

person = %{
   :Daughter => Judith
   
   ...
   ...
}

大多数人会这样写代码:

person = %{

    daughter: "Judith",
    ...

}

原子被用作映射中的键的原因是因为比较原子非常有效,而比较字符串的效率相对较低,必须逐个字符进行比较。

总而言之,虽然 VS Code 中的输出是正确的,但它是无用的、不需要的信息——例如,请参阅 iex 中的相同输出。

我不喜欢 iex 的快捷方式。就像在“交互模式”中一样,我 没有正确的语法和理解。

我写程序的方式是:我使用我选择的编辑器(vim,VS Code等)创建文件,比如my_functions.ex。完成编码后,我保存文件。我在我的编辑器下方打开了一个终端窗口,我已将其 cd 到与我的文件相同的目录中。在编辑器中保存文件后,我使用终端窗口编译文件,例如:

$ iex my_functions.ex

我调用 iex 中的函数。然后,我回去在我的编辑器中编辑代码以更正错误或编写更多代码。我从不在 iex 中写代码。

顺便问一下,您使用什么插件在 VS Code 中执行代码?


0
投票

这是语言的设计以及与 erlang 的互操作。

这里发生的事情很微妙。在内部,模块名称只是原子。当你写一个以大写字母开头的名字时,比如 IO,Elixir 会在内部将它转换成一个名为 Elixir.IO 的原子。

您可以在这里阅读更多内容


0
投票

在 Elixir 中以大写字母开头的独立单词是 aliases 指的是模块名称。它们自动以

Elixir.
:

为前缀
iex> to_string Utrecht
Elixir.Utrecht
iex> Utrecht == :"Elixir.Utrecht"
true

你应该做的是使用

:
来指定你想要定义自己的原子,而不是别名:

iex> to_string :Utrecht
"Utrecht"
iex> :Utrecht == :"Elixir.Utrecht"
false

或者使用字符串:

iex> "Utrecht"
"Utrecht"
© www.soinside.com 2019 - 2024. All rights reserved.