如何访问Elixir中的父模块?

时间:2016-04-26 08:11:40

标签: elixir

我有一个通用加载器,用于从数据库中获取记录:

defmodule Loader do
  defmacro __using__(opts) do
    quote location: :keep, bind_quoted: [schema: opts[:schema]] do

      def one(id), do: unquote(schema) |> Repo.get(id)
      def all,     do: unquote(schema) |> Repo.all
    end
  end
end

特定模式的特定加载器:

defmodule Location.Loader do
  use Loader, schema: Location
end

有没有办法以某种其他方式与“used”模块通信,例如__MODULE__.parent

1 个答案:

答案 0 :(得分:2)

您可以在__MODULE__的{​​{1}}内使用quote,并使用Loader.__using__Module.split/1Enum.drop/2获取父级模块。

Module.concat/1

打印

defmodule Loader do
  defmacro __using__(opts) do
    quote location: :keep, bind_quoted: [schema: opts[:schema]] do
      @parent_module __MODULE__ |> Module.split |> Enum.drop(-1) |> Module.concat
      def one(id), do: IO.puts("#{@parent_module}:one:#{id}")
      def all,     do: IO.puts("#{@parent_module}:all")
    end
  end
end

defmodule Location.Loader do
  use Loader
end

Location.Loader.one 123
Location.Loader.all

但是,我建议使用它并使用原始代码,因为它更明确,根据我的经验,我认为更加惯用。