为什么此Rust代码使用结构上的生存期绑定进行编译,但是如果绑定仅在impl上进行编译,则给出生命周期错误呢?

问题描述

最近,我尝试编写一段类似于以下内容的代码:

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 (将#修改为@)