使用地图为我提供了 VSCode 中意想不到的结果。 从地图中选择一个比例时,预期结果的前缀是 长生不老药。其次是预期的结果。 VSCode 和 Elixir 下载的版本是最近 20 天前的。 操作系统是 Windows 11。 我不喜欢 iex 的快捷方式。就像在“交互模式”中一样,我没有正确的语法和理解。
我更改了地图的名称,将键和值更改为数字并重新键入地图以及说明。 前缀“Elixir.”仍然存在。
来自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 中执行代码?
这是语言的设计以及与 erlang 的互操作。
这里发生的事情很微妙。在内部,模块名称只是原子。当你写一个以大写字母开头的名字时,比如 IO,Elixir 会在内部将它转换成一个名为 Elixir.IO 的原子。
您可以在这里阅读更多内容
在 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"