#string #static #concat #operations #ops #hash-set #format

static_str_ops

这个包允许使用静态字符串进行非平凡操作,例如concat!format!call_once等。

3个版本

0.1.2 2023年8月17日
0.1.1 2023年8月16日
0.1.0 2023年8月16日

算法中排名1619

Download history 102/week @ 2024-03-13 61/week @ 2024-03-20 81/week @ 2024-03-27 61/week @ 2024-04-03 107/week @ 2024-04-10 36/week @ 2024-04-17 73/week @ 2024-04-24 53/week @ 2024-05-01 100/week @ 2024-05-08 110/week @ 2024-05-15 85/week @ 2024-05-22 94/week @ 2024-05-29 37/week @ 2024-06-05 87/week @ 2024-06-12 79/week @ 2024-06-19 163/week @ 2024-06-26

每月下载量371
3个crate中使用(通过vineyard

BSD-3-Clause

15KB
135

static_str_ops

static_str_ops crate解决了长期存在的问题,即如何执行非const字符串操作,例如format!()concat!()等,并返回静态字符串,即&'static str

内部,该crate使用全局静态HashSet存储所有静态字符串,如果字符串之前已被静态化,则返回HashSet中字符串的引用。

[!注意] 使用此crate,静态化的字符串将泄漏,引用由底层的HashSet保持。可以使用destaticize()方法释放之前添加的字符串。

crates.io Downloads Docs.rs Github Actions

APIs

此crate提供以下宏和函数

  • staticize(s: &str) -> &'static str

    将字符串转换为静态字符串。如果字符串之前已被静态化,则返回HashSet中字符串的引用。这是此crate最基本的使用方式,例如

    示例

    use static_str_ops::staticize;
    let s: &'static str = staticize(&String::from("hello world!"));
    
  • is_staticized(s: &str) -> bool

    检查字符串之前是否已静态化。

    示例

    let s: &'static str = staticize(&String::from("hello world!"));
    assert!(is_staticized(s));
    
  • destaticize(s: &str) -> bool

    从HashSet中删除字符串。如果字符串存在并且成功删除,则返回true,否则返回false。

    示例

    let s: &'static str = staticize(&String::from("hello world!"));
    assert!(destaticize(s));
    
  • static_concat!(s1:expr,s2:expr, ...) -> &'static str

    将多个字符串连接成一个静态字符串。参数可以是字符串字面量,类似于concat!(),但返回静态字符串。

    示例

    let hello_world: &'static str = static_concat!("Hello", ", ", "world!");
    
  • static_format!(s:expr, ...) -> &'static str

    将字符串格式化为静态字符串。参数可以是内置宏format!()可以接受的任何内容。类似于format!(),但返回一个静态字符串。

    let name = "John";
    let age = 30;
    let message = static_format!("My name is {} and I'm {} years old.", name, age);
    
  • staticize_once!(expr:expr) -> &'static str

    类似于staticize(),但expr只会被评估一次。底层使用std::sync::Once

    示例

    let s: &'static str = staticize_once!({
        let s = "";  // can be some expensive computation
        s
    });
    

    如果你的函数想要返回一个静态字符串,同时生成逻辑较为复杂,并且你希望这个过程只发生一次,那么这个函数将非常有用,例如

    use static_str_ops::*;
    let make_string = || {
        staticize_once!({
            let s = "";  // can be some expensive computation
            s
        })
    };
    
    let s1: &'static str = make_string();
    let s2: &'static str = make_string();
    

    当你多次调用make_string()时,可以保证主体只会被评估一次。

许可证

本项目采用BSD-3条款许可证(LICENSEhttp://opensource.org/licenses/BSD-3-Clause)。

依赖关系

~0.5–1MB
~21K SLoC