gpt4 book ai didi

rust - 允许 Rust 格式中未使用的命名参数!()系列

转载 作者:行者123 更新时间:2023-11-29 07:44:51 26 4
gpt4 key购买 nike

给定:

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
}

( Docs for concat! macro )

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


我认为这很容易出错,因为如果您忘记了 {reset},您控制台的其余部分将变为红色。我想知道为什么不写这样的东西:

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

log_red!("{}", "text");

关于rust - 允许 Rust 格式中未使用的命名参数!()系列,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/41841400/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com