首页 > 其他分享 >基于macro 仿写一个简单的ecto schema dsl

基于macro 仿写一个简单的ecto schema dsl

时间:2024-01-08 18:04:04浏览次数:41  
标签:__ do end name 仿写 macro dsl schema

ecto 的schema macro 是一个很方便的功能,可以用来定义表的schema 信息,以下是一个简单的仿写(只是行像,但是功能不一样)

项目代码

  • macro 定义
    e.ex

 

defmodule E do
   # 方便use 使用
  defmacro __using__(_options) do
    quote do
      import E
      # 通过属性存储信息
      Module.register_attribute(__MODULE__, :fields, accumulate: true)
    end
  end
  # schema macro 定义,与ecto 的类型,一个是schema 名称,一个是里边的代码定义(schema 的字段信息)
  defmacro schema(name,do: block) do
     # 调用一个内部的私有方法,返回macro,macro 方法然后使用
     schema(name,:dalong,block)
  end
  # filed macro, 进行schema 字段配置
  defmacro filed(name,type) do
    quote do
      name = unquote(name)
      type = unquote(type)
      # 存储到模块的属性中
      Module.put_attribute(__MODULE__, :fields, {name,type})
      # 为了方便测试,输出
      IO.inspect(Module.get_attribute(__MODULE__, :fields))
    end
  end
 
  defp schema(name,source,block) do
    quote  do
      source = unquote(source)
      name = unquote(name)
      # 类型ecto name 必须是一个binary  (string)
      unless is_binary(name) do
        raise "name must be a string"
      end
      IO.puts("source: #{source} name: #{name}")
      unquote(block)
   end
  end
end
使用
f.ex 与ecto 的基本类似
 
defmodule F do
  use E
  schema "dalong" do
    filed :name, :string
    filed :age, :ineteger
    filed :version, :string
  end
end
# 方便use 使用
  • 测试效果
iex -S mix

基于macro 仿写一个简单的ecto schema dsl_私有方法

说明

elixir 的元编程在不少框架中都有频繁的使用,学习好macro 很重要

参考资料

https://hexdocs.pm/ecto/Ecto.html#module-schema


标签:__,do,end,name,仿写,macro,dsl,schema
From: https://blog.51cto.com/rongfengliang/9148163

相关文章

  • elixir apply 结合 macro 一个方便的开发技巧
    此玩法实际在Phoenixelixir项目中使用比较多,以下是一个简单的示例示例代码login.exdefmoduleLogindodefdemoappdoquotedoimportunquote(__MODULE__)endenddefdalongdoIO.puts("dalongdemo")enddefmacro__using__(which)whenis_......
  • elixir macro defoverridable 功能
    基于macro的包装函数可以使用defoverridable可以方便进行方法的重写参考使用app.exdefmoduleAppdodefmacro__using__(_options)doquotedodefinitdoIO.puts"doinit"enddeflogindoIO.puts"dologin"end......
  • SpringBoot+JaywayJsonPath实现Json数据的DSL(按照指定节点表达式解析json获取指定数
    场景若依前后端分离版手把手教你本地搭建环境并运行项目:若依前后端分离版手把手教你本地搭建环境并运行项目_前后端分离项目本地运行在上面搭建SpringBoot项目的基础上,并且在项目中引入fastjson、hutool等所需依赖后。JaywayJsonPath:GitHub-json-path/JsonPath:JavaJsonPathi......
  • vue中使用Vue.extend方法仿写一个loading加载中效果
    需求描述本文我们使用vue的extend方法实现一个全屏loading加载效果,需求如下:通过命令就可以让弹框开启或关闭,比如this.$showDialog()开启,this.$hideDialog()关闭方法可以传参更改loading中的文字也可以传参更改loading背景色当然这里除了文字,背景色什么的,也可以传递更多的参......
  • 分布式进阶-链路追踪SpringCloudSleuth、Zipkin【实战篇】
    一、前言我们在使用微服务的时候,往往设计到各个微服务之间的调用,肯定会存在深度的调用链路,如果出现BUG或者异常,就会让问题定位和处理效率非常低。有了Sleuth,就可以帮助我们记录、跟踪应用程序中的请求和操作。通常与Zipkin配合使用,从而提供更全面的可视化应用程序跟踪和分析功......
  • 直播软件app开发,仿写导航栏快速实现页面导航
    直播软件app开发,仿写导航栏快速实现页面导航physics和dragStartBehavior属性的应用示例: CopycodeTabBarView( controller:_tabController, physics:NeverScrollableScrollPhysics(),//禁用滚动 dragStartBehavior:DragStartBehavior.down,//垂直滚动 children......
  • Jayway JsonPath-提取JSON文档内容的Java DSL | 京东物流技术团队
    介绍JsonPath是一种能够提取部分JSON文档属性、对象、数组的语法,支持条件过滤、数学运算、字符串处理等功能。JsonPath与JSON文档就像XPath表达式与XML文档结合使用一样。由于JSON结构通常是匿名的,并不一定和XML一样具有“根成员对象”,因此JsonPath假定分配$给外层对象的抽......
  • Querydsl 使用和工具类
    Querydsl简化使用1、在使用Querydsl时,需要定义EntityManagerEntityManagerFactory会存在许多重复性的代码,下面将使用进行归口,减少重复的引入操作importcom.blazebit.persistence.Criteria;importcom.blazebit.persistence.CriteriaBuilderFactory;importcom.blazebit.pe......
  • nuclei 快速&可自定义的基于DSL的漏洞扫描工具
    nuclei是基于golang开发的,可以使用基于yaml定义的dsl,支持扫描不少协议(tcp,dns,http,ssl,file,whois,websocket,headless,以及code)同时nuclei也提供了不少模版可以方便快速使用说明nuclei使用简单,主要包含两步,定义yaml文件,运行,同时提供了大量可用的模版是一个很不错的安全工具,很值......
  • Slint 的两个核心 macro
    slint::include_modules!要使用这个库,首先需要在Cargo.toml中完成:[package]部分增加build="build.rs"[build-dependencies]部分增加slint-build="1.1.1"[1]随后,应该在与Cargo.toml同级的目录创建build.rs,其内容为(示例):fnmain(){slint_build::compile("ui/appw......