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

 

posted @ 2025-12-08 09:46  PKICA  阅读(6)  评论(0)    收藏  举报