【问题标题】:Is there a root Elixir module?有根 Elixir 模块吗?
【发布时间】:2018-08-31 10:30:37
【问题描述】:

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

MyModule |> to_string

我会得到结果的,

"Elixir.MyModule"

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

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

【问题讨论】:

  • 旁注: Elixir 确实支持命名空间(好吧,如果我们使用“命名空间”的常见含义。)

标签: elixir


【解决方案1】:

我相信这是为了让 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

【讨论】:

    【解决方案2】:

    在“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 只是将外部模块名称添加到内部模块名称之前,在两者之间放置一个点。这意味着我们可以直接定义一个嵌套模块。”

    【讨论】:

      猜你喜欢
      • 2015-06-22
      • 2016-04-14
      • 1970-01-01
      • 2017-09-27
      • 1970-01-01
      • 1970-01-01
      • 2015-04-29
      • 2020-02-16
      • 1970-01-01
      相关资源
      最近更新 更多