3个版本
0.1.2 | 2022年10月20日 |
---|---|
0.1.1 | 2022年8月23日 |
0.1.0 | 2022年8月1日 |
#1237 在 Rust模式
34,302 每月下载量
用于 8 个crate(通过 strck_ident)
28KB
379 行
检查所有者和借用字符串。
概述
Rust标准库提供了String
和str
类型,分别包装了Vec<u8>
和[u8]
,内容有效的UTF-8作为不变量。
此crate通过引入不可变的Check
和Ck
类型来抽象字符串的类型级别不变量,其中不变量由泛型Invariant
类型参数确定。实现Invariant
特质留给其他crate,例如strck_ident
。
"strck"来自"str check",类似于rustc有typeck和borrowck分别用于类型检查和借用检查。
有关更多详细信息,请参阅文档。
动机
处理具有某些属性(如标识符)的类似字符串类型的库会很快变得混乱,因为&str
和String
开始污染类型签名。一种解决方案是手动实现一个所有者检查字符串类型,如syn::Ident
来区分类型签名并验证字符串。缺点是如果只需要借用版本,则无法创建新值,这是不必要的。
strck
通过提供检查的借用字符串类型Ck
和检查的所有者字符串类型Check
来解决此问题。这些分别作为str
和String
的薄包装,并在类型级别证明其内容满足包装器泛型化的Invariant
。
[^1]: Check
实际上可以由任何 'static + AsRef<str>
类型支持,但默认是 String
。
使用案例
无分配的检查字符串
strck
提供的主要好处是通过 Ck
类型验证借用字符串,而无需在结果中进行分配。
use strck_ident::{Ck, IntoCk, rust::RustIdent};
let this_ident: &Ck<RustIdent> = "this".ck().unwrap();
检查零拷贝反序列化
当启用 serde
功能标志时,可以使用 Ck
进行检查零拷贝反序列化,这需要 #[serde(borrow)]
属性。
use strck_ident::{Ck, unicode::UnicodeIdent};
#[derive(Serialize, Deserialize)]
struct Player<'a> {
#[serde(borrow)]
username: &'a Ck<UnicodeIdent>,
level: u32,
}
请注意,此代码示例明确使用了 Ck<UnicodeIdent>
来演示该类型是 Ck
。然而,strck_ident
提供了 Ident
作为 Ck<UnicodeIdent>
的别名,这在实际应用中应该使用。
不可失败的解析
对于字符串验证相对便宜但解析昂贵且容易出错的类型,可以使用 strck
与自定义的 Invariant
作为输入来制作不可失败的解析函数。
使用 IntoCk
和 IntoCheck
后缀构造
此crate公开了两个辅助特质,IntoCk
和 IntoCheck
。当在作用域内时,可以使用 .ck()
和 .check()
函数分别创建 Ck
和 Check
。
use strck_ident::{IntoCheck, IntoCk, unicode::UnicodeIdent};
let this_ident = "this".ck::<UnicodeIdent>().unwrap();
let this_foo_ident = format!("{}_foo", this_ident).check::<UnicodeIdent>().unwrap();
文档
有关更多详细信息,请参阅crate级文档。
依赖关系
~170KB