用于重复数组元素的 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];
如果您是 Rust 的声明性宏的新手,深入学习它们的首选资源是 The Little Book of Rust Macros。
我正在尝试编写一个 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];
如果您是 Rust 的声明性宏的新手,深入学习它们的首选资源是 The Little Book of Rust Macros。