这两个模块定义有什么区别?

What is the difference between these two module definitions?

关于Phoenix Framework:我只是想知道写法有什么区别

defmodule MyApp.User do
  # some code
end

而且只是

defmodule User do
  # some code
end

以后写 User.function 比写 MyApp 更容易。User.function

这是为您的模块命名空间以避免冲突。想象一个场景,你调用你的模块 User 然后使用一个名为 user 的库,它也定义了一个 User 模块。你会发生碰撞。

您可以 alias 在使用您的 User 模块的模块中:

defmodule MyApp.SomeModule do
  alias MyApp.User

  def foo do
    User.some_function
  end
end

可以配合elixir中nesting的概念来应用。通常您希望根据功能或只是为了命名方便对某些模块进行分组。 这是文档中的直接示例

defmodule Foo do
  defmodule Bar do
  end
end

相同
defmodule Elixir.Foo do
  defmodule Elixir.Foo.Bar do
  end
  alias Elixir.Foo.Bar, as: Bar
end

重要的是要注意,在 Elixir 中,不需要定义 Outer 模块就可以使用 Outer.Inner 模块名称,因为语言翻译了所有无论如何,模块名称都是原子的。您可以定义任意嵌套的模块而无需定义链中的任何模块(例如,Foo.Bar.Baz 无需首先定义 Foo 或 Foo.Bar)。

elixir docs 提供了一个可靠的示例。