gpt4 book ai didi

rust - 在Rust中使用谓词函数向量创建结构

转载 作者:行者123 更新时间:2023-12-03 11:43:49 26 4
gpt4 key购买 nike

我从Rust开始,尝试实现如下结构,其中有一个谓词函数向量:

pub struct Client<P>
where
P: Fn(&Deal) -> bool,
{
clientid: String,
api_url: String,
deal_filters: Vec<P>,
}
我设法根据各种情况将其拼凑起来,并且以前我仅将属性硬编码为空向量时就能够为这些结构实现 new函数,但是当我尝试使用实数构造其中一个时,它变得很奇怪功能:
impl<P> Client<P>
where
P: Fn(&Deal) -> bool,
{
pub fn new(stings: settings::Settings, filters: Option<Vec<P>>) -> Self {
let deal_filters = match filters {
Some(fltrs) => fltrs,
None => vec![deal_predicates::check_revenue],
};
Self {
api_url: stings.url,
clientid: stings.clientid,
deal_filters
}
}
确实,当我尝试传入这些“默认”过滤器时,出现以下编译器错误:
`match` arms have incompatible types
expected type `Vec<for<'r> fn(&'r Deal) -> _>`
found struct `Vec<for<'r> fn(&'r Deal) -> _ {check_revenue}>`rustcE0308
另外,我不确定如何声明实例的类型。我不清楚这个 typeClient<P>
以下内容基于尝试遵循编译器的指导,但是这告诉我在编译时无法知道大小:
let client: clients::Client<dyn Fn(&Deal) -> bool>
= clients::Client::new(cfg, None);

14 | = client: clients::Client::new(cfg, None);
| ^^^^^^^^^^^^^^^^^^^^^^^^^^^^ doesn't have a size known at compile-time
我的目标是提供一组可以使用的谓词函数,并为不同的上下文提供不同的谓词。我相信我可以使用 Box解决“编译时无法得知大小”的问题吗?
当然,当然还有其他方法可以解决此问题。另外,我对此的很多思考都基于Haskell,因此我在这里可能有错误的期望或假设,但是我希望您能提出关于实现我想要的更好方法的建议。

编辑:以下的固定版本
感谢下面的一些帮助,我将函数包装在 Box中,然后我的新问题是错误 expected fn pointer, found reference。我还简化了它以删除通用特征声明。
一旦我搜索并解决了 expected fn pointer, found reference错误,我的代码就可以正常编译了。这个解决方案对我来说是陌生的,因此我不确定它是否是惯用的,但是它似乎可以工作。
结构:
pub struct Client {
clientid: String,
api_url: String,
deal_filters: Vec<fn(&Deal) -> bool>,
}
暗示新的:
impl Client {
pub fn new(
stings: settings::Settings,
filters: Option<Vec<fn(&Deal) -> bool>>,
) -> Self {
let deal_filters = match filters {
Some(fltr) => fltr,
None => vec![
deal_predicates::check_revenue as fn(&Deal) -> bool,
],
};
Self {
api_url: stings.url,
clientid: stings.clientid,
deal_filters,
}
}
}
我还通过 Box类型的 dyn Fn(&Deal) -> bool使用了它。

最佳答案

Client<P>
where
P: Fn(&Deal) -> bool,

这说明给定的Client结构具有一种可调用的类型。但是不同的lambda是不同的类型。
所以,是的,您真正想要的是 Vec<Box<dyn Fn(&Deal) -> bool>>

关于rust - 在Rust中使用谓词函数向量创建结构,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/66445942/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com