solana开发框架anchor入门工程tic_tac_toe源码解析(一,RUST宏)

本文深入解析Rust宏,包括declare_id的用途,宏的基本运作机制,如匹配器/Matcher和转码器/Transcriber。讨论了不同类型的宏选择器,并通过示例解释了如何处理多个变量。文章还介绍了Rust的三种程序宏:Function-like macros、Derive macros和Attribute macros,特别关注了derive宏如何为结构体或枚举引入trait。
摘要由CSDN通过智能技术生成
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

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值