4个版本
0.2.0 | 2023年4月10日 |
---|---|
0.1.1 | 2023年4月7日 |
0.1.0 | 2023年4月2日 |
0.1.0-alpha.1 | 2023年3月30日 |
在 文本处理 中排名第751
每月下载量375次
在 rocstr 中使用
135KB
2K SLoC
不可变字符串
这个crate提供了一个廉价克隆和可切片的UTF-8字符串类型。它受到bytes
crate的启发,该crate提供零拷贝的字节切片,以及im
crate,它提供不可变的copy-on-write数据结构。它提供了一个与标准库中的String
兼容的API。
内部,这个crate使用智能指针中存储的标准库字符串和该字符串的某个范围。这允许以低成本的零拷贝克隆和切片字符串。这对于需要将大字符串切割成许多子字符串的解析操作特别有用。
总结:这个crate提供了一个
ImString
类型,它作为String
(因为它可以修改并以相同的方式使用),一个Arc<String>
(因为它便宜易克隆)和一个&str
(因为它便宜易切片)的组合,所有这些都属于一个所有者类型。
这个crate提供了一个安全的API,确保每个字符串和每个字符串切片都是UTF-8编码的。它不允许在UTF-8多字节序列中切片字符串。它为每个可能失败的操作提供了try_*
函数,以避免恐慌。它还使用广泛的单元测试和完整的测试覆盖率来确保没有不稳定性。
功能
高效克隆:crate的架构使得低成本(零拷贝)克隆和切片创建成为可能,使其非常适合解析广泛共享的字符串。
高效切片:crate的架构使得低成本(零拷贝)切片创建成为可能,使其非常适合将一个大输入字符串切片成许多较小的字符串的解析操作。
写时复制:尽管克隆和切片成本低,但它允许使用写时复制进行修改。对于不共享的字符串,它有一个优化,可以在原地安全地修改它以避免不必要的复制。
兼容性:该API设计得与Rust标准库中的String
非常相似,便于集成,几乎是即插即用的替代品。它还与许多流行的Rust crate集成,例如serde
、peg
和nom
。
泛型存储:该crate在数据存储方面具有灵活性。它允许使用Arc<String>
用于多线程应用,以及Rc<String>
用于单线程使用,以适应不同的存储需求,并在不需要时避免原子操作的开销。
安全性:该crate强制要求所有字符串和字符串切片都使用UTF-8编码。任何可能违反此规定的函数都标记为不安全。所有可能失败的函数都有一个try_*
变体,不会导致panic。使用安全函数不会产生不安全的行为。
示例
use imstr::ImString;
// Create new ImString, allocates data.
let mut string = ImString::from("Hello, World");
// Edit: happens in-place (because this is the only reference).
string.push_str("!");
// Clone: this is zero-copy.
let clone = string.clone();
// Slice: this is zero-copy.
let hello = string.slice(0..5);
assert_eq!(hello, "Hello");
// Slice: this is zero-copy.
let world = string.slice(7..12);
assert_eq!(world, "World");
// Here we have to copy only the part that the slice refers to so it can be modified.
let hello = hello + "!";
assert_eq!(hello, "Hello!");
可选功能
可以使用功能标志启用的可选功能。
功能 | 描述 |
---|---|
serde |
使用serde crate将ImString 字段序列化和反序列化为字符串。 |
peg |
使用peg crate将ImString 作为解析的数据结构。请参阅peg-list.rs 以获取示例。 |
nom |
允许使用nom 将ImString 用于构建解析器。请参阅nom-json.rs 以获取示例。 |
类似功能
这是该crate与其他类似crate的比较。比较基于以下功能:
- 廉价克隆:克隆字符串是否为零拷贝操作?
- 廉价切片 🍕:是否可以廉价地切片字符串?
- 可变:是否可以修改字符串?
- 泛型存储:是否可以更换存储机制?
- 字符串兼容:是否与
String
兼容?
以下是数据,附有进一步检查的crate链接
Crate | 廉价克隆 | 廉价切片 | 可变 | 泛型存储 | 字符串兼容 | 注释 |
---|---|---|---|---|---|---|
imstr |
✅ | ✅ | ✅ | ✅ | ✅ | 此crate。 |
tendril |
✅ | ✅ | ✅ | ✅ | ❌ | 实现复杂。API与String 不完全兼容,但除此之外与该crate最接近。 |
immut_string |
✅ | ❌ | 🟡 (无优化) | ❌ | ❌ | 仅是Arc<String> 的包装。 |
immutable_string |
✅ | ❌ | ❌ | ❌ | ❌ | 包装在Arc<str> 。 |
arccstr |
✅ | ❌ | ❌ | ❌ | ❌ | 不是UTF-8(空终止C字符串)。手写的Arc 实现。 |
implicit-clone |
✅ | ❌ | ❌ | 🟡 | ✅ | 不可变字符串库。有 sync 和 unsync 两种变体。 |
semistr |
❌ | ❌ | ❌ | ❌ | ❌ | 在行内存储短字符串。 |
quetta |
✅ | ✅ | ❌ | ❌ | ❌ | 包装了 Arc<String> ,可以进行切片。 |
bytesstr |
✅ | 🟡 | ❌ | ❌ | ❌ | 包装了 Bytes 。不能直接切片。 |
fast-str |
✅ | ❌ | ❌ | ❌ | ❌ | 看起来可能存在一些不安全因素。 |
flexstr |
✅ | ❌ | ❌ | ✅ | ❌ | |
bytestring |
✅ | 🟡 | ❌ | ❌ | ❌ | 包装了 Bytes 。由 actix 使用。可以使用 slice_ref() 间接切片。 |
arcstr |
✅ | ✅ | ❌ | ❌ | ❌ | 可以将字符串字面量存储为 &'static str 。 |
cowstr |
✅ | ❌ | ✅ | ❌ | ❌ | 重新实现了 Arc ,自定义分配策略。 |
strck |
❌ | ❌ | ❌ | ✅ | ❌ | 类型检查的字符串库。 |
许可证
MIT,见 LICENSE.md。
依赖项
~0–400KB