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 日 |
#1373 在 Rust 模式
每月 21 次下载
42KB
493 行
Butcher
一种轻松与被 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.0 或 MIT 许可证 的许可。除非您明确声明,否则您提交给此软件包的任何贡献,根据 Apache-2.0 许可证定义,将按照上述方式双许可,没有任何附加条款或条件。
依赖项
~1.5MB
~35K SLoC