rust常用声明式宏
在 Rust 语言中,声明式宏(
macro_rules!)是日常编程中非常重要的工具,它们使得代码更加简洁、高效。许多标准库的功能都是通过声明式宏提供的。以下是一些常用的声明式宏及其使用示例:
1. println! 和 eprintln! (格式化输出)
这是最基础的宏,用于将格式化的文本输出到标准输出(stdout)或标准错误输出(stderr),并在末尾添加换行符。
用途: 控制台输出、日志记录。
fn main() { let name = "Rust"; let version = 2021; // println! 输出到标准输出 println!("Hello, {}! Welcome to year {}.", name, version); // eprintln! 输出到标准错误(常用于错误信息) eprintln!("Error: Connection lost."); }
2. vec! (创建向量)
用于快速、方便地初始化一个
Vec<T>(动态数组)。它提供了类似数组字面量 [] 的便捷语法。用途: 初始化动态列表。
fn main() {
// 创建一个包含 1, 2, 3 的向量
let numbers = vec![1, 2, 3];
// 创建一个包含 5 个 0 的向量
let zeros = vec![0; 5];
println!("Numbers: {:?}", numbers);
println!("Zeros: {:?}", zeros);
}
3. matches! (模式匹配检查)
这个宏非常有用,用于检查一个表达式是否匹配某个模式,并返回一个布尔值,而不需要写一个完整的
match 表达式。用途: 快速条件判断。
#[derive(Debug)]
enum ResultStatus {
Ok(u32),
Error(String),
Pending,
}
fn main() {
let status = ResultStatus::Ok(200);
// 检查 status 是否匹配 Ok(...) 模式
if matches!(status, ResultStatus::Ok(_)) {
println!("操作成功!");
}
let error_status = ResultStatus::Error(String::from("Failed"));
// 检查 status 是否匹配特定内容的 Error 模式
if matches!(error_status, ResultStatus::Error(s) if s == "Failed") {
println!("错误匹配到了特定的信息。");
}
}
4. write! 和 writeln! (写入格式化数据)
类似于
format!,但它将格式化的数据写入实现了 std::io::Write Trait 的缓冲区或流中,而不是创建一个新的 String。用途: 写入文件、网络流或缓冲区。
use std::io::Write;
fn main() {
let mut buffer = Vec::new(); // 创建一个可增长的缓冲区
let temperature = 25.5;
// write! 将格式化字符串写入 buffer 中
write!(&mut buffer, "Current temp: {:.1}°C", temperature).expect("写入失败");
writeln!(&mut buffer, " Status: OK").expect("写入失败");
// 将缓冲区内容转换为字符串并打印
println!("缓冲区内容: {}", String::from_utf8(buffer).expect("无效的UTF-8"));
}
5. dbg! (调试打印)
这是一个强大的调试辅助宏。它会打印出表达式的值、文件名、行号和列号,然后返回该表达式的值,非常适合快速插入到代码中进行调试。
用途: 快速调试。
fn main() { let a = 2; let b = 3; // dbg! 打印信息后,将 (a * b) 的结果 6 返回给 result 变量 let result = dbg!(a * b); println!("Result is: {}", result); } // 输出到 stdout 的信息类似: // [src/main.rs:10] a * b = 6 //Result is: 6
6. assert! 和 assert_eq!/assert_ne! (断言)
用于在测试中或调试构建中验证条件是否为真。如果条件为假,程序会因恐慌(panic)而崩溃。
用途: 单元测试、确保程序状态的正确性。
fn divide(numerator: f64, denominator: f64) -> f64 {
// 确保分母不为零
assert_ne!(denominator, 0.0, "分母不能为零!");
numerator / denominator
}
fn main() {
let x = divide(10.0, 2.0);
assert!(x == 5.0); // 验证结果
println!("10 / 2 = {}", x);
// 下一行会触发 panic 并显示 assert 失败信息
// divide(10.0, 0.0);
}
7. format! (格式化字符串)
类似于
println!,但它不输出到控制台,而是返回一个新的 String 实例。用途: 构建自定义字符串。
fn main() {
let user_id = 101;
let data = "user_login";
// 创建一个新的拥有所有权的 String
let log_message = format!("User ID: {} logged event: {}", user_id, data);
println!("{}", log_message);
}
浙公网安备 33010602011771号