2 个版本

0.0.2 2021 年 5 月 22 日
0.0.1 2021 年 5 月 18 日

#2528 in Rust 模式

MPL-2.0 许可证

105KB
1.5K SLoC

Eso - 制作类似 Cow 容器的类型级构建块

Crates.io docs.rs GitHub issues GitHub pull requests GitHub last commit GitHub Workflow Status Crates.io

此库提供了 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 文档
  • 更多的测试
  • 更多的示例

无运行时依赖