2 个版本
0.0.2 | 2021 年 5 月 22 日 |
---|---|
0.0.1 | 2021 年 5 月 18 日 |
#2528 in Rust 模式
105KB
1.5K SLoC
Eso - 制作类似 Cow
容器的类型级构建块
此库提供了 Eso
结构体,这是一个通用的构建块,用于创建可能拥有或引用其内容的新类型。
如何使用
将以下内容添加到您的 Cargo.toml
中:
[dependencies]
eso = "0.0.0"
示例
以下是创建基本类似 Cow
类型的示例
use eso::t;
pub struct SmartString<'a>(t::SO<&'a str, &'a str, String>);
impl SmartString {
fn from_ref(c: &'static str) -> Self {
SmartString(t::SO::from_static(c))
}
fn from_string(s: String) -> Self {
SmartString(t::SO::from_owned(s))
}
fn into_owned(self) -> String {
self.0.into_owning().safe_unwrap_owned()
}
fn is_owned(&self) -> bool {
self.0.is_owning()
}
fn is_borrowed(&self) -> bool {
self.0.is_reference()
}
fn to_mut(&mut self) -> &mut String {
self.0.to_mut()
}
}
impl Deref for SmartString {
type Target = str;
fn deref(&self) -> &str {
self.0.get_ref()
}
}
详细说明
Eso
非常灵活,因为它旨在作为图书馆作者的构建块,他们将限制其灵活性以适应各自的用例
-
Eso
类型本身可以表示任何子集中的选择- 一个借用引用
- 一个静态或共享引用
- 一个拥有的值
Eso
类型中存在哪些变体取决于类型参数,并且可能在客户端代码的使用中有所不同。 -
Eso
泛化了引用和所有权。例如,您可以创建一个存储自定义类型而不是普通引用的类似
Cow
的类型,因此您可以选择创建一个可写时复制的OwningRef
这种灵活性的代价是易用性。当使用 eso
时,类型可能会变得相当长,并且库中的 where
-子句相当难以处理。
待办事项
- 更多的 API 文档
- 更多的测试
- 更多的示例