elixir apply 结合 macro 一个方便的开发技巧
此玩法实际在Phoenix elixir 项目中使用比较多,以下是一个简单的示例
示例代码
- login.ex
defmodule Login do
def demoapp do
quote do
import unquote(__MODULE__)
end
end
def dalong do
IO.puts("dalong demo")
end
defmacro __using__(which) when is_atom(which) do
apply(__MODULE__,which,[])
end
end
- me.ex使用
说明此处use 使用login macro ,然后传递参数:demoapp 一个atom,然后会调用模块的demoapp 方法
demoapp 返回的是一个macro,自动会import 依赖
defmodule Me do
use Login,:demoapp
def demo() do
dalong()
end
end
- 效果
Phoenix 中的玩法
- 参考代码
默认Phoenix 项目入口entrypoint 中的一个router 方法,核心是提供了import 模块
def router do
quote do
use Phoenix.Router, helpers: false
# Import common connection and controller functions to use in pipelines
import Plug.Conn
import Phoenix.Controller
import Phoenix.LiveView.Router
end
end
方法dispatch定义(还是上边的代码中与我写的是一样的)
defmacro __using__(which) when is_atom(which) do
apply(__MODULE__, which, [])
end
说明
Phoenix 使用了不少macro 的玩法,利用了elixir 元编程能力,实现的功能还是很方便的,仔细分析,学好elixir 的基础还是很重要的
不然Phoenix一些使用就看起来看起来比较怪异
参考资料
https://hexdocs.pm/elixir/1.12.3/Kernel.html#apply/3
https://www.phoenixframework.org/