elixir macro defoverridable 功能
基于macro 的包装函数可以使用defoverridable 可以方便进行方法的重写
参考使用
- app.ex
defmodule App do
defmacro __using__(_options) do
quote do
def init do
IO.puts "do init"
end
def login do
IO.puts "do login"
end
def app_init do
init()
login()
end
defoverridable init: 0,login: 0
end
end
end
- demo.ex
defmodule Demo do
use App
def init() do
IO.puts "override do init"
end
end
- 效果
如果demo 中没有重写init 会输出
但是因为我们重写了init 方法,效果如下
说明
此方法还可以应用到Behaviour 中,phoenix 的pipeline 就使用了此方法
参考资料
https://blog.appsignal.com/2021/10/26/how-to-use-macros-in-elixir.html
https://hexdocs.pm/elixir/1.12/Kernel.html#defoverridable/1