首页 > 其他分享 >elixir apply 结合 macro 一个方便的开发技巧

elixir apply 结合 macro 一个方便的开发技巧

时间:2024-01-08 18:01:59浏览次数:30  
标签:__ do end Phoenix macro demoapp elixir apply import

此玩法实际在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
def demoapp do
  • me.ex使用
    说明此处use 使用login macro ,然后传递参数:demoapp 一个atom,然后会调用模块的demoapp 方法
    demoapp 返回的是一个macro,自动会import 依赖

 


 
defmodule Me do
  use Login,:demoapp
  def demo() do
      dalong()
  end
end
  • 效果

elixir  apply 结合 macro 一个方便的开发技巧_传递参数

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
quote do

方法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/

标签:__,do,end,Phoenix,macro,demoapp,elixir,apply,import
From: https://blog.51cto.com/rongfengliang/9148271

相关文章

  • elixir macro defoverridable 功能
    基于macro的包装函数可以使用defoverridable可以方便进行方法的重写参考使用app.exdefmoduleAppdodefmacro__using__(_options)doquotedodefinitdoIO.puts"doinit"enddeflogindoIO.puts"dologin"end......
  • wasmex webassenbly elixir 运行时
    wasmex是基于wasmtime以及rustnif开发的方便elixir运行webassembly的框架与rust的集成与rust集成使用的三方包 与mjml工具类似使用了rustler_precompiled以及rustlerrust使用的三方包 前边也说了是基于了wasmtime包装的,同时使用了wasmtimewasi一些子模块说明rustle......
  • JavaScript——函数的call、apply、bind方法
    JavaScript的函数拥有三个方法:callapplybind这三个方法都可以改变函数被调用时,函数内部this的指向。至于区别,阅读下面代码即可一目了然:functionmyCall(context){constargs=[...arguments].slice(1)letresultcontext=context?context:window......
  • elixir erlang 简单调用学习
    实际上基于elixir的mix进行erlang以及elixir的互调用开发处理是很方便的,mix直接就包含了构建erlang代码同时对于代码的互调用,只要使用符合语言格式要求就行了,以下是一个简单的互调用学习项目准备项目结构 ├──README.md├──lib│├──a.e......
  • rebar3 集成elixir 模块
    社区包含了一个rebar3的elixirmix插件,可以方便rebar使用elixir模块参考使用rebar.config配置{erl_opts,[debug_info]}.{deps,[%添加引用{decimal,"2.0.0"}]}.{shell,[{apps,[basic]}]}.%添加插件{plugins,[rebar_mix]}.{provider_hooks,[{......
  • elixir mjml_nif 试用
    mjml_nif是使用rustler包装的mrml基于了erlang的nif接口实现的elixir模块,同时为了方便预编译nif的使用,使用了rustler_precompiled,以下是一个简单的试用项目试用添加依赖defpdepsdo[{:mjml,"~>3.0"}]end代码集成lib/mail/rong.mail.exdefmoduleRo......
  • JavaScript的apply、call、bind方法
    JavaScript的apply、call、bind方法概述简述这三个方法存在一定的迷惑性,而且对于刚看ES6的人来说,十分难理解,这里为了以后我可能会复习到这个知识点,做出详解。总的来说,这三个方法都是将某某某(某01)绑定在某某某(某02)上,然后执行这个被绑定的某某某(某01),或者单纯就是绑定不执行。详......
  • elixir mjml_nif 试用
    mjml_nif是使用rustler包装的mrml基于了erlang的nif接口实现的elixir模块,同时为了方便预编译nif的使用,使用了rustler_precompiled,以下是一个简单的试用项目试用添加依赖 defpdepsdo[{:mjml,"~>3.0"}]end代码集......
  • rebar3 引用本地elixir 模块
    前边简单说过基于rebar_mix使用elixir模块,但是使用的模块是三方的,如果时候我们可以需要使用自己的就可以使用本地git项目,或者搭建自己的私服git,以下是一个简单使用项目准备本地elixirmix项目一个基于mixcli创建的项目,同时进行gitinit mixnewlogingit......
  • rebar3 集成elixir 模块
    社区包含了一个rebar3的elixirmix插件,可以方便rebar使用elixir模块参考使用rebar.config配置{erl_opts,[debug_info]}.{deps,[%添加引用{decimal,"2.0.0"}]}. {shell,[{apps,[basic]}]}. %添加插件 {plugins,[......