3个版本
0.1.2 | 2023年8月17日 |
---|---|
0.1.1 | 2023年8月16日 |
0.1.0 | 2023年8月16日 |
在算法中排名1619
每月下载量371
在3个crate中使用(通过vineyard)
15KB
135 行
static_str_ops
static_str_ops crate解决了长期存在的问题,即如何执行非const字符串操作,例如format!()
、concat!()
等,并返回静态字符串,即&'static str
。
内部,该crate使用全局静态HashSet存储所有静态字符串,如果字符串之前已被静态化,则返回HashSet中字符串的引用。
[!注意] 使用此crate,静态化的字符串将泄漏,引用由底层的
HashSet
保持。可以使用destaticize()
方法释放之前添加的字符串。
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条款许可证(LICENSE或http://opensource.org/licenses/BSD-3-Clause)。
依赖关系
~0.5–1MB
~21K SLoC