Closures 存储捕获返回值的闭包时存在冲突的生存期要求

Closures 存储捕获返回值的闭包时存在冲突的生存期要求,closures,rust,Closures,Rust,编辑: 我试图在函数中创建一个闭包向量,在向量中添加一个标准闭包,然后从函数返回向量。关于生命周期的冲突,我犯了一个错误 代码可以被执行 fn-vec\u with\u closure)->vec以下是我对这个问题的理解,稍微精简一下: fn filter<F>(&mut self, f: F) -> Keeper where F: Fn() -> bool + 'static //' { let mut k = Keeper::new();

编辑:

我试图在函数中创建一个闭包向量,在向量中添加一个标准闭包,然后从函数返回向量。关于生命周期的冲突,我犯了一个错误

代码可以被执行


fn-vec\u with\u closure)->vec以下是我对这个问题的理解,稍微精简一下:

fn filter<F>(&mut self, f: F) -> Keeper
    where F: Fn() -> bool + 'static //'
{
    let mut k = Keeper::new();
    self.subscribe(|| {
        if f() { k.publish() }
    });
    k
}
其中包含一条有用的错误消息:

error: `k` does not live long enough
let k2 = &mut k;
              ^
note: reference must be valid for the static lifetime...
...but borrowed value is only valid for the block
这导致了另一个问题:您试图在闭包中保留对
k
的引用,但一旦从函数返回
k
,该引用就会失效。当项目按值移动时,其地址将更改,因此引用不再有效

一种可能的解决方案是使用和:

fn过滤器(&mut self,f:f)->Rc
其中F:Fn()->bool+'static/'
{
让mut k=Rc::new(RefCell::new(Keeper::new());
设k2=k.clone();
自我订阅(移动| |{
如果f(){k2.borrow_mut().publish()}
});
K
}

我强烈建议创建一个帮助我们更好地帮助您的。我的猜测是,您可以删除该结构的许多方法,但仍然会重现相同的问题。我将尝试找出一个较短的版本。谢谢。虽然一些粗略的戳一下似乎表明我可能错了;-)。我认为您可以删除
T
'a
(将其替换为
'static
)以使其变得更小。使其成为静态是否会将其推向全局范围?我不确定我是否已经完全理解了这一生。我想我需要仔细阅读对问题的完美理解。:)我真的觉得我开始更好地理解生命周期的概念了。但是你对如何解决这个问题有什么建议吗?我已经更新了这个问题。@Emanuel不是一个好问题,我用了一个相当大的锤子,但我已经更新了。非常好的解释和有效的解决方案。我有很多事情要考虑。我认为这个问题已经解决了。谢谢
fn filter<F>(&mut self, f: F) -> Keeper
    where F: Fn() -> bool + 'static //'
{
    let mut k = Keeper::new();
    let k2 = &mut k;
    self.subscribe(move || {
        if f() { k2.publish() }
    });
    k
}
error: `k` does not live long enough
let k2 = &mut k;
              ^
note: reference must be valid for the static lifetime...
...but borrowed value is only valid for the block
fn filter<F>(&mut self, f: F) -> Rc<RefCell<Keeper>>
    where F: Fn() -> bool + 'static //'
{
    let mut k = Rc::new(RefCell::new(Keeper::new()));
    let k2 = k.clone();
    self.subscribe(move || {
        if f() { k2.borrow_mut().publish() }
    });
    k
}