7 个不稳定版本 (3 个破坏性更新)

0.5.1 2020年8月3日
0.5.0 2020年8月3日
0.4.2 2020年7月24日
0.3.0 2020年7月22日
0.2.0 2020年7月19日

#22 in #rust-patterns

每月26次下载
butcher 中使用

MIT/Apache

52KB
1.5K SLoC

Butcher

Build Status Latest Version Rust Documentation

一种与包裹在 Cow 中的结构和枚举交互的简单方法。

概念

标准库有一个 克隆写入类型,它允许与具有所有者或借用数据的任何数据一起工作,而不需要进行任何区分。然而,在某些情况下,这可能会导致大量代码重复。

该crate目前提供以下功能

  • 解构任何包裹在 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>。这可以进行配置。请参阅文档以获取更多信息。

迭代

此crate提供了一个 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 特性,可以将 Cow<T> 进行 flatten,转换为 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 版MIT 许可证 许可。
除非您明确声明,否则您提交给此软件包的任何贡献,如 Apache-2.0 许可证中定义的,将按上述方式双重许可,不附加任何额外条款或条件。

依赖项

~1.5MB
~35K SLoC