用于重复数组元素的 Rust 宏

Rust macro for repeating array elements

我正在尝试编写一个 Rust 宏,用重复元素填充数组,在本例中为零。这是我想出的:

macro_rules! pad4  {
    () => {
        println!("0b00000000, 0b00000000, 0b00000000, 0b00000000");
    }
}

const arr: [u8; 8] = [pad4!(), 0b01111100, 0b10000010, 0b00000010, 0b01111110];

但我收到以下错误:

expected `u8`, found `()`

Rust 宏不是简单的字符串替换,它们对已解析的标记进行模式匹配,并且必须 return 在调用宏的上下文中有效的 Rust 语法。

您当前的宏:

macro_rules! pad4  {
    () => {
        println!("0b00000000, 0b00000000, 0b00000000, 0b00000000");
    }
}

在此上下文中调用:

const arr: [u8; 8] = [pad4!(), 0b01111100, 0b10000010, 0b00000010, 0b01111110];

展开为:

const arr: [u8; 8] = [
    {
        println!("0b00000000, 0b00000000, 0b00000000, 0b00000000");
    },
    0b01111100,
    0b10000010,
    0b00000010,
    0b01111110,
];

这就是您收到错误的原因,因为数组 returns () 中的第一个表达式块而不是预期的 u8.

您可以使用例如cargo expand 轻松查看宏展开的结果。


这里是pad4,但写的方式行之有效:

macro_rules! pad4 {
    [$($e:expr),*] => {
        [0b00000000, 0b00000000, 0b00000000, 0b00000000, $($e,)*]
    }
}

const arr: [u8; 8] = pad4![0b01111100, 0b10000010, 0b00000010, 0b01111110];

playground

如果您是 Rust 的声明性宏的新手,深入学习它们的首选资源是 The Little Book of Rust Macros