10个版本 (4个破坏性更新)
0.5.1 | 2024年2月24日 |
---|---|
0.5.0 | 2024年2月24日 |
0.4.1 | 2023年12月27日 |
0.3.0 | 2023年10月2日 |
0.1.1 | 2023年8月19日 |
#120 in 文本处理
每月下载量 48,185
在 2 个包 中使用
77KB
1.5K SLoC
byteyarn
byteyarn
- 空间高效的字节字符串 🧶🐈⬛
Yarn
是一种高度优化的字符串类型,在许多方面都优于 String
- 始终占用两个指针宽度,因此总是通过寄存器在函数之间传递。
- 在64位架构上,小字符串优化(SSO)可达15字节。
- 可以是所有者拥有的缓冲区或借用缓冲区(如
Cow<str>
)。 - 如果它是由已知的静态字符串构建的,则可以将其提升为
'static
生命周期。 Option<Yarn>
与Yarn
具有相同的大小和ABI。
主要缺点是 Yarn
不容易追加,因为它们不跟踪内部容量,并且由 Yarn::as_slice()
返回的切片不具有与 String
相同的指针稳定性属性(尽管这些很少需要)。
Yarns 在需要写时复制字符串且大多数字符串相对较小的情况下很有用。尽管 Yarn
本身不是 Copy
,但有一个单独的 YarnRef
类型是。这些类型具有等效的表示形式,并且可以廉价地在它们之间进行转换。
创建 yarn 的最简单方法是使用 yarn!()
宏,它类似于 format!()
。
// Create a new yarn via `fmt`ing.
let yarn = yarn!("Answer: {}", 42);
// Convert that yarn into a reference.
let ry: YarnRef<str> = yarn.as_ref();
// Try up-casting the yarn into an "immortal yarn" without copying.
let copy: YarnRef<'static, str> = ry.immortalize().unwrap();
assert_eq!(yarn, copy);
纱线旨在存储文本,可以是UTF-8或可能是UTF-8的字节;Yarn<str>
和Yarn<u8>
用于这些目的,并且可以相互转换。可以使用Yarn::utf8_chunks()
函数来遍历字符串中的有效UTF-8块。
两种类型的纱线都可以进行Debug
和Display
操作,并将以字符串的形式打印出来。特别是,无效的UTF-8将被转换为\xNN
转义序列或替换字符(分别用于Debug
和Display
)。
let invalid = ByteYarn::from_byte(0xff);
assert_eq!(format!("{invalid:?}"), r#""\xFF""#);
assert_eq!(format!("{invalid}"), "�");
依赖关系
~0.6–0.8MB
~12K SLoC