允许 Rust 格式的未使用的命名参数!() 家庭



给定:

format!("{red}{}{reset}", "text", red = "RED", blue = "BLUE", reset = "RESET");

编译器退出时出现错误:

error: named argument never used
--> example.rs:1:47
|
1 |         format!("{red}{}{reset}", "text", red = "RED", blue = "BLUE", reset = "RESET");
|                                                        ^^^^^^^^^^^^^

通常情况下,这不会是一个问题,因为blue应该被删除,但我的用例是一个包装宏(简化):

macro_rules! log {
($fmt:expr, $($arg:tt)*) => {
println!($fmt, $($arg)*, blue = "BLUE", red = "RED", reset = "RESET");
};
}

有时,它是这样使用的(简化),但其他时候使用不同的颜色,你会得到要点:

log!("{red}{}{reset}", "text");

编译器退出时出现类似错误:

error: named argument never used
--> example.rs:3:26
|
3  |         println!($fmt, $($arg)*, blue = "BLUE", red = "RED", reset = "RESET");
|                                  ^^^^^^^^^^^^^

是否可以忽略未使用的参数,而不是在它们上出错?

如果颜色集都是已知的,您可以使用零长度的参数"消耗"它们:

macro_rules! log {
($fmt:expr, $($arg:tt)*) => {
println!(concat!($fmt, "{blue:.0}{red:.0}{reset:.0}"),  // <--
$($arg)*,
blue="BLUE", 
red="RED", 
reset="RESET")
}
}
fn main() {
log!("{red}{}{reset}", "<!>");
// prints: RED<!>RESET
}

(concat!宏的文档)

请注意,字符串BLUEREDRESET仍将被发送到格式化函数,因此即使不打印任何内容,也会产生较小的开销。


我认为这很容易出错,因为如果你忘记了{reset},你的控制台的其他部分就会变成红色

macro_rules! log_red {
($fmt:expr, $($arg:tt)*) => {
println!(concat!("RED", $fmt, "RESET"), $($arg)*);
}
}
// also define `log_blue!`.
log_red!("{}", "text");

最新更新