Regarding the Phoenix Framework: I was just wondering what the difference is between writing
defmodule MyApp.User do
# some code
end
and just
defmodule User do
# some code
end
later on it would be easier to just write User.function than MyApp.User.function
答案 0 :(得分:6)
这是命名空间模块以避免冲突。想象一下,您可以调用模块User
,然后使用名为user的库,该库也定义了User
模块。你会发生碰撞。
您可以在使用User
模块的模块中alias:
defmodule MyApp.SomeModule do
alias MyApp.User
def foo do
User.some_function
end
end
答案 1 :(得分:1)
它可以在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.Inner
模块名称,因为语言会将所有模块名称转换为原子。您可以定义任意嵌套的模块,而无需在链中定义任何模块(例如,Foo.Bar.Baz,而不首先定义Foo或Foo.Bar)。
elixir docs提供了一个可靠的示例。