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 文本处理

Download history 15163/week @ 2024-04-15 14832/week @ 2024-04-22 15979/week @ 2024-04-29 16202/week @ 2024-05-06 20377/week @ 2024-05-13 14503/week @ 2024-05-20 9779/week @ 2024-05-27 11399/week @ 2024-06-03 11960/week @ 2024-06-10 11612/week @ 2024-06-17 11871/week @ 2024-06-24 11257/week @ 2024-07-01 11724/week @ 2024-07-08 12417/week @ 2024-07-15 10269/week @ 2024-07-22 12582/week @ 2024-07-29

每月下载量 48,185
2 个包 中使用

Apache-2.0

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块。

两种类型的纱线都可以进行DebugDisplay操作,并将以字符串的形式打印出来。特别是,无效的UTF-8将被转换为\xNN转义序列或替换字符(分别用于DebugDisplay)。

let invalid = ByteYarn::from_byte(0xff);
assert_eq!(format!("{invalid:?}"), r#""\xFF""#);
assert_eq!(format!("{invalid}"), "");

依赖关系

~0.6–0.8MB
~12K SLoC