Rust 语言入门(一):打印与格式化输出
对于初学者来说,掌握 Rust 的基本 I/O 操作是入门的第一步。本篇博客将介绍 Rust 语言的打印机制,包括基本的 print!
、println!
宏,格式化输出方式,并探讨其底层原理。
Rust 的基本打印
在 Rust 中,最常见的输出方式是使用 println!
和 print!
宏。
fn main() {
println!("Hello, world!");
}
println!
和 print!
println!
:带换行符的输出,相当于 C 语言的printf("...\n");
print!
:不带换行符,需要手动添加\n
示例:
fn main() {
print!("Hello, ");
println!("world!");
}
输出:
Hello, world!
格式化输出
Rust 提供了强大的格式化输出功能,通过 {}
占位符实现。常见的格式化方式有:
1. 基本格式化
fn main() {
let name = "Rust";
let version = 1.73;
println!("{} is a systems programming language. Version: {}", name, version);
}
输出:
Rust is a systems programming language. Version: 1.73
2. 位置参数
fn main() {
println!("{1} is better than {0}!", "C", "Rust");
}
输出:
Rust is better than C!
3. 具名参数
fn main() {
println!("{language} is fun!", language="Rust");
}
输出:
Rust is fun!
4. 指定格式
Rust 支持各种格式控制,如二进制、十六进制、科学计数法等。
fn main() {
let num = 42;
println!("Binary: {:b}, Hex: {:x}, Octal: {:o}", num, num, num);
}
输出:
Binary: 101010, Hex: 2a, Octal: 52
5. 指定宽度和对齐
- 右对齐(默认):
println!("{:>10}", "Rust");
输出:
Rust
- 左对齐:
println!("{:<10}", "Rust");
输出:
Rust
- 填充字符:
println!("{:*>10}", "Rust");
输出:
******Rust
6. 浮点数格式化
fn main() {
let pi = 3.1415926;
println!("Pi to 2 decimal places: {:.2}", pi);
}
输出:
Pi to 2 decimal places: 3.14
Debug
格式化输出
Rust 提供 {:?}
进行 Debug
格式输出,适用于调试。
fn main() {
let tuple = (1, "Rust", 3.14);
println!("{:?}", tuple);
}
输出:
(1, "Rust", 3.14)
对于复杂数据结构,可以使用 {:#?}
进行美化输出。
fn main() {
let numbers = vec![1, 2, 3, 4, 5];
println!("{:#?}", numbers);
}
输出:
[
1,
2,
3,
4,
5,
]
Display
vs Debug
如果一个结构体希望支持 println!
,需要实现 Display
或 Debug
。
Debug
仅适用于调试
#[derive(Debug)]
struct Person {
name: String,
age: u8,
}
fn main() {
let p = Person { name: "Alice".to_string(), age: 30 };
println!("{:?}", p); // 自动实现 `Debug`
}
Display
自定义格式
Display
需要手动实现:
use std::fmt;
struct Person {
name: String,
age: u8,
}
impl fmt::Display for Person {
fn fmt(&self, f: &mut fmt::Formatter) -> fmt::Result {
write!(f, "{} is {} years old", self.name, self.age)
}
}
fn main() {
let p = Person { name: "Alice".to_string(), age: 30 };
println!("{}", p);
}
输出:
Alice is 30 years old
原理解析
Rust 的 println!
是一个宏,而非函数。这意味着:
- 编译时解析:Rust 编译器会在编译期解析
println!
并展开代码,确保类型安全。 - 自动格式检查:Rust 不允许格式不匹配,比如
println!("{}", 42, 43);
会编译报错。 - 零开销抽象:格式化操作会在编译时尽可能优化,保证高效性。
总结
println!
和print!
是 Rust 的基本输出宏。{}
用于格式化输出,支持参数位置、宽度控制、进制转换等。Debug
({:?}
)适用于调试,Display
可自定义格式化。println!
作为宏,提供编译时检查和高效性。
Rust 的打印与格式化机制既强大又安全,掌握这些基本概念有助于提高代码的可读性和可维护性。希望这篇文章对你有所帮助,欢迎留言交流!