当我在Elixir中定义一个模块并在IEX中像这样对它执行to_string
操作时
MyModule |> to_string
我会得到结果,
"Elixir.MyModule"
是否存在所有其他模块都位于的根级别Elixir
模块?为什么会有看起来像另一个模块的Elixir前缀?
This website说它是一个名称空间,但我读过其他文章说Elixir不支持名称空间。
答案 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只是将外部模块名称添加到内部模块名称中,在两者之间加一个点。意味着我们可以直接定义一个嵌套模块。”