我有一个通用加载器,用于从数据库中获取记录:
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
?
答案 0 :(得分:2)
您可以在__MODULE__
的{{1}}内使用quote
,并使用Loader.__using__
,Module.split/1
和Enum.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
但是,我建议不使用它并使用原始代码,因为它更明确,根据我的经验,我认为更加惯用。