#cow #wrapped #data #interact #borrowed #cows

butcher

一种轻松与被 Cows 包裹的结构体和枚举交互的方法

7 个版本 (4 个破坏性更新)

0.5.0 2020 年 8 月 3 日
0.4.0 2020 年 7 月 24 日
0.3.0 2020 年 7 月 22 日
0.2.1 2020 年 7 月 19 日
0.1.1 2020 年 6 月 10 日

#1373Rust 模式

每月 21 次下载

MIT/Apache

42KB
493

Butcher

Build Status Latest Version Rust Documentation

一种轻松与被 Cow 包裹的结构体和枚举交互的方法。

概念

标准库有一个 写时复制类型,它允许处理具有所有或借用数据的对象,而无需进行区分。然而,在某些情况下,这可能导致大量代码重复。

该软件包目前提供以下功能:

  • 解构任何被 Cow 包裹的结构体。
  • Cow 中的结构体和枚举上进行模式匹配。
  • 遍历被 Cow 包裹的集合。
  • Cow 平展。
  • Cow 解包。

解构

可以在结构体和枚举上派生 Butcher 特性。然后解构变得简单。

use std::borrow::Cow;
use butcher::Butcher;

#[derive(Butcher, Clone)]
struct MyNumberList {
    val: u32,
    next: Option<Box<MyNumberList>>,
}

fn get_elem(i: Cow<MyNumberList>) -> Cow<u32> {
    let ButcheredMyNumberList { val, .. } = Butcher::butcher(i);

    val
}

模式匹配

也可以在枚举上派生 Butcher 特性。这允许,例如

use butcher::Butcher;
use std::borrow::Cow;

#[derive(Butcher, Clone)]
enum WebEvent {
    PageLoad,
    KeyPress(char),
    Paste(String),
    // or c-like structures.
    Click { x: i64, y: i64 },
}

fn print_action(i: Cow<WebEvent>) {
    match WebEvent::butcher(i) {
        ButcheredWebEvent::PageLoad => { /* ... */ },
        ButcheredWebEvent::KeyPress(key) => { /* ... */ },
        ButcheredWebEvent::Paste(pasted) => { /* ... */ },
        ButcheredWebEvent::Click { x, y } => { /* ... */ },
    }
}

每个变体的字段默认将变为 Cow<T>。这可以进行配置。请参阅文档获取更多信息。

迭代

此软件包提供了一个 CowIter 类型,允许编写友好的 Cow 迭代器。请参阅以下示例

use std::borrow::Cow;
use butcher::iterator::CowIter;

fn print_numbers(elems: Cow<[u32]>) {
    let mut iter = CowIter::from(elems);

    for element in iter {
        // The type of element is Cow<u32>
        println!("{:?}", element);
    }
}

平展

多亏了 Deref 特性,可以 flatten 一个 Cow<T>Cow<<T as Deref>::Target>。例如,可以从 Cow<str> 创建一个 Cow<String>,从一个 Cow<[T]> 创建一个 Cow<Vec<T>>,等等。

由于 Deref 的定义方式,目标类型总是由类型推断系统推断出来,这非常方便。

use std::borrow::Cow;
use butcher::flatten::FlattenCow;

let some_cow: Cow<String> = Cow::Owned(String::from("Hello 🦀"));
let flattened_cow: Cow<str> = some_cow.flatten();

去嵌套

Unnest 特性允许简单地去除 cow 的嵌套使用。它提供了一个 unnest 方法,该方法将 Cow<Cow<T>> 转换为 Cow<T>

use std::borrow::Cow;
use butcher::unnest::UnnestCow;

let foo: Cow<Cow<usize>> = Cow::Owned(Cow::Owned(42usize));
let foo_unnested: Cow<usize> = foo.unnest();

支持的 Rust 最低版本

此软件包可以在 rust 1.42 及更早版本中编译。提高 MSRV 是一个破坏性更改。CI 已经设置好,以确保软件包在 1.42 和稳定 rust 上都能编译和测试通过。

许可

根据您的选择,此软件包受 Apache 许可证,版本 2.0MIT 许可证 的许可。
除非您明确声明,否则您提交给此软件包的任何贡献,根据 Apache-2.0 许可证定义,将按照上述方式双许可,没有任何附加条款或条件。

依赖项

~1.5MB
~35K SLoC