5 个版本 (3 个破坏性更新)
0.4.0 | 2023年1月8日 |
---|---|
0.3.0 | 2022年12月29日 |
0.2.0 | 2022年12月29日 |
0.1.1 | 2022年12月28日 |
0.1.0 | 2022年12月28日 |
#2256 in Rust 模式
41KB
432 行
Compost
概述
此库公开了 decompose!
宏,用于将元组分解为包含其值子集的元组。
use compost::decompose;
// Pack all your context into a tuple...
let mut cx = (&mut 1u32, &2u8, (&3u16, &mut 'e', "f", &mut [1, 2, 3]));
// And cal your target function!
consumer(decompose!(cx));
// Define functions taking tuples of context...
fn consumer_2((a, b, c, d, e): (&u32, &str, &char, &f32, &i8)) {
dbg!(a, b, c, d, e);
}
fn consumer_3((f, g, h): (&char, &str, &mut [u8; 3])) {
dbg!(f, g, h);
}
fn consumer(mut cx: (&mut u32, &char, &str, &mut [u8; 3])) {
// Bring types into scope and produce a remainder tuple.
decompose!(cx => rest & {
char: &char,
bytes: &mut [u8; 3],
});
// Combine contexts...
let mut rest = (rest, (&mut 4.3f32, &-4i8), &mut 5i16);
// ...and forward them to further functions.
consumer_2(decompose!(rest));
// ...all without invalidating existing borrows!
dbg!(char, bytes);
// Reborrow the original context after its borrows have expired.
consumer_3(decompose!(cx));
}
有关宏的精确语义和限制的详细信息,请参阅 decompose!
的文档。
功能
是的,此库...
- 支持重新借用(即
decompose!
不会消耗其输入。一旦完成借用,可以重新使用原始元组)。 - 如果元组不能分解,则在编译时产生(确实相当丑陋)的错误。
- 支持借用可变、不可变和智能指针包装组件(只要它们实现
Deref
)。 - 支持从嵌套元组树借用,允许同时从任意数量的组件借用,并快速通过将它们打包到一个单个元组中合并多个上下文元组。
- 支持在泛型元素上借用而不会在单态化时意外失败。
- 依赖于类型推断而不是
TypeId
,允许宏在非'static
类型上操作。 - 支持
no_std
环境,并且不依赖于不安全代码。 - 没有运行时依赖。