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

信丰网站制作商机网网站源码

信丰网站制作,商机网网站源码,114网址大全,拷问wordpress前言 rust 学习曲线非常陡峭#xff0c;但是基本语法也还算挺好理解#xff0c;自动内存管理有点类似智能指针#xff0c;基本看一下语法入门就可以大概理解#xff0c;但是唯独宏很难理解#xff0c;语法非常晦涩。但是功能非常强大。声明宏类似于c语言的宏处理#xf…前言 rust 学习曲线非常陡峭但是基本语法也还算挺好理解自动内存管理有点类似智能指针基本看一下语法入门就可以大概理解但是唯独宏很难理解语法非常晦涩。但是功能非常强大。声明宏类似于c语言的宏处理但是功能更强大。过程宏则类似于Android的注解编程自定义AbstractProcessor但是实现更优雅。 下面记录一下宏处理的一些特点 正文 目前主流的文章都是翻译自官方文档或者取部分Rust语言圣经关键的部分特性就确实只有rust宏详解中非常详细的介绍这里简要记录一下特点 声明宏 声明宏主要是替代主要是通过简单的模式匹配然后进行操作这貌似非常容易处理面向对象的工厂模式或者解决方法多参数操作比如 macro_rules! vec {() ($crate::__rust_force_expr!($crate::vec::Vec::new()));($elem:expr; $n:expr) ($crate::__rust_force_expr!($crate::vec::from_elem($elem, $n)));($($x:expr), $(,)?) ($crate::__rust_force_expr!([_]::into_vec(// This rustc_box is not required, but it produces a dramatic improvement in compile// time when constructing arrays with many elements.#[rustc_box]$crate::boxed::Box::new([$($x),])))); }这就是根据不同的匹配模式的前半部分替换成后半部。比如无参数的vec。因为这是系统接口这里不在详细介绍操作只介绍匹配 ()是无参构造函数。($elem:expr; $n:expr)这是匹配模式类似vec![1;5],这是创造一个size是5的值是1的vec。这个是匹配vec![1, 2, 3]这是构造一个内容是1、2、3的vec 第二个匹配模式中$elem是为匹配的内容命名方便后面使用expr一个表达式 (expression)指明匹配的元素就不用解释就是字面值。$n:expr同样道理。 第二个匹配则稍微复杂一些这里则用的是循环模式。循环是通过$(....)来指明的括号内为循环内容为了方便阅读则需要有分隔符和循环次数这里是通过定义分隔符定义循环至少一次。$(,)?又是一个循环循环内容则是。而循环一次则是最多一次。 所有的语句如下 block一个块比如一块语句或者由大括号包围的一个表达式 expr一个表达式 (expression) ident一个标识符 (identifier)包括关键字 (keywords) item一个条目比如函数、结构体、模块、impl 块 lifetime一个生命周期注解比如 foo、static literal一个字面值比如 “Hello World!”、3.14、‘’ meta一个元信息比如 #[…] 和 #![…] 属性内部的东西 pat一个模式 (pattern) path一条路径比如 foo、::std::mem::replace、transmute::_, int stmt一条语句 (statement) tt单棵标记树 ty一个类型 vis一个可能为空的可视标识符比如 pub、pub(in crate) 循环则如下 反复捕获的一般形式为 $ ( … ) sep rep。 $ 是字面上的美元符号标记 ( … ) 是被反复匹配的模式由小括号包围。 sep 是可选的分隔标记。它不能是括号或者反复操作符 rep。常用例子有 , 和 ; 。 rep 是必须的重复操作符。当前可以是 ?表示最多一次重复所以此时不能前跟分隔标记。*表示零次或多次重复。表示一次或多次重复。 过程宏 分为三类 派生宏Derive macro用于结构体struct、枚举enum、联合union类型可为其实现函数或特征Trait。属性宏Attribute macro用在结构体、字段、函数等地方为其指定属性等功能。如标准库中的#[inline]、#[derive(…)]等都是属性宏。函数式宏Function-like macro用法与普通的规则宏类似但功能更加强大可实现任意语法树层面的转换功能。 声明宏需要解析传入的参数进行匹配而过程宏则需要自己解析传入的内容然后进行补充生成代码。这里需要解析TokenStream举个例子就是用宏为一个结构体实现构建者模式。 #[derive(Builder)] struct Command {// ... }最麻烦的是如何实现Builder #[derive(Builder)] struct Command {input_paht: String,// ... }pub fn derive_builder(input: TokenStream) - TokenStream {let input parse_macro_input!(input as DeriveInput); // 解析input为 DeriveInput类型let input_ident input.ident; // 获取原始类名let ident_builder format_ident!({}Builder, input_ident.to_string()); // 拼接builder类名if let Data::Struct(r) input.data { // 处理结构体let fields r.fields;// 结构体属性声明let builder_fields map_fields(fields, mut |(ident, ty)| {quote!(#ident: Option#ty,) });// 为builder增加set函数let builder_set_fields map_fields(fields, mut |(ident, ty)| {quote!(pub fn #ident(mut self, value: #ty) - Self {self.#ident Some(value);self}) });// 获取builder的属性值let builder_lets map_fields(fields, mut |(ident, _)| {quote!(let #ident self.#ident.ok_or(format!(field {:?} not set yet, stringify!(#ident),))?;)});// 初始化时的默认值let builder_fields_values map_fields(fields, mut |(ident, _)| {quote!(#ident,)});quote!(impl #input_ident {pub fn builder() - #ident_builder {#ident_builder::default()}}#[derive(Default)]pub struct #ident_builder {#builder_fields}impl #ident_builder {#builder_set_fieldspub fn build(self) - Result#input_ident, String {#builder_letsOk(#input_ident{ #builder_fields_values })}}).into()} else {// 不支持非struct类型quote!().into()} }fn map_fieldsF(fields: Fields, mapper:mut F) - TokenStream2 whereF: FnMut((Optionproc_macro2::Ident , Type)) - TokenStream2, {let fs fields.iter().map(|field| mapper((field.ident ,field.ty)) );let stream2 TokenStream2::from_iter(fs);stream2 }这里为Command实现了builder方法如下 impl Command{pub fn builder() - CommandBuilder{CommandBuilder::default()} }pub struct CommandBuilder{input_path: String, }impl CommandBuilder{pub fn (mut self, value: String) - Self {self.input_path Some(value);self}pub fn build(self) - ResultCommand, String {let input_path self.input_path.ok_or(format!(field {:?} not set yet, stringify!(input_path),))?;Ok(Command{ input_path })}}属性宏则可以传入参数让控制更自由一些这里就不在详细介绍 函数式宏则相对比较简单类似声明宏但是可以不去匹配规则更自由功能更强大。 解析TokenStream需要依赖一些库这比较复杂就不在详细介绍。要结合自己代码需求慢慢理解。 分析工具 cargo.exe install cargo-expandcargo.exe expand后记 rust实在是复杂这里解释一些语法规则以后遇到问题再补充。
http://www.pierceye.com/news/360764/

