Псевдоним вложенного модуля и родительского модуля - PullRequest
0 голосов
/ 07 сентября 2018

В настоящее время я пытаюсь создать псевдоним модуля (A) и модуля, вложенного в этот модуль (A.B). Есть ли способ сделать это в режиме онлайн?

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

defmodule C do
  alias A
  alias A.B
end

Ответы [ 2 ]

0 голосов
/ 07 сентября 2018

В Elixir нет понятия вложенных модулей. Модуль 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.B и A.B.C в пределах одного вызова:

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

Тот же синтаксис будет работать для Kernel.SpecialForms.require/2, Kernel.SpecialForms.import/2 и Kernel.use/2.

К сожалению, трюк с фигурными скобками не работает на верхнем уровне (alias {A, A.B} не сработает.) Может быть, это был бы хороший пиар для ядра Elixir.

0 голосов
/ 07 сентября 2018

Неа. A не является родительским модулем A.B в Elixir.

Модуль . - это только имя, и вы можете просто использовать его, чтобы понять буквально, что A является родительским модулем B.

...