/*更多请看:
http://blog.hubwiz.com/2020/01/30/rust-macro/
https://github.com/rooat/RustLearn/blob/master/src/appendix-04-macros.md
https://rustcc.gitbooks.io/rustprimer/content/macro/macro.html
https://rust-by-example.budshome.com/macros.html定义:Rust宏让你可以发明自己的语法,编写出可以自行展开的代码,也就是我们通常所说的元编程,你甚至可以用Rust宏来创作自己的DSL。从根本上来说,宏是一种为写其他代码而写代码的方式,即所谓的元编程运作机制:首先匹配宏规则中定义的模式,然后将匹配 结果绑定到变量,最后展开变量替换后的代码。调用方式:另外从形式上看,与函数调用的另一个区别是参数可以用圆括号(())、花括号({})、方括号([])中的任意一种括起来,比如这行也可以写成 println!["Hello, world!"] 或 println!{"Hello, world!"},不过对于 Rust 内置的宏都有约定俗成的括号,比如 vec! 用方括号,assert_eq! 用圆括号宏的分类:
声明式宏( declarative macro )来进行元编程(metaprogramming)
过程式宏( procedural macro )来自定义 derive traits() => {}看起来很神秘,因为它不是标准的rust语法,是macro_rules! 这个宏自己发明的,用来表示一条宏规则,=>左边是匹配模式,右边是 等待展开的代码rust 有哪些自带宏?
源文件 std/src/macros.rs
panic print println eprint eprintln dbg assert_approx_eq debug_assert debug_assert_eq debug_assert_ne matches r#try write writeln unreachable unimplemented todo compile_error format_args format_args_nl env option_env concat_idents concat line column file stringify include_str include_bytes
module_path cfg include assert asm llvm_asm global_asm log_syntax trace_macros
源文件 alloc/src/macros.rs
vec formatRust自带的声明宏:
常用的宏函数:assert, cfg, dbg, env, format, eprintln, println, panic, vec。
-------------------------------------------------------------------------------宏导入导出用 #[macro_use] 和 #[macro_export]。父模块中定义的宏对其下的子模块是可见的,要想子模块中定义的宏在其后面的父模块中可用,需要使用 #[macro_use]。*/use std::collections::HashMap;//-----------------------通用元编程的声明式宏 macro_rules!-------------------------//一个空的宏
macro_rules! hey{() => {}
}//可以定义多条宏规则  感觉就像函数重载
macro_rules! hey2{() => {};() => {}
}//其中name可以更改名字 expr不可更改
macro_rules! yo{($name:expr) => {println!("Yo {}!",$name);}
}//函数可以打印自己的名字
macro_rules! create_function {($func_name:ident) => (fn $func_name() {println!("function {:?} is called", stringify!($func_name))})
}//多参数的宏
macro_rules! hey3{($($name:expr),*) => {}
}//输入源是成对出现的 =>写法是宏规则定的,不可更改
macro_rules! hey4{($($key:expr => $value:expr), *) => {{let mut map = HashMap::new();$(map.insert($key, $value);) *map}}
}//看一个 vec! 稍微简化的定义
//注意:标准库中实际定义的 vec! 包括预分配适当量的内存。这部分为代码优化,为了让示例简化,此处并没有包含在内。
#[macro_export]
macro_rules! vec {( $( $x:expr ),* ) => {{let mut temp_vec = Vec::new();$(temp_vec.push($x);)*temp_vec}};
}//-----------------------自定义 derive 的过程式宏-------------------------
extern crate hello_macro;
#[macro_use]
extern crate hello_macro_derive;use hello_macro::HelloMacro;#[derive(HelloMacro)]
struct Pancakes;/*
hello_macro_derive存在的意义:其实我们完全不用hello_macro_derive也可以实现类似功能
然而,他们需要为每一个他们想使用 hello_macro 的类型编写实现的代码块。我们希望为其节约这些工作。
另外,我们也无法为 hello_macro 函数提供一个能够打印实现了该 trait 的类型的名字的默认实现:Rust 没有反射的能力,因此其无法在运行时获取类型名。我们需要一个在运行时生成代码的宏。extern crate hello_macro;
use hello_macro::HelloMacro;
struct Pancakes;
impl HelloMacro for Pancakes {fn hello_macro() {println!("Hello, Macro! My name is Pancakes!");}
}
*/
fn main() {//-----------------------通用元编程的声明式宏 macro_rules!-------------------------hey!();yo!("666666666666");yo!["666666666666"];yo!{"666666666666"};//yo!<"666666666666">; 前三种写法都是正确的,唯独这个不行create_function!(foo);foo();hey3! ("Finn", "Jake", "PB");let user = hey4! ("liujiayu" => 30,"liuyalin" => 31);println!("user {:?}",user);//-----------------------自定义 derive 的过程式宏-------------------------Pancakes::hello_macro();
}/*
-----------------------自定义 derive 的过程式宏依赖-------------------------
本包toml:
[dependencies]
hello_macro = { path = "./hello_macro" }
hello_macro_derive = { path = "./hello_macro/hello_macro_derive" }
------------------------------------------------------------------------------------
hello_macro包lib.rs:
/*
对于一个 foo 的包来说,一个自定义的派生过程式宏的包被称为 foo_derive
*/
pub trait HelloMacro {fn hello_macro();
}
----------------------------------------------------------------------------------
hello_macro_derive包lib.rs:
extern crate proc_macro;
extern crate syn;
#[macro_use]
extern crate quote;use proc_macro::TokenStream;#[proc_macro_derive(HelloMacro)]
pub fn hello_macro_derive(input: TokenStream) -> TokenStream {// Construct a string representation of the type definitionlet s = input.to_string();// Parse the string representationlet ast = syn::parse_derive_input(&s).unwrap();// Build the impllet gen = impl_hello_macro(&ast);// Return the generated implgen.parse().unwrap()
}fn impl_hello_macro(ast: &syn::DeriveInput) -> quote::Tokens {let name = &ast.ident;quote! {impl HelloMacro for #name {fn hello_macro() {println!("impl_hello_macro--->Hello, Macro! My name is {}", stringify!(#name));}}}
}
----------------------------------------------------------------------------------
hello_macro_derive包toml:
[lib]
proc-macro = true[dependencies]
syn = "0.11.11"
quote = "0.3.15"*/

34.rust宏.txt相关推荐

  1. 37.rust属性.txt

    ==================================================================================================== ...

  2. vba打开txt文件_VBA基础入门(34)读取txt文本文件

    对于这样的txt文本文件,我们怎么一行一行去读取数据呢? #00001 65536 *00001 65536 说说常用的两种方法,一种是把txt文本文档读到Excel中,然后获取最大行数,做个循环来遍 ...

  3. rust(34)-Rust and WebAssembly(2)

    WebAssembly (wasm)是一种简单的机器模型和可执行格式,具有广泛的规范.它被设计成便携.紧凑.以或接近本机速度执行. 作为一种编程语言,WebAssembly由两种表示相同结构的格式组成 ...

  4. Rust学习资料大全

    2021年接触了区块链,接触了波卡,接触了rust,接触了一个全新的世界,愿自己可以有一个好的发展,加油!!!rust语言是一门新兴起的编程语言,作为一个编程爱好者很想把他学精学透.但是一门编程语言没 ...

  5. 在Rust代码中编写Python是种怎样的体验?

    作者 | Mara Bos,Rust资深工程师 译者 | Arvin,编辑 | 屠敏 来源 | CSDN(ID:CSDNnews) 大约一年前,我发布了一个名为inline-python(https: ...

  6. rust实战入门到进阶(2)

    Cargo是构建系统和包装管理.大多数Rustaceans使用这个工具来管理他们的Rust项目,因为Cargo处理许多任务,比如构建代码.下载代码所依赖的库以及构建这些库. lxaipro@insta ...

  7. c++hello world代码_在 Rust 代码中编写 Python 是种怎样的体验?

    作者 | Mara Bos,Rust资深工程师译者 | Arvin 责编 | 屠敏头图 | CSDN 下载自东方 IC出品 | CSDN(ID:CSDNnews) 以下为译文: 大约一年前,我发布了一 ...

  8. python调用rust_在 Rust 代码中编写 Python 是种怎样的体验?

    本文为转载摘要,完整版请移步: https://mp.weixin.qq.com/s/YT_HNFDCQ_IyocvBkRNJnA 以下为译文: 大约一年前,我发布了一个名为inline-python ...

  9. max std value 宏_Rust Macro/宏 新手指南

    Rust语言最强大的一个特点就是可以创建和利用宏/Macro.不过创建 Rust宏看起来挺复杂,常常令刚接触Rust的开发者心生畏惧.这片文章 的目的就是帮助你理解Rust Macro的基本运作原理, ...

最新文章

  1. Spring+Quartz实现定时任务的配置方法
  2. 浏览器中的“Linux”
  3. [自定义区间-Range]书里的例子 - 中文数字类
  4. Spring松耦合的实现
  5. 推荐:学习自然语言处理(NLP)的学习方法和资料合集
  6. bzoj1997 [HNOI2010]平面图判定Plana
  7. python怎么用第三方库_python中第三方库的下载方法
  8. $.extend(true,{},a,b)解析
  9. 小白用GitHub快速搭建自己的网站,可访问,不用买域名、服务器
  10. 自学python免费教材-最好的Python入门教材是哪本?
  11. 第八篇: UpdateProgress 控件--显示正在处理中的信息
  12. 趣图:IT 项目的时间估算
  13. C++/CLR 使用(VS2012,VS2013,VS2015)编写
  14. 计算机组成原理课程设计:复杂模型机
  15. 软件测试基础知识总结
  16. jetbrains goland配置go开发环境
  17. Django中间件之csrf跨站请求伪造
  18. 数据中心机房建设中的关键问题都有哪些?
  19. GAIN: Missing Data Imputation using Generative Adversarial Nets学习笔记
  20. TCL作价5000万美元收购美国Novatel Wireless公司MIFI业务

热门文章

  1. 文件上传案例优化(文件命名循环接收多线程提高效率)
  2. 函数的嵌套调用-函数嵌套调用的执行线路图
  3. sas数据集怎么导出_利用SAS中的ODS导出程序结果数据集
  4. java11开源中国,Java 11 正式发布!
  5. php 微信机器人_微信小程序机器人自动客服功能
  6. 【报错笔记】maven项目启动时报错
  7. Java语言中的注释有哪些
  8. MAX3222/MAX3232/ MAX3237/MAX3241/串口通信中文_技术文档
  9. ElasticSearch6.5.0 【安装IK分词器】
  10. 官宣!极客邦科技获2000万元 A 轮融资,全面发力知识服务平台