gpt4 book ai didi

closures - 在闭包 Rust 中使用函数指针参数

转载 作者:行者123 更新时间:2023-11-29 08:04:02 25 4
gpt4 key购买 nike

我想创建一个函数 agg,它接受另一个函数 get_id 作为参数,并返回一个 FnMut使用 get_id 函数的闭包。

具体例子:

struct CowRow {
pub id : i32,
}
impl CowRow {
fn get_id(&self) -> i32 { self.id }
}

pub fn agg<F>(col: F) -> Box<FnMut(&CowRow) -> i32>
where F: Fn(&CowRow) -> i32 {
let mut res = 0;
Box::new(move |r| { res += col(&r); return res })
}

fn main() {
let mut cow = CowRow { id: 0 };
let a = agg(CowRow::get_id);
a(&cow);

产生错误的地方:

the parameter type `F` may not live long enough [E0310]

run `rustc --explain E0310` to see a detailed explanation

consider adding an explicit lifetime bound `F: 'static`...

...so that the type `[closure@main.rs:23:14: 23:53 col:F, res:i32]` will meet its required lifetime bounds

这里的想法是我想要一个通用函数,它允许创建在结构中的不同字段上运行的闭包。所以,我的想法是传递一个函数,它是结构的 getter,并在闭包中使用它来提取适当的字段。

我已经尝试了将 'static 添加到 agg 签名的各种组合,但我不确定这到底意味着什么,也不确定它在语法上需要去哪里。此外,我还尝试了以下技术:https://github.com/nrc/r4cppp/blob/master/closures.md例如将 get_id 方法添加为特征,但也无法使其正常工作。

最佳答案

类型参数F您的函数具有关联的生命周期(就像所有其他类型一样)。但隐含地,你的函数的返回值,Box<FnMut(&CowRow) -> i32> , 真的是 Box<FnMut(&CowRow) -> i32 + 'static> .也就是说,除非您为盒子指定生命周期,否则它会假定其内容可以永远存在。当然如果F只为'a而活,那么借贷检查员就会提示。要解决此问题,要么

  • 强制 F有一个静态的生命周期,这样它就可以永远存在于盒子里(playpen):

    fn agg<F>(col: F) -> Box<FnMut(&CowRow) -> i32>
    where F: Fn(&CowRow) -> i32 + 'static
    {
    ...
    }
  • 明确说明F有生命周期 'a Box也是如此( playpen ):

    fn agg<'a, F>(col: F) -> Box<FnMut(&CowRow) -> i32 + 'a>
    where F: Fn(&CowRow) -> i32 + 'a
    {
    ...
    }

第二个版本比第一个版本更通用,并将接受更多的闭包作为参数。

关于closures - 在闭包 Rust 中使用函数指针参数,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/36519622/

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