一、常用过程宏库
一般来说,一个好的语言一定会提供一些强大的基础库,如C和C++,都有标准的库,这些库久经风雨。而Rust做为一门新语言,当然也必须有,同时,如果能发展一批第三方或者说爱好者提供的强有力的库,那么整个生态的建设也会迅速的展开,保证语言快速的向外溢出。比如c++的Boost库就号称标准库的预备队。第三方的库也是比比皆是。
对于宏编程,Rust中提供了几种过程宏的库操作支持,这个在前面提到过,即:
1、Syn
它是基于TokenStream的一种语法分析过程,它并不很强大,需要自定义扩展一些宏,比如Rust中的函数和闭包等。
2、Quote
应用比较简单,适合使用。
3、proc_macro2
更好的proc_macro更方便的接口,能和syn、quote一起更好的配合应用。
二、具体库的应用
下面看一下具体的实例应用:
1、Syn
//库配置
[dependencies]
syn = "1.0"
quote = "1.0"
[lib]
proc-macro = true
//代码
use proc_macro::TokenStream;
use quote::quote;
use syn::{parse_macro_input, DeriveInput};
#[proc_macro_derive(MyMacro)]
pub fn my_macro(input: TokenStream) -> TokenStream {
// Parse the input tokens into a syntax tree
let input = parse_macro_input!(input as DeriveInput);
// Build the output, possibly using quasi-quotation
let expanded = quote! {
// ...
};
// Hand the output tokens back to the compiler
TokenStream::from(expanded)
}
2、Quote
let type_definition = quote! {...};
let methods = quote! {...};
let tokens = quote! {
#type_definition
#methods
};
3、proc_macro2
extern crate proc_macro;
#[proc_macro_derive(MyDerive)]
pub fn my_derive(input: proc_macro::TokenStream) -> proc_macro::TokenStream {
let input = proc_macro2::TokenStream::from(input);
let output: proc_macro2::TokenStream = {
/* transform input */
};
proc_macro::TokenStream::from(output)
}
更多的详情可查看:
https://docs.rs/proc-macro2/1.0.30/proc_macro2/#structs
*记得要在配置文件中增加库的依赖啊!
三、总结
麻烦的不是Rust难或者学习曲线陡峭,麻烦的是没地方应用,技术型公司太少,大多数的公司对新技术的应用都持有观望的态度,除非能显著的提高开发的效率,否则想要引进一个新语言,新技术,全靠技术负责人的热情和相关人员的努力!
努力吧,归来的少年!