在elixir中定义外部引用块的函数

时间:2017-09-16 09:51:50

标签: elixir metaprogramming ex-doc

我是一个将一个函数注入调用模块的简单宏。

defmodule MyModule do
  defmacro __using__(_opts) do
    quote do
      def run do
        IO.puts "Hello world"
      end
    end
  end
end

这是按预期工作的,但由于run函数嵌套在quote块中,我无法使用ExDoc添加文档。我也想在外面定义run函数,因为我觉得这会使代码看起来更好。像这样:

defmodule MyModule do
  def run do
    IO.puts "Hello world"
  end

  defmacro __using__(_opts) do
    quote do
       # Some code to inject the run function
    end
  end
end

我该怎么做呢?另外,如何使用ExDoc为嵌套函数添加文档?

1 个答案:

答案 0 :(得分:3)

您可以在defdelegate中使用quote,然后在主模块中定义run

defmodule MyModule do
  @doc """
  Prints "Hello world"
  """
  def run do
    IO.puts "Hello world"
  end

  defmacro __using__(_opts) do
    quote do
      defdelegate run, to: MyModule
    end
  end
end

defmodule A do
  use MyModule
end

A.run/0默认会获得一个自动生成的文档,该文档会将用户指向MyModule.run/0。如果需要,可以在@doc ""之前添加defdelegate来自定义。

iex(1)> MyModule.run
Hello world
:ok
iex(2)> A.run
Hello world
:ok
iex(3)> h(MyModule.run)

                                   def run()

Prints "Hello world"

iex(4)> h(A.run)

                                   def run()

See MyModule.run/0.