1 个不稳定版本
0.1.0 | 2023年6月6日 |
---|
#79 在 #struct-fields
17KB
167 行
Conquer Struct
宏允许通过提供字段作为futures来构建结构体。这些宏自动并发地执行未来解析并构建结构体。
为什么
考虑一个场景,您正在尝试构建一个结构体,并且需要异步获取其字段。执行此操作的代码可能看起来像这样
async fn get_contact_info(contact_id: usize) -> Contact {
Contact {
name: get_contact_name(contact_id).await,
number: get_contact_number(contact_id).await,
is_verified: true
}
}
看起来很简单,但现在为了提高性能,我们需要并发地调用这些函数。哦,这是一个重构。它需要我们添加更多代码,并跟踪正在执行的功能。这绝对可能,但考虑到巨大的结构体,跟踪确实很困难,您可能将不同函数的输出分配给困难的变量。
如何
引入 conquer_struct
,正如其名所示,它将为您征服并发,您可以避免编写任何样板代码。让我们以上面的例子为例,看看如何使其并发
async fn get_contact_info(contact_id: usize) -> Contact {
conquer_future!(Contact {
name: async { get_contact_name(contact_id).await },
number: async { get_contact_number(contact_id).await },
is_verified: true
}).await
}
完成了!这很简单,通过最小限度的更改,我们的代码已经变成了并发代码。
使用方法
conquer_struct
为我们提供了2个宏。
conquer_future
这个宏解析结构体内部提供的futures。这个宏的大致签名是
conquer_future!(StructName {
value1: T,
value2: async { .. } // ~ impl Future<Output = V>, considering the field
// accepts type V
}) -> impl Future<Output = StructName>
try_conquer_future
这个宏解析结构体内部提供的futures,同时还考虑了内部存在的未来的结果。
try_conquer_future!(StructName {
value1: T,
value2: async { .. } // ~ impl Future<Output = Result<V, E>>, consider the field
// accepts type V
}) -> impl Future<Output = Result<StructName, E>>
贡献
贡献始终欢迎,在贡献之前请检查问题部分,了解可能已经完成的前期开发。对于任何改进、功能、错误修复,请首先创建问题以跟踪。
代码指南
任何添加的代码都应通过 +nightly fmt
格式化检查、clippy检查和测试。
依赖关系
~280–730KB
~17K SLoC