有根Elixir模块吗?

时间:2018-08-08 02:49:36

标签: elixir

当我在Elixir中定义一个模块并在IEX中像这样对它执行to_string操作时

MyModule |> to_string

我会得到结果,

"Elixir.MyModule"

是否存在所有其他模块都位于的根级别Elixir模块?为什么会有看起来像另一个模块的Elixir前缀?

This website说它是一个名称空间,但我读过其他文章说Elixir不支持名称空间。

2 个答案:

答案 0 :(得分:4)

我相信这是为了使Elixir和Erlang模块有所不同。所有elixir模块均以Elixir前缀开头。 MyModule只是原子:"Elixir.MyModule"的别名:

iex(1)> defmodule MyModule, do: def f(), do: "MyModule.f()"

标准函数调用:

iex(2)> MyModule.f()
"MyModule.f()"

Erlang样式的函数调用:

iex(3)> :"Elixir.MyModule".f()
"MyModule.f()"

原子等于别名吗?

iex(4)> :"Elixir.MyModule" == MyModule
true
iex(5)> :"Elixir.MyModule" == Elixir.MyModule
true

Elixir前缀是为了方便:

iex(6)> MyModule == Elixir.MyModule
true

答案 1 :(得分:1)

在“ Programming Elixir 1.6”中,Dave Thomas给出了以下示例:

defmodule​ Outer ​do​ ​ ​defmodule​ Inner ​do​ ​​ def​ inner_func ​do​ ​​ end​ ​​ end​ ​ ​​ def​ outer_func ​do​ ​Inner.inner_func ​​ end​ ​​end​ ​ ​Outer.outer_func ​Outer.Inner.inner_func

然后,他解释:

“ Elixir中的模块嵌套是一种错觉-所有模块都在顶层定义。当我们在另一个内部定义模块时,Elixir只是将外部模块名称添加到内部模块名称中,在两者之间加一个点。意味着我们可以直接定义一个嵌套模块。”