我是一个将一个函数注入调用模块的简单宏。
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为嵌套函数添加文档?
答案 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.