在该代码中,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's printf()常见的错误源.

这些都不可能通过简单的函数或方法实现.

另见:

Rust相关问答推荐

是否有可能同时避免不兼容的不透明类型和代码重复?

通过解引用将值移出Box(以及它被脱糖到什么地方)?

为什么允许我们将可变引用转换为不可变引用?

捕获FnMut闭包的时间不够长

在我的Cargo 中,当我在建筑物中使用时,找不到我可以在产品包中使用的 crate .r我如何解决这个问题?

为什么基于高山Linux的Docker镜像不能在绝对路径下找到要执行的命令?

Trait bound i8:来自u8的不满意

通过RabbitMQ取消铁 rust 中长时间运行的人造丝任务的策略

在Rust中克隆源自INTO_ITER()的迭代器的成本?

失真图像图形捕获Api

是否提供Bundle 在可执行文件中的warp中的静态文件?

为什么 tokio 在以奇怪的方式调用时只运行 n 个任务中的 n-1 个?

Rust 中的静态引用

try 从标准输入获取用户名和密码并删除 \r\n

Option<&T> 如何实现复制

中文优化标题:跳出特定循环并返回一个值

push 方法是否取得所有权?

如何刷新 TcpStream

Rust 异步和 AsRef 未被发送

如何从 Rust 中不同类型的多个部分加入 Path?