将 println 设为宏有什么好处?

What benefits are there with making println a macro?

在这段代码中,println后面有一个!

fn main() {
    println!("Hello, world!");
}

在我见过的大多数语言中,打印操作都是一个函数。为什么它是 Rust 中的宏?

作为程序宏,println!() 获得了以下能力:

  1. 自动引用其参数。例如这是有效的:

    let x = "x".to_string();
    println!("{}", x);
    println!("{}", x); // Works even though you might expect `x` to have been moved on the previous line.
    
  2. 接受任意数量的参数。

  3. 在编译时验证格式字符串占位符和参数是否匹配。这是 C 的 printf().

    的常见错误来源

None 可以使用简单的函数或方法实现。

另请参阅:

  • Is it possible to write something as complex as `print!` in a pure Rust macro?