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 中使用
52KB
1.5K SLoC
Butcher
一种与包裹在 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