当前位置: 首页 > news >正文

nodejs网站毕设代做关于华大18年专注seo服务网站制作应用开发

nodejs网站毕设代做,关于华大18年专注seo服务网站制作应用开发,crm管理系统销售,网站权重提升本人rust萌新,写web碰到了这个,基于ChatGPT和文心一言学了宏,强行把这玩意实现出来了,做个学习记录,如果有更好的方法,勿喷。 先看效果,注意不支持嵌套,且kv映射要用>(因为它这个…

本人rust萌新,写web碰到了这个,基于ChatGPT和文心一言学了宏,强行把这玩意实现出来了,做个学习记录,如果有更好的方法,勿喷。

先看效果,注意不支持嵌套,且kv映射要用=>(因为它这个只支持用箭头),即在这个宏语法内只支持单层kv,但是你可以传value为HashMap。
对此我曾尝试用#[proc_macro]TokenStream拿到变量名和值的方式实现正常使用花括号和冒号和深层字典,但是太菜了搞不会。
如果能基于我的想法实现出深层kv,欢迎评论区分享。

//第一个变量是msg,后面的全部存入data{key1:...,key2:...}
success!("success","key1"=> vec![1,2,3,4,5],"key2" =>"qwer","key3"=>String::from("value")
);

在这里插入图片描述

//第一个变量没了就是默认空msg,后面的全部存入data{key1:...,key2:...}
success!("key"=>"qwer","key2"=>1324,
);

在这里插入图片描述
fail!同理

rust中实现统一返回类有点麻烦,比如我想返回固定格式

{"success":true,"msg":"登录成功","data":{"id":15,"name":"qwer"}
}

我目前用的是actix-web,虽然支持直接传入结构体对象作为json返回值,但我有时候想对于data进行灵活的处理,不想建那么多结构体

这里我基于serde_jsonjson!进行进一步封装
这里一个宏里面写两个形式,因为要匹配传入msg和不传入msg的两种情形。最后一个$(,)?是允许最后一个多余的逗号,换行时好看一点

// 随便找个文件放
// 用了#[macro_export]的宏会直接放在crate下//下面三个库需要在使用下面宏的地方进行use,此处use没用
// use actix_web::web;
// use serde_json::json;
// use std::collections::HashMap;#[macro_export]
macro_rules! success {// 没有msg的情况($($key:expr => $value:expr),* $(,)?) => {{let mut resp = HashMap::new();resp.insert("success", json!(true));resp.insert("msg", json!("")); // 提供一个默认的消息let mut data:HashMap<String,Value> = HashMap::new();$(data.insert($key, json!($value));)*resp.insert("data",json!(data));web::Json(json!(resp))}};// 有msg的情况($msg:expr,  $($key:expr => $value:expr),* $(,)?) => {{let mut resp = HashMap::new();resp.insert("success", json!(true));resp.insert("msg", json!($msg)); // 提供一个默认的消息let mut data:HashMap<String,Value> = HashMap::new();$(data.insert($key, json!($value));)*resp.insert("data",json!(data));web::Json(json!(resp))}};
}#[macro_export]
macro_rules! fail {// 没有$msg的情况($($key:expr => $value:expr),* $(,)?) => {{let mut resp = HashMap::new();resp.insert("success", json!(false));resp.insert("msg", json!(""));let mut data:HashMap<String,Value> = HashMap::new();$(data.insert($key, json!($value));)*resp.insert("data",data);web::Json(json!(resp))}};// 有$msg的情况($msg:expr,  $($key:expr => $value:expr),* $(,)?) => {{let mut resp = HashMap::new();resp.insert("success", json!(false));resp.insert("msg", json!($msg));let mut data:HashMap<String,Value> = HashMap::new();$(data.insert($key, json!($value));)*resp.insert("data",json!(data));web::Json(json!(resp))}};
}

注意:过程宏需要定义在一个单独的crate中,主要是因为过程宏是一段在编译crate前,对其代码进行加工的代码,而这段是需要在编译后执行的。若是将定义过程宏和使用过程宏放到同一个crate中,就会陷入编译“死锁”:

另一个文件对其进行调用

// 注意是在crate下面的
use crate::success;
use actix_web::{get,web::{self, Json},
};
use serde_json::{json, Value};
use std::collections::HashMap;#[get("/login")]
async fn login() -> Json<Value> {let resp = success!("success","key1"=> vec![1,2,3,4,5],"key2" =>"qwer","key3"=>String::from("value"));resp
}

我理解的这个宏就是字符串替换,因为他是编译阶段处理的,所以宏所在rs文件的use是无效的,即使用了宏的文件需要对于宏使用的第三方库进行use,这个有点恶心,问题不大。

http://www.mmbaike.com/news/90691.html

相关文章:

  • 计算机学习网站百度seo指南
  • 公众号做成网站那样怎么做新闻热点最新事件
  • 招聘网站哪个好用关键词seo优化排名公司
  • 广州网站建设易企今天热搜榜前十名
  • photoshop手机版安卓汕头seo全网营销
  • 衡水做外贸网站建设百度网盟推广怎么做
  • 定制软件开发文案揭阳百度快照优化排名
  • 做网站市场报价黑马程序员培训机构在哪
  • 网站建设覀金手指科杰网络推广seo是什么
  • 建设手机移动网站google play 应用商店
  • 怎样做网站域名注册19
  • 做网站怎么插入表格廊坊百度关键词优化怎么做
  • 深圳平台型网站建设公司就在刚刚武汉宣布最新消息
  • 做网站会提供源代码百度刷seo关键词排名
  • 深圳微信商城网站设计价格百度域名购买
  • 软件技术专业介绍公布如何优化网络速度
  • php多语言网站怎么做网站排名快速提升工具
  • 做网站的 书籍怎么找到当地的微信推广
  • 久久建筑网可信吗郑州百度网站快速优化
  • 可以做反链的网站怎么快速优化网站
  • 天津建设项目验收公示网站建设网站的基本流程
  • 福州官网建站厂网络营销软文
  • 怎么做p2p网站微信群二维码推广平台
  • 这几年做那个网站能致富搭建网站的步骤
  • 云盘网站建设seo内部优化方案
  • 公司网站怎么做能被别人搜索到网上营销方式和方法
  • 怎么做快三一模一样的网站互联网seo是什么
  • 科技通信网站模板下载友链目录网
  • 如何个网站做优化郑州竞价托管
  • 西宁最好网站建设公司哪家好现在的seo1发布页在哪里