相关文章:

  • 苏州哪家做网站好些推广之家app
  • 网站开发计入管理费用哪个明细对网站建设的调研报告
  • 南头专业的网站建设公司wordpress数据量大网站访问
  • 龙华民治网站建设公司wordpress设置vip
  • 网站建设天猫店免费主机空间
  • 帮网贷做网站会判刑吗学it要多久多少学费
  • 陕西网站建设维护erp软件怎么安装
  • 沈阳网站建设简维软件工程在网站建设
  • 万维网网站续费云南建设厅网站执业注册
  • 判断网站首页民宿设计网站大全
  • .net如何建设网站做影视会员网站
  • 织梦网站安全免费咨询医生皮肤科专家
  • dw做网站背景图片设置网站建设设计作品怎么写
  • 网站建设推广专员岗位职责济南做企业网站公司
  • 网站不备案能解析吗合肥网站推广 公司哪家好
  • 网站描述怎样写深圳网站制作招聘
  • 二手车网站建设代理网页 国外
  • 广州制作网站静态网站首页更新
  • 个人网站用什么服务器宁波网站建设制作哪家好
  • 视频模板网站企业所得税优惠政策2022年
  • 坪山附近公司做网站建设哪家效益快wordpress 置顶 插件
  • 品牌网站建设服务机构内容网站管理系统
  • 电商网站建设基础ppt个人简单网站页
  • 移动端网站模板专业建站工作室
  • 企业网站建设的重要性及意义建设银行忘记密码网站首页
  • 易雅达网站建设公司广告设计公司设计收费标准
  • 行业门户网站php网站开发程序
  • 广州微信网站建设报价表上海注销营业执照流程
  • 陕西省建设执业资格注册中心网站科技有限公司 翻译
  • 做推广都有哪些网站网站怎么上传源码