use anchor_lang::prelude::*;
use num_derive::*;
use num_traits::*;
declare_id!("Fg6PaFpoGXkYsidMpWTK6W2BeZ7FEfcYkg476zPFsLnS");
此处使用declare_id宏定义了Fg6PaFpoGXkYsidMpWTK6W2BeZ7FEfcYkg476zPFsLnS,这个ID对所有anchor工程都是一样的。让我们来看一下他的原型:
#[proc_macro]
pub fn declare_id(input: proc_macro::TokenStream) -> proc_macro::TokenStream {
let id = parse_macro_input!(input as id::Id);
proc_macro::TokenStream::from(quote! {#id})
}
#[macro_export]
macro_rules! quote {
() => {
$crate::__private::TokenStream::new()
};
($($tt:tt)*) => {
{
let mut _s = $crate::__private::TokenStream::new();
$crate::quote_each_token!(_s $($tt)*);
_s
}};
}
上面这几个宏定义就是declare!所有关联调用的宏了,那什么是宏?
简单地说,Rust宏让你可以发明自己的语法,编写出可以自行展开的代码, 也就是我们通常所说的元编程。Rust宏的基本运作机制就是:首先匹配宏规则中定义的模式,然后将匹配 结果绑定到变量,最后展开变量替换后的代码。
让我们看一下最简单的宏:
macro_rules! hellow_word {
() => {}
}
如果你有C语言宏的知识理解起来并不困难。
左边的小括号部分是Rust宏的匹配器/Matcher,用来匹配模式并捕捉变量,右边的大括号部分是Rust宏的转码器/Transcri