什么时候在 elixir 模块名称中使用点?

When to use a dot in elixir module name?

我见过这样命名的 elixir 模块:

defmodule Foo.bar.baz do
end

但我找不到任何说明何时执行此操作的文档。

跟子目录有关系吗?使用 mix,我可以将我的模块放在 lib 文件夹中的子目录中,它们可以正常工作而没有点。

例如:

# this is in /lib/foo/bar

defmodule Bar do
end

约定是什么?

.没什么特别的。你可以给模块起任何你想要的名字,只要它是一个有效的原子,包括例如空格:

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

您也不需要将模块命名为与它们所在的 file/folder 相同的名称。您可以在 lib 内的任何 .ex 文件中定义任何模块,并且它们'将对整个应用程序和 iex.

可用

惯例,如果文件在顶层声明单个模块,则根据其路径命名它,不包括 lib,将每个路径段转换为大写。例如,lib/foo/bar/baz.ex 通常定义一个名为 Foo.Bar.Baz.

的模块

惯例只是将你的 application/package 中的所有模块命名为 MyApp.MyModule(假设你的 application/package 被命名为 MyApp。)这或多或少类似于 java 包命名约定 com.example.blah....

这样做是为了防止不同 applications/packages.

之间的名称冲突

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

在您的 application/package 中,选择模块命名的平面模型还是分层模型完全取决于您。

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