我见过以这种方式命名的elixir模块:
defmodule Foo.bar.baz do
end
但我找不到任何文件说明何时这样做。
是否与子目录有关?使用mix,我可以将我的模块放在lib文件夹中的子目录中,并且它们可以在没有点的情况下正常工作。
例如:
# this is in /lib/foo/bar
defmodule Bar do
end
约定是什么?
答案 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}
帮助器使用点来构建模块名称,但这只是常规。