何时在elixir模块名称中使用点?

时间:2018-03-30 16:54:16

标签: elixir mix

我见过以这种方式命名的elixir模块:

defmodule Foo.bar.baz do
end

但我找不到任何文件说明何时这样做。

是否与子目录有关?使用mix,我可以将我的模块放在lib文件夹中的子目录中,并且它们可以在没有点的情况下正常工作。

例如:

# this is in /lib/foo/bar

defmodule Bar do
end

约定是什么?

2 个答案:

答案 0 :(得分:6)

.没有什么特别之处。您可以为模块提供您想要的任何名称,只要它是有效原子,包括例如空白:

iex(1)> defmodule :"hello world!!!" do
...(1)>   def hi, do: :ok
...(1)> end
iex(2)> :"hello world!!!".hi
:ok

您也不需要将模块命名为与他们所在的文件/文件夹相同的名称。您可以在.ex内的任何lib文件中定义任何模块。 #39;将可用于整个应用程序iex

如果文件在顶层声明单个模块,则约定是根据其路径命名,排除lib,将每个路径段转换为大写形式。例如,lib/foo/bar/baz.ex通常定义名为Foo.Bar.Baz的模块。

答案 1 :(得分:3)

约定只是将应用程序/包中的所有模块命名为MyApp.MyModule(假设您的应用程序/包名为MyApp。)这或多或少类似于java约定名称包com.example.blah...

这样做是为了防止不同应用程序/包之间的名称冲突。

Elixir核心模块没有命名空间(但有一些例外,例如String.Chars。)

在您的应用程序/包中,完全取决于您是选择模块命名的平面模型还是分层模型。

BTW,模块名称可能是任何有效的原子。点只是约定,它既不影响编译器的模式可访问性,也不影响其他任何东西。 Module.concat/{1,2}帮助器使用点来构建模块名称,但这只是常规。