Rust 学习笔记:关于宏的练习题

Rust 学习笔记:关于宏的练习题

参考视频:

  1. https://www.bilibili.com/video/BV1bvLYzaEkn

问题一

以下代码能否通过编译?若能,输出是?

macro_rules! manylet {
    ( $( $i:ident), * = $e:expr ) => {
        $(
            let mut $i = $e;
        )*
    }
}

fn main() {
    let mut s = String::from("A");
    manylet!(x, y = s);
    x.push_str("B");
    println!("{x}{y}");
}

答:不能通过编译。

在这里插入图片描述

替换宏后,main 函数变为:

fn main() {
    let mut s = String::from("A");
    // manylet!(x, y = s);
    let mut x = s;
    x.push_str("B");
    println!("{x}{s}");
}

因为后面还要打印 s,所以将 s 的所有权交给 x 是不允许的。

问题二

下面哪些是选择使用过程性宏而不是声明性宏的合理理由?

A. 你的宏需要整个语法项(item)作为输入, 而不仅仅是一个表达式
B. 你希望生成可变长度的代码序列
C. 你想要集成 Rust 的 derive 系统
D. 你的宏需要对用户写的代码进行复杂的语法分析

答:C、D。

问题三

下列哪一项最准确地描述了过程性宏的输入?

A. 输入是一个抽象语法树(abstract syntax tree)
B. 输入是一个字节字符串
C. 输入是一个有类型的控制流图(typed control-flow graph)
D. 输入是一组标记(tokens)序列

答:D。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

UestcXiye

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值