别名化嵌套模块和父模块

时间:2018-09-07 00:50:56

标签: elixir

我目前正在尝试对模块(A)进行别名,而嵌套在该模块(A.B)中的模块是否可以在线实现呢?

defmodule A do ... end
defmodule A.B do ... end

defmodule C do
  alias A
  alias A.B
end

2 个答案:

答案 0 :(得分:2)

首先,在Elixir中没有 nested 模块的概念。 A.B模块实际上与A模块没有任何共同之处,只是将其名称用作命名空间。

但是对于深度命名的模块,您仍然要问些什么。

defmodule A do               
  defmodule B do               
    def b, do: IO.puts :b        
    defmodule C do       
      def c, do: IO.puts :c 
    end
  end
end

对于上面的代码,在一次调用中可能同时Kernel.SpecialForms.alias/2 A.BA.B.C

alias A.{B, B.C}             
#⇒ [A.B, A.B.C]
C.c
#⇒ c

Kernel.SpecialForms.require/2Kernel.SpecialForms.import/2Kernel.use/2可以使用相同的语法。

不幸的是,使用curlies的技巧在最高级别上无效(alias {A, A.B}无效。)也许这对Elixir内核是一个很好的PR。

答案 1 :(得分:0)

不。 A不是Elixir中A.B的父模块。

模块的.仅是一个名称,您可以使用它来从字面上理解A是B的父模块。