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/
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 全程不用写代码,我用AI程序员写了一个飞机大战
· DeepSeek 开源周回顾「GitHub 热点速览」
· 记一次.NET内存居高不下排查解决与启示
· MongoDB 8.0这个新功能碉堡了,比商业数据库还牛
· .NET10 - 预览版1新功能体验(一)
2023-01-03 nginx-clojure 调试简单试用
2023-01-03 dremio 表函数简单说明
2023-01-03 nginx-clojure java 集成试用
2023-01-03 apache drill 提供的physical-operators 以及说明
2023-01-03 dremio 数据存储结构示例
2022-01-03 castled 运行试用
2022-01-03 反向ETL 一些参考知识