鉴于:

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");
    };
}

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

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

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

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

有没有可能只使用ignore个未使用的参数,而不是在它们上面出错?

推荐答案

如果 colored颜色 集都已知,则可以使用零长度参数"使用"它们:

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,polars CSV:有没有一种方法可以从impll BufRead(或任何字节迭代器)中读取CSV?

使用pyo3::Types::PyIterator的无限内存使用量

如何使用syn插入 comments ?

告诉Rust编译器返回值不包含构造函数中提供的引用

在本例中,为什么我不能一次多次borrow 可变变量?

在Rust中,Box:ed struct 与普通 struct 在删除顺序上有区别吗?

在 Rust 中,为什么 10 个字符的字符串的 size_of_val() 返回 24 个字节?

如何强制匹配的返回类型为()?

为什么 Rust 需要可变引用的显式生命周期而不是常规引用?

为什么编译器看不到这个 `From` impl?

通过写入 std::io::stdout() 输出不可见

Rust中的位移操作对范围有什么影响?

从 Rust 中的 if/else 中的引用创建 MappedRwLockWriteGuard

错误:将自定义 proc_macro 与用Rust 的宝贝编写的属性一起使用时,无法在此范围内找到属性

仅在运行测试时生成调试输出

为什么 match 语句对引用类型比函数参数更挑剔?

将文件的第一行分别读取到文件的其余部分的最有效方法是什么?

Rust 跨同一文件夹中文件的可见性

为什么这个闭包没有比 var 长寿?

需要括号的宏调用中的不必要的括号警告 - 这是编写宏的糟糕方法吗?