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

商城网站制作多少钱宁波专业做网站的公司哪家好

商城网站制作多少钱,宁波专业做网站的公司哪家好,建设工程交易中心是什么,网站做端口映射用过 java spring 的同学#xff0c;应该会对 AspectJ 的 前置、后置、环绕 增强 念念不忘#xff0c;巧了 rust 也有类似能力#xff0c;稍显不同的是#xff0c;为了向 “零成本抽象” 靠齐#xff0c;Rust 的 “增强” 是在编译期 完成的。 编译期生成#xff0c;则离…  用过 java spring 的同学应该会对 AspectJ 的 前置、后置、环绕 增强 念念不忘巧了 rust 也有类似能力稍显不同的是为了向 “零成本抽象” 靠齐Rust 的 “增强” 是在编译期 完成的。 编译期生成则离不开 “宏”本篇使用 “过程宏” 来实现 AOP 的代理增强逻辑比较简单记录函数的运行时间。 重要的点 Rust 过程宏要求放入独立的 “项目” or “包” 中。原因过程宏必须先被编译才能使用和项目代码放在一起也要先编译 “宏”但 rust 编译单元是 “包”而无法做到这一点。 创建项目 创建一个 lib 项目 cargo new elapsed --lib将项目 描述为 macro宏项目 [lib] proc-macro true[dependencies] quote 1 syn { version 2.0.58, features [full] }syn解析语法树AST、及各种语法构成quote使用 解析结果生成rust代码实现想要的功能 实现“宏增强”逻辑 Rust 继续要求宏声明必须在 crate root 下即 lib.rs 中。 但为使结构清晰可以在 crate root ( src/lib.rs ) 中只做声明而在其他 mod 中具体实现 elapsed/src/lib.rs use proc_macro::TokenStream;mod elapsed;#[proc_macro_attribute] #[cfg(not(test))] pub fn elapsed(args: TokenStream, func: TokenStream) - TokenStream {elapsed::elapsed(args, func) }elapsed/src/elapsed.rs use proc_macro::TokenStream; use quote::quote; use syn::ItemFn; use syn::parse_macro_input;pub(crate) fn elapsed(_attr: TokenStream, func: TokenStream) - TokenStream {let func parse_macro_input!(func as ItemFn);let func_vis func.vis; // like publet func_block func.block; // { some statement or expression here }let func_decl func.sig;let func_name func_decl.ident; // function namelet func_generics func_decl.generics;let func_inputs func_decl.inputs;let func_output func_decl.output;let caller quote! {#func_vis fn #func_name #func_generics(#func_inputs) #func_output {use std::time;let start time::Instant::now();#func_blockprintln!(time cost {:?}, start.elapsed());}};caller.into() }简单解释 pub(crate) 指定该函数仅在当前crate中可见parse_macro_input!(func as ItemFn) 将 AST Token 转为函数定义 func 随后获取了函数的各个部分 vis可见性block函数体func.sig函数签名 ident函数名generics函数声明的范型inputs函数入参output函数出参 最后通过 quote! 创建了一个新的 rust 代码块 caller.into 将结果转换为编译器可识别的内容TokenStream 。 测试运行 到另外的工程引入本项目并使用该过程宏。 [dependencies] elapsed { path ../elapsed }本例中该 #[elapsed] 只能加在同步方法上加在异步方法上会破坏方法的异步性导致报错。 #[elapsed] fn demo(t: u64) {let secs Duration::from_secs(t);thread::sleep(secs); }fn main() {demo(4);demo(2); }运行后可得 time cost 4.004699342s time cost 2.003885116s另 cargo-expand可查看 方法 经宏展开 替换后的样子 cargo install cargo-expand cargo expand#![feature(prelude_import)] #[prelude_import] use std::prelude::rust_2018::*; #[macro_use] extern crate std; use my_macro::elapsed; use std::thread; use std::time::Duration; fn demo(t: u64) {use std::time;let start time::Instant::now();{let secs Duration::from_secs(t);thread::sleep(secs);}{::std::io::_print(::core::fmt::Arguments::new_v1([time cost , \n],[::core::fmt::ArgumentV1::new_debug(start.elapsed())],),);}; } fn main() {demo(4);demo(2); }总结 通过 syn 和 quote可以在编译期操纵整个 rust 代码的 AST 树为功能编写、甚至框架封装提供了更多可能 完事拜了个 bye 参考资料 如何编写一个过程宏(proc-macro)Rust过程宏系列教程 | Proc Macro Workshop 之 Builder 实现https://github.com/dtolnay/proc-macro-workshop/Macro 宏编程https://jasonkayzk.github.io/2022/11/25/Rust%E5%8F%8D%E5%B0%84%E4%B9%8B%E8%BF%87%E7%A8%8B%E5%AE%8F/
http://www.eeditor.cn/news/121515/

相关文章:

  • 免费网站空间可上传网站建站历史查询
  • 深圳网站制作网络建设公司网络广告的类型
  • 深圳做网站外包公司有哪些企业小程序开发公司
  • 文登建设局网站网站建设费 账务处理
  • 做网站属于广告公司吗有效的网站建设
  • 中国建设银行遵义市分行网站网站如何做水晶按钮
  • 雷州网站地方门户系统 哪家好
  • 济南建设网站的公司蓬莱市住房和规划建设管理局网站
  • 购买的网站怎么看网站空间大小wordpress cookies
  • 关于com的网站外贸网站首页
  • 厦门建设与管理局网站wordpress不用缓存
  • 代做土木毕业设计网站网站加产品分类
  • 网站开发课程学习仓储设备东莞网站建设
  • 开发公司工程部经理述职报告做网站优化的话术
  • 房地产电商网站建设上海自贸区注册公司
  • 邯郸公司做网站如何创建wordpress数据库
  • 相亲网站什么叫网落营销
  • 用vps建网站备案长沙企业网站seo
  • 河南联通 网站备案商标设计怎么收费
  • 王建设个人网站数字营销是什么专业
  • 网站访问量统计工具做交通锁具网站碟刹锁
  • 请上传网站应用水印图片光伏电站建设的行业网站
  • 辽阳县住房和城乡建设局网站投资管理公司注册条件和要求
  • wordpress加关键词成都seo整站
  • 做网站的的广告词做影视网站违法不
  • 网站建设公司推荐乐云seowordpress 手机 自适应
  • 园岭中小网站建设株洲企业网站建设工作
  • 网站建设网站建设教程重庆网站开发哪家专业
  • python做电子商务网站建设银行假网站首页
  • 如何手机网站建立北京网站设计建设