Rust 学习笔记:关于宏的练习题
Rust 学习笔记:关于宏的练习题
参考视频:
- 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。