Rust字符串处理宏库str-macro的使用,高效实现编译时字符串操作与格式化

Rust字符串处理宏库str-macro的使用,高效实现编译时字符串操作与格式化

Rust CI badge

str-macro是一个Rust crate,提供了str!()宏,使得String类型也能获得类似vec![]那样的便利操作。

这个库没有外部依赖,可以在任何Rust发布通道上工作。

基本用法示例

创建空String

// Vec等效
let v = vec![];
assert_eq!(v, Vec::new());
assert!(v.is_empty());

// String
let s = str!();
assert_eq!(s, String::new());
assert!(s.is_empty());

从常量字符串创建String

// Vec等效
let v = vec!["alpha", "beta", "gamma"];
assert_eq!(&v, &["alpha", "beta", "gamma"];
assert_eq!(v.len(), 3);

// String
let s = str!("alpha beta gamma");
assert_eq!(&s, "alpha beta gamma");
let _: String = s;

从实现ToString的对象创建String

(注意:任何实现Display的类型都会自动实现ToString)

let s = str!(2194);
assert_eq!(&s, "2194");

let s = str!(Ipv4Addr::new(127, 0, 0, 1));
assert_eq!(&s, "127.0.0.1");

完整示例代码

use str_macro::str;
use std::net::Ipv4Addr;

fn main() {
    // 1. 创建空字符串
    let empty_str = str!();
    println!("Empty string: '{}'", empty_str);
    assert!(empty_str.is_empty());
    
    // 2. 从字面量创建
    let hello = str!("Hello, world!");
    println!("Greeting: {}", hello);
    
    // 3. 从数字创建
    let num_str = str!(42);
    println!("Number as string: {}", num_str);
    
    // 4. 从IP地址创建
    let ip_str = str!(Ipv4Addr::new(192, 168, 1, 1));
    println!("IP as string: {}", ip_str);
    
    // 5. 组合使用
    let combined = str!("IP: ", ip_str, ", Number: ", num_str);
    println!("Combined: {}", combined);
}

安装

在项目目录中运行以下Cargo命令:

cargo add str-macro

或者在Cargo.toml中添加:

str-macro = "1.0.0"

特点

  1. 无依赖
  2. 编译时字符串操作
  3. 支持所有实现了ToString/Display的类型
  4. 简洁高效,类似vec!的语法
  5. 适用于所有Rust版本

这个库由Ammon Smith开发,采用MIT许可证授权。


1 回复

Rust字符串处理宏库str-macro使用指南

简介

str-macro是一个Rust宏库,专注于在编译时进行高效的字符串操作和格式化处理。它通过Rust的宏系统提供了一系列编译时字符串处理功能,避免了运行时开销,特别适合需要高性能字符串处理的场景。

主要特性

  • 编译时字符串操作
  • 类型安全的字符串格式化
  • 零运行时开销
  • 支持常见的字符串操作(连接、插值、格式化等)

使用方法

首先在Cargo.toml中添加依赖:

[dependencies]
str-macro = "0.1"

基本示例

use str_macro::str_format;

fn main() {
    // 编译时字符串格式化
    const GREETING: &str = str_format!("Hello, {}!", "Rust");
    println!("{}", GREETING); // 输出: Hello, Rust!
    
    // 编译时字符串连接
    const NAME: &str = "Alice";
    const WELCOME: &str = str_concat!("Welcome ", NAME, "!");
    println!("{}", WELCOME); // 输出: Welcome Alice!
}

字符串插值

use str_macro::str_interp;

fn main() {
    let version = "1.50.0";
    const MSG: &str = str_interp!("Using Rust version {version}");
    println!("{}", MSG); // 输出: Using Rust version 1.50.0
}

条件字符串生成

use str_macro::str_if;

fn main() {
    const DEBUG: bool = true;
    const LOG_LEVEL: &str = str_if!(DEBUG => "DEBUG" | "RELEASE");
    println!("Log level: {}", LOG_LEVEL); // 输出: Log level: DEBUG
}

编译时字符串转换

use str_macro::{str_lowercase, str_uppercase};

fn main() {
    const NAME: &str = "Rust";
    const LOWER: &str = str_lowercase!(NAME);
    const UPPER: &str = str_uppercase!(NAME);
    
    println!("{} {}", LOWER, UPPER); // 输出: rust RUST
}

高级格式化

use str_macro::str_format;

fn main() {
    const PI: f64 = 3.14159265359;
    const PI_STR: &str = str_format!("PI is {:.2}", PI);
    println!("{}", PI_STR); // 输出: PI is 3.14
    
    const HEX: &str = str_format!("255 in hex: {:X}", 255);
    println!("{}", HEX); // 输出: 255 in hex: FF
}

性能优势

由于所有操作都在编译时完成,生成的代码中直接包含处理后的字符串常量,运行时没有任何额外开销。这使得str-macro特别适合以下场景:

  • 需要高性能的字符串处理
  • 构建常量字符串
  • 生成配置或模板字符串
  • 开发嵌入式系统等资源受限环境

注意事项

  1. 宏参数必须是编译时可确定的常量表达式
  2. 某些复杂操作可能受限于编译时计算能力
  3. 错误消息会在编译时直接报告

str-macro为Rust开发者提供了一种高效、安全的字符串处理方式,特别适合需要极致性能的场景。

完整示例

下面是一个整合了所有特性的完整示例代码:

// 引入所有需要的宏
use str_macro::{str_format, str_concat, str_interp, str_if, str_lowercase, str_uppercase};

fn main() {
    // 1. 基本格式化示例
    const GREETING: &str = str_format!("Hello, {}!", "Rust");
    println!("基本格式化: {}", GREETING);
    
    // 2. 字符串连接示例
    const NAME: &str = "World";
    const WELCOME: &str = str_concat!("Welcome to ", NAME, "!");
    println!("字符串连接: {}", WELCOME);
    
    // 3. 字符串插值示例
    let version = "1.60.0";
    const MSG: &str = str_interp!("Current Rust version: {version}");
    println!("字符串插值: {}", MSG);
    
    // 4. 条件字符串生成示例
    const DEBUG_MODE: bool = cfg!(debug_assertions);
    const MODE: &str = str_if!(DEBUG_MODE => "Debug" | "Release");
    println!("当前模式: {}", MODE);
    
    // 5. 字符串大小写转换示例
    const LANG: &str = "Rust";
    const LOWER_LANG: &str = str_lowercase!(LANG);
    const UPPER_LANG: &str = str_uppercase!(LANG);
    println!("大小写转换: {} -> {} / {}", LANG, LOWER_LANG, UPPER_LANG);
    
    // 6. 高级格式化示例
    const PI: f64 = 3.14159265359;
    const FORMATTED_PI: &str = str_format!("PI保留两位小数: {:.2}", PI);
    println!("高级格式化: {}", FORMATTED_PI);
    
    const BINARY: &str = str_format!("42的二进制: {:b}", 42);
    println!("进制转换: {}", BINARY);
}

这个完整示例展示了str-macro库的主要功能,包括:

  1. 基本字符串格式化
  2. 字符串连接
  3. 字符串插值
  4. 条件字符串生成
  5. 字符串大小写转换
  6. 高级格式化选项

所有操作都在编译时完成,运行时直接使用处理后的字符串常量,保证了最佳性能。

回到顶部