问题描述
最近,我尝试编写一段类似于以下内容的代码:
pub struct Foo<'a,F> /* where F: Fn(&u32) -> bool */ {
u: &'a u32,f: F
}
impl<'a,F> Foo<'a,F>
where F: Fn(&u32) -> bool
{
pub fn new_foo<G: 'static>(&self,g: G) -> Foo<impl Fn(&u32) -> bool + '_>
where G: Fn(&u32) -> bool
{
Foo { u: self.u,f: move |x| (self.f)(x) && g(x) }
}
}
在这里,Foo
的一个实例表示一条数据(u32
)上的条件,其中可以通过{{ 1}},而不消耗旧的。但是,上面的代码并没有像编写时那样编译,而是给出了相当隐秘的错误消息:
Foo
经过大量实验,我确实找到了一种使代码编译的方法,并且我相信它随后可以按预期运行。我习惯于在不依赖那些边界的情况下编写声明时,将边界放在impls而不是声明上,但是出于某种原因,取消注释上面的new_foo
子句,即复制绑定的{{1} }从暗示到error[E0308]: mismatched types
--> src/lib.rs:9:52
|
9 | pub fn new_foo<G: 'static>(&self,g: G) -> Foo<impl Fn(&u32) -> bool + '_>
| ^^^^^^^^^^^^^^^^^^^^^^^^^^ one type is more general than the other
|
= note: expected type `std::ops::FnOnce<(&u32,)>`
found type `std::ops::FnOnce<(&u32,)>`
error: higher-ranked subtype error
--> src/lib.rs:9:5
|
9 | / pub fn new_foo<G: 'static>(&self,g: G) -> Foo<impl Fn(&u32) -> bool + '_>
10 | | where G: Fn(&u32) -> bool
11 | | {
12 | | Foo { u: self.u,f: move |x| (self.f)(x) && g(x) }
13 | | }
| |_____^
error: aborting due to 2 previous errors
的声明本身解决了这个问题。但是,我不知道为什么会有所不同(一开始我也不真正理解错误消息)。有人对这里发生的事情有任何解释吗?
解决方法
暂无找到可以解决该程序问题的有效方法,小编努力寻找整理中!
如果你已经找到好的解决方法,欢迎将解决方案带上本链接一起发送给小编。
小编邮箱:dio#foxmail.com (将#修改为@)